From 2e0d1a668d33ce6c82bcc3fd767cb18efe3fbfb5 Mon Sep 17 00:00:00 2001 From: PraetorP Date: Wed, 16 Nov 2022 10:52:47 +0000 Subject: [PATCH] feature/setCollectionLimit Behavior of the `setCollectionLimit` method. Removed method overload: single signature `(string, uint256)` is used for both cases. --- --- a/Cargo.lock +++ b/Cargo.lock @@ -5831,7 +5831,7 @@ [[package]] name = "pallet-common" -version = "0.1.10" +version = "0.1.11" dependencies = [ "ethereum", "evm-coder", --- a/pallets/common/CHANGELOG.md +++ b/pallets/common/CHANGELOG.md @@ -2,10 +2,22 @@ All notable changes to this project will be documented in this file. + + +## [0.1.11] - 2022-11-16 + +### Changed + +- Behavior of the `setCollectionLimit` method. + Removed method overload: single signature `(string, uint256)` + is used for both cases. + ## [0.1.10] - 2022-11-02 + ### Changed - - Use named structure `EthCrossAccount` in eth functions. +- Use named structure `EthCrossAccount` in eth functions. + ## [0.1.9] - 2022-10-13 ## Added @@ -34,8 +46,6 @@ ### Added - New Ethereum API methods: changeOwner, changeOwner(Substrate) and verifyOwnerOrAdmin(Substrate). - - ## [v0.1.5] 2022-08-16 --- a/pallets/common/Cargo.toml +++ b/pallets/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-common" -version = "0.1.10" +version = "0.1.11" license = "GPLv3" edition = "2021" --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -303,11 +303,29 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" + /// "ownerCanTransfer", + /// "ownerCanDestroy", + /// "transfersEnabled" /// @param value Value of the limit. #[solidity(rename_selector = "setCollectionLimit")] - fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result { + fn set_int_limit(&mut self, caller: caller, limit: string, value: uint256) -> Result { self.consume_store_reads_and_writes(1, 1)?; + let value = value + .try_into() + .map_err(|_| Error::Revert(format!("can't convert value to u32 \"{}\"", value)))?; + + let convert_value_to_bool = || match value { + 0 => Ok(false), + 1 => Ok(true), + _ => { + return Err(Error::Revert(format!( + "can't convert value to boolean \"{}\"", + value + ))) + } + }; + check_is_owner_or_admin(caller, self)?; let mut limits = self.limits.clone(); @@ -330,48 +348,16 @@ "sponsorApproveTimeout" => { limits.sponsor_approve_timeout = Some(value); } - _ => { - return Err(Error::Revert(format!( - "unknown integer limit \"{}\"", - limit - ))) - } - } - self.limits = >::clamp_limits(self.mode.clone(), &self.limits, limits) - .map_err(dispatch_to_evm::)?; - save(self) - } - - /// 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. - #[solidity(rename_selector = "setCollectionLimit")] - fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result { - self.consume_store_reads_and_writes(1, 1)?; - - check_is_owner_or_admin(caller, self)?; - let mut limits = self.limits.clone(); - - match limit.as_str() { "ownerCanTransfer" => { - limits.owner_can_transfer = Some(value); + limits.owner_can_transfer = Some(convert_value_to_bool()?); } "ownerCanDestroy" => { - limits.owner_can_destroy = Some(value); + limits.owner_can_destroy = Some(convert_value_to_bool()?); } "transfersEnabled" => { - limits.transfers_enabled = Some(value); - } - _ => { - return Err(Error::Revert(format!( - "unknown boolean limit \"{}\"", - limit - ))) + limits.transfers_enabled = Some(convert_value_to_bool()?); } + _ => return Err(Error::Revert(format!("unknown limit \"{}\"", limit))), } self.limits = >::clamp_limits(self.mode.clone(), &self.limits, limits) .map_err(dispatch_to_evm::)?; --- a/pallets/fungible/src/stubs/UniqueFungible.sol +++ b/pallets/fungible/src/stubs/UniqueFungible.sol @@ -18,7 +18,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x324a7f5b +/// @dev the ERC-165 identifier for this interface is 0x8b91d192 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -167,26 +167,13 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x6a3841db, - /// or in textual repr: setCollectionLimit(string,uint32) - 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", + /// "ownerCanTransfer", /// "ownerCanDestroy", /// "transfersEnabled" /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x993b7fba, - /// or in textual repr: setCollectionLimit(string,bool) - function setCollectionLimit(string memory limit, bool value) public { + /// @dev EVM selector for this function is: 0x4ad890a8, + /// or in textual repr: setCollectionLimit(string,uint256) + function setCollectionLimit(string memory limit, uint256 value) public { require(false, stub_error); limit; value; --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -119,7 +119,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x324a7f5b +/// @dev the ERC-165 identifier for this interface is 0x8b91d192 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -268,26 +268,13 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x6a3841db, - /// or in textual repr: setCollectionLimit(string,uint32) - 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", + /// "ownerCanTransfer", /// "ownerCanDestroy", /// "transfersEnabled" /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x993b7fba, - /// or in textual repr: setCollectionLimit(string,bool) - function setCollectionLimit(string memory limit, bool value) public { + /// @dev EVM selector for this function is: 0x4ad890a8, + /// or in textual repr: setCollectionLimit(string,uint256) + function setCollectionLimit(string memory limit, uint256 value) public { require(false, stub_error); limit; value; --- a/pallets/refungible/src/stubs/UniqueRefungible.sol +++ b/pallets/refungible/src/stubs/UniqueRefungible.sol @@ -119,7 +119,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x324a7f5b +/// @dev the ERC-165 identifier for this interface is 0x8b91d192 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -268,26 +268,13 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x6a3841db, - /// or in textual repr: setCollectionLimit(string,uint32) - 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", + /// "ownerCanTransfer", /// "ownerCanDestroy", /// "transfersEnabled" /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x993b7fba, - /// or in textual repr: setCollectionLimit(string,bool) - function setCollectionLimit(string memory limit, bool value) public { + /// @dev EVM selector for this function is: 0x4ad890a8, + /// or in textual repr: setCollectionLimit(string,uint256) + function setCollectionLimit(string memory limit, uint256 value) public { require(false, stub_error); limit; value; --- a/tests/src/eth/abi/fungible.json +++ b/tests/src/eth/abi/fungible.json @@ -390,17 +390,7 @@ { "inputs": [ { "internalType": "string", "name": "limit", "type": "string" }, - { "internalType": "uint32", "name": "value", "type": "uint32" } - ], - "name": "setCollectionLimit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "limit", "type": "string" }, - { "internalType": "bool", "name": "value", "type": "bool" } + { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "setCollectionLimit", "outputs": [], --- a/tests/src/eth/abi/nonFungible.json +++ b/tests/src/eth/abi/nonFungible.json @@ -505,17 +505,7 @@ { "inputs": [ { "internalType": "string", "name": "limit", "type": "string" }, - { "internalType": "uint32", "name": "value", "type": "uint32" } - ], - "name": "setCollectionLimit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "limit", "type": "string" }, - { "internalType": "bool", "name": "value", "type": "bool" } + { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "setCollectionLimit", "outputs": [], --- a/tests/src/eth/abi/reFungible.json +++ b/tests/src/eth/abi/reFungible.json @@ -487,17 +487,7 @@ { "inputs": [ { "internalType": "string", "name": "limit", "type": "string" }, - { "internalType": "uint32", "name": "value", "type": "uint32" } - ], - "name": "setCollectionLimit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "string", "name": "limit", "type": "string" }, - { "internalType": "bool", "name": "value", "type": "bool" } + { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "setCollectionLimit", "outputs": [], --- a/tests/src/eth/api/UniqueFungible.sol +++ b/tests/src/eth/api/UniqueFungible.sol @@ -13,7 +13,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x324a7f5b +/// @dev the ERC-165 identifier for this interface is 0x8b91d192 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -113,21 +113,13 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x6a3841db, - /// or in textual repr: setCollectionLimit(string,uint32) - 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", + /// "ownerCanTransfer", /// "ownerCanDestroy", /// "transfersEnabled" /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x993b7fba, - /// or in textual repr: setCollectionLimit(string,bool) - function setCollectionLimit(string memory limit, bool value) external; + /// @dev EVM selector for this function is: 0x4ad890a8, + /// or in textual repr: setCollectionLimit(string,uint256) + function setCollectionLimit(string memory limit, uint256 value) external; /// Get contract address. /// @dev EVM selector for this function is: 0xf6b4dfb4, --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -80,7 +80,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x324a7f5b +/// @dev the ERC-165 identifier for this interface is 0x8b91d192 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -180,21 +180,13 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x6a3841db, - /// or in textual repr: setCollectionLimit(string,uint32) - 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", + /// "ownerCanTransfer", /// "ownerCanDestroy", /// "transfersEnabled" /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x993b7fba, - /// or in textual repr: setCollectionLimit(string,bool) - function setCollectionLimit(string memory limit, bool value) external; + /// @dev EVM selector for this function is: 0x4ad890a8, + /// or in textual repr: setCollectionLimit(string,uint256) + function setCollectionLimit(string memory limit, uint256 value) external; /// Get contract address. /// @dev EVM selector for this function is: 0xf6b4dfb4, --- a/tests/src/eth/api/UniqueRefungible.sol +++ b/tests/src/eth/api/UniqueRefungible.sol @@ -80,7 +80,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x324a7f5b +/// @dev the ERC-165 identifier for this interface is 0x8b91d192 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -180,21 +180,13 @@ /// "tokenLimit", /// "sponsorTransferTimeout", /// "sponsorApproveTimeout" - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x6a3841db, - /// or in textual repr: setCollectionLimit(string,uint32) - 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", + /// "ownerCanTransfer", /// "ownerCanDestroy", /// "transfersEnabled" /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x993b7fba, - /// or in textual repr: setCollectionLimit(string,bool) - function setCollectionLimit(string memory limit, bool value) external; + /// @dev EVM selector for this function is: 0x4ad890a8, + /// or in textual repr: setCollectionLimit(string,uint256) + function setCollectionLimit(string memory limit, uint256 value) external; /// Get contract address. /// @dev EVM selector for this function is: 0xf6b4dfb4, --- a/tests/src/eth/createFTCollection.test.ts +++ b/tests/src/eth/createFTCollection.test.ts @@ -85,32 +85,44 @@ tokenLimit: 1000000, sponsorTransferTimeout: 6, sponsorApproveTimeout: 6, + ownerCanTransfer: 0, + ownerCanDestroy: 0, + transfersEnabled: 0, + }; + + const expectedLimits = { + accountTokenOwnershipLimit: 1000, + sponsoredDataSize: 1024, + sponsoredDataRateLimit: 30, + tokenLimit: 1000000, + sponsorTransferTimeout: 6, + sponsorApproveTimeout: 6, ownerCanTransfer: false, ownerCanDestroy: false, transfersEnabled: false, }; - + const collection = helper.ethNativeContract.collection(collectionAddress, 'ft', owner); - await collection.methods['setCollectionLimit(string,uint32)']('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataSize', limits.sponsoredDataSize).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('tokenLimit', limits.tokenLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsorTransferTimeout', limits.sponsorTransferTimeout).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsorApproveTimeout', limits.sponsorApproveTimeout).send(); - await collection.methods['setCollectionLimit(string,bool)']('ownerCanTransfer', limits.ownerCanTransfer).send(); - await collection.methods['setCollectionLimit(string,bool)']('ownerCanDestroy', limits.ownerCanDestroy).send(); - await collection.methods['setCollectionLimit(string,bool)']('transfersEnabled', limits.transfersEnabled).send(); + await collection.methods.setCollectionLimit('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send(); + await collection.methods.setCollectionLimit('sponsoredDataSize', limits.sponsoredDataSize).send(); + await collection.methods.setCollectionLimit('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send(); + await collection.methods.setCollectionLimit('tokenLimit', limits.tokenLimit).send(); + await collection.methods.setCollectionLimit('sponsorTransferTimeout', limits.sponsorTransferTimeout).send(); + await collection.methods.setCollectionLimit('sponsorApproveTimeout', limits.sponsorApproveTimeout).send(); + await collection.methods.setCollectionLimit('ownerCanTransfer', limits.ownerCanTransfer).send(); + await collection.methods.setCollectionLimit('ownerCanDestroy', limits.ownerCanDestroy).send(); + await collection.methods.setCollectionLimit('transfersEnabled', limits.transfersEnabled).send(); const data = (await helper.rft.getData(collectionId))!; - expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(limits.accountTokenOwnershipLimit); - expect(data.raw.limits.sponsoredDataSize).to.be.eq(limits.sponsoredDataSize); - expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(limits.sponsoredDataRateLimit); - expect(data.raw.limits.tokenLimit).to.be.eq(limits.tokenLimit); - expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(limits.sponsorTransferTimeout); - expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(limits.sponsorApproveTimeout); - expect(data.raw.limits.ownerCanTransfer).to.be.eq(limits.ownerCanTransfer); - expect(data.raw.limits.ownerCanDestroy).to.be.eq(limits.ownerCanDestroy); - expect(data.raw.limits.transfersEnabled).to.be.eq(limits.transfersEnabled); + expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit); + expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize); + expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit); + expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit); + expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout); + expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout); + expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer); + expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy); + expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled); }); itEth('Collection address exist', async ({helper}) => { @@ -257,11 +269,28 @@ }); itEth('(!negative test!) Set limits', async ({helper}) => { + + const invalidLimits = { + accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER), + transfersEnabled: 3, + }; + const owner = await helper.eth.createAccountWithBalance(donor); const {collectionAddress} = await helper.eth.createFungibleCollection(owner, 'Limits', DECIMALS, 'absolutely anything', 'ISNI'); const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'ft', owner); await expect(collectionEvm.methods - .setCollectionLimit('badLimit', 'true') - .call()).to.be.rejectedWith('unknown boolean limit "badLimit"'); + .setCollectionLimit('badLimit', '1') + .call()).to.be.rejectedWith('unknown limit "badLimit"'); + + await expect(collectionEvm.methods + .setCollectionLimit(Object.keys(invalidLimits)[0], invalidLimits.accountTokenOwnershipLimit) + .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`); + + await expect(collectionEvm.methods + .setCollectionLimit(Object.keys(invalidLimits)[1], invalidLimits.transfersEnabled) + .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`); }); + + + }); --- a/tests/src/eth/createNFTCollection.test.ts +++ b/tests/src/eth/createNFTCollection.test.ts @@ -124,32 +124,44 @@ tokenLimit: 1000000, sponsorTransferTimeout: 6, sponsorApproveTimeout: 6, + ownerCanTransfer: 0, + ownerCanDestroy: 0, + transfersEnabled: 0, + }; + + const expectedLimits = { + accountTokenOwnershipLimit: 1000, + sponsoredDataSize: 1024, + sponsoredDataRateLimit: 30, + tokenLimit: 1000000, + sponsorTransferTimeout: 6, + sponsorApproveTimeout: 6, ownerCanTransfer: false, ownerCanDestroy: false, transfersEnabled: false, }; const collection = helper.ethNativeContract.collection(collectionAddress, 'nft', owner); - await collection.methods['setCollectionLimit(string,uint32)']('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataSize', limits.sponsoredDataSize).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('tokenLimit', limits.tokenLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsorTransferTimeout', limits.sponsorTransferTimeout).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsorApproveTimeout', limits.sponsorApproveTimeout).send(); - await collection.methods['setCollectionLimit(string,bool)']('ownerCanTransfer', limits.ownerCanTransfer).send(); - await collection.methods['setCollectionLimit(string,bool)']('ownerCanDestroy', limits.ownerCanDestroy).send(); - await collection.methods['setCollectionLimit(string,bool)']('transfersEnabled', limits.transfersEnabled).send(); + await collection.methods.setCollectionLimit('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send(); + await collection.methods.setCollectionLimit('sponsoredDataSize', limits.sponsoredDataSize).send(); + await collection.methods.setCollectionLimit('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send(); + await collection.methods.setCollectionLimit('tokenLimit', limits.tokenLimit).send(); + await collection.methods.setCollectionLimit('sponsorTransferTimeout', limits.sponsorTransferTimeout).send(); + await collection.methods.setCollectionLimit('sponsorApproveTimeout', limits.sponsorApproveTimeout).send(); + await collection.methods.setCollectionLimit('ownerCanTransfer', limits.ownerCanTransfer).send(); + await collection.methods.setCollectionLimit('ownerCanDestroy', limits.ownerCanDestroy).send(); + await collection.methods.setCollectionLimit('transfersEnabled', limits.transfersEnabled).send(); - const data = (await helper.nft.getData(collectionId))!; - expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(limits.accountTokenOwnershipLimit); - expect(data.raw.limits.sponsoredDataSize).to.be.eq(limits.sponsoredDataSize); - expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(limits.sponsoredDataRateLimit); - expect(data.raw.limits.tokenLimit).to.be.eq(limits.tokenLimit); - expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(limits.sponsorTransferTimeout); - expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(limits.sponsorApproveTimeout); - expect(data.raw.limits.ownerCanTransfer).to.be.eq(limits.ownerCanTransfer); - expect(data.raw.limits.ownerCanDestroy).to.be.eq(limits.ownerCanDestroy); - expect(data.raw.limits.transfersEnabled).to.be.eq(limits.transfersEnabled); + const data = (await helper.rft.getData(collectionId))!; + expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit); + expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize); + expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit); + expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit); + expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout); + expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout); + expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer); + expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy); + expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled); }); itEth('Collection address exist', async ({helper}) => { @@ -270,12 +282,22 @@ }); itEth('(!negative test!) Set limits', async ({helper}) => { + const invalidLimits = { + accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER), + transfersEnabled: 3, + }; + const owner = await helper.eth.createAccountWithBalance(donor); const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'OLF'); const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner); + + await expect(collectionEvm.methods + .setCollectionLimit(Object.keys(invalidLimits)[0], invalidLimits.accountTokenOwnershipLimit) + .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`); + await expect(collectionEvm.methods - .setCollectionLimit('badLimit', 'true') - .call()).to.be.rejectedWith('unknown boolean limit "badLimit"'); + .setCollectionLimit(Object.keys(invalidLimits)[1], invalidLimits.transfersEnabled) + .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`); }); itEth('destroyCollection', async ({helper}) => { --- a/tests/src/eth/createRFTCollection.test.ts +++ b/tests/src/eth/createRFTCollection.test.ts @@ -159,32 +159,44 @@ tokenLimit: 1000000, sponsorTransferTimeout: 6, sponsorApproveTimeout: 6, + ownerCanTransfer: 0, + ownerCanDestroy: 0, + transfersEnabled: 0, + }; + + const expectedLimits = { + accountTokenOwnershipLimit: 1000, + sponsoredDataSize: 1024, + sponsoredDataRateLimit: 30, + tokenLimit: 1000000, + sponsorTransferTimeout: 6, + sponsorApproveTimeout: 6, ownerCanTransfer: false, ownerCanDestroy: false, transfersEnabled: false, }; - + const collection = helper.ethNativeContract.collection(collectionAddress, 'rft', owner); - await collection.methods['setCollectionLimit(string,uint32)']('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataSize', limits.sponsoredDataSize).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('tokenLimit', limits.tokenLimit).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsorTransferTimeout', limits.sponsorTransferTimeout).send(); - await collection.methods['setCollectionLimit(string,uint32)']('sponsorApproveTimeout', limits.sponsorApproveTimeout).send(); - await collection.methods['setCollectionLimit(string,bool)']('ownerCanTransfer', limits.ownerCanTransfer).send(); - await collection.methods['setCollectionLimit(string,bool)']('ownerCanDestroy', limits.ownerCanDestroy).send(); - await collection.methods['setCollectionLimit(string,bool)']('transfersEnabled', limits.transfersEnabled).send(); + await collection.methods.setCollectionLimit('accountTokenOwnershipLimit', limits.accountTokenOwnershipLimit).send(); + await collection.methods.setCollectionLimit('sponsoredDataSize', limits.sponsoredDataSize).send(); + await collection.methods.setCollectionLimit('sponsoredDataRateLimit', limits.sponsoredDataRateLimit).send(); + await collection.methods.setCollectionLimit('tokenLimit', limits.tokenLimit).send(); + await collection.methods.setCollectionLimit('sponsorTransferTimeout', limits.sponsorTransferTimeout).send(); + await collection.methods.setCollectionLimit('sponsorApproveTimeout', limits.sponsorApproveTimeout).send(); + await collection.methods.setCollectionLimit('ownerCanTransfer', limits.ownerCanTransfer).send(); + await collection.methods.setCollectionLimit('ownerCanDestroy', limits.ownerCanDestroy).send(); + await collection.methods.setCollectionLimit('transfersEnabled', limits.transfersEnabled).send(); const data = (await helper.rft.getData(collectionId))!; - expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(limits.accountTokenOwnershipLimit); - expect(data.raw.limits.sponsoredDataSize).to.be.eq(limits.sponsoredDataSize); - expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(limits.sponsoredDataRateLimit); - expect(data.raw.limits.tokenLimit).to.be.eq(limits.tokenLimit); - expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(limits.sponsorTransferTimeout); - expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(limits.sponsorApproveTimeout); - expect(data.raw.limits.ownerCanTransfer).to.be.eq(limits.ownerCanTransfer); - expect(data.raw.limits.ownerCanDestroy).to.be.eq(limits.ownerCanDestroy); - expect(data.raw.limits.transfersEnabled).to.be.eq(limits.transfersEnabled); + expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit); + expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize); + expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit); + expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit); + expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout); + expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout); + expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer); + expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy); + expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled); }); itEth('Collection address exist', async ({helper}) => { @@ -305,12 +317,22 @@ }); itEth('(!negative test!) Set limits', async ({helper}) => { + const invalidLimits = { + accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER), + transfersEnabled: 3, + }; + const owner = await helper.eth.createAccountWithBalance(donor); const {collectionAddress} = await helper.eth.createRFTCollection(owner, 'Limits', 'absolutely anything', 'ISNI'); const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'rft', owner); + + await expect(collectionEvm.methods + .setCollectionLimit(Object.keys(invalidLimits)[0], invalidLimits.accountTokenOwnershipLimit) + .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`); + await expect(collectionEvm.methods - .setCollectionLimit('badLimit', 'true') - .call()).to.be.rejectedWith('unknown boolean limit "badLimit"'); + .setCollectionLimit(Object.keys(invalidLimits)[1], invalidLimits.transfersEnabled) + .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`); }); itEth('destroyCollection', async ({helper}) => { -- gitstuff