--- a/Cargo.lock +++ b/Cargo.lock @@ -5731,7 +5731,7 @@ [[package]] name = "pallet-common" -version = "0.1.0" +version = "0.1.2" dependencies = [ "ethereum", "evm-coder", --- /dev/null +++ b/pallets/common/CHANGELOG.MD @@ -0,0 +1,10 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +## [0.1.2] - 2022-07-20 + +### Fixed + +- Some methods in `#[solidity_interface]` for `CollectionHandle` had invalid + mutability modifiers, causing invalid stub/abi generation. --- a/pallets/common/Cargo.toml +++ b/pallets/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-common" -version = "0.1.0" +version = "0.1.2" license = "GPLv3" edition = "2021" --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -225,7 +225,11 @@ /// Add collection admin by substrate address. /// @param new_admin Substrate administrator address. - fn add_collection_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result { + fn add_collection_admin_substrate( + &mut self, + caller: caller, + new_admin: uint256, + ) -> Result { let caller = T::CrossAccountId::from_eth(caller); let mut new_admin_arr: [u8; 32] = Default::default(); new_admin.to_big_endian(&mut new_admin_arr); @@ -237,7 +241,11 @@ /// Remove collection admin by substrate address. /// @param admin Substrate administrator address. - fn remove_collection_admin_substrate(&self, caller: caller, admin: uint256) -> Result { + fn remove_collection_admin_substrate( + &mut self, + caller: caller, + admin: uint256, + ) -> Result { let caller = T::CrossAccountId::from_eth(caller); let mut admin_arr: [u8; 32] = Default::default(); admin.to_big_endian(&mut admin_arr); @@ -249,7 +257,7 @@ /// Add collection admin. /// @param new_admin Address of the added administrator. - fn add_collection_admin(&self, caller: caller, new_admin: address) -> Result { + fn add_collection_admin(&mut self, caller: caller, new_admin: address) -> Result { let caller = T::CrossAccountId::from_eth(caller); let new_admin = T::CrossAccountId::from_eth(new_admin); >::toggle_admin(self, &caller, &new_admin, true).map_err(dispatch_to_evm::)?; @@ -259,7 +267,7 @@ /// Remove collection admin. /// /// @param new_admin Address of the removed administrator. - fn remove_collection_admin(&self, caller: caller, admin: address) -> Result { + fn remove_collection_admin(&mut self, caller: caller, admin: address) -> Result { let caller = T::CrossAccountId::from_eth(caller); let admin = T::CrossAccountId::from_eth(admin); >::toggle_admin(self, &caller, &admin, false).map_err(dispatch_to_evm::)?; @@ -365,7 +373,7 @@ /// Add the user to the allowed list. /// /// @param user Address of a trusted user. - fn add_to_collection_allow_list(&self, caller: caller, user: address) -> Result { + fn add_to_collection_allow_list(&mut self, caller: caller, user: address) -> Result { let caller = T::CrossAccountId::from_eth(caller); let user = T::CrossAccountId::from_eth(user); >::toggle_allowlist(self, &caller, &user, true).map_err(dispatch_to_evm::)?; @@ -375,7 +383,7 @@ /// Remove the user from the allowed list. /// /// @param user Address of a removed user. - fn remove_from_collection_allow_list(&self, caller: caller, user: address) -> Result { + fn remove_from_collection_allow_list(&mut self, caller: caller, user: address) -> Result { let caller = T::CrossAccountId::from_eth(caller); let user = T::CrossAccountId::from_eth(user); >::toggle_allowlist(self, &caller, &user, false).map_err(dispatch_to_evm::)?; --- a/pallets/fungible/src/stubs/UniqueFungible.sol +++ b/pallets/fungible/src/stubs/UniqueFungible.sol @@ -43,6 +43,233 @@ } } +// Selector: 7d9262e6 +contract Collection is Dummy, ERC165 { + // Set collection property. + // + // @param key Property key. + // @param value Propery value. + // + // Selector: setCollectionProperty(string,bytes) 2f073f66 + function setCollectionProperty(string memory key, bytes memory value) + public + { + require(false, stub_error); + key; + value; + dummy = 0; + } + + // Delete collection property. + // + // @param key Property key. + // + // Selector: deleteCollectionProperty(string) 7b7debce + function deleteCollectionProperty(string memory key) public { + require(false, stub_error); + key; + dummy = 0; + } + + // Get collection property. + // + // @dev Throws error if key not found. + // + // @param key Property key. + // @return bytes The property corresponding to the key. + // + // Selector: collectionProperty(string) cf24fd6d + function collectionProperty(string memory key) + public + view + returns (bytes memory) + { + require(false, stub_error); + key; + dummy; + return hex""; + } + + // Set the sponsor of the collection. + // + // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor. + // + // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract. + // + // Selector: setCollectionSponsor(address) 7623402e + function setCollectionSponsor(address sponsor) public { + require(false, stub_error); + sponsor; + dummy = 0; + } + + // Collection sponsorship confirmation. + // + // @dev After setting the sponsor for the collection, it must be confirmed with this function. + // + // Selector: confirmCollectionSponsorship() 3c50e97a + function confirmCollectionSponsorship() public { + require(false, stub_error); + dummy = 0; + } + + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "accountTokenOwnershipLimit", + // "sponsoredDataSize", + // "sponsoredDataRateLimit", + // "tokenLimit", + // "sponsorTransferTimeout", + // "sponsorApproveTimeout" + // @param value Value of the limit. + // + // Selector: setCollectionLimit(string,uint32) 6a3841db + function setCollectionLimit(string memory limit, uint32 value) public { + require(false, stub_error); + limit; + value; + dummy = 0; + } + + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "ownerCanTransfer", + // "ownerCanDestroy", + // "transfersEnabled" + // @param value Value of the limit. + // + // Selector: setCollectionLimit(string,bool) 993b7fba + function setCollectionLimit(string memory limit, bool value) public { + require(false, stub_error); + limit; + value; + dummy = 0; + } + + // Get contract address. + // + // Selector: contractAddress() f6b4dfb4 + function contractAddress() public view returns (address) { + require(false, stub_error); + dummy; + return 0x0000000000000000000000000000000000000000; + } + + // Add collection admin by substrate address. + // @param new_admin Substrate administrator address. + // + // Selector: addCollectionAdminSubstrate(uint256) 5730062b + function addCollectionAdminSubstrate(uint256 newAdmin) public { + require(false, stub_error); + newAdmin; + dummy = 0; + } + + // Remove collection admin by substrate address. + // @param admin Substrate administrator address. + // + // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 + function removeCollectionAdminSubstrate(uint256 admin) public { + require(false, stub_error); + admin; + dummy = 0; + } + + // Add collection admin. + // @param new_admin Address of the added administrator. + // + // Selector: addCollectionAdmin(address) 92e462c7 + function addCollectionAdmin(address newAdmin) public { + require(false, stub_error); + newAdmin; + dummy = 0; + } + + // Remove collection admin. + // + // @param new_admin Address of the removed administrator. + // + // Selector: removeCollectionAdmin(address) fafd7b42 + function removeCollectionAdmin(address admin) public { + require(false, stub_error); + admin; + dummy = 0; + } + + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled' + // + // Selector: setCollectionNesting(bool) 112d4586 + function setCollectionNesting(bool enable) public { + require(false, stub_error); + enable; + dummy = 0; + } + + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled' + // @param collections Addresses of collections that will be available for nesting. + // + // Selector: setCollectionNesting(bool,address[]) 64872396 + function setCollectionNesting(bool enable, address[] memory collections) + public + { + require(false, stub_error); + enable; + collections; + dummy = 0; + } + + // Set the collection access method. + // @param mode Access mode + // 0 for Normal + // 1 for AllowList + // + // Selector: setCollectionAccess(uint8) 41835d4c + function setCollectionAccess(uint8 mode) public { + require(false, stub_error); + mode; + dummy = 0; + } + + // Add the user to the allowed list. + // + // @param user Address of a trusted user. + // + // Selector: addToCollectionAllowList(address) 67844fe6 + function addToCollectionAllowList(address user) public { + require(false, stub_error); + user; + dummy = 0; + } + + // Remove the user from the allowed list. + // + // @param user Address of a removed user. + // + // Selector: removeFromCollectionAllowList(address) 85c51acb + function removeFromCollectionAllowList(address user) public { + require(false, stub_error); + user; + dummy = 0; + } + + // Switch permission for minting. + // + // @param mode Enable if "true". + // + // Selector: setCollectionMintMode(bool) 00018e84 + function setCollectionMintMode(bool mode) public { + require(false, stub_error); + mode; + dummy = 0; + } +} + // Selector: 942e8b22 contract ERC20 is Dummy, ERC165, ERC20Events { // Selector: name() 06fdde03 @@ -124,76 +351,6 @@ spender; dummy; return 0; - } -} - -// Selector: c894dc35 -contract Collection is Dummy, ERC165 { - // Selector: setCollectionProperty(string,bytes) 2f073f66 - function setCollectionProperty(string memory key, bytes memory value) - public - { - require(false, stub_error); - key; - value; - dummy = 0; - } - - // Selector: deleteCollectionProperty(string) 7b7debce - function deleteCollectionProperty(string memory key) public { - require(false, stub_error); - key; - dummy = 0; - } - - // Throws error if key not found - // - // Selector: collectionProperty(string) cf24fd6d - function collectionProperty(string memory key) - public - view - returns (bytes memory) - { - require(false, stub_error); - key; - dummy; - return hex""; - } - - // Selector: ethSetSponsor(address) 8f9af356 - function ethSetSponsor(address sponsor) public { - require(false, stub_error); - sponsor; - dummy = 0; - } - - // Selector: ethConfirmSponsorship() a8580d1a - function ethConfirmSponsorship() public { - require(false, stub_error); - dummy = 0; - } - - // Selector: setLimit(string,uint32) 68db30ca - function setLimit(string memory limit, uint32 value) public { - require(false, stub_error); - limit; - value; - dummy = 0; - } - - // Selector: setLimit(string,bool) ea67e4c2 - function setLimit(string memory limit, bool value) public { - require(false, stub_error); - limit; - value; - dummy = 0; - } - - // Selector: contractAddress() f6b4dfb4 - function contractAddress() public view returns (address) { - require(false, stub_error); - dummy; - return 0x0000000000000000000000000000000000000000; } } --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -77,7 +77,7 @@ // @notice Set token property value. // @dev Throws error if `msg.sender` has no permission to edit the property. - // @param token_id ID of the token. + // @param tokenId ID of the token. // @param key Property key. // @param value Property value. // @@ -96,7 +96,7 @@ // @notice Delete token property value. // @dev Throws error if `msg.sender` has no permission to edit the property. - // @param token_id ID of the token. + // @param tokenId ID of the token. // @param key Property key. // // Selector: deleteProperty(uint256,string) 066111d1 @@ -109,8 +109,9 @@ // @notice Get token property value. // @dev Throws error if key not found - // @param token_id ID of the token. + // @param tokenId ID of the token. // @param key Property key. + // @return Property value bytes // // Selector: property(uint256,string) 7228c327 function property(uint256 tokenId, string memory key) @@ -146,8 +147,8 @@ // @notice Count all NFTs assigned to an owner // @dev NFTs assigned to the zero address are considered invalid, and this // function throws for queries about the zero address. - // @param _owner An address for whom to query the balance - // @return The number of NFTs owned by `_owner`, possibly zero + // @param owner An address for whom to query the balance + // @return The number of NFTs owned by `owner`, possibly zero // // Selector: balanceOf(address) 70a08231 function balanceOf(address owner) public view returns (uint256) { @@ -160,7 +161,7 @@ // @notice Find the owner of an NFT // @dev NFTs assigned to zero address are considered invalid, and queries // about them do throw. - // @param _tokenId The identifier for an NFT + // @param tokenId The identifier for an NFT // @return The address of the owner of the NFT // // Selector: ownerOf(uint256) 6352211e @@ -371,7 +372,6 @@ // Selector: 780e9d63 contract ERC721Enumerable is Dummy, ERC165 { // @notice Enumerate valid NFTs - // @dev Throws if `index` >= `totalSupply()`. // @param index A counter less than `totalSupply()` // @return The token identifier for the `index`th NFT, // (sort order not specified) @@ -413,6 +413,11 @@ // Selector: 7d9262e6 contract Collection is Dummy, ERC165 { + // Set collection property. + // + // @param key Property key. + // @param value Propery value. + // // Selector: setCollectionProperty(string,bytes) 2f073f66 function setCollectionProperty(string memory key, bytes memory value) public @@ -423,6 +428,10 @@ dummy = 0; } + // Delete collection property. + // + // @param key Property key. + // // Selector: deleteCollectionProperty(string) 7b7debce function deleteCollectionProperty(string memory key) public { require(false, stub_error); @@ -430,7 +439,12 @@ dummy = 0; } - // Throws error if key not found + // Get collection property. + // + // @dev Throws error if key not found. + // + // @param key Property key. + // @return bytes The property corresponding to the key. // // Selector: collectionProperty(string) cf24fd6d function collectionProperty(string memory key) @@ -444,6 +458,12 @@ return hex""; } + // Set the sponsor of the collection. + // + // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor. + // + // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract. + // // Selector: setCollectionSponsor(address) 7623402e function setCollectionSponsor(address sponsor) public { require(false, stub_error); @@ -451,12 +471,27 @@ dummy = 0; } + // Collection sponsorship confirmation. + // + // @dev After setting the sponsor for the collection, it must be confirmed with this function. + // // Selector: confirmCollectionSponsorship() 3c50e97a function confirmCollectionSponsorship() public { require(false, stub_error); dummy = 0; } + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "accountTokenOwnershipLimit", + // "sponsoredDataSize", + // "sponsoredDataRateLimit", + // "tokenLimit", + // "sponsorTransferTimeout", + // "sponsorApproveTimeout" + // @param value Value of the limit. + // // Selector: setCollectionLimit(string,uint32) 6a3841db function setCollectionLimit(string memory limit, uint32 value) public { require(false, stub_error); @@ -465,6 +500,14 @@ dummy = 0; } + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "ownerCanTransfer", + // "ownerCanDestroy", + // "transfersEnabled" + // @param value Value of the limit. + // // Selector: setCollectionLimit(string,bool) 993b7fba function setCollectionLimit(string memory limit, bool value) public { require(false, stub_error); @@ -473,6 +516,8 @@ dummy = 0; } + // Get contract address. + // // Selector: contractAddress() f6b4dfb4 function contractAddress() public view returns (address) { require(false, stub_error); @@ -480,34 +525,51 @@ return 0x0000000000000000000000000000000000000000; } + // Add collection admin by substrate address. + // @param new_admin Substrate administrator address. + // // Selector: addCollectionAdminSubstrate(uint256) 5730062b - function addCollectionAdminSubstrate(uint256 newAdmin) public view { + function addCollectionAdminSubstrate(uint256 newAdmin) public { require(false, stub_error); newAdmin; - dummy; + dummy = 0; } + // Remove collection admin by substrate address. + // @param admin Substrate administrator address. + // // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 - function removeCollectionAdminSubstrate(uint256 newAdmin) public view { + function removeCollectionAdminSubstrate(uint256 admin) public { require(false, stub_error); - newAdmin; - dummy; + admin; + dummy = 0; } + // Add collection admin. + // @param new_admin Address of the added administrator. + // // Selector: addCollectionAdmin(address) 92e462c7 - function addCollectionAdmin(address newAdmin) public view { + function addCollectionAdmin(address newAdmin) public { require(false, stub_error); newAdmin; - dummy; + dummy = 0; } + // Remove collection admin. + // + // @param new_admin Address of the removed administrator. + // // Selector: removeCollectionAdmin(address) fafd7b42 - function removeCollectionAdmin(address admin) public view { + function removeCollectionAdmin(address admin) public { require(false, stub_error); admin; - dummy; + dummy = 0; } + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled' + // // Selector: setCollectionNesting(bool) 112d4586 function setCollectionNesting(bool enable) public { require(false, stub_error); @@ -515,6 +577,11 @@ dummy = 0; } + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled' + // @param collections Addresses of collections that will be available for nesting. + // // Selector: setCollectionNesting(bool,address[]) 64872396 function setCollectionNesting(bool enable, address[] memory collections) public @@ -525,6 +592,11 @@ dummy = 0; } + // Set the collection access method. + // @param mode Access mode + // 0 for Normal + // 1 for AllowList + // // Selector: setCollectionAccess(uint8) 41835d4c function setCollectionAccess(uint8 mode) public { require(false, stub_error); @@ -532,20 +604,32 @@ dummy = 0; } + // Add the user to the allowed list. + // + // @param user Address of a trusted user. + // // Selector: addToCollectionAllowList(address) 67844fe6 - function addToCollectionAllowList(address user) public view { + function addToCollectionAllowList(address user) public { require(false, stub_error); user; - dummy; + dummy = 0; } + // Remove the user from the allowed list. + // + // @param user Address of a removed user. + // // Selector: removeFromCollectionAllowList(address) 85c51acb - function removeFromCollectionAllowList(address user) public view { + function removeFromCollectionAllowList(address user) public { require(false, stub_error); user; - dummy; + dummy = 0; } + // Switch permission for minting. + // + // @param mode Enable if "true". + // // Selector: setCollectionMintMode(bool) 00018e84 function setCollectionMintMode(bool mode) public { require(false, stub_error); @@ -556,9 +640,7 @@ // Selector: d74d154f contract ERC721UniqueExtensions is Dummy, ERC165 { - // @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE - // TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE - // THEY MAY BE PERMANENTLY LOST + // @notice Transfer ownership of an NFT // @dev Throws unless `msg.sender` is the current owner. Throws if `to` // is the zero address. Throws if `tokenId` is not a valid NFT. // @param to The new owner --- a/tests/src/eth/api/UniqueFungible.sol +++ b/tests/src/eth/api/UniqueFungible.sol @@ -28,6 +28,154 @@ function burnFrom(address from, uint256 amount) external returns (bool); } +// Selector: 7d9262e6 +interface Collection is Dummy, ERC165 { + // Set collection property. + // + // @param key Property key. + // @param value Propery value. + // + // Selector: setCollectionProperty(string,bytes) 2f073f66 + function setCollectionProperty(string memory key, bytes memory value) + external; + + // Delete collection property. + // + // @param key Property key. + // + // Selector: deleteCollectionProperty(string) 7b7debce + function deleteCollectionProperty(string memory key) external; + + // Get collection property. + // + // @dev Throws error if key not found. + // + // @param key Property key. + // @return bytes The property corresponding to the key. + // + // Selector: collectionProperty(string) cf24fd6d + function collectionProperty(string memory key) + external + view + returns (bytes memory); + + // Set the sponsor of the collection. + // + // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor. + // + // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract. + // + // Selector: setCollectionSponsor(address) 7623402e + function setCollectionSponsor(address sponsor) external; + + // Collection sponsorship confirmation. + // + // @dev After setting the sponsor for the collection, it must be confirmed with this function. + // + // Selector: confirmCollectionSponsorship() 3c50e97a + function confirmCollectionSponsorship() external; + + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "accountTokenOwnershipLimit", + // "sponsoredDataSize", + // "sponsoredDataRateLimit", + // "tokenLimit", + // "sponsorTransferTimeout", + // "sponsorApproveTimeout" + // @param value Value of the limit. + // + // Selector: setCollectionLimit(string,uint32) 6a3841db + function setCollectionLimit(string memory limit, uint32 value) external; + + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "ownerCanTransfer", + // "ownerCanDestroy", + // "transfersEnabled" + // @param value Value of the limit. + // + // Selector: setCollectionLimit(string,bool) 993b7fba + function setCollectionLimit(string memory limit, bool value) external; + + // Get contract address. + // + // Selector: contractAddress() f6b4dfb4 + function contractAddress() external view returns (address); + + // Add collection admin by substrate address. + // @param new_admin Substrate administrator address. + // + // Selector: addCollectionAdminSubstrate(uint256) 5730062b + function addCollectionAdminSubstrate(uint256 newAdmin) external; + + // Remove collection admin by substrate address. + // @param admin Substrate administrator address. + // + // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 + function removeCollectionAdminSubstrate(uint256 admin) external; + + // Add collection admin. + // @param new_admin Address of the added administrator. + // + // Selector: addCollectionAdmin(address) 92e462c7 + function addCollectionAdmin(address newAdmin) external; + + // Remove collection admin. + // + // @param new_admin Address of the removed administrator. + // + // Selector: removeCollectionAdmin(address) fafd7b42 + function removeCollectionAdmin(address admin) external; + + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled' + // + // Selector: setCollectionNesting(bool) 112d4586 + function setCollectionNesting(bool enable) external; + + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled' + // @param collections Addresses of collections that will be available for nesting. + // + // Selector: setCollectionNesting(bool,address[]) 64872396 + function setCollectionNesting(bool enable, address[] memory collections) + external; + + // Set the collection access method. + // @param mode Access mode + // 0 for Normal + // 1 for AllowList + // + // Selector: setCollectionAccess(uint8) 41835d4c + function setCollectionAccess(uint8 mode) external; + + // Add the user to the allowed list. + // + // @param user Address of a trusted user. + // + // Selector: addToCollectionAllowList(address) 67844fe6 + function addToCollectionAllowList(address user) external; + + // Remove the user from the allowed list. + // + // @param user Address of a removed user. + // + // Selector: removeFromCollectionAllowList(address) 85c51acb + function removeFromCollectionAllowList(address user) external; + + // Switch permission for minting. + // + // @param mode Enable if "true". + // + // Selector: setCollectionMintMode(bool) 00018e84 + function setCollectionMintMode(bool mode) external; +} + // Selector: 942e8b22 interface ERC20 is Dummy, ERC165, ERC20Events { // Selector: name() 06fdde03 @@ -63,39 +211,6 @@ external view returns (uint256); -} - -// Selector: c894dc35 -interface Collection is Dummy, ERC165 { - // Selector: setCollectionProperty(string,bytes) 2f073f66 - function setCollectionProperty(string memory key, bytes memory value) - external; - - // Selector: deleteCollectionProperty(string) 7b7debce - function deleteCollectionProperty(string memory key) external; - - // Throws error if key not found - // - // Selector: collectionProperty(string) cf24fd6d - function collectionProperty(string memory key) - external - view - returns (bytes memory); - - // Selector: ethSetSponsor(address) 8f9af356 - function ethSetSponsor(address sponsor) external; - - // Selector: ethConfirmSponsorship() a8580d1a - function ethConfirmSponsorship() external; - - // Selector: setLimit(string,uint32) 68db30ca - function setLimit(string memory limit, uint32 value) external; - - // Selector: setLimit(string,bool) ea67e4c2 - function setLimit(string memory limit, bool value) external; - - // Selector: contractAddress() f6b4dfb4 - function contractAddress() external view returns (address); } interface UniqueFungible is --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -61,7 +61,7 @@ // @notice Set token property value. // @dev Throws error if `msg.sender` has no permission to edit the property. - // @param token_id ID of the token. + // @param tokenId ID of the token. // @param key Property key. // @param value Property value. // @@ -74,7 +74,7 @@ // @notice Delete token property value. // @dev Throws error if `msg.sender` has no permission to edit the property. - // @param token_id ID of the token. + // @param tokenId ID of the token. // @param key Property key. // // Selector: deleteProperty(uint256,string) 066111d1 @@ -82,8 +82,9 @@ // @notice Get token property value. // @dev Throws error if key not found - // @param token_id ID of the token. + // @param tokenId ID of the token. // @param key Property key. + // @return Property value bytes // // Selector: property(uint256,string) 7228c327 function property(uint256 tokenId, string memory key) @@ -108,8 +109,8 @@ // @notice Count all NFTs assigned to an owner // @dev NFTs assigned to the zero address are considered invalid, and this // function throws for queries about the zero address. - // @param _owner An address for whom to query the balance - // @return The number of NFTs owned by `_owner`, possibly zero + // @param owner An address for whom to query the balance + // @return The number of NFTs owned by `owner`, possibly zero // // Selector: balanceOf(address) 70a08231 function balanceOf(address owner) external view returns (uint256); @@ -117,7 +118,7 @@ // @notice Find the owner of an NFT // @dev NFTs assigned to zero address are considered invalid, and queries // about them do throw. - // @param _tokenId The identifier for an NFT + // @param tokenId The identifier for an NFT // @return The address of the owner of the NFT // // Selector: ownerOf(uint256) 6352211e @@ -248,7 +249,6 @@ // Selector: 780e9d63 interface ERC721Enumerable is Dummy, ERC165 { // @notice Enumerate valid NFTs - // @dev Throws if `index` >= `totalSupply()`. // @param index A counter less than `totalSupply()` // @return The token identifier for the `index`th NFT, // (sort order not specified) @@ -274,14 +274,28 @@ // Selector: 7d9262e6 interface Collection is Dummy, ERC165 { + // Set collection property. + // + // @param key Property key. + // @param value Propery value. + // // Selector: setCollectionProperty(string,bytes) 2f073f66 function setCollectionProperty(string memory key, bytes memory value) external; + // Delete collection property. + // + // @param key Property key. + // // Selector: deleteCollectionProperty(string) 7b7debce function deleteCollectionProperty(string memory key) external; - // Throws error if key not found + // Get collection property. + // + // @dev Throws error if key not found. + // + // @param key Property key. + // @return bytes The property corresponding to the key. // // Selector: collectionProperty(string) cf24fd6d function collectionProperty(string memory key) @@ -289,58 +303,126 @@ view returns (bytes memory); + // Set the sponsor of the collection. + // + // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor. + // + // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract. + // // Selector: setCollectionSponsor(address) 7623402e function setCollectionSponsor(address sponsor) external; + // Collection sponsorship confirmation. + // + // @dev After setting the sponsor for the collection, it must be confirmed with this function. + // // Selector: confirmCollectionSponsorship() 3c50e97a function confirmCollectionSponsorship() external; + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "accountTokenOwnershipLimit", + // "sponsoredDataSize", + // "sponsoredDataRateLimit", + // "tokenLimit", + // "sponsorTransferTimeout", + // "sponsorApproveTimeout" + // @param value Value of the limit. + // // Selector: setCollectionLimit(string,uint32) 6a3841db function setCollectionLimit(string memory limit, uint32 value) external; + // Set limits for the collection. + // @dev Throws error if limit not found. + // @param limit Name of the limit. Valid names: + // "ownerCanTransfer", + // "ownerCanDestroy", + // "transfersEnabled" + // @param value Value of the limit. + // // Selector: setCollectionLimit(string,bool) 993b7fba function setCollectionLimit(string memory limit, bool value) external; + // Get contract address. + // // Selector: contractAddress() f6b4dfb4 function contractAddress() external view returns (address); + // Add collection admin by substrate address. + // @param new_admin Substrate administrator address. + // // Selector: addCollectionAdminSubstrate(uint256) 5730062b - function addCollectionAdminSubstrate(uint256 newAdmin) external view; + function addCollectionAdminSubstrate(uint256 newAdmin) external; + // Remove collection admin by substrate address. + // @param admin Substrate administrator address. + // // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 - function removeCollectionAdminSubstrate(uint256 newAdmin) external view; + function removeCollectionAdminSubstrate(uint256 admin) external; + // Add collection admin. + // @param new_admin Address of the added administrator. + // // Selector: addCollectionAdmin(address) 92e462c7 - function addCollectionAdmin(address newAdmin) external view; + function addCollectionAdmin(address newAdmin) external; + // Remove collection admin. + // + // @param new_admin Address of the removed administrator. + // // Selector: removeCollectionAdmin(address) fafd7b42 - function removeCollectionAdmin(address admin) external view; + function removeCollectionAdmin(address admin) external; + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled' + // // Selector: setCollectionNesting(bool) 112d4586 function setCollectionNesting(bool enable) external; + // Toggle accessibility of collection nesting. + // + // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled' + // @param collections Addresses of collections that will be available for nesting. + // // Selector: setCollectionNesting(bool,address[]) 64872396 function setCollectionNesting(bool enable, address[] memory collections) external; + // Set the collection access method. + // @param mode Access mode + // 0 for Normal + // 1 for AllowList + // // Selector: setCollectionAccess(uint8) 41835d4c function setCollectionAccess(uint8 mode) external; + // Add the user to the allowed list. + // + // @param user Address of a trusted user. + // // Selector: addToCollectionAllowList(address) 67844fe6 - function addToCollectionAllowList(address user) external view; + function addToCollectionAllowList(address user) external; + // Remove the user from the allowed list. + // + // @param user Address of a removed user. + // // Selector: removeFromCollectionAllowList(address) 85c51acb - function removeFromCollectionAllowList(address user) external view; + function removeFromCollectionAllowList(address user) external; + // Switch permission for minting. + // + // @param mode Enable if "true". + // // Selector: setCollectionMintMode(bool) 00018e84 function setCollectionMintMode(bool mode) external; } // Selector: d74d154f interface ERC721UniqueExtensions is Dummy, ERC165 { - // @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE - // TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE - // THEY MAY BE PERMANENTLY LOST + // @notice Transfer ownership of an NFT // @dev Throws unless `msg.sender` is the current owner. Throws if `to` // is the zero address. Throws if `tokenId` is not a valid NFT. // @param to The new owner --- a/tests/src/eth/fungibleAbi.json +++ b/tests/src/eth/fungibleAbi.json @@ -51,6 +51,33 @@ }, { "inputs": [ + { "internalType": "address", "name": "newAdmin", "type": "address" } + ], + "name": "addCollectionAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "newAdmin", "type": "uint256" } + ], + "name": "addCollectionAdminSubstrate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "user", "type": "address" } + ], + "name": "addToCollectionAllowList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], @@ -97,6 +124,13 @@ }, { "inputs": [], + "name": "confirmCollectionSponsorship", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], "name": "contractAddress", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "view", @@ -118,43 +152,51 @@ }, { "inputs": [], - "name": "ethConfirmSponsorship", - "outputs": [], - "stateMutability": "nonpayable", + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "sponsor", "type": "address" } + { "internalType": "address", "name": "admin", "type": "address" } ], - "name": "ethSetSponsor", + "name": "removeCollectionAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", + "inputs": [ + { "internalType": "uint256", "name": "admin", "type": "uint256" } + ], + "name": "removeCollectionAdminSubstrate", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { "internalType": "string", "name": "key", "type": "string" }, - { "internalType": "bytes", "name": "value", "type": "bytes" } + { "internalType": "address", "name": "user", "type": "address" } ], - "name": "setCollectionProperty", + "name": "removeFromCollectionAllowList", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { + "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }], + "name": "setCollectionAccess", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "inputs": [ { "internalType": "string", "name": "limit", "type": "string" }, { "internalType": "uint32", "name": "value", "type": "uint32" } ], - "name": "setLimit", + "name": "setCollectionLimit", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -164,7 +206,54 @@ { "internalType": "string", "name": "limit", "type": "string" }, { "internalType": "bool", "name": "value", "type": "bool" } ], - "name": "setLimit", + "name": "setCollectionLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }], + "name": "setCollectionMintMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }], + "name": "setCollectionNesting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bool", "name": "enable", "type": "bool" }, + { + "internalType": "address[]", + "name": "collections", + "type": "address[]" + } + ], + "name": "setCollectionNesting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "string", "name": "key", "type": "string" }, + { "internalType": "bytes", "name": "value", "type": "bytes" } + ], + "name": "setCollectionProperty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "sponsor", "type": "address" } + ], + "name": "setCollectionSponsor", "outputs": [], "stateMutability": "nonpayable", "type": "function" --- a/tests/src/eth/nonFungibleAbi.json +++ b/tests/src/eth/nonFungibleAbi.json @@ -86,7 +86,7 @@ ], "name": "addCollectionAdmin", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -95,7 +95,7 @@ ], "name": "addCollectionAdminSubstrate", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -104,7 +104,7 @@ ], "name": "addToCollectionAllowList", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -304,16 +304,16 @@ ], "name": "removeCollectionAdmin", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "newAdmin", "type": "uint256" } + { "internalType": "uint256", "name": "admin", "type": "uint256" } ], "name": "removeCollectionAdminSubstrate", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { @@ -322,7 +322,7 @@ ], "name": "removeFromCollectionAllowList", "outputs": [], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { --- a/tests/src/interfaces/augment-api-errors.ts +++ b/tests/src/interfaces/augment-api-errors.ts @@ -277,15 +277,16 @@ }; fungible: { /** - * Fungible token does not support nested + * Fungible token does not support nesting. **/ FungibleDisallowsNesting: AugmentedError; /** - * Tried to set data for fungible item + * Tried to set data for fungible item. **/ FungibleItemsDontHaveData: AugmentedError; /** - * Not default id passed as TokenId argument + * Not default id passed as TokenId argument. + * The default value of TokenId for Fungible collection is 0. **/ FungibleItemsHaveNoId: AugmentedError; /** @@ -293,7 +294,7 @@ **/ NotFungibleDataUsedToMintFungibleCollectionToken: AugmentedError; /** - * Setting item properties is not allowed + * Setting item properties is not allowed. **/ SettingPropertiesNotAllowed: AugmentedError; /** --- a/tests/src/interfaces/augment-api-query.ts +++ b/tests/src/interfaces/augment-api-query.ts @@ -187,8 +187,17 @@ [key: string]: QueryableStorageEntry; }; fungible: { + /** + * Storage for delegated assets. + **/ allowance: AugmentedQuery Observable, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry; + /** + * Amount of tokens owned by an account inside a collection. + **/ balance: AugmentedQuery Observable, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry; + /** + * Total amount of fungible tokens inside a collection. + **/ totalSupply: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; /** * Generic query @@ -400,17 +409,35 @@ [key: string]: QueryableStorageEntry; }; refungible: { + /** + * Amount of tokens owned by account + **/ accountBalance: AugmentedQuery Observable, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry; + /** + * Allowance set by an owner for a spender for a token + **/ allowance: AugmentedQuery Observable, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry; + /** + * Amount of token pieces owned by account + **/ balance: AugmentedQuery Observable, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry; /** * Used to enumerate tokens owned by account **/ owned: AugmentedQuery Observable, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]> & QueryableStorageEntry; + /** + * Custom data serialized to bytes for token + **/ tokenData: AugmentedQuery Observable, [u32, u32]> & QueryableStorageEntry; tokenProperties: AugmentedQuery Observable, [u32, u32]> & QueryableStorageEntry; tokensBurnt: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; + /** + * Amount of tokens minted for collection + **/ tokensMinted: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; + /** + * Total amount of pieces for token + **/ totalSupply: AugmentedQuery Observable, [u32, u32]> & QueryableStorageEntry; /** * Generic query