Skip to content

Commit

Permalink
Merge pull request #26 from sushiswap/fix/improved-token-factory
Browse files Browse the repository at this point in the history
Update TokenFactory
  • Loading branch information
TheGreatHB committed Aug 23, 2021
2 parents 353b7ef + b982e0c commit 75ab41f
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 130 deletions.
117 changes: 37 additions & 80 deletions contracts/TokenFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ import "./libraries/Signature.sol";
contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
uint8 public constant override MAX_ROYALTY_FEE = 250; // 25%
uint8 public constant override MAX_OPERATIONAL_FEE = 50; // 5%
// keccak256("NFT721(address nft,address to,uint256 tokenId,bytes data,uint256 nonce)");
bytes32 public constant override NFT721_TYPEHASH =
0xc168906d06f61a0b44a8e4e89e114a285237f3c7eb34b490a56feeefe2ce3eef;
// keccak256("NFT1155(address nft,address to,uint256 tokenId,uint256 amount,bytes data,uint256 nonce)");
bytes32 public constant override NFT1155_TYPEHASH =
0xa775fac8298714a0a727dc16ef93dfe9da2c45e1cd7f3e9fec481134044c4c7a;
// keccak256("ParkTokenIds721(address nft,uint256 toTokenId,uint256 nonce)");
bytes32 public constant override PARK_TOKEN_IDS_721 =
0x3fddacac0a7d8b05f741f01ff6becadd9986be8631a2af41a675f365dd74090d;
// keccak256("MintBatch721(address nft,address to,uint256[] tokenIds,bytes data,uint256 nonce)");
bytes32 public constant override MINT_BATCH_721_TYPEHASH =
0x884adba7f4e17962aed36c871036adea39c6d9f81fb25407a78db239e9731e86;
// keccak256("MintBatch1155(address nft,address to,uint256[] tokenIds,uint256[] amounts,bytes data,uint256 nonce)");
bytes32 public constant override MINT_BATCH_1155_TYPEHASH =
0xb47ce0f6456fcc2f16b7d6e7b0255eb73822b401248e672a4543c2b3d7183043;
bytes32 internal immutable _DOMAIN_SEPARATOR;
uint256 internal immutable _CACHED_CHAIN_ID;

Expand All @@ -31,8 +34,7 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
address internal _operationalFeeRecipient;
uint8 internal _operationalFee; // out of 1000

mapping(address => uint256) public override nonces721;
mapping(address => uint256) public override nonces1155;
mapping(address => uint256) public override nonces;

string public override baseURI721;
string public override baseURI1155;
Expand Down Expand Up @@ -181,7 +183,7 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
emit UpgradeERC1155Exchange(exchange);
}

function deployNFT721(
function deployNFT721AndMintBatch(
address owner,
string calldata name,
string calldata symbol,
Expand All @@ -206,10 +208,10 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
)
);

emit DeployNFT721(nft, owner, name, symbol, tokenIds, royaltyFeeRecipient, royaltyFee);
emit DeployNFT721AndMintBatch(nft, owner, name, symbol, tokenIds, royaltyFeeRecipient, royaltyFee);
}

function deployNFT721(
function deployNFT721AndPark(
address owner,
string calldata name,
string calldata symbol,
Expand All @@ -234,7 +236,7 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
)
);

emit DeployNFT721(nft, owner, name, symbol, toTokenId, royaltyFeeRecipient, royaltyFee);
emit DeployNFT721AndPark(nft, owner, name, symbol, toTokenId, royaltyFeeRecipient, royaltyFee);
}

function isNFT721(address query) external view override returns (bool result) {
Expand All @@ -246,7 +248,7 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
return false;
}

function deployNFT1155(
function deployNFT1155AndMintBatch(
address owner,
uint256[] memory tokenIds,
uint256[] memory amounts,
Expand All @@ -267,7 +269,7 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
)
);

emit DeployNFT1155(nft, owner, tokenIds, amounts, royaltyFeeRecipient, royaltyFee);
emit DeployNFT1155AndMintBatch(nft, owner, tokenIds, amounts, royaltyFeeRecipient, royaltyFee);
}

