Skip to content

Commit

Permalink
add hat wearer check
Browse files Browse the repository at this point in the history
yu23ki14 committed Nov 22, 2024
1 parent f140fa4 commit 57cba9d
Showing 8 changed files with 139 additions and 42 deletions.
39 changes: 31 additions & 8 deletions pkgs/contract/contracts/bigbang/BigBang.sol
Original file line number Diff line number Diff line change
@@ -39,15 +39,15 @@ contract BigBang is ERC2771ContextUpgradeable, OwnableUpgradeable {
* @param _splitFactoryV2 Address of the split factory V2 contract.
* @param _fractionToken Address of the fraction token contract.
*/
function initialize (
function initialize(
address _trustedForwarder,
address _hatsAddress,
address _hatsModuleFactory,
address _hatsTimeFrameModule_IMPL,
address _splitsCreatorFactory,
address _splitFactoryV2,
address _fractionToken
) initializer public {
) public initializer {
__Ownable_init(_msgSender());
__ERC2771Context_init(address(_trustedForwarder));
Hats = IHats(_hatsAddress);
@@ -116,13 +116,20 @@ contract BigBang is ERC2771ContextUpgradeable, OwnableUpgradeable {
.createSplitCreatorDeterministic(
topHatId,
_trustedForwarder,
address(Hats),
SplitsFactoryV2,
hatsTimeFrameModule,
FractionToken,
keccak256(abi.encodePacked(topHatId))
);

emit Executed(_owner, topHatId, hatterHatId, hatsTimeFrameModule, splitCreator);
emit Executed(
_owner,
topHatId,
hatterHatId,
hatsTimeFrameModule,
splitCreator
);

return topHatId;
}
@@ -131,15 +138,21 @@ contract BigBang is ERC2771ContextUpgradeable, OwnableUpgradeable {
Hats = IHats(_hats);
}

function setHatsModuleFactory(address _hatsModuleFactory) external onlyOwner {
function setHatsModuleFactory(
address _hatsModuleFactory
) external onlyOwner {
HatsModuleFactory = IHatsModuleFactory(_hatsModuleFactory);
}

function setSplitsCreatorFactory(address _splitsCreatorFactory) external onlyOwner {
function setSplitsCreatorFactory(
address _splitsCreatorFactory
) external onlyOwner {
SplitsCreatorFactory = ISplitsCreatorFactory(_splitsCreatorFactory);
}

function setHatsTimeFrameModuleImpl(address _hatsTimeFrameModuleImpl) external onlyOwner {
function setHatsTimeFrameModuleImpl(
address _hatsTimeFrameModuleImpl
) external onlyOwner {
HatsTimeFrameModule_IMPL = _hatsTimeFrameModuleImpl;
}

@@ -151,11 +164,21 @@ contract BigBang is ERC2771ContextUpgradeable, OwnableUpgradeable {
FractionToken = _fractionToken;
}

function _msgSender() internal view override(ERC2771ContextUpgradeable, ContextUpgradeable) returns (address sender) {
function _msgSender()
internal
view
override(ERC2771ContextUpgradeable, ContextUpgradeable)
returns (address sender)
{
return super._msgSender();
}

function _msgData() internal view override(ERC2771ContextUpgradeable, ContextUpgradeable) returns (bytes calldata) {
function _msgData()
internal
view
override(ERC2771ContextUpgradeable, ContextUpgradeable)
returns (bytes calldata)
{
return super._msgData();
}
}
51 changes: 37 additions & 14 deletions pkgs/contract/contracts/bigbang/mock/BigBang_Mock_v2.sol
Original file line number Diff line number Diff line change
@@ -42,15 +42,15 @@ contract BigBang_Mock_v2 is ERC2771ContextUpgradeable, OwnableUpgradeable {
* @param _splitFactoryV2 Address of the split factory V2 contract.
* @param _fractionToken Address of the fraction token contract.
*/
function initialize (
function initialize(
address _trustedForwarder,
address _hatsAddress,
address _hatsModuleFactory,
address _hatsTimeFrameModule_IMPL,
address _splitsCreatorFactory,
address _splitFactoryV2,
address _fractionToken
) initializer public {
) public initializer {
__Ownable_init(_msgSender());
__ERC2771Context_init(address(_trustedForwarder));
Hats = IHats(_hatsAddress);
@@ -119,13 +119,20 @@ contract BigBang_Mock_v2 is ERC2771ContextUpgradeable, OwnableUpgradeable {
.createSplitCreatorDeterministic(
topHatId,
_trustedForwarder,
address(Hats),
SplitsFactoryV2,
hatsTimeFrameModule,
FractionToken,
keccak256(abi.encodePacked(topHatId))
);

emit Executed(_owner, topHatId, hatterHatId, hatsTimeFrameModule, splitCreator);
emit Executed(
_owner,
topHatId,
hatterHatId,
hatsTimeFrameModule,
splitCreator
);

return topHatId;
}
@@ -134,15 +141,21 @@ contract BigBang_Mock_v2 is ERC2771ContextUpgradeable, OwnableUpgradeable {
Hats = IHats(_hats);
}

function setHatsModuleFactory(address _hatsModuleFactory) external onlyOwner {
function setHatsModuleFactory(
address _hatsModuleFactory
) external onlyOwner {
HatsModuleFactory = IHatsModuleFactory(_hatsModuleFactory);
}

function setSplitsCreatorFactory(address _splitsCreatorFactory) external onlyOwner {
function setSplitsCreatorFactory(
address _splitsCreatorFactory
) external onlyOwner {
SplitsCreatorFactory = ISplitsCreatorFactory(_splitsCreatorFactory);
}

function setHatsTimeFrameModuleImpl(address _hatsTimeFrameModuleImpl) external onlyOwner {
function setHatsTimeFrameModuleImpl(
address _hatsTimeFrameModuleImpl
) external onlyOwner {
HatsTimeFrameModule_IMPL = _hatsTimeFrameModuleImpl;
}

@@ -154,18 +167,28 @@ contract BigBang_Mock_v2 is ERC2771ContextUpgradeable, OwnableUpgradeable {
FractionToken = _fractionToken;
}

function _msgSender() internal view override(ERC2771ContextUpgradeable, ContextUpgradeable) returns (address sender) {
function _msgSender()
internal
view
override(ERC2771ContextUpgradeable, ContextUpgradeable)
returns (address sender)
{
return super._msgSender();
}

function _msgData() internal view override(ERC2771ContextUpgradeable, ContextUpgradeable) returns (bytes calldata) {
function _msgData()
internal
view
override(ERC2771ContextUpgradeable, ContextUpgradeable)
returns (bytes calldata)
{
return super._msgData();
}

/**
* 検証用に追加した関数
*/
function testUpgradeFunction() external pure returns (string memory) {
return "testUpgradeFunction";
}
/**
* 検証用に追加した関数
*/
function testUpgradeFunction() external pure returns (string memory) {
return "testUpgradeFunction";
}
}
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@ interface ISplitsCreatorFactory {
function createSplitCreatorDeterministic(
uint256 _topHatId,
address _trustedForwarder,
address _hats,
address _splitFactoryV2,
address _hatsTimeFrameModule,
address _fractionToken,
35 changes: 22 additions & 13 deletions pkgs/contract/contracts/splitscreator/SplitsCreator.sol
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

pragma solidity ^0.8.24;

import { IHats } from "../hats/src/Interfaces/IHats.sol";
import { ISplitsCreator } from "./ISplitsCreator.sol";
import { ISplitFactoryV2 } from "../splits/interfaces/ISplitFactoryV2.sol";
import { SplitV2Lib } from "../splits/libraries/SplitV2.sol";
@@ -17,20 +18,24 @@ contract SplitsCreator is ISplitsCreator, Clone {
return _getArgAddress(12);
}

function HATS() public pure returns (IHats) {
return IHats(_getArgAddress(44));
}

function SPLIT_FACTORY_V2() public pure returns (ISplitFactoryV2) {
return ISplitFactoryV2(_getArgAddress(44));
return ISplitFactoryV2(_getArgAddress(76));
}

function HATS_TIME_FRAME_MODULE()
public
pure
returns (IHatsTimeFrameModule)
{
return IHatsTimeFrameModule(_getArgAddress(76));
return IHatsTimeFrameModule(_getArgAddress(108));
}

function FRACTION_TOKEN() public pure returns (IFractionToken) {
return IFractionToken(_getArgAddress(108));
return IFractionToken(_getArgAddress(140));
}

function create(
@@ -52,7 +57,9 @@ contract SplitsCreator is ISplitsCreator, Clone {

address[] memory shareHolders = new address[](numOfShareHolders);
address[] memory wearers = new address[](numOfShareHolders);
uint256[] memory hatIdsOfShareHolders = new uint256[](numOfShareHolders);
uint256[] memory hatIdsOfShareHolders = new uint256[](
numOfShareHolders
);
uint256[] memory roleMultipliersOfShareHolders = new uint256[](
numOfShareHolders
);
@@ -67,12 +74,19 @@ contract SplitsCreator is ISplitsCreator, Clone {
uint256 roleMultiplier = _splitInfo.multiplierTop /
_splitInfo.multiplierBottom;
for (uint si = 0; si < _splitInfo.wearers.length; si++) {
address wearer = _splitInfo.wearers[si];

require(
HATS().balanceOf(wearer, _splitInfo.hatId) > 0,
"Invalid wearer"
);

uint256 tokenId = FRACTION_TOKEN().getTokenId(
_splitInfo.hatId,
_splitInfo.wearers[si]
wearer
);
uint256 hatsTimeFrameMultiplier = _getHatsTimeFrameMultiplier(
_splitInfo.wearers[si],
wearer,
_splitInfo.hatId
);

@@ -81,7 +95,7 @@ contract SplitsCreator is ISplitsCreator, Clone {
.getTokenRecipients(tokenId);
for (uint j = 0; j < recipients.length; j++) {
shareHolders[shareHolderIndex] = recipients[j];
wearers[shareHolderIndex] = _splitInfo.wearers[si];
wearers[shareHolderIndex] = wearer;
hatIdsOfShareHolders[shareHolderIndex] = _splitInfo.hatId;
roleMultipliersOfShareHolders[
shareHolderIndex
@@ -121,12 +135,7 @@ contract SplitsCreator is ISplitsCreator, Clone {
_generateSalt(_splitsInfo)
);

emit SplitsCreated(
split,
shareHolders,
allocations,
totalAllocation
);
emit SplitsCreated(split, shareHolders, allocations, totalAllocation);

return split;
}
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@ contract SplitsCreatorFactory is ERC2771ContextUpgradeable {
function createSplitCreatorDeterministic(
uint256 _topHatId,
address _trustedForwarder,
address _hats,
address _splitFactoryV2,
address _hatsTimeFrameModule,
address _fractionToken,
@@ -40,13 +41,15 @@ contract SplitsCreatorFactory is ERC2771ContextUpgradeable {
SPLITS_CREATOR_IMPLEMENTATION,
abi.encode(
_trustedForwarder,
_hats,
_splitFactoryV2,
_hatsTimeFrameModule,
_fractionToken
),
_getSalt(
_topHatId,
_trustedForwarder,
_hats,
_splitFactoryV2,
_hatsTimeFrameModule,
_fractionToken,
@@ -68,6 +71,7 @@ contract SplitsCreatorFactory is ERC2771ContextUpgradeable {
function predictDeterministicAddress(
uint256 _topHatId,
address _trustedForwarder,
address _hats,
address _splitFactoryV2,
address _hatsTimeFrameModule,
address _fractionToken,
@@ -78,13 +82,15 @@ contract SplitsCreatorFactory is ERC2771ContextUpgradeable {
SPLITS_CREATOR_IMPLEMENTATION,
abi.encode(
_trustedForwarder,
_hats,
_splitFactoryV2,
_hatsTimeFrameModule,
_fractionToken
),
_getSalt(
_topHatId,
_trustedForwarder,
_hats,
_splitFactoryV2,
_hatsTimeFrameModule,
_fractionToken,
@@ -97,6 +103,7 @@ contract SplitsCreatorFactory is ERC2771ContextUpgradeable {
function _getSalt(
uint256 _topHatId,
address _trustedForwarder,
address _hats,
address _splitFactoryV2,
address _hatsTimeFrameModule,
address _fractionToken,
@@ -107,6 +114,7 @@ contract SplitsCreatorFactory is ERC2771ContextUpgradeable {
abi.encodePacked(
_topHatId,
_trustedForwarder,
_hats,
_splitFactoryV2,
_hatsTimeFrameModule,
_fractionToken,
8 changes: 4 additions & 4 deletions pkgs/contract/contracts/timeframe/HatsTimeFrameModule.sol
Original file line number Diff line number Diff line change
@@ -11,16 +11,16 @@ contract HatsTimeFrameModule is
IHatsTimeFrameModule
{
// hatId => wearer => wore timestamp
mapping(uint256 => mapping(address => uint256)) private woreTime;
mapping(uint256 => mapping(address => uint256)) public woreTime;

// hatId => wearer => last deactivation timestamp
mapping(uint256 => mapping(address => uint256)) private deactivatedTime;
mapping(uint256 => mapping(address => uint256)) public deactivatedTime;

// hatId => wearer => total active time
mapping(uint256 => mapping(address => uint256)) private totalActiveTime;
mapping(uint256 => mapping(address => uint256)) public totalActiveTime;

// hatId => wearer => isActive
mapping(uint256 => mapping(address => bool)) private isActive;
mapping(uint256 => mapping(address => bool)) public isActive;

/**
* @dev Constructor to initialize the trusted forwarder.
20 changes: 20 additions & 0 deletions pkgs/contract/contracts/timeframe/IHatsTimeFrameModule.sol
Original file line number Diff line number Diff line change
@@ -23,4 +23,24 @@ interface IHatsTimeFrameModule {
address wearer,
uint256 hatId
) external view returns (uint256);

function woreTime(
uint256 hatId,
address wearer
) external view returns (uint256);

function deactivatedTime(
uint256 hatId,
address wearer
) external view returns (uint256);

function totalActiveTime(
uint256 hatId,
address wearer
) external view returns (uint256);

function isActive(
uint256 hatId,
address wearer
) external view returns (bool);
}
19 changes: 16 additions & 3 deletions pkgs/contract/test/SplitsCreator.ts
Original file line number Diff line number Diff line change
@@ -129,6 +129,7 @@ describe("SplitsCreator Factory", () => {
await SplitsCreatorFactory.read.predictDeterministicAddress([
topHatId,
zeroAddress,
Hats.address,
PullSplitsFactory.address,
HatsTimeFrameModule.address,
FractionToken.address,
@@ -142,6 +143,7 @@ describe("SplitsCreator Factory", () => {
await SplitsCreatorFactory.read.predictDeterministicAddress([
topHatId,
address1.account?.address!,
Hats.address,
PullSplitsFactory.address,
HatsTimeFrameModule.address,
FractionToken.address,
@@ -151,6 +153,7 @@ describe("SplitsCreator Factory", () => {
await SplitsCreatorFactory.write.createSplitCreatorDeterministic([
topHatId,
address1.account?.address!,
Hats.address,
PullSplitsFactory.address,
HatsTimeFrameModule.address,
FractionToken.address,
@@ -274,6 +277,7 @@ describe("CreateSplit", () => {
await SplitsCreatorFactory.write.createSplitCreatorDeterministic([
topHatId,
address1.account?.address!,
Hats.address,
PullSplitsFactory.address,
HatsTimeFrameModule.address,
FractionToken.address,
@@ -413,9 +417,18 @@ describe("CreateSplit", () => {
})
.then((block) => block.timestamp);

await FractionToken.write.mintInitialSupply([hat1_id, address1.account?.address!]);
await FractionToken.write.mintInitialSupply([hat1_id, address2.account?.address!]);
await FractionToken.write.mintInitialSupply([hat2_id, address3.account?.address!]);
await FractionToken.write.mintInitialSupply([
hat1_id,
address1.account?.address!,
]);
await FractionToken.write.mintInitialSupply([
hat1_id,
address2.account?.address!,
]);
await FractionToken.write.mintInitialSupply([
hat2_id,
address3.account?.address!,
]);

// let balance: bigint;

0 comments on commit 57cba9d

Please sign in to comment.