From a4e6c79aaf401f7cdd3f8f1ef5fe52ecac4062c5 Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Tue, 20 Dec 2022 09:42:12 +0000 Subject: [PATCH] feat: Rewrite tuple to named structures for CollectionLimits. --- --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -36,7 +36,7 @@ Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf, eth::{ Property as PropertyStruct, EthCrossAccount, CollectionPermissions as EvmPermissions, - CollectionLimits as EvmCollectionLimits, + CollectionLimitField as EvmCollectionLimits, self, }, weights::WeightInfo, }; @@ -299,52 +299,16 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. - fn collection_limits(&self) -> Result> { - let convert_value_limit = |limit: EvmCollectionLimits, - value: Option| - -> (EvmCollectionLimits, bool, uint256) { - value - .map(|v| (limit, true, v.into())) - .unwrap_or((limit, false, Default::default())) - }; - - let convert_bool_limit = |limit: EvmCollectionLimits, - value: Option| - -> (EvmCollectionLimits, bool, uint256) { - value - .map(|v| { - ( - limit, - true, - if v { - uint256::from(1) - } else { - Default::default() - }, - ) - }) - .unwrap_or((limit, false, Default::default())) - }; - + /// @return Array of collection limits + fn collection_limits(&self) -> Result> { let limits = &self.collection.limits; Ok(vec![ - convert_value_limit( + eth::CollectionLimit::from_opt_int( EvmCollectionLimits::AccountTokenOwnership, limits.account_token_ownership_limit, ), - convert_value_limit( + eth::CollectionLimit::from_opt_int( EvmCollectionLimits::SponsoredDataSize, limits.sponsored_data_size, ), @@ -352,38 +316,36 @@ .sponsored_data_rate_limit .and_then(|limit| { if let SponsoringRateLimit::Blocks(blocks) = limit { - Some(( + Some(eth::CollectionLimit::from_int( EvmCollectionLimits::SponsoredDataRateLimit, - true, - blocks.into(), + blocks, )) } else { None } }) - .unwrap_or(( + .unwrap_or(eth::CollectionLimit::from_int( EvmCollectionLimits::SponsoredDataRateLimit, - false, Default::default(), )), - convert_value_limit(EvmCollectionLimits::TokenLimit, limits.token_limit), - convert_value_limit( + eth::CollectionLimit::from_opt_int(EvmCollectionLimits::TokenLimit, limits.token_limit), + eth::CollectionLimit::from_opt_int( EvmCollectionLimits::SponsorTransferTimeout, limits.sponsor_transfer_timeout, ), - convert_value_limit( + eth::CollectionLimit::from_opt_int( EvmCollectionLimits::SponsorApproveTimeout, limits.sponsor_approve_timeout, ), - convert_bool_limit( + eth::CollectionLimit::from_opt_bool( EvmCollectionLimits::OwnerCanTransfer, limits.owner_can_transfer, ), - convert_bool_limit( + eth::CollectionLimit::from_opt_bool( EvmCollectionLimits::OwnerCanDestroy, limits.owner_can_destroy, ), - convert_bool_limit( + eth::CollectionLimit::from_opt_bool( EvmCollectionLimits::TransferEnabled, limits.transfers_enabled, ), @@ -392,82 +354,17 @@ /// 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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. + /// @param limit Some limit. #[solidity(rename_selector = "setCollectionLimit")] fn set_collection_limit( &mut self, caller: caller, - limit: EvmCollectionLimits, - status: bool, - value: uint256, + limit: eth::CollectionLimit, ) -> Result { self.consume_store_reads_and_writes(1, 1)?; - - if !status { - return Err(Error::Revert("user can't disable limits".into())); - } - - 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 - ))) - } - }; - - let mut limits = self.limits.clone(); - - match limit { - EvmCollectionLimits::AccountTokenOwnership => { - limits.account_token_ownership_limit = Some(value); - } - EvmCollectionLimits::SponsoredDataSize => { - limits.sponsored_data_size = Some(value); - } - EvmCollectionLimits::SponsoredDataRateLimit => { - limits.sponsored_data_rate_limit = Some(SponsoringRateLimit::Blocks(value)); - } - EvmCollectionLimits::TokenLimit => { - limits.token_limit = Some(value); - } - EvmCollectionLimits::SponsorTransferTimeout => { - limits.sponsor_transfer_timeout = Some(value); - } - EvmCollectionLimits::SponsorApproveTimeout => { - limits.sponsor_approve_timeout = Some(value); - } - EvmCollectionLimits::OwnerCanTransfer => { - limits.owner_can_transfer = Some(convert_value_to_bool()?); - } - EvmCollectionLimits::OwnerCanDestroy => { - limits.owner_can_destroy = Some(convert_value_to_bool()?); - } - EvmCollectionLimits::TransferEnabled => { - limits.transfers_enabled = Some(convert_value_to_bool()?); - } - _ => return Err(Error::Revert(format!("unknown limit \"{:?}\"", limit))), - } let caller = T::CrossAccountId::from_eth(caller); - >::update_limits(&caller, self, limits).map_err(dispatch_to_evm::) + >::update_limits(&caller, self, limit.try_into()?).map_err(dispatch_to_evm::) } /// Get contract address. --- a/pallets/common/src/eth.rs +++ b/pallets/common/src/eth.rs @@ -16,6 +16,7 @@ //! The module contains a number of functions for converting and checking ethereum identifiers. +use alloc::format; use sp_std::{vec, vec::Vec}; use evm_coder::{ AbiCoder, @@ -129,7 +130,7 @@ /// [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. #[derive(Debug, Default, Clone, Copy, AbiCoder)] #[repr(u8)] -pub enum CollectionLimits { +pub enum CollectionLimitField { /// How many tokens can a user have on one account. #[default] AccountTokenOwnership, @@ -158,6 +159,116 @@ /// Is it possible to send tokens from this collection between users. TransferEnabled, } + +#[derive(Debug, Default, AbiCoder)] +pub struct CollectionLimit { + field: CollectionLimitField, + status: bool, + value: uint256, +} + +impl CollectionLimit { + pub fn from_int(field: CollectionLimitField, value: u32) -> Self { + Self { + field, + status: true, + value: value.into(), + } + } + + 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(), + }) + } + + 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(), + }) + } +} + +impl TryInto for CollectionLimit { + type Error = evm_coder::execution::Error; + + fn try_into(self) -> Result { + if !self.status { + return Err(Self::Error::Revert("user can't disable limits".into())); + } + + let value = self.value.try_into().map_err(|error| { + Self::Error::Revert(format!( + "can't convert value to u32 \"{}\" because: \"{error}\"", + self.value + )) + })?; + + let convert_value_to_bool = || match value { + 0 => Ok(false), + 1 => Ok(true), + _ => { + return Err(Self::Error::Revert(format!( + "can't convert value to boolean \"{value}\"" + ))) + } + }; + + let mut limits = up_data_structs::CollectionLimits::default(); + match self.field { + CollectionLimitField::AccountTokenOwnership => { + limits.account_token_ownership_limit = Some(value); + } + CollectionLimitField::SponsoredDataSize => { + limits.sponsored_data_size = Some(value); + } + CollectionLimitField::SponsoredDataRateLimit => { + limits.sponsored_data_rate_limit = + Some(up_data_structs::SponsoringRateLimit::Blocks(value)); + } + CollectionLimitField::TokenLimit => { + limits.token_limit = Some(value); + } + CollectionLimitField::SponsorTransferTimeout => { + limits.sponsor_transfer_timeout = Some(value); + } + CollectionLimitField::SponsorApproveTimeout => { + limits.sponsor_approve_timeout = Some(value); + } + CollectionLimitField::OwnerCanTransfer => { + limits.owner_can_transfer = Some(convert_value_to_bool()?); + } + CollectionLimitField::OwnerCanDestroy => { + limits.owner_can_destroy = Some(convert_value_to_bool()?); + } + CollectionLimitField::TransferEnabled => { + limits.transfers_enabled = Some(convert_value_to_bool()?); + } + }; + Ok(limits) + } +} + /// Ethereum representation of `NestingPermissions` (see [`up_data_structs::NestingPermissions`]) fields as an enumeration. #[derive(Default, Debug, Clone, Copy, AbiCoder)] #[repr(u8)] @@ -173,7 +284,7 @@ /// Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration. #[derive(AbiCoder, Copy, Clone, Default, Debug)] #[repr(u8)] -pub enum EthTokenPermissions { +pub enum TokenPermissionField { /// Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`] #[default] Mutable, @@ -189,7 +300,7 @@ #[derive(Debug, Default, AbiCoder)] pub struct PropertyPermission { /// TokenPermission field. - code: EthTokenPermissions, + code: TokenPermissionField, /// TokenPermission value. value: bool, } @@ -198,15 +309,15 @@ pub fn into_vec(pp: up_data_structs::PropertyPermission) -> Vec { vec![ PropertyPermission { - code: EthTokenPermissions::Mutable, + code: TokenPermissionField::Mutable, value: pp.mutable, }, PropertyPermission { - code: EthTokenPermissions::TokenOwner, + code: TokenPermissionField::TokenOwner, value: pp.token_owner, }, PropertyPermission { - code: EthTokenPermissions::CollectionAdmin, + code: TokenPermissionField::CollectionAdmin, value: pp.collection_admin, }, ] @@ -217,9 +328,9 @@ for PropertyPermission { code, value } in permission { match code { - EthTokenPermissions::Mutable => token_permission.mutable = value, - EthTokenPermissions::TokenOwner => token_permission.token_owner = value, - EthTokenPermissions::CollectionAdmin => token_permission.collection_admin = value, + TokenPermissionField::Mutable => token_permission.mutable = value, + TokenPermissionField::TokenOwner => token_permission.token_owner = value, + TokenPermissionField::CollectionAdmin => token_permission.collection_admin = value, } } token_permission @@ -262,12 +373,12 @@ let mut perms = Vec::new(); for TokenPropertyPermission { key, permissions } in permissions { - if permissions.len() > ::FIELDS_COUNT { + if permissions.len() > ::FIELDS_COUNT { return Err(alloc::format!( "Actual number of fields {} for {}, which exceeds the maximum value of {}", permissions.len(), stringify!(EthTokenPermissions), - ::FIELDS_COUNT + ::FIELDS_COUNT ) .as_str() .into()); --- 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 0x81172a75 +/// @dev the ERC-165 identifier for this interface is 0x23201442 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -160,50 +160,23 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. + /// @return Array of collection limits /// @dev EVM selector for this function is: 0xf63bc572, /// or in textual repr: collectionLimits() - function collectionLimits() public view returns (Tuple23[] memory) { + function collectionLimits() public view returns (CollectionLimit[] memory) { require(false, stub_error); dummy; - return new Tuple23[](0); + return new CollectionLimit[](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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x88150bd0, - /// or in textual repr: setCollectionLimit(uint8,bool,uint256) - function setCollectionLimit( - CollectionLimits limit, - bool status, - uint256 value - ) public { + /// @param limit Some limit. + /// @dev EVM selector for this function is: 0x2a2235e7, + /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + function setCollectionLimit(CollectionLimit memory limit) public { require(false, stub_error); limit; - status; - value; dummy = 0; } @@ -284,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 (Tuple29 memory) { + function collectionNestingRestrictedCollectionIds() public view returns (Tuple30 memory) { require(false, stub_error); dummy; - return Tuple29(false, new uint256[](0)); + return Tuple30(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 (Tuple32[] memory) { + function collectionNestingPermissions() public view returns (Tuple33[] memory) { require(false, stub_error); dummy; - return new Tuple32[](0); + return new Tuple33[](0); } /// Set the collection access method. @@ -479,19 +452,25 @@ } /// @dev anonymous struct -struct Tuple32 { +struct Tuple33 { CollectionPermissions field_0; bool field_1; } /// @dev anonymous struct -struct Tuple29 { +struct Tuple30 { bool field_0; uint256[] field_1; } +struct CollectionLimit { + CollectionLimitField field; + bool status; + uint256 value; +} + /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. -enum CollectionLimits { +enum CollectionLimitField { /// @dev How many tokens can a user have on one account. AccountTokenOwnership, /// @dev How many bytes of data are available for sponsorship. @@ -510,13 +489,6 @@ OwnerCanDestroy, /// @dev Is it possible to send tokens from this collection between users. TransferEnabled -} - -/// @dev anonymous struct -struct Tuple23 { - CollectionLimits field_0; - bool field_1; - uint256 field_2; } /// @dev Ethereum representation of collection [`PropertyKey`](up_data_structs::PropertyKey) and [`PropertyValue`](up_data_structs::PropertyValue). --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -146,13 +146,13 @@ /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) as an key and value. struct PropertyPermission { /// @dev TokenPermission field. - EthTokenPermissions code; + TokenPermissionField code; /// @dev TokenPermission value. bool value; } /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration. -enum EthTokenPermissions { +enum TokenPermissionField { /// @dev Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`] Mutable, /// @dev Change permission for the collection administrator. See [`up_data_structs::PropertyPermission::token_owner`] @@ -162,7 +162,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x81172a75 +/// @dev the ERC-165 identifier for this interface is 0x23201442 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -304,50 +304,23 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. + /// @return Array of collection limits /// @dev EVM selector for this function is: 0xf63bc572, /// or in textual repr: collectionLimits() - function collectionLimits() public view returns (Tuple35[] memory) { + function collectionLimits() public view returns (CollectionLimit[] memory) { require(false, stub_error); dummy; - return new Tuple35[](0); + return new CollectionLimit[](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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x88150bd0, - /// or in textual repr: setCollectionLimit(uint8,bool,uint256) - function setCollectionLimit( - CollectionLimits limit, - bool status, - uint256 value - ) public { + /// @param limit Some limit. + /// @dev EVM selector for this function is: 0x2a2235e7, + /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + function setCollectionLimit(CollectionLimit memory limit) public { require(false, stub_error); limit; - status; - value; dummy = 0; } @@ -428,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 (Tuple42 memory) { require(false, stub_error); dummy; - return Tuple41(false, new uint256[](0)); + return Tuple42(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 (Tuple45[] memory) { require(false, stub_error); dummy; - return new Tuple44[](0); + return new Tuple45[](0); } /// Set the collection access method. @@ -623,19 +596,25 @@ } /// @dev anonymous struct -struct Tuple44 { +struct Tuple45 { CollectionPermissions field_0; bool field_1; } /// @dev anonymous struct -struct Tuple41 { +struct Tuple42 { bool field_0; uint256[] field_1; } +struct CollectionLimit { + CollectionLimitField field; + bool status; + uint256 value; +} + /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. -enum CollectionLimits { +enum CollectionLimitField { /// @dev How many tokens can a user have on one account. AccountTokenOwnership, /// @dev How many bytes of data are available for sponsorship. @@ -654,13 +633,6 @@ OwnerCanDestroy, /// @dev Is it possible to send tokens from this collection between users. TransferEnabled -} - -/// @dev anonymous struct -struct Tuple35 { - CollectionLimits field_0; - bool field_1; - uint256 field_2; } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension --- a/pallets/refungible/src/stubs/UniqueRefungible.sol +++ b/pallets/refungible/src/stubs/UniqueRefungible.sol @@ -146,13 +146,13 @@ /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) as an key and value. struct PropertyPermission { /// @dev TokenPermission field. - EthTokenPermissions code; + TokenPermissionField code; /// @dev TokenPermission value. bool value; } /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration. -enum EthTokenPermissions { +enum TokenPermissionField { /// @dev Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`] Mutable, /// @dev Change permission for the collection administrator. See [`up_data_structs::PropertyPermission::token_owner`] @@ -162,7 +162,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x81172a75 +/// @dev the ERC-165 identifier for this interface is 0x23201442 contract Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -304,50 +304,23 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. + /// @return Array of collection limits /// @dev EVM selector for this function is: 0xf63bc572, /// or in textual repr: collectionLimits() - function collectionLimits() public view returns (Tuple34[] memory) { + function collectionLimits() public view returns (CollectionLimit[] memory) { require(false, stub_error); dummy; - return new Tuple34[](0); + return new CollectionLimit[](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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x88150bd0, - /// or in textual repr: setCollectionLimit(uint8,bool,uint256) - function setCollectionLimit( - CollectionLimits limit, - bool status, - uint256 value - ) public { + /// @param limit Some limit. + /// @dev EVM selector for this function is: 0x2a2235e7, + /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + function setCollectionLimit(CollectionLimit memory limit) public { require(false, stub_error); limit; - status; - value; dummy = 0; } @@ -428,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 (Tuple40 memory) { + function collectionNestingRestrictedCollectionIds() public view returns (Tuple41 memory) { require(false, stub_error); dummy; - return Tuple40(false, new uint256[](0)); + return Tuple41(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 (Tuple43[] memory) { + function collectionNestingPermissions() public view returns (Tuple44[] memory) { require(false, stub_error); dummy; - return new Tuple43[](0); + return new Tuple44[](0); } /// Set the collection access method. @@ -623,19 +596,25 @@ } /// @dev anonymous struct -struct Tuple43 { +struct Tuple44 { CollectionPermissions field_0; bool field_1; } /// @dev anonymous struct -struct Tuple40 { +struct Tuple41 { bool field_0; uint256[] field_1; } +struct CollectionLimit { + CollectionLimitField field; + bool status; + uint256 value; +} + /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. -enum CollectionLimits { +enum CollectionLimitField { /// @dev How many tokens can a user have on one account. AccountTokenOwnership, /// @dev How many bytes of data are available for sponsorship. @@ -654,13 +633,6 @@ OwnerCanDestroy, /// @dev Is it possible to send tokens from this collection between users. TransferEnabled -} - -/// @dev anonymous struct -struct Tuple34 { - CollectionLimits field_0; - bool field_1; - uint256 field_2; } /// @dev the ERC-165 identifier for this interface is 0x5b5e139f --- a/tests/src/eth/abi/fungible.json +++ b/tests/src/eth/abi/fungible.json @@ -213,14 +213,14 @@ { "components": [ { - "internalType": "enum CollectionLimits", - "name": "field_0", + "internalType": "enum CollectionLimitField", + "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "field_1", "type": "bool" }, - { "internalType": "uint256", "name": "field_2", "type": "uint256" } + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } ], - "internalType": "struct Tuple23[]", + "internalType": "struct CollectionLimit[]", "name": "", "type": "tuple[]" } @@ -241,7 +241,7 @@ }, { "internalType": "bool", "name": "field_1", "type": "bool" } ], - "internalType": "struct Tuple32[]", + "internalType": "struct Tuple33[]", "name": "", "type": "tuple[]" } @@ -262,7 +262,7 @@ "type": "uint256[]" } ], - "internalType": "struct Tuple29", + "internalType": "struct Tuple30", "name": "", "type": "tuple" } @@ -494,12 +494,19 @@ { "inputs": [ { - "internalType": "enum CollectionLimits", + "components": [ + { + "internalType": "enum CollectionLimitField", + "name": "field", + "type": "uint8" + }, + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct CollectionLimit", "name": "limit", - "type": "uint8" - }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + "type": "tuple" + } ], "name": "setCollectionLimit", "outputs": [], --- a/tests/src/eth/abi/nonFungible.json +++ b/tests/src/eth/abi/nonFungible.json @@ -243,14 +243,14 @@ { "components": [ { - "internalType": "enum CollectionLimits", - "name": "field_0", + "internalType": "enum CollectionLimitField", + "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "field_1", "type": "bool" }, - { "internalType": "uint256", "name": "field_2", "type": "uint256" } + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } ], - "internalType": "struct Tuple35[]", + "internalType": "struct CollectionLimit[]", "name": "", "type": "tuple[]" } @@ -271,7 +271,7 @@ }, { "internalType": "bool", "name": "field_1", "type": "bool" } ], - "internalType": "struct Tuple44[]", + "internalType": "struct Tuple45[]", "name": "", "type": "tuple[]" } @@ -292,7 +292,7 @@ "type": "uint256[]" } ], - "internalType": "struct Tuple41", + "internalType": "struct Tuple42", "name": "", "type": "tuple" } @@ -656,12 +656,19 @@ { "inputs": [ { - "internalType": "enum CollectionLimits", + "components": [ + { + "internalType": "enum CollectionLimitField", + "name": "field", + "type": "uint8" + }, + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct CollectionLimit", "name": "limit", - "type": "uint8" - }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + "type": "tuple" + } ], "name": "setCollectionLimit", "outputs": [], @@ -756,7 +763,7 @@ { "components": [ { - "internalType": "enum EthTokenPermissions", + "internalType": "enum TokenPermissionField", "name": "code", "type": "uint8" }, @@ -822,7 +829,7 @@ { "components": [ { - "internalType": "enum EthTokenPermissions", + "internalType": "enum TokenPermissionField", "name": "code", "type": "uint8" }, --- a/tests/src/eth/abi/reFungible.json +++ b/tests/src/eth/abi/reFungible.json @@ -225,14 +225,14 @@ { "components": [ { - "internalType": "enum CollectionLimits", - "name": "field_0", + "internalType": "enum CollectionLimitField", + "name": "field", "type": "uint8" }, - { "internalType": "bool", "name": "field_1", "type": "bool" }, - { "internalType": "uint256", "name": "field_2", "type": "uint256" } + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } ], - "internalType": "struct Tuple34[]", + "internalType": "struct CollectionLimit[]", "name": "", "type": "tuple[]" } @@ -253,7 +253,7 @@ }, { "internalType": "bool", "name": "field_1", "type": "bool" } ], - "internalType": "struct Tuple43[]", + "internalType": "struct Tuple44[]", "name": "", "type": "tuple[]" } @@ -274,7 +274,7 @@ "type": "uint256[]" } ], - "internalType": "struct Tuple40", + "internalType": "struct Tuple41", "name": "", "type": "tuple" } @@ -638,12 +638,19 @@ { "inputs": [ { - "internalType": "enum CollectionLimits", + "components": [ + { + "internalType": "enum CollectionLimitField", + "name": "field", + "type": "uint8" + }, + { "internalType": "bool", "name": "status", "type": "bool" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "internalType": "struct CollectionLimit", "name": "limit", - "type": "uint8" - }, - { "internalType": "bool", "name": "status", "type": "bool" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } + "type": "tuple" + } ], "name": "setCollectionLimit", "outputs": [], @@ -738,7 +745,7 @@ { "components": [ { - "internalType": "enum EthTokenPermissions", + "internalType": "enum TokenPermissionField", "name": "code", "type": "uint8" }, @@ -813,7 +820,7 @@ { "components": [ { - "internalType": "enum EthTokenPermissions", + "internalType": "enum TokenPermissionField", "name": "code", "type": "uint8" }, --- 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 0x81172a75 +/// @dev the ERC-165 identifier for this interface is 0x23201442 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -106,42 +106,17 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. + /// @return Array of collection limits /// @dev EVM selector for this function is: 0xf63bc572, /// or in textual repr: collectionLimits() - function collectionLimits() external view returns (Tuple21[] memory); + function collectionLimits() external view returns (CollectionLimit[] memory); /// 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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x88150bd0, - /// or in textual repr: setCollectionLimit(uint8,bool,uint256) - function setCollectionLimit( - CollectionLimits limit, - bool status, - uint256 value - ) external; + /// @param limit Some limit. + /// @dev EVM selector for this function is: 0x2a2235e7, + /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + function setCollectionLimit(CollectionLimit memory limit) external; /// Get contract address. /// @dev EVM selector for this function is: 0xf6b4dfb4, @@ -330,8 +305,14 @@ uint256[] field_1; } +struct CollectionLimit { + CollectionLimitField field; + bool status; + uint256 value; +} + /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. -enum CollectionLimits { +enum CollectionLimitField { /// @dev How many tokens can a user have on one account. AccountTokenOwnership, /// @dev How many bytes of data are available for sponsorship. @@ -350,13 +331,6 @@ OwnerCanDestroy, /// @dev Is it possible to send tokens from this collection between users. TransferEnabled -} - -/// @dev anonymous struct -struct Tuple21 { - CollectionLimits field_0; - bool field_1; - uint256 field_2; } /// @dev Ethereum representation of collection [`PropertyKey`](up_data_structs::PropertyKey) and [`PropertyValue`](up_data_structs::PropertyValue). --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -99,13 +99,13 @@ /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) as an key and value. struct PropertyPermission { /// @dev TokenPermission field. - EthTokenPermissions code; + TokenPermissionField code; /// @dev TokenPermission value. bool value; } /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration. -enum EthTokenPermissions { +enum TokenPermissionField { /// @dev Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`] Mutable, /// @dev Change permission for the collection administrator. See [`up_data_structs::PropertyPermission::token_owner`] @@ -115,7 +115,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x81172a75 +/// @dev the ERC-165 identifier for this interface is 0x23201442 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -208,42 +208,17 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. + /// @return Array of collection limits /// @dev EVM selector for this function is: 0xf63bc572, /// or in textual repr: collectionLimits() - function collectionLimits() external view returns (Tuple31[] memory); + function collectionLimits() external view returns (CollectionLimit[] memory); /// 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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x88150bd0, - /// or in textual repr: setCollectionLimit(uint8,bool,uint256) - function setCollectionLimit( - CollectionLimits limit, - bool status, - uint256 value - ) external; + /// @param limit Some limit. + /// @dev EVM selector for this function is: 0x2a2235e7, + /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + function setCollectionLimit(CollectionLimit memory limit) external; /// Get contract address. /// @dev EVM selector for this function is: 0xf6b4dfb4, @@ -432,8 +407,14 @@ uint256[] field_1; } +struct CollectionLimit { + CollectionLimitField field; + bool status; + uint256 value; +} + /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. -enum CollectionLimits { +enum CollectionLimitField { /// @dev How many tokens can a user have on one account. AccountTokenOwnership, /// @dev How many bytes of data are available for sponsorship. @@ -452,13 +433,6 @@ OwnerCanDestroy, /// @dev Is it possible to send tokens from this collection between users. TransferEnabled -} - -/// @dev anonymous struct -struct Tuple31 { - CollectionLimits field_0; - bool field_1; - uint256 field_2; } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension --- a/tests/src/eth/api/UniqueRefungible.sol +++ b/tests/src/eth/api/UniqueRefungible.sol @@ -99,13 +99,13 @@ /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) as an key and value. struct PropertyPermission { /// @dev TokenPermission field. - EthTokenPermissions code; + TokenPermissionField code; /// @dev TokenPermission value. bool value; } /// @dev Ethereum representation of TokenPermissions (see [`up_data_structs::PropertyPermission`]) fields as an enumeration. -enum EthTokenPermissions { +enum TokenPermissionField { /// @dev Permission to change the property and property permission. See [`up_data_structs::PropertyPermission::mutable`] Mutable, /// @dev Change permission for the collection administrator. See [`up_data_structs::PropertyPermission::token_owner`] @@ -115,7 +115,7 @@ } /// @title A contract that allows you to work with collections. -/// @dev the ERC-165 identifier for this interface is 0x81172a75 +/// @dev the ERC-165 identifier for this interface is 0x23201442 interface Collection is Dummy, ERC165 { // /// Set collection property. // /// @@ -208,42 +208,17 @@ /// Get current collection limits. /// - /// @return Array of tuples (byte, bool, uint256) with limits and their values. Order of limits: - /// "accountTokenOwnershipLimit", - /// "sponsoredDataSize", - /// "sponsoredDataRateLimit", - /// "tokenLimit", - /// "sponsorTransferTimeout", - /// "sponsorApproveTimeout" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// Return `false` if a limit not set. + /// @return Array of collection limits /// @dev EVM selector for this function is: 0xf63bc572, /// or in textual repr: collectionLimits() - function collectionLimits() external view returns (Tuple30[] memory); + function collectionLimits() external view returns (CollectionLimit[] memory); /// 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" - /// "ownerCanTransfer", - /// "ownerCanDestroy", - /// "transfersEnabled" - /// @param status enable\disable limit. Works only with `true`. - /// @param value Value of the limit. - /// @dev EVM selector for this function is: 0x88150bd0, - /// or in textual repr: setCollectionLimit(uint8,bool,uint256) - function setCollectionLimit( - CollectionLimits limit, - bool status, - uint256 value - ) external; + /// @param limit Some limit. + /// @dev EVM selector for this function is: 0x2a2235e7, + /// or in textual repr: setCollectionLimit((uint8,bool,uint256)) + function setCollectionLimit(CollectionLimit memory limit) external; /// Get contract address. /// @dev EVM selector for this function is: 0xf6b4dfb4, @@ -432,8 +407,14 @@ uint256[] field_1; } +struct CollectionLimit { + CollectionLimitField field; + bool status; + uint256 value; +} + /// @dev [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM. -enum CollectionLimits { +enum CollectionLimitField { /// @dev How many tokens can a user have on one account. AccountTokenOwnership, /// @dev How many bytes of data are available for sponsorship. @@ -452,13 +433,6 @@ OwnerCanDestroy, /// @dev Is it possible to send tokens from this collection between users. TransferEnabled -} - -/// @dev anonymous struct -struct Tuple30 { - CollectionLimits field_0; - bool field_1; - uint256 field_2; } /// @dev the ERC-165 identifier for this interface is 0x5b5e139f --- a/tests/src/eth/collectionLimits.test.ts +++ b/tests/src/eth/collectionLimits.test.ts @@ -1,7 +1,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {Pallets} from '../util'; import {expect, itEth, usingEthPlaygrounds} from './util'; -import {CollectionLimits} from './util/playgrounds/types'; +import {CollectionLimitField} from './util/playgrounds/types'; describe('Can set collection limits', () => { @@ -46,15 +46,15 @@ }; const collectionEvm = helper.ethNativeContract.collection(collectionAddress, testCase.case, owner); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send(); - await collectionEvm.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send(); + 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(); // 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([CollectionLimits.AccountTokenOwnership.toString(), true, limits.accountTokenOwnershipLimit.toString()]); - expect(limitsEvm[1]).to.deep.eq([CollectionLimits.SponsoredDataSize.toString(), true, limits.sponsoredDataSize.toString()]); - expect(limitsEvm[2]).to.deep.eq([CollectionLimits.SponsoredDataRateLimit.toString(), true, limits.sponsoredDataRateLimit.toString()]); - expect(limitsEvm[3]).to.deep.eq([CollectionLimits.TokenLimit.toString(), true, limits.tokenLimit.toString()]); - expect(limitsEvm[4]).to.deep.eq([CollectionLimits.SponsorTransferTimeout.toString(), true, limits.sponsorTransferTimeout.toString()]); - expect(limitsEvm[5]).to.deep.eq([CollectionLimits.SponsorApproveTimeout.toString(), true, limits.sponsorApproveTimeout.toString()]); - expect(limitsEvm[6]).to.deep.eq([CollectionLimits.OwnerCanTransfer.toString(), true, limits.ownerCanTransfer.toString()]); - expect(limitsEvm[7]).to.deep.eq([CollectionLimits.OwnerCanDestroy.toString(), true, limits.ownerCanDestroy.toString()]); - expect(limitsEvm[8]).to.deep.eq([CollectionLimits.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(9, true, 1) - .call()).to.be.rejectedWith('Returned error: VM Exception while processing transaction: revert Value not convertible into enum "CollectionLimits"'); + .setCollectionLimit({field: 9, status: true, value: 1}) + .call()).to.be.rejectedWith('Value not convertible into enum "CollectionLimitField"'); // Cannot disable limits await expect(collectionEvm.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, false, 200) - .call()).to.be.rejectedWith('Returned error: VM Exception while processing transaction: revert user can\'t disable limits'); + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: false, value: 200}) + .call()).to.be.rejectedWith('user can\'t disable limits'); await expect(collectionEvm.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: invalidLimits.accountTokenOwnershipLimit}) .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`); await expect(collectionEvm.methods - .setCollectionLimit(CollectionLimits.TransferEnabled, true, 3) + .setCollectionLimit({field: CollectionLimitField.TransferEnabled, status: true, value: 3}) .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`); expect(() => collectionEvm.methods - .setCollectionLimit(CollectionLimits.SponsoredDataSize, true, -1).send()).to.throw('value out-of-bounds'); + .setCollectionLimit({field: CollectionLimitField.SponsoredDataSize, 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(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call({from: nonOwner})) .to.be.rejectedWith('NoPermission'); await expect(collectionEvm.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .send({from: nonOwner})) .to.be.rejected; })); --- a/tests/src/eth/createFTCollection.test.ts +++ b/tests/src/eth/createFTCollection.test.ts @@ -18,7 +18,7 @@ import {evmToAddress} from '@polkadot/util-crypto'; import {Pallets, requirePalletsOrSkip} from '../util'; import {expect, itEth, usingEthPlaygrounds} from './util'; -import { CollectionLimits } from './util/playgrounds/types'; +import {CollectionLimitField} from './util/playgrounds/types'; const DECIMALS = 18; @@ -197,7 +197,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); @@ -222,7 +222,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); --- a/tests/src/eth/createNFTCollection.test.ts +++ b/tests/src/eth/createNFTCollection.test.ts @@ -17,7 +17,7 @@ import {evmToAddress} from '@polkadot/util-crypto'; import {IKeyringPair} from '@polkadot/types/types'; import {expect, itEth, usingEthPlaygrounds} from './util'; -import { CollectionLimits } from './util/playgrounds/types'; +import {CollectionLimitField} from './util/playgrounds/types'; describe('Create NFT collection from EVM', () => { @@ -208,7 +208,7 @@ } { await expect(malfeasantCollection.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); @@ -233,7 +233,7 @@ } { await expect(malfeasantCollection.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); --- a/tests/src/eth/createRFTCollection.test.ts +++ b/tests/src/eth/createRFTCollection.test.ts @@ -18,7 +18,7 @@ import {IKeyringPair} from '@polkadot/types/types'; import {Pallets, requirePalletsOrSkip} from '../util'; import {expect, itEth, usingEthPlaygrounds} from './util'; -import {CollectionLimits} from './util/playgrounds/types'; +import {CollectionLimitField} from './util/playgrounds/types'; describe('Create RFT collection from EVM', () => { @@ -240,7 +240,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); @@ -265,7 +265,7 @@ } { await expect(peasantCollection.methods - .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000) + .setCollectionLimit({field: CollectionLimitField.AccountTokenOwnership, status: true, value: 1000}) .call()).to.be.rejectedWith(EXPECTED_ERROR); } }); --- a/tests/src/eth/events.test.ts +++ b/tests/src/eth/events.test.ts @@ -19,7 +19,7 @@ import {EthUniqueHelper, itEth, usingEthPlaygrounds} from './util'; import {IEvent, TCollectionMode} from '../util/playgrounds/types'; import {Pallets, requirePalletsOrSkip} from '../util'; -import {CollectionLimits, EthTokenPermissions, NormalizedEvent} from './util/playgrounds/types'; +import {CollectionLimitField, TokenPermissionField, NormalizedEvent} from './util/playgrounds/types'; let donor: IKeyringPair; @@ -121,9 +121,9 @@ const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]); await collection.methods.setTokenPropertyPermissions([ ['A', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, true]], ], ]).send({from: owner}); await helper.wait.newBlocks(1); @@ -233,7 +233,7 @@ }); const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]); { - await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, 0).send({from: owner}); + await collection.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanTransfer, status: true, value: 0}).send({from: owner}); await helper.wait.newBlocks(1); expect(ethEvents).to.containSubset([ { @@ -379,9 +379,9 @@ const tokenId = result.events.Transfer.returnValues.tokenId; await collection.methods.setTokenPropertyPermissions([ ['A', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, true]], ], ]).send({from: owner}); --- a/tests/src/eth/tokenProperties.test.ts +++ b/tests/src/eth/tokenProperties.test.ts @@ -20,7 +20,7 @@ import {ITokenPropertyPermission} from '../util/playgrounds/types'; import {Pallets} from '../util'; import {UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection} from '../util/playgrounds/unique'; -import {EthTokenPermissions} from './util/playgrounds/types'; +import {TokenPermissionField} from './util/playgrounds/types'; describe('EVM token properties', () => { let donor: IKeyringPair; @@ -47,9 +47,9 @@ await collection.methods.setTokenPropertyPermissions([ ['testKey', [ - [EthTokenPermissions.Mutable, mutable], - [EthTokenPermissions.TokenOwner, tokenOwner], - [EthTokenPermissions.CollectionAdmin, collectionAdmin]], + [TokenPermissionField.Mutable, mutable], + [TokenPermissionField.TokenOwner, tokenOwner], + [TokenPermissionField.CollectionAdmin, collectionAdmin]], ], ]).send({from: caller.eth}); @@ -60,9 +60,9 @@ expect(await collection.methods.tokenPropertyPermissions().call({from: caller.eth})).to.be.like([ ['testKey', [ - [EthTokenPermissions.Mutable.toString(), mutable], - [EthTokenPermissions.TokenOwner.toString(), tokenOwner], - [EthTokenPermissions.CollectionAdmin.toString(), collectionAdmin]], + [TokenPermissionField.Mutable.toString(), mutable], + [TokenPermissionField.TokenOwner.toString(), tokenOwner], + [TokenPermissionField.CollectionAdmin.toString(), collectionAdmin]], ], ]); } @@ -80,19 +80,19 @@ await collection.methods.setTokenPropertyPermissions([ ['testKey_0', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, true]], ], ['testKey_1', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, false], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, false], + [TokenPermissionField.CollectionAdmin, true]], ], ['testKey_2', [ - [EthTokenPermissions.Mutable, false], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, false]], + [TokenPermissionField.Mutable, false], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, false]], ], ]).send({from: owner}); @@ -113,19 +113,19 @@ expect(await collection.methods.tokenPropertyPermissions().call({from: owner})).to.be.like([ ['testKey_0', [ - [EthTokenPermissions.Mutable.toString(), true], - [EthTokenPermissions.TokenOwner.toString(), true], - [EthTokenPermissions.CollectionAdmin.toString(), true]], + [TokenPermissionField.Mutable.toString(), true], + [TokenPermissionField.TokenOwner.toString(), true], + [TokenPermissionField.CollectionAdmin.toString(), true]], ], ['testKey_1', [ - [EthTokenPermissions.Mutable.toString(), true], - [EthTokenPermissions.TokenOwner.toString(), false], - [EthTokenPermissions.CollectionAdmin.toString(), true]], + [TokenPermissionField.Mutable.toString(), true], + [TokenPermissionField.TokenOwner.toString(), false], + [TokenPermissionField.CollectionAdmin.toString(), true]], ], ['testKey_2', [ - [EthTokenPermissions.Mutable.toString(), false], - [EthTokenPermissions.TokenOwner.toString(), true], - [EthTokenPermissions.CollectionAdmin.toString(), false]], + [TokenPermissionField.Mutable.toString(), false], + [TokenPermissionField.TokenOwner.toString(), true], + [TokenPermissionField.CollectionAdmin.toString(), false]], ], ]); })); @@ -144,19 +144,19 @@ await collection.methods.setTokenPropertyPermissions([ ['testKey_0', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, true]], ], ['testKey_1', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, false], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, false], + [TokenPermissionField.CollectionAdmin, true]], ], ['testKey_2', [ - [EthTokenPermissions.Mutable, false], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, false]], + [TokenPermissionField.Mutable, false], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, false]], ], ]).send({from: caller.eth}); @@ -177,19 +177,19 @@ expect(await collection.methods.tokenPropertyPermissions().call({from: caller.eth})).to.be.like([ ['testKey_0', [ - [EthTokenPermissions.Mutable.toString(), true], - [EthTokenPermissions.TokenOwner.toString(), true], - [EthTokenPermissions.CollectionAdmin.toString(), true]], + [TokenPermissionField.Mutable.toString(), true], + [TokenPermissionField.TokenOwner.toString(), true], + [TokenPermissionField.CollectionAdmin.toString(), true]], ], ['testKey_1', [ - [EthTokenPermissions.Mutable.toString(), true], - [EthTokenPermissions.TokenOwner.toString(), false], - [EthTokenPermissions.CollectionAdmin.toString(), true]], + [TokenPermissionField.Mutable.toString(), true], + [TokenPermissionField.TokenOwner.toString(), false], + [TokenPermissionField.CollectionAdmin.toString(), true]], ], ['testKey_2', [ - [EthTokenPermissions.Mutable.toString(), false], - [EthTokenPermissions.TokenOwner.toString(), true], - [EthTokenPermissions.CollectionAdmin.toString(), false]], + [TokenPermissionField.Mutable.toString(), false], + [TokenPermissionField.TokenOwner.toString(), true], + [TokenPermissionField.CollectionAdmin.toString(), false]], ], ]); @@ -460,9 +460,9 @@ await expect(collection.methods.setTokenPropertyPermissions([ ['testKey_0', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, true]], ], ]).call({from: caller})).to.be.rejectedWith('NoPermission'); })); @@ -480,9 +480,9 @@ await expect(collection.methods.setTokenPropertyPermissions([ // "Space" is invalid character ['testKey 0', [ - [EthTokenPermissions.Mutable, true], - [EthTokenPermissions.TokenOwner, true], - [EthTokenPermissions.CollectionAdmin, true]], + [TokenPermissionField.Mutable, true], + [TokenPermissionField.TokenOwner, true], + [TokenPermissionField.CollectionAdmin, true]], ], ]).call({from: owner})).to.be.rejectedWith('InvalidCharacterInPropertyKey'); })); --- a/tests/src/eth/util/playgrounds/types.ts +++ b/tests/src/eth/util/playgrounds/types.ts @@ -20,12 +20,12 @@ export type EthProperty = string[]; -export enum EthTokenPermissions { +export enum TokenPermissionField { Mutable, TokenOwner, CollectionAdmin } -export enum CollectionLimits { +export enum CollectionLimitField { AccountTokenOwnership, SponsoredDataSize, SponsoredDataRateLimit, @@ -36,3 +36,9 @@ OwnerCanDestroy, TransferEnabled } + +export interface EthCollectionLimit { + field: CollectionLimitField, + status: boolean, + value: bigint, +} -- gitstuff