function isNFT1155(address query) external view override returns (bool result) {
Expand Down Expand Up @@ -305,93 +307,48 @@ contract TokenFactory is ProxyFactory, Ownable, ITokenFactory {
return false;
}

function mint721(
function parkTokenIds721(
address nft,
address to,
uint256 tokenId,
bytes memory data,
uint256 toTokenId,
uint8 v,
bytes32 r,
bytes32 s
) public override {
) external override {
address owner = IBaseNFT721(nft).owner();
bytes32 hash = keccak256(abi.encode(NFT721_TYPEHASH, nft, to, tokenId, data, nonces721[owner]++));
bytes32 hash = keccak256(abi.encode(PARK_TOKEN_IDS_721, nft, toTokenId, nonces[owner]++));
Signature.verify(hash, owner, v, r, s, DOMAIN_SEPARATOR());
IBaseNFT721(nft).mint(to, tokenId, data);
IBaseNFT721(nft).parkTokenIds(toTokenId);
}

function mint1155(
function mintBatch721(
address nft,
address to,
uint256 tokenId,
uint256 amount,
bytes memory data,
uint8 v,
bytes32 r,
bytes32 s
) public override {
address owner = IBaseNFT1155(nft).owner();
bytes32 hash = keccak256(abi.encode(NFT1155_TYPEHASH, nft, to, tokenId, amount, data, nonces1155[owner]++));
Signature.verify(hash, owner, v, r, s, DOMAIN_SEPARATOR());
IBaseNFT1155(nft).mint(to, tokenId, amount, data);
}

function mintWithTags721(
address nft,
address to,
uint256 tokenId,
bytes memory data,
string[] memory tags,
uint256[] calldata tokenIds,
bytes calldata data,
uint8 v,
bytes32 r,
bytes32 s
) external override {
mint721(nft, to, tokenId, data, v, r, s);
_setTags(nft, tokenId, tags);
address owner = IBaseNFT721(nft).owner();
bytes32 hash = keccak256(abi.encode(MINT_BATCH_721_TYPEHASH, nft, to, tokenIds, data, nonces[owner]++));
Signature.verify(hash, owner, v, r, s, DOMAIN_SEPARATOR());
IBaseNFT721(nft).mintBatch(to, tokenIds, data);
}

function mintWithTags1155(
function mintBatch1155(
address nft,
address to,
uint256 tokenId,
uint256 amount,
bytes memory data,
string[] memory tags,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
bytes calldata data,
uint8 v,
bytes32 r,
bytes32 s
) external override {
mint1155(nft, to, tokenId, amount, data, v, r, s);
_setTags(nft, tokenId, tags);
}

function setTags721(
address nft,
uint256 tokenId,
string[] memory tags
) external override {
require(IBaseNFT721(nft).ownerOf(tokenId) == msg.sender, "SHOYU: FORBIDDEN");
_setTags(nft, tokenId, tags);
}

function setTags1155(
address nft,
uint256 tokenId,
string[] memory tags
) external override {
require(IBaseNFT1155(nft).balanceOf(msg.sender, tokenId) > 0, "SHOYU: FORBIDDEN");
_setTags(nft, tokenId, tags);
}

function _setTags(
address nft,
uint256 tokenId,
string[] memory tags
) internal {
uint256 nonce = tagNonces[nft][tokenId]++;

for (uint256 i; i < tags.length; i++) {
emit Tag(nft, tokenId, tags[i], nonce);
}
address owner = IBaseNFT1155(nft).owner();
bytes32 hash =
keccak256(abi.encode(MINT_BATCH_1155_TYPEHASH, nft, to, tokenIds, amounts, data, nonces[owner]++));
Signature.verify(hash, owner, v, r, s, DOMAIN_SEPARATOR());
IBaseNFT1155(nft).mintBatch(to, tokenIds, amounts, data);
}
}
4 changes: 2 additions & 2 deletions contracts/base/BaseNFT1155.sol
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ abstract contract BaseNFT1155 is ERC1155Initializable, OwnableInitializable, IBa
uint256 amount,
bytes memory data
) external override {
require(_factory == msg.sender || owner() == msg.sender, "SHOYU: FORBIDDEN");
require(owner() == msg.sender || _factory == msg.sender, "SHOYU: FORBIDDEN");

_mint(to, tokenId, amount, data);
}
Expand All @@ -114,7 +114,7 @@ abstract contract BaseNFT1155 is ERC1155Initializable, OwnableInitializable, IBa
uint256[] memory amounts,
bytes memory data
) external override {
require(owner() == msg.sender, "SHOYU: FORBIDDEN");
require(owner() == msg.sender || _factory == msg.sender, "SHOYU: FORBIDDEN");

_mintBatch(to, tokenIds, amounts, data);
}
Expand Down
6 changes: 3 additions & 3 deletions contracts/base/BaseNFT721.sol
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ abstract contract BaseNFT721 is ERC721Initializable, OwnableInitializable, IBase
}

