From 8ca834e34e7f058073062cdebec2187e7cd93dd6 Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Tue, 20 Dec 2022 13:49:46 +0000 Subject: [PATCH] feat: add evm OptionUint type --- --- a/pallets/common/src/eth.rs +++ b/pallets/common/src/eth.rs @@ -66,6 +66,56 @@ T::CrossAccountId::from_sub(account_id) } +/// Ethereum representation of Optional value with uint256. +#[derive(Debug, Default, AbiCoder)] +pub struct OptionUint { + status: bool, + value: uint256, +} + +impl From for OptionUint { + fn from(value: u32) -> Self { + Self { + status: true, + value: uint256::from(value), + } + } +} + +impl From> for OptionUint { + fn from(value: Option) -> Self { + match value { + Some(value) => Self { + status: true, + value: value.into(), + }, + None => Self { + status: false, + value: Default::default(), + }, + } + } +} + +impl From> for OptionUint { + fn from(value: Option) -> Self { + match value { + Some(value) => Self { + status: true, + value: if value { + uint256::from(1) + } else { + Default::default() + }, + }, + None => Self { + status: false, + value: Default::default(), + }, + } + } +} + /// Cross account struct #[derive(Debug, Default, AbiCoder)] pub struct CrossAccount { @@ -164,8 +214,7 @@ #[derive(Debug, Default, AbiCoder)] pub struct CollectionLimit { field: CollectionLimitField, - status: bool, - value: uint256, + value: OptionUint, } impl CollectionLimit { @@ -173,43 +222,24 @@ pub fn from_int(field: CollectionLimitField, value: u32) -> Self { Self { field, - status: true, value: value.into(), } } /// Make [`CollectionLimit`] from [`CollectionLimitField`] and optional int value. pub fn from_opt_int(field: CollectionLimitField, value: Option) -> Self { - value - .map(|v| Self { - field, - status: true, - value: v.into(), - }) - .unwrap_or(Self { - field, - status: false, - value: Default::default(), - }) + Self { + field, + value: value.into(), + } } /// Make [`CollectionLimit`] from [`CollectionLimitField`] and bool value. pub fn from_opt_bool(field: CollectionLimitField, value: Option) -> Self { - value - .map(|v| Self { - field, - status: true, - value: if v { - uint256::from(1) - } else { - Default::default() - }, - }) - .unwrap_or(Self { - field, - status: false, - value: Default::default(), - }) + Self { + field, + value: value.into(), + } } } @@ -217,14 +247,14 @@ type Error = evm_coder::execution::Error; fn try_into(self) -> Result { - if !self.status { + if !self.value.status { return Err(Self::Error::Revert("user can't disable limits".into())); } - let value = self.value.try_into().map_err(|error| { + let value = self.value.value.try_into().map_err(|error| { Self::Error::Revert(format!( "can't convert value to u32 \"{}\" because: \"{error}\"", - self.value + self.value.value )) })?; --- 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 0x23201442 +/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -172,8 +172,8 @@ /// Set limits for the collection. /// @dev Throws error if limit not found. /// @param limit Some limit. - /// @dev EVM selector for this function is: 0x2a2235e7, - /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + /// @dev EVM selector for this function is: 0x2316ee74, + /// or in textual repr: setCollectionLimit((uint8,(bool,uint256))) function setCollectionLimit(CollectionLimit memory limit) public { require(false, stub_error); limit; @@ -257,19 +257,19 @@ /// Returns nesting for a collection /// @dev EVM selector for this function is: 0x22d25bfe, /// or in textual repr: collectionNestingRestrictedCollectionIds() - function collectionNestingRestrictedCollectionIds() public view returns (Tuple30 memory) { + function collectionNestingRestrictedCollectionIds() public view returns (Tuple33 memory) { require(false, stub_error); dummy; - return Tuple30(false, new uint256[](0)); + return Tuple33(false, new uint256[](0)); } /// Returns permissions for a collection /// @dev EVM selector for this function is: 0x5b2eaf4b, /// or in textual repr: collectionNestingPermissions() - function collectionNestingPermissions() public view returns (Tuple33[] memory) { + function collectionNestingPermissions() public view returns (Tuple36[] memory) { require(false, stub_error); dummy; - return new Tuple33[](0); + return new Tuple36[](0); } /// Set the collection access method. @@ -452,13 +452,13 @@ } /// @dev anonymous struct -struct Tuple33 { +struct Tuple36 { CollectionPermissions field_0; bool field_1; } /// @dev anonymous struct -struct Tuple30 { +struct Tuple33 { bool field_0; uint256[] field_1; } @@ -466,6 +466,10 @@ /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM. struct CollectionLimit { CollectionLimitField field; + OptionUint value; +} + +struct OptionUint { bool status; uint256 value; } --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -162,7 +162,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x23201442 +/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -316,8 +316,8 @@ /// Set limits for the collection. /// @dev Throws error if limit not found. /// @param limit Some limit. - /// @dev EVM selector for this function is: 0x2a2235e7, - /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + /// @dev EVM selector for this function is: 0x2316ee74, + /// or in textual repr: setCollectionLimit((uint8,(bool,uint256))) function setCollectionLimit(CollectionLimit memory limit) public { require(false, stub_error); limit; @@ -401,19 +401,19 @@ /// Returns nesting for a collection /// @dev EVM selector for this function is: 0x22d25bfe, /// or in textual repr: collectionNestingRestrictedCollectionIds() - function collectionNestingRestrictedCollectionIds() public view returns (Tuple42 memory) { + function collectionNestingRestrictedCollectionIds() public view returns (Tuple45 memory) { require(false, stub_error); dummy; - return Tuple42(false, new uint256[](0)); + return Tuple45(false, new uint256[](0)); } /// Returns permissions for a collection /// @dev EVM selector for this function is: 0x5b2eaf4b, /// or in textual repr: collectionNestingPermissions() - function collectionNestingPermissions() public view returns (Tuple45[] memory) { + function collectionNestingPermissions() public view returns (Tuple48[] memory) { require(false, stub_error); dummy; - return new Tuple45[](0); + return new Tuple48[](0); } /// Set the collection access method. @@ -596,13 +596,13 @@ } /// @dev anonymous struct -struct Tuple45 { +struct Tuple48 { CollectionPermissions field_0; bool field_1; } /// @dev anonymous struct -struct Tuple42 { +struct Tuple45 { bool field_0; uint256[] field_1; } @@ -610,6 +610,10 @@ /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM. struct CollectionLimit { CollectionLimitField field; + OptionUint value; +} + +struct OptionUint { bool status; uint256 value; } --- a/pallets/refungible/src/stubs/UniqueRefungible.sol +++ b/pallets/refungible/src/stubs/UniqueRefungible.sol @@ -162,7 +162,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x23201442 +/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -316,8 +316,8 @@ /// Set limits for the collection. /// @dev Throws error if limit not found. /// @param limit Some limit. - /// @dev EVM selector for this function is: 0x2a2235e7, - /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + /// @dev EVM selector for this function is: 0x2316ee74, + /// or in textual repr: setCollectionLimit((uint8,(bool,uint256))) function setCollectionLimit(CollectionLimit memory limit) public { require(false, stub_error); limit; @@ -401,19 +401,19 @@ /// Returns nesting for a collection /// @dev EVM selector for this function is: 0x22d25bfe, /// or in textual repr: collectionNestingRestrictedCollectionIds() - function collectionNestingRestrictedCollectionIds() public view returns (Tuple41 memory) { + function collectionNestingRestrictedCollectionIds() public view returns (Tuple44 memory) { require(false, stub_error); dummy; - return Tuple41(false, new uint256[](0)); + return Tuple44(false, new uint256[](0)); } /// Returns permissions for a collection /// @dev EVM selector for this function is: 0x5b2eaf4b, /// or in textual repr: collectionNestingPermissions() - function collectionNestingPermissions() public view returns (Tuple44[] memory) { + function collectionNestingPermissions() public view returns (Tuple47[] memory) { require(false, stub_error); dummy; - return new Tuple44[](0); + return new Tuple47[](0); } /// Set the collection access method. @@ -596,13 +596,13 @@ } /// @dev anonymous struct -struct Tuple44 { +struct Tuple47 { CollectionPermissions field_0; bool field_1; } /// @dev anonymous struct -struct Tuple41 { +struct Tuple44 { bool field_0; uint256[] field_1; } @@ -610,6 +610,10 @@ /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM. struct CollectionLimit { CollectionLimitField field; + OptionUint value; +} + +struct OptionUint { bool status; uint256 value; } --- a/tests/src/eth/abi/fungible.json +++ b/tests/src/eth/abi/fungible.json @@ -217,8 +217,15 @@ "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + { + "components": [ + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct OptionUint", + "name": "value", + "type": "tuple" + } ], "internalType": "struct CollectionLimit[]", "name": "", @@ -241,7 +248,7 @@ }, { "internalType": "bool", "name": "field_1", "type": "bool" } ], - "internalType": "struct Tuple33[]", + "internalType": "struct Tuple36[]", "name": "", "type": "tuple[]" } @@ -262,7 +269,7 @@ "type": "uint256[]" } ], - "internalType": "struct Tuple30", + "internalType": "struct Tuple33", "name": "", "type": "tuple" } @@ -500,8 +507,15 @@ "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + { + "components": [ + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct OptionUint", + "name": "value", + "type": "tuple" + } ], "internalType": "struct CollectionLimit", "name": "limit", --- a/tests/src/eth/abi/nonFungible.json +++ b/tests/src/eth/abi/nonFungible.json @@ -247,8 +247,15 @@ "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + { + "components": [ + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct OptionUint", + "name": "value", + "type": "tuple" + } ], "internalType": "struct CollectionLimit[]", "name": "", @@ -271,7 +278,7 @@ }, { "internalType": "bool", "name": "field_1", "type": "bool" } ], - "internalType": "struct Tuple45[]", + "internalType": "struct Tuple48[]", "name": "", "type": "tuple[]" } @@ -292,7 +299,7 @@ "type": "uint256[]" } ], - "internalType": "struct Tuple42", + "internalType": "struct Tuple45", "name": "", "type": "tuple" } @@ -662,8 +669,15 @@ "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + { + "components": [ + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct OptionUint", + "name": "value", + "type": "tuple" + } ], "internalType": "struct CollectionLimit", "name": "limit", --- a/tests/src/eth/abi/reFungible.json +++ b/tests/src/eth/abi/reFungible.json @@ -229,8 +229,15 @@ "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + { + "components": [ + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct OptionUint", + "name": "value", + "type": "tuple" + } ], "internalType": "struct CollectionLimit[]", "name": "", @@ -253,7 +260,7 @@ }, { "internalType": "bool", "name": "field_1", "type": "bool" } ], - "internalType": "struct Tuple44[]", + "internalType": "struct Tuple47[]", "name": "", "type": "tuple[]" } @@ -274,7 +281,7 @@ "type": "uint256[]" } ], - "internalType": "struct Tuple41", + "internalType": "struct Tuple44", "name": "", "type": "tuple" } @@ -644,8 +651,15 @@ "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + { + "components": [ + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct OptionUint", + "name": "value", + "type": "tuple" + } ], "internalType": "struct CollectionLimit", "name": "limit", --- 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 0x23201442 +/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -114,8 +114,8 @@ /// Set limits for the collection. /// @dev Throws error if limit not found. /// @param limit Some limit. - /// @dev EVM selector for this function is: 0x2a2235e7, - /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + /// @dev EVM selector for this function is: 0x2316ee74, + /// or in textual repr: setCollectionLimit((uint8,(bool,uint256))) function setCollectionLimit(CollectionLimit memory limit) external; /// Get contract address. @@ -166,12 +166,12 @@ /// Returns nesting for a collection /// @dev EVM selector for this function is: 0x22d25bfe, /// or in textual repr: collectionNestingRestrictedCollectionIds() - function collectionNestingRestrictedCollectionIds() external view returns (Tuple26 memory); + function collectionNestingRestrictedCollectionIds() external view returns (Tuple28 memory); /// Returns permissions for a collection /// @dev EVM selector for this function is: 0x5b2eaf4b, /// or in textual repr: collectionNestingPermissions() - function collectionNestingPermissions() external view returns (Tuple29[] memory); + function collectionNestingPermissions() external view returns (Tuple31[] memory); /// Set the collection access method. /// @param mode Access mode @@ -286,7 +286,7 @@ } /// @dev anonymous struct -struct Tuple29 { +struct Tuple31 { CollectionPermissions field_0; bool field_1; } @@ -300,7 +300,7 @@ } /// @dev anonymous struct -struct Tuple26 { +struct Tuple28 { bool field_0; uint256[] field_1; } @@ -308,6 +308,10 @@ /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM. struct CollectionLimit { CollectionLimitField field; + OptionUint value; +} + +struct OptionUint { bool status; uint256 value; } --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -115,7 +115,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x23201442 +/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -216,8 +216,8 @@ /// Set limits for the collection. /// @dev Throws error if limit not found. /// @param limit Some limit. - /// @dev EVM selector for this function is: 0x2a2235e7, - /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + /// @dev EVM selector for this function is: 0x2316ee74, + /// or in textual repr: setCollectionLimit((uint8,(bool,uint256))) function setCollectionLimit(CollectionLimit memory limit) external; /// Get contract address. @@ -268,12 +268,12 @@ /// Returns nesting for a collection /// @dev EVM selector for this function is: 0x22d25bfe, /// or in textual repr: collectionNestingRestrictedCollectionIds() - function collectionNestingRestrictedCollectionIds() external view returns (Tuple36 memory); + function collectionNestingRestrictedCollectionIds() external view returns (Tuple38 memory); /// Returns permissions for a collection /// @dev EVM selector for this function is: 0x5b2eaf4b, /// or in textual repr: collectionNestingPermissions() - function collectionNestingPermissions() external view returns (Tuple39[] memory); + function collectionNestingPermissions() external view returns (Tuple41[] memory); /// Set the collection access method. /// @param mode Access mode @@ -388,7 +388,7 @@ } /// @dev anonymous struct -struct Tuple39 { +struct Tuple41 { CollectionPermissions field_0; bool field_1; } @@ -402,7 +402,7 @@ } /// @dev anonymous struct -struct Tuple36 { +struct Tuple38 { bool field_0; uint256[] field_1; } @@ -410,6 +410,10 @@ /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM. struct CollectionLimit { CollectionLimitField field; + OptionUint value; +} + +struct OptionUint { bool status; uint256 value; } --- a/tests/src/eth/api/UniqueRefungible.sol +++ b/tests/src/eth/api/UniqueRefungible.sol @@ -115,7 +115,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x23201442 +/// @dev the ERC-165 identifier for this interface is 0x2a14cfd1 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -216,8 +216,8 @@ /// Set limits for the collection. /// @dev Throws error if limit not found. /// @param limit Some limit. - /// @dev EVM selector for this function is: 0x2a2235e7, - /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + /// @dev EVM selector for this function is: 0x2316ee74, + /// or in textual repr: setCollectionLimit((uint8,(bool,uint256))) function setCollectionLimit(CollectionLimit memory limit) external; /// Get contract address. @@ -268,12 +268,12 @@ /// Returns nesting for a collection /// @dev EVM selector for this function is: 0x22d25bfe, /// or in textual repr: collectionNestingRestrictedCollectionIds() - function collectionNestingRestrictedCollectionIds() external view returns (Tuple35 memory); + function collectionNestingRestrictedCollectionIds() external view returns (Tuple37 memory); /// Returns permissions for a collection /// @dev EVM selector for this function is: 0x5b2eaf4b, /// or in textual repr: collectionNestingPermissions() - function collectionNestingPermissions() external view returns (Tuple38[] memory); + function collectionNestingPermissions() external view returns (Tuple40[] memory); /// Set the collection access method. /// @param mode Access mode @@ -388,7 +388,7 @@ } /// @dev anonymous struct -struct Tuple38 { +struct Tuple40 { CollectionPermissions field_0; bool field_1; } @@ -402,7 +402,7 @@ } /// @dev anonymous struct -struct Tuple35 { +struct Tuple37 { bool field_0; uint256[] field_1; } @@ -410,6 +410,10 @@ /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) field representation for EVM. struct CollectionLimit { CollectionLimitField field; + OptionUint value; +} + +struct OptionUint { bool status; uint256 value; } --- a/tests/src/eth/collectionLimits.test.ts +++ b/tests/src/eth/collectionLimits.test.ts @@ -46,15 +46,15 @@ }; const collectionEvm = helper.ethNativeContract.collection(collectionAddress, testCase.case, owner); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: limits.accountTokenOwnershipLimit}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsoredDataSize, status: true, value: limits.sponsoredDataSize}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsoredDataRateLimit, status: true, value: limits.sponsoredDataRateLimit}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.TokenLimit, status: true, value: limits.tokenLimit}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsorTransferTimeout, status: true, value: limits.sponsorTransferTimeout}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsorApproveTimeout, status: true, value: limits.sponsorApproveTimeout}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanTransfer, status: true, value: limits.ownerCanTransfer}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanDestroy, status: true, value: limits.ownerCanDestroy}).send(); - await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.TransferEnabled, status: true, value: limits.transfersEnabled}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: limits.accountTokenOwnershipLimit}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsoredDataSize, value: {status: true, value: limits.sponsoredDataSize}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsoredDataRateLimit, value: {status: true, value: limits.sponsoredDataRateLimit}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.TokenLimit, value: {status: true, value: limits.tokenLimit}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsorTransferTimeout, value: {status: true, value: limits.sponsorTransferTimeout}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.SponsorApproveTimeout, value: {status: true, value: limits.sponsorApproveTimeout}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanTransfer, value: {status: true, value: limits.ownerCanTransfer}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanDestroy, value: {status: true, value: limits.ownerCanDestroy}}).send(); + await collectionEvm.methods.setCollectionLimit({field: CollectionLimitField.TransferEnabled, value: {status: true, value: limits.transfersEnabled}}).send(); // Check limits from sub: const data = (await helper.rft.getData(collectionId))!; @@ -63,15 +63,15 @@ // Check limits from eth: const limitsEvm = await collectionEvm.methods.collectionLimits().call({from: owner}); expect(limitsEvm).to.have.length(9); - expect(limitsEvm[0]).to.deep.eq([CollectionLimitField.AccountTokenOwnership.toString(), true, limits.accountTokenOwnershipLimit.toString()]); - expect(limitsEvm[1]).to.deep.eq([CollectionLimitField.SponsoredDataSize.toString(), true, limits.sponsoredDataSize.toString()]); - expect(limitsEvm[2]).to.deep.eq([CollectionLimitField.SponsoredDataRateLimit.toString(), true, limits.sponsoredDataRateLimit.toString()]); - expect(limitsEvm[3]).to.deep.eq([CollectionLimitField.TokenLimit.toString(), true, limits.tokenLimit.toString()]); - expect(limitsEvm[4]).to.deep.eq([CollectionLimitField.SponsorTransferTimeout.toString(), true, limits.sponsorTransferTimeout.toString()]); - expect(limitsEvm[5]).to.deep.eq([CollectionLimitField.SponsorApproveTimeout.toString(), true, limits.sponsorApproveTimeout.toString()]); - expect(limitsEvm[6]).to.deep.eq([CollectionLimitField.OwnerCanTransfer.toString(), true, limits.ownerCanTransfer.toString()]); - expect(limitsEvm[7]).to.deep.eq([CollectionLimitField.OwnerCanDestroy.toString(), true, limits.ownerCanDestroy.toString()]); - expect(limitsEvm[8]).to.deep.eq([CollectionLimitField.TransferEnabled.toString(), true, limits.transfersEnabled.toString()]); + expect(limitsEvm[0]).to.deep.eq([CollectionLimitField.AccountTokenOwnership.toString(), [true, limits.accountTokenOwnershipLimit.toString()]]); + expect(limitsEvm[1]).to.deep.eq([CollectionLimitField.SponsoredDataSize.toString(), [true, limits.sponsoredDataSize.toString()]]); + expect(limitsEvm[2]).to.deep.eq([CollectionLimitField.SponsoredDataRateLimit.toString(), [true, limits.sponsoredDataRateLimit.toString()]]); + expect(limitsEvm[3]).to.deep.eq([CollectionLimitField.TokenLimit.toString(), [true, limits.tokenLimit.toString()]]); + expect(limitsEvm[4]).to.deep.eq([CollectionLimitField.SponsorTransferTimeout.toString(), [true, limits.sponsorTransferTimeout.toString()]]); + expect(limitsEvm[5]).to.deep.eq([CollectionLimitField.SponsorApproveTimeout.toString(), [true, limits.sponsorApproveTimeout.toString()]]); + expect(limitsEvm[6]).to.deep.eq([CollectionLimitField.OwnerCanTransfer.toString(), [true, limits.ownerCanTransfer.toString()]]); + expect(limitsEvm[7]).to.deep.eq([CollectionLimitField.OwnerCanDestroy.toString(), [true, limits.ownerCanDestroy.toString()]]); + expect(limitsEvm[8]).to.deep.eq([CollectionLimitField.TransferEnabled.toString(), [true, limits.transfersEnabled.toString()]]); })); }); @@ -101,24 +101,24 @@ // Cannot set non-existing limit await expect(collectionEvm.methods - .setCollectionLimit({field: 9, status: true, value: 1}) + .setCollectionLimit({field: 9, value: {status: true, value: 1}}) .call()).to.be.rejectedWith('Value not convertible into enum "CollectionLimitField"'); // Cannot disable limits await expect(collectionEvm.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: false, value: 200}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: false, value: 200}}) .call()).to.be.rejectedWith('user can\'t disable limits'); await expect(collectionEvm.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: invalidLimits.accountTokenOwnershipLimit}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: invalidLimits.accountTokenOwnershipLimit}}) .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`); await expect(collectionEvm.methods - .setCollectionLimit({field: CollectionLimitField.TransferEnabled, status: true, value: 3}) + .setCollectionLimit({field: CollectionLimitField.TransferEnabled, value: {status: true, value: 3}}) .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`); expect(() => collectionEvm.methods - .setCollectionLimit({field: CollectionLimitField.SponsoredDataSize, status: true, value: -1}).send()).to.throw('value out-of-bounds'); + .setCollectionLimit({field: CollectionLimitField.SponsoredDataSize, value: {status: true, value: -1}}).send()).to.throw('value out-of-bounds'); })); [ @@ -133,12 +133,12 @@ const collectionEvm = helper.ethNativeContract.collection(collectionAddress, testCase.case, owner); await expect(collectionEvm.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call({from: nonOwner})) .to.be.rejectedWith('NoPermission'); await expect(collectionEvm.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .send({from: nonOwner})) .to.be.rejected; })); --- a/tests/src/eth/createFTCollection.test.ts +++ b/tests/src/eth/createFTCollection.test.ts @@ -197,7 +197,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); @@ -222,7 +222,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); --- a/tests/src/eth/createNFTCollection.test.ts +++ b/tests/src/eth/createNFTCollection.test.ts @@ -208,7 +208,7 @@ } { await expect(malfeasantCollection.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); @@ -233,7 +233,7 @@ } { await expect(malfeasantCollection.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); --- a/tests/src/eth/createRFTCollection.test.ts +++ b/tests/src/eth/createRFTCollection.test.ts @@ -240,7 +240,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); @@ -265,7 +265,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, value: {status: true, value: 1000}}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); --- a/tests/src/eth/events.test.ts +++ b/tests/src/eth/events.test.ts @@ -233,7 +233,7 @@ }); const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]); { - await collection.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanTransfer, status: true, value: 0}).send({from: owner}); + await collection.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanTransfer, value: {status: true, value: 0}}).send({from: owner}); await helper.wait.newBlocks(1); expect(ethEvents).to.containSubset([ { --- a/tests/src/eth/util/playgrounds/types.ts +++ b/tests/src/eth/util/playgrounds/types.ts @@ -13,6 +13,12 @@ event: string, args: { [key: string]: string } }; + +export interface OptionUint { + status: boolean, + value: bigint, +} + export interface TEthCrossAccount { readonly eth: string, readonly sub: string | Uint8Array, @@ -40,6 +46,5 @@ export interface CollectionLimit { field: CollectionLimitField, - status: boolean, - value: bigint | number, + value: OptionUint, } -- gitstuff