function parkTokenIds(uint256 toTokenId) external override {
require(owner() == msg.sender, "SHOYU: FORBIDDEN");
require(owner() == msg.sender || _factory == msg.sender, "SHOYU: FORBIDDEN");

_parkTokenIds(toTokenId);

Expand All @@ -118,7 +118,7 @@ abstract contract BaseNFT721 is ERC721Initializable, OwnableInitializable, IBase
uint256 tokenId,
bytes memory data
) external override {
require(_factory == msg.sender || owner() == msg.sender, "SHOYU: FORBIDDEN");
require(owner() == msg.sender || _factory == msg.sender, "SHOYU: FORBIDDEN");

_safeMint(to, tokenId, data);
}
Expand All @@ -128,7 +128,7 @@ abstract contract BaseNFT721 is ERC721Initializable, OwnableInitializable, IBase
uint256[] memory tokenIds,
bytes memory data
) external override {
require(owner() == msg.sender, "SHOYU: FORBIDDEN");
require(owner() == msg.sender || _factory == msg.sender, "SHOYU: FORBIDDEN");

for (uint256 i = 0; i < tokenIds.length; i++) {
_safeMint(to, tokenIds[i], data);
Expand Down
63 changes: 18 additions & 45 deletions contracts/interfaces/ITokenFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ interface ITokenFactory {
event UpgradeSocialToken(address newTarget);
event UpgradeERC721Exchange(address exchange);
event UpgradeERC1155Exchange(address exchange);
event DeployNFT721(
event DeployNFT721AndMintBatch(
address indexed proxy,
address indexed owner,
string name,
Expand All @@ -17,7 +17,7 @@ interface ITokenFactory {
address royaltyFeeRecipient,
uint8 royaltyFee
);
event DeployNFT721(
event DeployNFT721AndPark(
address indexed proxy,
address indexed owner,
string name,
Expand All @@ -26,7 +26,7 @@ interface ITokenFactory {
address royaltyFeeRecipient,
uint8 royaltyFee
);
event DeployNFT1155(
event DeployNFT1155AndMintBatch(
address indexed proxy,
address indexed owner,
uint256[] tokenIds,
Expand All @@ -47,15 +47,15 @@ interface ITokenFactory {

function MAX_OPERATIONAL_FEE() external view returns (uint8);

function NFT721_TYPEHASH() external view returns (bytes32);
function PARK_TOKEN_IDS_721() external view returns (bytes32);

function NFT1155_TYPEHASH() external view returns (bytes32);
function MINT_BATCH_721_TYPEHASH() external view returns (bytes32);

function DOMAIN_SEPARATOR() external view returns (bytes32);
function MINT_BATCH_1155_TYPEHASH() external view returns (bytes32);

function nonces721(address account) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);

function nonces1155(address account) external view returns (uint256);
function nonces(address account) external view returns (uint256);

function baseURI721() external view returns (string memory);

Expand Down Expand Up @@ -97,7 +97,7 @@ interface ITokenFactory {

function upgradeERC1155Exchange(address exchange) external;

function deployNFT721(
function deployNFT721AndMintBatch(
address owner,
string calldata name,
string calldata symbol,
Expand All @@ -106,7 +106,7 @@ interface ITokenFactory {
uint8 royaltyFee
) external returns (address nft);

function deployNFT721(
function deployNFT721AndPark(
address owner,
string calldata name,
string calldata symbol,
Expand All @@ -117,7 +117,7 @@ interface ITokenFactory {

function isNFT721(address query) external view returns (bool result);

function deployNFT1155(
function deployNFT1155AndMintBatch(
address owner,
uint256[] memory tokenIds,
uint256[] memory amounts,
Expand All @@ -136,59 +136,32 @@ interface ITokenFactory {

function isSocialToken(address query) external view returns (bool result);

function mint721(
function parkTokenIds721(
address nft,
address to,
uint256 tokenId,
bytes calldata data,
uint8 v,
bytes32 r,
bytes32 s
) external;

function mint1155(
address nft,
address to,
uint256 tokenId,
uint256 amount,
bytes calldata data,
uint256 toTokenId,
uint8 v,
bytes32 r,
bytes32 s
) external;

function mintWithTags721(
function mintBatch721(
address nft,
address to,
uint256 tokenId,
uint256[] calldata tokenIds,
bytes calldata data,
string[] calldata tags,
uint8 v,
bytes32 r,
bytes32 s
) external;

function mintWithTags1155(
function mintBatch1155(
address nft,
address to,
uint256 tokenId,
uint256 amount,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
bytes calldata data,
string[] calldata tags,
uint8 v,
bytes32 r,
bytes32 s
) external;

function setTags721(
address nft,
uint256 tokenId,
string[] calldata tags
) external;

function setTags1155(
address nft,
uint256 tokenId,
string[] calldata tags
) external;
}

0 comments on commit 75ab41f

Please sign in to comment.