git.delta.rocks / unique-network / refs/commits / fb2c7d6a78b6

difftreelog

added `collectionLimits` function in `Collection` interface, changed signture for `setCollectionLimit`

PraetorP2022-12-09parent: #21ff2d2.patch.diff
in: master

15 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -37,6 +37,7 @@
 	Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf,
 	eth::{
 		EthCrossAccount, convert_cross_account_to_uint256, CollectionPermissions as EvmPermissions,
+		CollectionLimits as EvmCollectionLimits,
 	},
 	weights::WeightInfo,
 };
@@ -304,6 +305,101 @@
 		Ok(result)
 	}
 
+	/// 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<Vec<(EvmCollectionLimits, bool, uint256)>> {
+		let convert_value_limit = |limit: EvmCollectionLimits,
+		                           value: Option<u32>|
+		 -> (EvmCollectionLimits, bool, uint256) {
+			value
+				.map(|v| (limit, true, v.into()))
+				.unwrap_or((limit, false, Default::default()))
+		};
+
+		let convert_bool_limit = |limit: EvmCollectionLimits,
+		                          value: Option<bool>|
+		 -> (EvmCollectionLimits, bool, uint256) {
+			value
+				.map(|v| {
+					(
+						limit,
+						true,
+						if v {
+							uint256::from(1)
+						} else {
+							Default::default()
+						},
+					)
+				})
+				.unwrap_or((limit, false, Default::default()))
+		};
+
+		let limits = &self.collection.limits;
+
+		Ok(vec![
+			convert_value_limit(
+				EvmCollectionLimits::AccountTokenOwnership,
+				limits.account_token_ownership_limit,
+			),
+			convert_value_limit(
+				EvmCollectionLimits::SponsoredDataSize,
+				limits.sponsored_data_size,
+			),
+			limits
+				.sponsored_data_rate_limit
+				.map(|limit| {
+					(
+						EvmCollectionLimits::SponsoredDataRateLimit,
+						match limit {
+							SponsoringRateLimit::Blocks(_) => true,
+							_ => false,
+						},
+						match limit {
+							SponsoringRateLimit::Blocks(blocks) => blocks.into(),
+							_ => Default::default(),
+						},
+					)
+				})
+				.unwrap_or((
+					EvmCollectionLimits::SponsoredDataRateLimit,
+					false,
+					Default::default(),
+				)),
+			convert_value_limit(EvmCollectionLimits::TokenLimit, limits.token_limit),
+			convert_value_limit(
+				EvmCollectionLimits::SponsorTransferTimeout,
+				limits.sponsor_transfer_timeout,
+			),
+			convert_value_limit(
+				EvmCollectionLimits::SponsorApproveTimeout,
+				limits.sponsor_approve_timeout,
+			),
+			convert_bool_limit(
+				EvmCollectionLimits::OwnerCanTransfer,
+				limits.owner_can_transfer,
+			),
+			convert_bool_limit(
+				EvmCollectionLimits::OwnerCanDestroy,
+				limits.owner_can_destroy,
+			),
+			convert_bool_limit(
+				EvmCollectionLimits::TransferEnabled,
+				limits.transfers_enabled,
+			),
+		])
+	}
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -318,9 +414,19 @@
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
 	#[solidity(rename_selector = "setCollectionLimit")]
-	fn set_int_limit(&mut self, caller: caller, limit: string, value: uint256) -> Result<void> {
+	fn set_collection_limit(
+		&mut self,
+		caller: caller,
+		limit: EvmCollectionLimits,
+		status: bool,
+		value: uint256,
+	) -> Result<void> {
 		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)))?;
@@ -338,35 +444,35 @@
 
 		let mut limits = self.limits.clone();
 
-		match limit.as_str() {
-			"accountTokenOwnershipLimit" => {
+		match limit {
+			EvmCollectionLimits::AccountTokenOwnership => {
 				limits.account_token_ownership_limit = Some(value);
 			}
-			"sponsoredDataSize" => {
+			EvmCollectionLimits::SponsoredDataSize => {
 				limits.sponsored_data_size = Some(value);
 			}
-			"sponsoredDataRateLimit" => {
+			EvmCollectionLimits::SponsoredDataRateLimit => {
 				limits.sponsored_data_rate_limit = Some(SponsoringRateLimit::Blocks(value));
 			}
-			"tokenLimit" => {
+			EvmCollectionLimits::TokenLimit => {
 				limits.token_limit = Some(value);
 			}
-			"sponsorTransferTimeout" => {
+			EvmCollectionLimits::SponsorTransferTimeout => {
 				limits.sponsor_transfer_timeout = Some(value);
 			}
-			"sponsorApproveTimeout" => {
+			EvmCollectionLimits::SponsorApproveTimeout => {
 				limits.sponsor_approve_timeout = Some(value);
 			}
-			"ownerCanTransfer" => {
+			EvmCollectionLimits::OwnerCanTransfer => {
 				limits.owner_can_transfer = Some(convert_value_to_bool()?);
 			}
-			"ownerCanDestroy" => {
+			EvmCollectionLimits::OwnerCanDestroy => {
 				limits.owner_can_destroy = Some(convert_value_to_bool()?);
 			}
-			"transfersEnabled" => {
+			EvmCollectionLimits::TransferEnabled => {
 				limits.transfers_enabled = Some(convert_value_to_bool()?);
 			}
-			_ => return Err(Error::Revert(format!("unknown limit \"{}\"", limit))),
+			_ => return Err(Error::Revert(format!("unknown limit \"{:?}\"", limit))),
 		}
 
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -778,3 +884,31 @@
 		})
 	}
 }
+
+fn convert_value_limit<V: Into<uint256> + Copy>(
+	limit: EvmCollectionLimits,
+	value: &Option<V>,
+) -> (EvmCollectionLimits, bool, uint256) {
+	value
+		.map(|v| (limit, true, v.into()))
+		.unwrap_or((limit, false, Default::default()))
+}
+
+fn convert_bool_limit(
+	limit: EvmCollectionLimits,
+	value: &Option<bool>,
+) -> (EvmCollectionLimits, bool, uint256) {
+	value
+		.map(|v| {
+			(
+				limit,
+				true,
+				if v {
+					uint256::from(1)
+				} else {
+					Default::default()
+				},
+			)
+		})
+		.unwrap_or((limit, false, Default::default()))
+}
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -155,6 +155,20 @@
 		}
 	}
 }
+#[derive(Debug, Default, Clone, Copy, AbiCoder)]
+#[repr(u8)]
+pub enum CollectionLimits {
+	#[default]
+	AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled,
+}
 #[derive(Default, Debug, Clone, Copy, AbiCoder)]
 #[repr(u8)]
 pub enum CollectionPermissions {
modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -158,6 +158,27 @@
 		return Tuple8(0x0000000000000000000000000000000000000000, 0);
 	}
 
+	/// 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.
+	/// @dev EVM selector for this function is: 0xf63bc572,
+	///  or in textual repr: collectionLimits()
+	function collectionLimits() public view returns (Tuple20[] memory) {
+		require(false, stub_error);
+		dummy;
+		return new Tuple20[](0);
+	}
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -171,11 +192,16 @@
 	/// 	"ownerCanDestroy",
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
-	/// @dev EVM selector for this function is: 0x4ad890a8,
-	///  or in textual repr: setCollectionLimit(string,uint256)
-	function setCollectionLimit(string memory limit, uint256 value) public {
+	/// @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 {
 		require(false, stub_error);
 		limit;
+		status;
 		value;
 		dummy = 0;
 	}
modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -291,6 +291,27 @@
 		return Tuple30(0x0000000000000000000000000000000000000000, 0);
 	}
 
+	/// 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.
+	/// @dev EVM selector for this function is: 0xf63bc572,
+	///  or in textual repr: collectionLimits()
+	function collectionLimits() public view returns (Tuple33[] memory) {
+		require(false, stub_error);
+		dummy;
+		return new Tuple33[](0);
+	}
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -304,11 +325,16 @@
 	/// 	"ownerCanDestroy",
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
-	/// @dev EVM selector for this function is: 0x4ad890a8,
-	///  or in textual repr: setCollectionLimit(string,uint256)
-	function setCollectionLimit(string memory limit, uint256 value) public {
+	/// @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 {
 		require(false, stub_error);
 		limit;
+		status;
 		value;
 		dummy = 0;
 	}
modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -292,6 +292,27 @@
 		return Tuple29(0x0000000000000000000000000000000000000000, 0);
 	}
 
+	/// 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.
+	/// @dev EVM selector for this function is: 0xf63bc572,
+	///  or in textual repr: collectionLimits()
+	function collectionLimits() public view returns (Tuple32[] memory) {
+		require(false, stub_error);
+		dummy;
+		return new Tuple32[](0);
+	}
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -305,11 +326,16 @@
 	/// 	"ownerCanDestroy",
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
-	/// @dev EVM selector for this function is: 0x4ad890a8,
-	///  or in textual repr: setCollectionLimit(string,uint256)
-	function setCollectionLimit(string memory limit, uint256 value) public {
+	/// @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 {
 		require(false, stub_error);
 		limit;
+		status;
 		value;
 		dummy = 0;
 	}
modifiedtests/src/eth/abi/fungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/fungible.json
+++ b/tests/src/eth/abi/fungible.json
@@ -208,11 +208,16 @@
   },
   {
     "inputs": [],
+<<<<<<< HEAD
     "name": "collectionNestingPermissions",
+=======
+    "name": "collectionLimits",
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
     "outputs": [
       {
         "components": [
           {
+<<<<<<< HEAD
             "internalType": "enum CollectionPermissions",
             "name": "field_0",
             "type": "uint8"
@@ -220,6 +225,16 @@
           { "internalType": "bool", "name": "field_1", "type": "bool" }
         ],
         "internalType": "struct Tuple24[]",
+=======
+            "internalType": "enum CollectionLimits",
+            "name": "field_0",
+            "type": "uint8"
+          },
+          { "internalType": "bool", "name": "field_1", "type": "bool" },
+          { "internalType": "uint256", "name": "field_2", "type": "uint256" }
+        ],
+        "internalType": "struct Tuple20[]",
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
         "name": "",
         "type": "tuple[]"
       }
@@ -229,6 +244,7 @@
   },
   {
     "inputs": [],
+<<<<<<< HEAD
     "name": "collectionNestingRestrictedCollectionIds",
     "outputs": [
       {
@@ -250,6 +266,8 @@
   },
   {
     "inputs": [],
+=======
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
     "name": "collectionOwner",
     "outputs": [
       {
@@ -453,7 +471,12 @@
   },
   {
     "inputs": [
-      { "internalType": "string", "name": "limit", "type": "string" },
+      {
+        "internalType": "enum CollectionLimits",
+        "name": "limit",
+        "type": "uint8"
+      },
+      { "internalType": "bool", "name": "status", "type": "bool" },
       { "internalType": "uint256", "name": "value", "type": "uint256" }
     ],
     "name": "setCollectionLimit",
modifiedtests/src/eth/abi/nonFungible.jsondiffbeforeafterboth
before · tests/src/eth/abi/nonFungible.json
1[2  {3    "anonymous": false,4    "inputs": [5      {6        "indexed": true,7        "internalType": "address",8        "name": "owner",9        "type": "address"10      },11      {12        "indexed": true,13        "internalType": "address",14        "name": "approved",15        "type": "address"16      },17      {18        "indexed": true,19        "internalType": "uint256",20        "name": "tokenId",21        "type": "uint256"22      }23    ],24    "name": "Approval",25    "type": "event"26  },27  {28    "anonymous": false,29    "inputs": [30      {31        "indexed": true,32        "internalType": "address",33        "name": "owner",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "operator",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "bool",45        "name": "approved",46        "type": "bool"47      }48    ],49    "name": "ApprovalForAll",50    "type": "event"51  },52  {53    "anonymous": false,54    "inputs": [],55    "name": "MintingFinished",56    "type": "event"57  },58  {59    "anonymous": false,60    "inputs": [61      {62        "indexed": true,63        "internalType": "address",64        "name": "from",65        "type": "address"66      },67      {68        "indexed": true,69        "internalType": "address",70        "name": "to",71        "type": "address"72      },73      {74        "indexed": true,75        "internalType": "uint256",76        "name": "tokenId",77        "type": "uint256"78      }79    ],80    "name": "Transfer",81    "type": "event"82  },83  {84    "inputs": [85      {86        "components": [87          { "internalType": "address", "name": "eth", "type": "address" },88          { "internalType": "uint256", "name": "sub", "type": "uint256" }89        ],90        "internalType": "struct EthCrossAccount",91        "name": "newAdmin",92        "type": "tuple"93      }94    ],95    "name": "addCollectionAdminCross",96    "outputs": [],97    "stateMutability": "nonpayable",98    "type": "function"99  },100  {101    "inputs": [102      {103        "components": [104          { "internalType": "address", "name": "eth", "type": "address" },105          { "internalType": "uint256", "name": "sub", "type": "uint256" }106        ],107        "internalType": "struct EthCrossAccount",108        "name": "user",109        "type": "tuple"110      }111    ],112    "name": "addToCollectionAllowListCross",113    "outputs": [],114    "stateMutability": "nonpayable",115    "type": "function"116  },117  {118    "inputs": [119      {120        "components": [121          { "internalType": "address", "name": "eth", "type": "address" },122          { "internalType": "uint256", "name": "sub", "type": "uint256" }123        ],124        "internalType": "struct EthCrossAccount",125        "name": "user",126        "type": "tuple"127      }128    ],129    "name": "allowlistedCross",130    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],131    "stateMutability": "view",132    "type": "function"133  },134  {135    "inputs": [136      { "internalType": "address", "name": "approved", "type": "address" },137      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }138    ],139    "name": "approve",140    "outputs": [],141    "stateMutability": "nonpayable",142    "type": "function"143  },144  {145    "inputs": [146      {147        "components": [148          { "internalType": "address", "name": "eth", "type": "address" },149          { "internalType": "uint256", "name": "sub", "type": "uint256" }150        ],151        "internalType": "struct EthCrossAccount",152        "name": "approved",153        "type": "tuple"154      },155      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156    ],157    "name": "approveCross",158    "outputs": [],159    "stateMutability": "nonpayable",160    "type": "function"161  },162  {163    "inputs": [164      { "internalType": "address", "name": "owner", "type": "address" }165    ],166    "name": "balanceOf",167    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],168    "stateMutability": "view",169    "type": "function"170  },171  {172    "inputs": [173      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174    ],175    "name": "burn",176    "outputs": [],177    "stateMutability": "nonpayable",178    "type": "function"179  },180  {181    "inputs": [182      {183        "components": [184          { "internalType": "address", "name": "eth", "type": "address" },185          { "internalType": "uint256", "name": "sub", "type": "uint256" }186        ],187        "internalType": "struct EthCrossAccount",188        "name": "from",189        "type": "tuple"190      },191      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }192    ],193    "name": "burnFromCross",194    "outputs": [],195    "stateMutability": "nonpayable",196    "type": "function"197  },198  {199    "inputs": [200      {201        "components": [202          { "internalType": "address", "name": "eth", "type": "address" },203          { "internalType": "uint256", "name": "sub", "type": "uint256" }204        ],205        "internalType": "struct EthCrossAccount",206        "name": "newOwner",207        "type": "tuple"208      }209    ],210    "name": "changeCollectionOwnerCross",211    "outputs": [],212    "stateMutability": "nonpayable",213    "type": "function"214  },215  {216    "inputs": [],217    "name": "collectionAdmins",218    "outputs": [219      {220        "components": [221          { "internalType": "address", "name": "eth", "type": "address" },222          { "internalType": "uint256", "name": "sub", "type": "uint256" }223        ],224        "internalType": "struct EthCrossAccount[]",225        "name": "",226        "type": "tuple[]"227      }228    ],229    "stateMutability": "view",230    "type": "function"231  },232  {233    "inputs": [],234    "name": "collectionHelperAddress",235    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],236    "stateMutability": "view",237    "type": "function"238  },239  {240    "inputs": [],241    "name": "collectionNestingPermissions",242    "outputs": [243      {244        "components": [245          {246            "internalType": "enum CollectionPermissions",247            "name": "field_0",248            "type": "uint8"249          },250          { "internalType": "bool", "name": "field_1", "type": "bool" }251        ],252        "internalType": "struct Tuple37[]",253        "name": "",254        "type": "tuple[]"255      }256    ],257    "stateMutability": "view",258    "type": "function"259  },260  {261    "inputs": [],262    "name": "collectionNestingRestrictedCollectionIds",263    "outputs": [264      {265        "components": [266          { "internalType": "bool", "name": "field_0", "type": "bool" },267          {268            "internalType": "uint256[]",269            "name": "field_1",270            "type": "uint256[]"271          }272        ],273        "internalType": "struct Tuple34",274        "name": "",275        "type": "tuple"276      }277    ],278    "stateMutability": "view",279    "type": "function"280  },281  {282    "inputs": [],283    "name": "collectionOwner",284    "outputs": [285      {286        "components": [287          { "internalType": "address", "name": "eth", "type": "address" },288          { "internalType": "uint256", "name": "sub", "type": "uint256" }289        ],290        "internalType": "struct EthCrossAccount",291        "name": "",292        "type": "tuple"293      }294    ],295    "stateMutability": "view",296    "type": "function"297  },298  {299    "inputs": [300      { "internalType": "string[]", "name": "keys", "type": "string[]" }301    ],302    "name": "collectionProperties",303    "outputs": [304      {305        "components": [306          { "internalType": "string", "name": "key", "type": "string" },307          { "internalType": "bytes", "name": "value", "type": "bytes" }308        ],309        "internalType": "struct Property[]",310        "name": "",311        "type": "tuple[]"312      }313    ],314    "stateMutability": "view",315    "type": "function"316  },317  {318    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],319    "name": "collectionProperty",320    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],321    "stateMutability": "view",322    "type": "function"323  },324  {325    "inputs": [],326    "name": "collectionSponsor",327    "outputs": [328      {329        "components": [330          { "internalType": "address", "name": "field_0", "type": "address" },331          { "internalType": "uint256", "name": "field_1", "type": "uint256" }332        ],333        "internalType": "struct Tuple30",334        "name": "",335        "type": "tuple"336      }337    ],338    "stateMutability": "view",339    "type": "function"340  },341  {342    "inputs": [],343    "name": "confirmCollectionSponsorship",344    "outputs": [],345    "stateMutability": "nonpayable",346    "type": "function"347  },348  {349    "inputs": [],350    "name": "contractAddress",351    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],352    "stateMutability": "view",353    "type": "function"354  },355  {356    "inputs": [357      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }358    ],359    "name": "crossOwnerOf",360    "outputs": [361      {362        "components": [363          { "internalType": "address", "name": "eth", "type": "address" },364          { "internalType": "uint256", "name": "sub", "type": "uint256" }365        ],366        "internalType": "struct EthCrossAccount",367        "name": "",368        "type": "tuple"369      }370    ],371    "stateMutability": "view",372    "type": "function"373  },374  {375    "inputs": [376      { "internalType": "string[]", "name": "keys", "type": "string[]" }377    ],378    "name": "deleteCollectionProperties",379    "outputs": [],380    "stateMutability": "nonpayable",381    "type": "function"382  },383  {384    "inputs": [385      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },386      { "internalType": "string[]", "name": "keys", "type": "string[]" }387    ],388    "name": "deleteProperties",389    "outputs": [],390    "stateMutability": "nonpayable",391    "type": "function"392  },393  {394    "inputs": [],395    "name": "description",396    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],397    "stateMutability": "view",398    "type": "function"399  },400  {401    "inputs": [],402    "name": "finishMinting",403    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],404    "stateMutability": "nonpayable",405    "type": "function"406  },407  {408    "inputs": [409      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }410    ],411    "name": "getApproved",412    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],413    "stateMutability": "view",414    "type": "function"415  },416  {417    "inputs": [],418    "name": "hasCollectionPendingSponsor",419    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],420    "stateMutability": "view",421    "type": "function"422  },423  {424    "inputs": [425      { "internalType": "address", "name": "owner", "type": "address" },426      { "internalType": "address", "name": "operator", "type": "address" }427    ],428    "name": "isApprovedForAll",429    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],430    "stateMutability": "view",431    "type": "function"432  },433  {434    "inputs": [435      {436        "components": [437          { "internalType": "address", "name": "eth", "type": "address" },438          { "internalType": "uint256", "name": "sub", "type": "uint256" }439        ],440        "internalType": "struct EthCrossAccount",441        "name": "user",442        "type": "tuple"443      }444    ],445    "name": "isOwnerOrAdminCross",446    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],447    "stateMutability": "view",448    "type": "function"449  },450  {451    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],452    "name": "mint",453    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],454    "stateMutability": "nonpayable",455    "type": "function"456  },457  {458    "inputs": [459      { "internalType": "address", "name": "to", "type": "address" },460      { "internalType": "string", "name": "tokenUri", "type": "string" }461    ],462    "name": "mintWithTokenURI",463    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],464    "stateMutability": "nonpayable",465    "type": "function"466  },467  {468    "inputs": [],469    "name": "mintingFinished",470    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],471    "stateMutability": "view",472    "type": "function"473  },474  {475    "inputs": [],476    "name": "name",477    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],478    "stateMutability": "view",479    "type": "function"480  },481  {482    "inputs": [],483    "name": "nextTokenId",484    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],485    "stateMutability": "view",486    "type": "function"487  },488  {489    "inputs": [490      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }491    ],492    "name": "ownerOf",493    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],494    "stateMutability": "view",495    "type": "function"496  },497  {498    "inputs": [499      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },500      { "internalType": "string[]", "name": "keys", "type": "string[]" }501    ],502    "name": "properties",503    "outputs": [504      {505        "components": [506          { "internalType": "string", "name": "key", "type": "string" },507          { "internalType": "bytes", "name": "value", "type": "bytes" }508        ],509        "internalType": "struct Property[]",510        "name": "",511        "type": "tuple[]"512      }513    ],514    "stateMutability": "view",515    "type": "function"516  },517  {518    "inputs": [519      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },520      { "internalType": "string", "name": "key", "type": "string" }521    ],522    "name": "property",523    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],524    "stateMutability": "view",525    "type": "function"526  },527  {528    "inputs": [529      {530        "components": [531          { "internalType": "address", "name": "eth", "type": "address" },532          { "internalType": "uint256", "name": "sub", "type": "uint256" }533        ],534        "internalType": "struct EthCrossAccount",535        "name": "admin",536        "type": "tuple"537      }538    ],539    "name": "removeCollectionAdminCross",540    "outputs": [],541    "stateMutability": "nonpayable",542    "type": "function"543  },544  {545    "inputs": [],546    "name": "removeCollectionSponsor",547    "outputs": [],548    "stateMutability": "nonpayable",549    "type": "function"550  },551  {552    "inputs": [553      {554        "components": [555          { "internalType": "address", "name": "eth", "type": "address" },556          { "internalType": "uint256", "name": "sub", "type": "uint256" }557        ],558        "internalType": "struct EthCrossAccount",559        "name": "user",560        "type": "tuple"561      }562    ],563    "name": "removeFromCollectionAllowListCross",564    "outputs": [],565    "stateMutability": "nonpayable",566    "type": "function"567  },568  {569    "inputs": [570      { "internalType": "address", "name": "from", "type": "address" },571      { "internalType": "address", "name": "to", "type": "address" },572      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }573    ],574    "name": "safeTransferFrom",575    "outputs": [],576    "stateMutability": "nonpayable",577    "type": "function"578  },579  {580    "inputs": [581      { "internalType": "address", "name": "from", "type": "address" },582      { "internalType": "address", "name": "to", "type": "address" },583      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },584      { "internalType": "bytes", "name": "data", "type": "bytes" }585    ],586    "name": "safeTransferFrom",587    "outputs": [],588    "stateMutability": "nonpayable",589    "type": "function"590  },591  {592    "inputs": [593      { "internalType": "address", "name": "operator", "type": "address" },594      { "internalType": "bool", "name": "approved", "type": "bool" }595    ],596    "name": "setApprovalForAll",597    "outputs": [],598    "stateMutability": "nonpayable",599    "type": "function"600  },601  {602    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],603    "name": "setCollectionAccess",604    "outputs": [],605    "stateMutability": "nonpayable",606    "type": "function"607  },608  {609    "inputs": [610      { "internalType": "string", "name": "limit", "type": "string" },611      { "internalType": "uint256", "name": "value", "type": "uint256" }612    ],613    "name": "setCollectionLimit",614    "outputs": [],615    "stateMutability": "nonpayable",616    "type": "function"617  },618  {619    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],620    "name": "setCollectionMintMode",621    "outputs": [],622    "stateMutability": "nonpayable",623    "type": "function"624  },625  {626    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],627    "name": "setCollectionNesting",628    "outputs": [],629    "stateMutability": "nonpayable",630    "type": "function"631  },632  {633    "inputs": [634      { "internalType": "bool", "name": "enable", "type": "bool" },635      {636        "internalType": "address[]",637        "name": "collections",638        "type": "address[]"639      }640    ],641    "name": "setCollectionNesting",642    "outputs": [],643    "stateMutability": "nonpayable",644    "type": "function"645  },646  {647    "inputs": [648      {649        "components": [650          { "internalType": "string", "name": "key", "type": "string" },651          { "internalType": "bytes", "name": "value", "type": "bytes" }652        ],653        "internalType": "struct Property[]",654        "name": "properties",655        "type": "tuple[]"656      }657    ],658    "name": "setCollectionProperties",659    "outputs": [],660    "stateMutability": "nonpayable",661    "type": "function"662  },663  {664    "inputs": [665      {666        "components": [667          { "internalType": "address", "name": "eth", "type": "address" },668          { "internalType": "uint256", "name": "sub", "type": "uint256" }669        ],670        "internalType": "struct EthCrossAccount",671        "name": "sponsor",672        "type": "tuple"673      }674    ],675    "name": "setCollectionSponsorCross",676    "outputs": [],677    "stateMutability": "nonpayable",678    "type": "function"679  },680  {681    "inputs": [682      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },683      {684        "components": [685          { "internalType": "string", "name": "key", "type": "string" },686          { "internalType": "bytes", "name": "value", "type": "bytes" }687        ],688        "internalType": "struct Property[]",689        "name": "properties",690        "type": "tuple[]"691      }692    ],693    "name": "setProperties",694    "outputs": [],695    "stateMutability": "nonpayable",696    "type": "function"697  },698  {699    "inputs": [700      {701        "components": [702          { "internalType": "string", "name": "field_0", "type": "string" },703          {704            "components": [705              {706                "internalType": "enum EthTokenPermissions",707                "name": "field_0",708                "type": "uint8"709              },710              { "internalType": "bool", "name": "field_1", "type": "bool" }711            ],712            "internalType": "struct Tuple46[]",713            "name": "field_1",714            "type": "tuple[]"715          }716        ],717        "internalType": "struct Tuple48[]",718        "name": "permissions",719        "type": "tuple[]"720      }721    ],722    "name": "setTokenPropertyPermissions",723    "outputs": [],724    "stateMutability": "nonpayable",725    "type": "function"726  },727  {728    "inputs": [729      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }730    ],731    "name": "supportsInterface",732    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],733    "stateMutability": "view",734    "type": "function"735  },736  {737    "inputs": [],738    "name": "symbol",739    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],740    "stateMutability": "view",741    "type": "function"742  },743  {744    "inputs": [745      { "internalType": "uint256", "name": "index", "type": "uint256" }746    ],747    "name": "tokenByIndex",748    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],749    "stateMutability": "view",750    "type": "function"751  },752  {753    "inputs": [754      { "internalType": "address", "name": "owner", "type": "address" },755      { "internalType": "uint256", "name": "index", "type": "uint256" }756    ],757    "name": "tokenOfOwnerByIndex",758    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],759    "stateMutability": "view",760    "type": "function"761  },762  {763    "inputs": [],764    "name": "tokenPropertyPermissions",765    "outputs": [766      {767        "components": [768          { "internalType": "string", "name": "field_0", "type": "string" },769          {770            "components": [771              {772                "internalType": "enum EthTokenPermissions",773                "name": "field_0",774                "type": "uint8"775              },776              { "internalType": "bool", "name": "field_1", "type": "bool" }777            ],778            "internalType": "struct Tuple46[]",779            "name": "field_1",780            "type": "tuple[]"781          }782        ],783        "internalType": "struct Tuple48[]",784        "name": "",785        "type": "tuple[]"786      }787    ],788    "stateMutability": "view",789    "type": "function"790  },791  {792    "inputs": [793      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }794    ],795    "name": "tokenURI",796    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],797    "stateMutability": "view",798    "type": "function"799  },800  {801    "inputs": [],802    "name": "totalSupply",803    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],804    "stateMutability": "view",805    "type": "function"806  },807  {808    "inputs": [809      { "internalType": "address", "name": "to", "type": "address" },810      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }811    ],812    "name": "transfer",813    "outputs": [],814    "stateMutability": "nonpayable",815    "type": "function"816  },817  {818    "inputs": [819      {820        "components": [821          { "internalType": "address", "name": "eth", "type": "address" },822          { "internalType": "uint256", "name": "sub", "type": "uint256" }823        ],824        "internalType": "struct EthCrossAccount",825        "name": "to",826        "type": "tuple"827      },828      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }829    ],830    "name": "transferCross",831    "outputs": [],832    "stateMutability": "nonpayable",833    "type": "function"834  },835  {836    "inputs": [837      { "internalType": "address", "name": "from", "type": "address" },838      { "internalType": "address", "name": "to", "type": "address" },839      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }840    ],841    "name": "transferFrom",842    "outputs": [],843    "stateMutability": "nonpayable",844    "type": "function"845  },846  {847    "inputs": [848      {849        "components": [850          { "internalType": "address", "name": "eth", "type": "address" },851          { "internalType": "uint256", "name": "sub", "type": "uint256" }852        ],853        "internalType": "struct EthCrossAccount",854        "name": "from",855        "type": "tuple"856      },857      {858        "components": [859          { "internalType": "address", "name": "eth", "type": "address" },860          { "internalType": "uint256", "name": "sub", "type": "uint256" }861        ],862        "internalType": "struct EthCrossAccount",863        "name": "to",864        "type": "tuple"865      },866      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }867    ],868    "name": "transferFromCross",869    "outputs": [],870    "stateMutability": "nonpayable",871    "type": "function"872  },873  {874    "inputs": [],875    "name": "uniqueCollectionType",876    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],877    "stateMutability": "view",878    "type": "function"879  }880]
after · tests/src/eth/abi/nonFungible.json
1[2  {3    "anonymous": false,4    "inputs": [5      {6        "indexed": true,7        "internalType": "address",8        "name": "owner",9        "type": "address"10      },11      {12        "indexed": true,13        "internalType": "address",14        "name": "approved",15        "type": "address"16      },17      {18        "indexed": true,19        "internalType": "uint256",20        "name": "tokenId",21        "type": "uint256"22      }23    ],24    "name": "Approval",25    "type": "event"26  },27  {28    "anonymous": false,29    "inputs": [30      {31        "indexed": true,32        "internalType": "address",33        "name": "owner",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "operator",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "bool",45        "name": "approved",46        "type": "bool"47      }48    ],49    "name": "ApprovalForAll",50    "type": "event"51  },52  {53    "anonymous": false,54    "inputs": [],55    "name": "MintingFinished",56    "type": "event"57  },58  {59    "anonymous": false,60    "inputs": [61      {62        "indexed": true,63        "internalType": "address",64        "name": "from",65        "type": "address"66      },67      {68        "indexed": true,69        "internalType": "address",70        "name": "to",71        "type": "address"72      },73      {74        "indexed": true,75        "internalType": "uint256",76        "name": "tokenId",77        "type": "uint256"78      }79    ],80    "name": "Transfer",81    "type": "event"82  },83  {84    "inputs": [85      {86        "components": [87          { "internalType": "address", "name": "eth", "type": "address" },88          { "internalType": "uint256", "name": "sub", "type": "uint256" }89        ],90        "internalType": "struct EthCrossAccount",91        "name": "newAdmin",92        "type": "tuple"93      }94    ],95    "name": "addCollectionAdminCross",96    "outputs": [],97    "stateMutability": "nonpayable",98    "type": "function"99  },100  {101    "inputs": [102      {103        "components": [104          { "internalType": "address", "name": "eth", "type": "address" },105          { "internalType": "uint256", "name": "sub", "type": "uint256" }106        ],107        "internalType": "struct EthCrossAccount",108        "name": "user",109        "type": "tuple"110      }111    ],112    "name": "addToCollectionAllowListCross",113    "outputs": [],114    "stateMutability": "nonpayable",115    "type": "function"116  },117  {118    "inputs": [119      {120        "components": [121          { "internalType": "address", "name": "eth", "type": "address" },122          { "internalType": "uint256", "name": "sub", "type": "uint256" }123        ],124        "internalType": "struct EthCrossAccount",125        "name": "user",126        "type": "tuple"127      }128    ],129    "name": "allowlistedCross",130    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],131    "stateMutability": "view",132    "type": "function"133  },134  {135    "inputs": [136      { "internalType": "address", "name": "approved", "type": "address" },137      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }138    ],139    "name": "approve",140    "outputs": [],141    "stateMutability": "nonpayable",142    "type": "function"143  },144  {145    "inputs": [146      {147        "components": [148          { "internalType": "address", "name": "eth", "type": "address" },149          { "internalType": "uint256", "name": "sub", "type": "uint256" }150        ],151        "internalType": "struct EthCrossAccount",152        "name": "approved",153        "type": "tuple"154      },155      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156    ],157    "name": "approveCross",158    "outputs": [],159    "stateMutability": "nonpayable",160    "type": "function"161  },162  {163    "inputs": [164      { "internalType": "address", "name": "owner", "type": "address" }165    ],166    "name": "balanceOf",167    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],168    "stateMutability": "view",169    "type": "function"170  },171  {172    "inputs": [173      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174    ],175    "name": "burn",176    "outputs": [],177    "stateMutability": "nonpayable",178    "type": "function"179  },180  {181    "inputs": [182      {183        "components": [184          { "internalType": "address", "name": "eth", "type": "address" },185          { "internalType": "uint256", "name": "sub", "type": "uint256" }186        ],187        "internalType": "struct EthCrossAccount",188        "name": "from",189        "type": "tuple"190      },191      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }192    ],193    "name": "burnFromCross",194    "outputs": [],195    "stateMutability": "nonpayable",196    "type": "function"197  },198  {199    "inputs": [200      {201        "components": [202          { "internalType": "address", "name": "eth", "type": "address" },203          { "internalType": "uint256", "name": "sub", "type": "uint256" }204        ],205        "internalType": "struct EthCrossAccount",206        "name": "newOwner",207        "type": "tuple"208      }209    ],210    "name": "changeCollectionOwnerCross",211    "outputs": [],212    "stateMutability": "nonpayable",213    "type": "function"214  },215  {216    "inputs": [],217    "name": "collectionAdmins",218    "outputs": [219      {220        "components": [221          { "internalType": "address", "name": "eth", "type": "address" },222          { "internalType": "uint256", "name": "sub", "type": "uint256" }223        ],224        "internalType": "struct EthCrossAccount[]",225        "name": "",226        "type": "tuple[]"227      }228    ],229    "stateMutability": "view",230    "type": "function"231  },232  {233    "inputs": [],234    "name": "collectionHelperAddress",235    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],236    "stateMutability": "view",237    "type": "function"238  },239  {240    "inputs": [],241    "name": "collectionNestingPermissions",242    "outputs": [243      {244        "components": [245          {246            "internalType": "enum CollectionPermissions",247            "name": "field_0",248            "type": "uint8"249          },250          { "internalType": "bool", "name": "field_1", "type": "bool" }251        ],252        "internalType": "struct Tuple37[]",253        "name": "",254        "type": "tuple[]"255      }256    ],257    "stateMutability": "view",258    "type": "function"259  },260  {261    "inputs": [],262    "name": "collectionNestingRestrictedCollectionIds",263    "outputs": [264      {265        "components": [266          { "internalType": "bool", "name": "field_0", "type": "bool" },267          {268            "internalType": "uint256[]",269            "name": "field_1",270            "type": "uint256[]"271          }272        ],273        "internalType": "struct Tuple34",274        "name": "",275        "type": "tuple"276      }277    ],278    "stateMutability": "view",279    "type": "function"280  },281  {282    "inputs": [],283    "name": "collectionOwner",284    "outputs": [285      {286        "components": [287          { "internalType": "address", "name": "eth", "type": "address" },288          { "internalType": "uint256", "name": "sub", "type": "uint256" }289        ],290        "internalType": "struct EthCrossAccount",291        "name": "",292        "type": "tuple"293      }294    ],295    "stateMutability": "view",296    "type": "function"297  },298  {299    "inputs": [300      { "internalType": "string[]", "name": "keys", "type": "string[]" }301    ],302    "name": "collectionProperties",303    "outputs": [304      {305        "components": [306          { "internalType": "string", "name": "key", "type": "string" },307          { "internalType": "bytes", "name": "value", "type": "bytes" }308        ],309        "internalType": "struct Property[]",310        "name": "",311        "type": "tuple[]"312      }313    ],314    "stateMutability": "view",315    "type": "function"316  },317  {318    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],319    "name": "collectionProperty",320    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],321    "stateMutability": "view",322    "type": "function"323  },324  {325    "inputs": [],326    "name": "collectionSponsor",327    "outputs": [328      {329        "components": [330          { "internalType": "address", "name": "field_0", "type": "address" },331          { "internalType": "uint256", "name": "field_1", "type": "uint256" }332        ],333        "internalType": "struct Tuple30",334        "name": "",335        "type": "tuple"336      }337    ],338    "stateMutability": "view",339    "type": "function"340  },341  {342    "inputs": [],343    "name": "confirmCollectionSponsorship",344    "outputs": [],345    "stateMutability": "nonpayable",346    "type": "function"347  },348  {349    "inputs": [],350    "name": "contractAddress",351    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],352    "stateMutability": "view",353    "type": "function"354  },355  {356    "inputs": [357      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }358    ],359    "name": "crossOwnerOf",360    "outputs": [361      {362        "components": [363          { "internalType": "address", "name": "eth", "type": "address" },364          { "internalType": "uint256", "name": "sub", "type": "uint256" }365        ],366        "internalType": "struct EthCrossAccount",367        "name": "",368        "type": "tuple"369      }370    ],371    "stateMutability": "view",372    "type": "function"373  },374  {375    "inputs": [376      { "internalType": "string[]", "name": "keys", "type": "string[]" }377    ],378    "name": "deleteCollectionProperties",379    "outputs": [],380    "stateMutability": "nonpayable",381    "type": "function"382  },383  {384    "inputs": [385      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },386      { "internalType": "string[]", "name": "keys", "type": "string[]" }387    ],388    "name": "deleteProperties",389    "outputs": [],390    "stateMutability": "nonpayable",391    "type": "function"392  },393  {394    "inputs": [],395    "name": "description",396    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],397    "stateMutability": "view",398    "type": "function"399  },400  {401    "inputs": [],402    "name": "finishMinting",403    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],404    "stateMutability": "nonpayable",405    "type": "function"406  },407  {408    "inputs": [409      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }410    ],411    "name": "getApproved",412    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],413    "stateMutability": "view",414    "type": "function"415  },416  {417    "inputs": [],418    "name": "hasCollectionPendingSponsor",419    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],420    "stateMutability": "view",421    "type": "function"422  },423  {424    "inputs": [425      { "internalType": "address", "name": "owner", "type": "address" },426      { "internalType": "address", "name": "operator", "type": "address" }427    ],428    "name": "isApprovedForAll",429    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],430    "stateMutability": "view",431    "type": "function"432  },433  {434    "inputs": [435      {436        "components": [437          { "internalType": "address", "name": "eth", "type": "address" },438          { "internalType": "uint256", "name": "sub", "type": "uint256" }439        ],440        "internalType": "struct EthCrossAccount",441        "name": "user",442        "type": "tuple"443      }444    ],445    "name": "isOwnerOrAdminCross",446    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],447    "stateMutability": "view",448    "type": "function"449  },450  {451    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],452    "name": "mint",453    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],454    "stateMutability": "nonpayable",455    "type": "function"456  },457  {458    "inputs": [459      { "internalType": "address", "name": "to", "type": "address" },460      { "internalType": "string", "name": "tokenUri", "type": "string" }461    ],462    "name": "mintWithTokenURI",463    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],464    "stateMutability": "nonpayable",465    "type": "function"466  },467  {468    "inputs": [],469    "name": "mintingFinished",470    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],471    "stateMutability": "view",472    "type": "function"473  },474  {475    "inputs": [],476    "name": "name",477    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],478    "stateMutability": "view",479    "type": "function"480  },481  {482    "inputs": [],483    "name": "nextTokenId",484    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],485    "stateMutability": "view",486    "type": "function"487  },488  {489    "inputs": [490      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }491    ],492    "name": "ownerOf",493    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],494    "stateMutability": "view",495    "type": "function"496  },497  {498    "inputs": [499      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },500      { "internalType": "string[]", "name": "keys", "type": "string[]" }501    ],502    "name": "properties",503    "outputs": [504      {505        "components": [506          { "internalType": "string", "name": "key", "type": "string" },507          { "internalType": "bytes", "name": "value", "type": "bytes" }508        ],509        "internalType": "struct Property[]",510        "name": "",511        "type": "tuple[]"512      }513    ],514    "stateMutability": "view",515    "type": "function"516  },517  {518    "inputs": [519      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },520      { "internalType": "string", "name": "key", "type": "string" }521    ],522    "name": "property",523    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],524    "stateMutability": "view",525    "type": "function"526  },527  {528    "inputs": [529      {530        "components": [531          { "internalType": "address", "name": "eth", "type": "address" },532          { "internalType": "uint256", "name": "sub", "type": "uint256" }533        ],534        "internalType": "struct EthCrossAccount",535        "name": "admin",536        "type": "tuple"537      }538    ],539    "name": "removeCollectionAdminCross",540    "outputs": [],541    "stateMutability": "nonpayable",542    "type": "function"543  },544  {545    "inputs": [],546    "name": "removeCollectionSponsor",547    "outputs": [],548    "stateMutability": "nonpayable",549    "type": "function"550  },551  {552    "inputs": [553      {554        "components": [555          { "internalType": "address", "name": "eth", "type": "address" },556          { "internalType": "uint256", "name": "sub", "type": "uint256" }557        ],558        "internalType": "struct EthCrossAccount",559        "name": "user",560        "type": "tuple"561      }562    ],563    "name": "removeFromCollectionAllowListCross",564    "outputs": [],565    "stateMutability": "nonpayable",566    "type": "function"567  },568  {569    "inputs": [570      { "internalType": "address", "name": "from", "type": "address" },571      { "internalType": "address", "name": "to", "type": "address" },572      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }573    ],574    "name": "safeTransferFrom",575    "outputs": [],576    "stateMutability": "nonpayable",577    "type": "function"578  },579  {580    "inputs": [581      { "internalType": "address", "name": "from", "type": "address" },582      { "internalType": "address", "name": "to", "type": "address" },583      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },584      { "internalType": "bytes", "name": "data", "type": "bytes" }585    ],586    "name": "safeTransferFrom",587    "outputs": [],588    "stateMutability": "nonpayable",589    "type": "function"590  },591  {592    "inputs": [593      { "internalType": "address", "name": "operator", "type": "address" },594      { "internalType": "bool", "name": "approved", "type": "bool" }595    ],596    "name": "setApprovalForAll",597    "outputs": [],598    "stateMutability": "nonpayable",599    "type": "function"600  },601  {602    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],603    "name": "setCollectionAccess",604    "outputs": [],605    "stateMutability": "nonpayable",606    "type": "function"607  },608  {609    "inputs": [610      {611        "internalType": "enum CollectionLimits",612        "name": "limit",613        "type": "uint8"614      },615      { "internalType": "bool", "name": "status", "type": "bool" },616      { "internalType": "uint256", "name": "value", "type": "uint256" }617    ],618    "name": "setCollectionLimit",619    "outputs": [],620    "stateMutability": "nonpayable",621    "type": "function"622  },623  {624    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],625    "name": "setCollectionMintMode",626    "outputs": [],627    "stateMutability": "nonpayable",628    "type": "function"629  },630  {631    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],632    "name": "setCollectionNesting",633    "outputs": [],634    "stateMutability": "nonpayable",635    "type": "function"636  },637  {638    "inputs": [639      { "internalType": "bool", "name": "enable", "type": "bool" },640      {641        "internalType": "address[]",642        "name": "collections",643        "type": "address[]"644      }645    ],646    "name": "setCollectionNesting",647    "outputs": [],648    "stateMutability": "nonpayable",649    "type": "function"650  },651  {652    "inputs": [653      {654        "components": [655          { "internalType": "string", "name": "key", "type": "string" },656          { "internalType": "bytes", "name": "value", "type": "bytes" }657        ],658        "internalType": "struct Property[]",659        "name": "properties",660        "type": "tuple[]"661      }662    ],663    "name": "setCollectionProperties",664    "outputs": [],665    "stateMutability": "nonpayable",666    "type": "function"667  },668  {669    "inputs": [670      {671        "components": [672          { "internalType": "address", "name": "eth", "type": "address" },673          { "internalType": "uint256", "name": "sub", "type": "uint256" }674        ],675        "internalType": "struct EthCrossAccount",676        "name": "sponsor",677        "type": "tuple"678      }679    ],680    "name": "setCollectionSponsorCross",681    "outputs": [],682    "stateMutability": "nonpayable",683    "type": "function"684  },685  {686    "inputs": [687      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },688      {689        "components": [690          { "internalType": "string", "name": "key", "type": "string" },691          { "internalType": "bytes", "name": "value", "type": "bytes" }692        ],693        "internalType": "struct Property[]",694        "name": "properties",695        "type": "tuple[]"696      }697    ],698    "name": "setProperties",699    "outputs": [],700    "stateMutability": "nonpayable",701    "type": "function"702  },703  {704    "inputs": [705      {706        "components": [707          { "internalType": "string", "name": "field_0", "type": "string" },708          {709            "components": [710              {711                "internalType": "enum EthTokenPermissions",712                "name": "field_0",713                "type": "uint8"714              },715              { "internalType": "bool", "name": "field_1", "type": "bool" }716            ],717            "internalType": "struct Tuple46[]",718            "name": "field_1",719            "type": "tuple[]"720          }721        ],722        "internalType": "struct Tuple48[]",723        "name": "permissions",724        "type": "tuple[]"725      }726    ],727    "name": "setTokenPropertyPermissions",728    "outputs": [],729    "stateMutability": "nonpayable",730    "type": "function"731  },732  {733    "inputs": [734      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }735    ],736    "name": "supportsInterface",737    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],738    "stateMutability": "view",739    "type": "function"740  },741  {742    "inputs": [],743    "name": "symbol",744    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],745    "stateMutability": "view",746    "type": "function"747  },748  {749    "inputs": [750      { "internalType": "uint256", "name": "index", "type": "uint256" }751    ],752    "name": "tokenByIndex",753    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],754    "stateMutability": "view",755    "type": "function"756  },757  {758    "inputs": [759      { "internalType": "address", "name": "owner", "type": "address" },760      { "internalType": "uint256", "name": "index", "type": "uint256" }761    ],762    "name": "tokenOfOwnerByIndex",763    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],764    "stateMutability": "view",765    "type": "function"766  },767  {768    "inputs": [],769    "name": "tokenPropertyPermissions",770    "outputs": [771      {772        "components": [773          { "internalType": "string", "name": "field_0", "type": "string" },774          {775            "components": [776              {777                "internalType": "enum EthTokenPermissions",778                "name": "field_0",779                "type": "uint8"780              },781              { "internalType": "bool", "name": "field_1", "type": "bool" }782            ],783            "internalType": "struct Tuple46[]",784            "name": "field_1",785            "type": "tuple[]"786          }787        ],788        "internalType": "struct Tuple48[]",789        "name": "",790        "type": "tuple[]"791      }792    ],793    "stateMutability": "view",794    "type": "function"795  },796  {797    "inputs": [798      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }799    ],800    "name": "tokenURI",801    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],802    "stateMutability": "view",803    "type": "function"804  },805  {806    "inputs": [],807    "name": "totalSupply",808    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],809    "stateMutability": "view",810    "type": "function"811  },812  {813    "inputs": [814      { "internalType": "address", "name": "to", "type": "address" },815      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }816    ],817    "name": "transfer",818    "outputs": [],819    "stateMutability": "nonpayable",820    "type": "function"821  },822  {823    "inputs": [824      {825        "components": [826          { "internalType": "address", "name": "eth", "type": "address" },827          { "internalType": "uint256", "name": "sub", "type": "uint256" }828        ],829        "internalType": "struct EthCrossAccount",830        "name": "to",831        "type": "tuple"832      },833      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }834    ],835    "name": "transferCross",836    "outputs": [],837    "stateMutability": "nonpayable",838    "type": "function"839  },840  {841    "inputs": [842      { "internalType": "address", "name": "from", "type": "address" },843      { "internalType": "address", "name": "to", "type": "address" },844      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }845    ],846    "name": "transferFrom",847    "outputs": [],848    "stateMutability": "nonpayable",849    "type": "function"850  },851  {852    "inputs": [853      {854        "components": [855          { "internalType": "address", "name": "eth", "type": "address" },856          { "internalType": "uint256", "name": "sub", "type": "uint256" }857        ],858        "internalType": "struct EthCrossAccount",859        "name": "from",860        "type": "tuple"861      },862      {863        "components": [864          { "internalType": "address", "name": "eth", "type": "address" },865          { "internalType": "uint256", "name": "sub", "type": "uint256" }866        ],867        "internalType": "struct EthCrossAccount",868        "name": "to",869        "type": "tuple"870      },871      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }872    ],873    "name": "transferFromCross",874    "outputs": [],875    "stateMutability": "nonpayable",876    "type": "function"877  },878  {879    "inputs": [],880    "name": "uniqueCollectionType",881    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],882    "stateMutability": "view",883    "type": "function"884  }885]
modifiedtests/src/eth/abi/reFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -589,7 +589,12 @@
   },
   {
     "inputs": [
-      { "internalType": "string", "name": "limit", "type": "string" },
+      {
+        "internalType": "enum CollectionLimits",
+        "name": "limit",
+        "type": "uint8"
+      },
+      { "internalType": "bool", "name": "status", "type": "bool" },
       { "internalType": "uint256", "name": "value", "type": "uint256" }
     ],
     "name": "setCollectionLimit",
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -13,7 +13,11 @@
 }
 
 /// @title A contract that allows you to work with collections.
+<<<<<<< HEAD
 /// @dev the ERC-165 identifier for this interface is 0xb5e1747f
+=======
+/// @dev the ERC-165 identifier for this interface is 0xf8ebdec0
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
 interface Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -104,6 +108,23 @@
 	///  or in textual repr: collectionSponsor()
 	function collectionSponsor() external view returns (Tuple8 memory);
 
+	/// 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.
+	/// @dev EVM selector for this function is: 0xf63bc572,
+	///  or in textual repr: collectionLimits()
+	function collectionLimits() external view returns (Tuple19[] memory);
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -117,9 +138,13 @@
 	/// 	"ownerCanDestroy",
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
-	/// @dev EVM selector for this function is: 0x4ad890a8,
-	///  or in textual repr: setCollectionLimit(string,uint256)
-	function setCollectionLimit(string memory limit, uint256 value) external;
+	/// @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;
 
 	/// Get contract address.
 	/// @dev EVM selector for this function is: 0xf6b4dfb4,
@@ -288,6 +313,7 @@
 	uint256 sub;
 }
 
+<<<<<<< HEAD
 /// @dev anonymous struct
 struct Tuple23 {
 	CollectionPermissions field_0;
@@ -303,6 +329,25 @@
 struct Tuple20 {
 	bool field_0;
 	uint256[] field_1;
+=======
+enum CollectionLimits {
+	AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled
+}
+
+/// @dev anonymous struct
+struct Tuple19 {
+	CollectionLimits field_0;
+	bool field_1;
+	uint256 field_2;
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
 }
 
 /// @dev Property struct
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -104,7 +104,11 @@
 }
 
 /// @title A contract that allows you to work with collections.
+<<<<<<< HEAD
 /// @dev the ERC-165 identifier for this interface is 0xb5e1747f
+=======
+/// @dev the ERC-165 identifier for this interface is 0xf8ebdec0
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
 interface Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -195,6 +199,23 @@
 	///  or in textual repr: collectionSponsor()
 	function collectionSponsor() external view returns (Tuple27 memory);
 
+	/// 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.
+	/// @dev EVM selector for this function is: 0xf63bc572,
+	///  or in textual repr: collectionLimits()
+	function collectionLimits() external view returns (Tuple30[] memory);
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -208,9 +229,13 @@
 	/// 	"ownerCanDestroy",
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
-	/// @dev EVM selector for this function is: 0x4ad890a8,
-	///  or in textual repr: setCollectionLimit(string,uint256)
-	function setCollectionLimit(string memory limit, uint256 value) external;
+	/// @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;
 
 	/// Get contract address.
 	/// @dev EVM selector for this function is: 0xf6b4dfb4,
@@ -379,6 +404,25 @@
 	uint256 sub;
 }
 
+enum CollectionLimits {
+	AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled
+}
+
+/// @dev anonymous struct
+struct Tuple30 {
+	CollectionLimits field_0;
+	bool field_1;
+	uint256 field_2;
+}
+
 /// @dev anonymous struct
 struct Tuple34 {
 	CollectionPermissions field_0;
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -105,7 +105,11 @@
 }
 
 /// @title A contract that allows you to work with collections.
+<<<<<<< HEAD
 /// @dev the ERC-165 identifier for this interface is 0xb5e1747f
+=======
+/// @dev the ERC-165 identifier for this interface is 0xf8ebdec0
+>>>>>>> 32e011ce... added `collectionLimits` function in `Collection` interface,  changed signture for `setCollectionLimit`
 interface Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -196,6 +200,23 @@
 	///  or in textual repr: collectionSponsor()
 	function collectionSponsor() external view returns (Tuple26 memory);
 
+	/// 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.
+	/// @dev EVM selector for this function is: 0xf63bc572,
+	///  or in textual repr: collectionLimits()
+	function collectionLimits() external view returns (Tuple29[] memory);
+
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
 	/// @param limit Name of the limit. Valid names:
@@ -209,9 +230,13 @@
 	/// 	"ownerCanDestroy",
 	/// 	"transfersEnabled"
 	/// @param value Value of the limit.
-	/// @dev EVM selector for this function is: 0x4ad890a8,
-	///  or in textual repr: setCollectionLimit(string,uint256)
-	function setCollectionLimit(string memory limit, uint256 value) external;
+	/// @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;
 
 	/// Get contract address.
 	/// @dev EVM selector for this function is: 0xf6b4dfb4,
@@ -380,6 +405,25 @@
 	uint256 sub;
 }
 
+enum CollectionLimits {
+	AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled
+}
+
+/// @dev anonymous struct
+struct Tuple29 {
+	CollectionLimits field_0;
+	bool field_1;
+	uint256 field_2;
+}
+
 /// @dev anonymous struct
 struct Tuple33 {
 	CollectionPermissions field_0;
modifiedtests/src/eth/createFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createFTCollection.test.ts
+++ b/tests/src/eth/createFTCollection.test.ts
@@ -17,7 +17,7 @@
 import {IKeyringPair} from '@polkadot/types/types';
 import {evmToAddress} from '@polkadot/util-crypto';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
 
 const DECIMALS = 18;
 
@@ -79,6 +79,56 @@
     expect(await collection.methods.description().call()).to.deep.equal(description);
   });
 
+  itEth('Set limits', async ({helper}) => {
+    const owner = await helper.eth.createAccountWithBalance(donor);
+    const {collectionId, collectionAddress} = await helper.eth.createFungibleCollection(owner, 'Limits', DECIMALS, 'absolutely anything', 'INSI');
+    const limits = {
+      accountTokenOwnershipLimit: 1000,
+      sponsoredDataSize: 1024,
+      sponsoredDataRateLimit: 30,
+      tokenLimit: 1000000,
+      sponsorTransferTimeout: 6,
+      sponsorApproveTimeout: 6,
+      ownerCanTransfer: 0,
+      ownerCanDestroy: 0,
+      transfersEnabled: 0,
+    };
+    
+    const expectedLimits = {
+      accountTokenOwnershipLimit: 1000,
+      sponsoredDataSize: 1024,
+      sponsoredDataRateLimit: 30,
+      tokenLimit: 1000000,
+      sponsorTransferTimeout: 6,
+      sponsorApproveTimeout: 6,
+      ownerCanTransfer: false,
+      ownerCanDestroy: false,
+      transfersEnabled: false,
+    };
+   
+    const collection = helper.ethNativeContract.collection(collectionAddress, 'ft', owner);
+    await collection.methods.setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();
+    
+    const data = (await helper.rft.getData(collectionId))!;
+    expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit);
+    expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize);
+    expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit);
+    expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit);
+    expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout);
+    expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout);
+    expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer);
+    expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy);
+    expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled);
+  });
+
   itEth('Collection address exist', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const collectionAddressForNonexistentCollection = '0x17C4E6453CC49AAAAEACA894E6D9683E00112233';
@@ -197,6 +247,7 @@
     {
       await expect(peasantCollection.methods
         .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
         .call()).to.be.rejectedWith(EXPECTED_ERROR);
     }
   });
@@ -224,5 +275,31 @@
         .setCollectionLimit('accountTokenOwnershipLimit', '1000')
         .call()).to.be.rejectedWith(EXPECTED_ERROR);
     }
-  });    
+  });
+
+  itEth('(!negative test!) Set limits', async ({helper}) => {
+
+    const invalidLimits = {
+      accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
+      transfersEnabled: 3,
+    };
+
+    const owner = await helper.eth.createAccountWithBalance(donor);
+    const {collectionAddress} = await helper.eth.createFungibleCollection(owner, 'Limits', DECIMALS, 'absolutely anything', 'ISNI');
+    const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'ft', owner);
+    await expect(collectionEvm.methods
+      .setCollectionLimit(20, true, '1')
+      .call()).to.be.rejectedWith('Returned error: VM Exception while processing transaction: revert Value not convertible into enum "CollectionLimits"');
+    
+    await expect(collectionEvm.methods
+      .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)
+      .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+    
+    await expect(collectionEvm.methods
+      .setCollectionLimit(CollectionLimits.TransferEnabled, true, invalidLimits.transfersEnabled)
+      .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
+  });
+
+   
+    
 });
modifiedtests/src/eth/createNFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createNFTCollection.test.ts
+++ b/tests/src/eth/createNFTCollection.test.ts
@@ -16,7 +16,7 @@
 
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
 
 
 describe('Create NFT collection from EVM', () => {
@@ -120,6 +120,56 @@
     expect(await sponsorCollection.methods.description().call()).to.deep.equal(description);
   });
 
+  itEth('Set limits', async ({helper}) => {
+    const owner = await helper.eth.createAccountWithBalance(donor);
+    const {collectionId, collectionAddress} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'FLO');
+    const limits = {
+      accountTokenOwnershipLimit: 1000,
+      sponsoredDataSize: 1024,
+      sponsoredDataRateLimit: 30,
+      tokenLimit: 1000000,
+      sponsorTransferTimeout: 6,
+      sponsorApproveTimeout: 6,
+      ownerCanTransfer: 0,
+      ownerCanDestroy: 0,
+      transfersEnabled: 0,
+    };
+    
+    const expectedLimits = {
+      accountTokenOwnershipLimit: 1000,
+      sponsoredDataSize: 1024,
+      sponsoredDataRateLimit: 30,
+      tokenLimit: 1000000,
+      sponsorTransferTimeout: 6,
+      sponsorApproveTimeout: 6,
+      ownerCanTransfer: false,
+      ownerCanDestroy: false,
+      transfersEnabled: false,
+    };
+
+    const collection = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
+    await collection.methods.setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();
+
+    const data = (await helper.rft.getData(collectionId))!;
+    expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit);
+    expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize);
+    expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit);
+    expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit);
+    expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout);
+    expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout);
+    expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer);
+    expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy);
+    expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled);
+  });
+
   itEth('Collection address exist', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const collectionAddressForNonexistentCollection = '0x17C4E6453CC49AAAAEACA894E6D9683E00112233';
@@ -207,7 +257,7 @@
     }
     {
       await expect(malfeasantCollection.methods
-        .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
         .call()).to.be.rejectedWith(EXPECTED_ERROR);
     }
   });
@@ -232,11 +282,30 @@
     }
     {
       await expect(malfeasantCollection.methods
-        .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
         .call()).to.be.rejectedWith(EXPECTED_ERROR);
     }
   });
 
+  itEth('(!negative test!) Set limits', async ({helper}) => {
+    const invalidLimits = {
+      accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
+      transfersEnabled: 3,
+    };
+
+    const owner = await helper.eth.createAccountWithBalance(donor);
+    const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'OLF');
+    const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
+    
+    await expect(collectionEvm.methods
+      .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)
+      .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+    
+    await expect(collectionEvm.methods
+      .setCollectionLimit(CollectionLimits.TransferEnabled, true, invalidLimits.transfersEnabled)
+      .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
+  });
+
   itEth('destroyCollection', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'Limits', 'absolutely anything', 'OLF');
modifiedtests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createRFTCollection.test.ts
+++ b/tests/src/eth/createRFTCollection.test.ts
@@ -17,7 +17,7 @@
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
 
 
 describe('Create RFT collection from EVM', () => {
@@ -152,6 +152,56 @@
     expect(data.raw.sponsorship.Confirmed).to.be.equal(evmToAddress(sponsor, Number(ss58Format)));
   });
 
+  itEth('Set limits', async ({helper}) => {
+    const owner = await helper.eth.createAccountWithBalance(donor);
+    const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(owner, 'Limits', 'absolutely anything', 'INSI');
+    const limits = {
+      accountTokenOwnershipLimit: 1000,
+      sponsoredDataSize: 1024,
+      sponsoredDataRateLimit: 30,
+      tokenLimit: 1000000,
+      sponsorTransferTimeout: 6,
+      sponsorApproveTimeout: 6,
+      ownerCanTransfer: 0,
+      ownerCanDestroy: 0,
+      transfersEnabled: 0,
+    };
+    
+    const expectedLimits = {
+      accountTokenOwnershipLimit: 1000,
+      sponsoredDataSize: 1024,
+      sponsoredDataRateLimit: 30,
+      tokenLimit: 1000000,
+      sponsorTransferTimeout: 6,
+      sponsorApproveTimeout: 6,
+      ownerCanTransfer: false,
+      ownerCanDestroy: false,
+      transfersEnabled: false,
+    };
+    
+    const collection = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);
+    await collection.methods.setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, limits.accountTokenOwnershipLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataSize, true, limits.sponsoredDataSize).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsoredDataRateLimit, true, limits.sponsoredDataRateLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.TokenLimit, true, limits.tokenLimit).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsorTransferTimeout, true, limits.sponsorTransferTimeout).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.SponsorApproveTimeout, true, limits.sponsorApproveTimeout).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, limits.ownerCanTransfer).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanDestroy, true, limits.ownerCanDestroy).send();
+    await collection.methods.setCollectionLimit(CollectionLimits.TransferEnabled, true, limits.transfersEnabled).send();
+    
+    const data = (await helper.rft.getData(collectionId))!;
+    expect(data.raw.limits.accountTokenOwnershipLimit).to.be.eq(expectedLimits.accountTokenOwnershipLimit);
+    expect(data.raw.limits.sponsoredDataSize).to.be.eq(expectedLimits.sponsoredDataSize);
+    expect(data.raw.limits.sponsoredDataRateLimit.blocks).to.be.eq(expectedLimits.sponsoredDataRateLimit);
+    expect(data.raw.limits.tokenLimit).to.be.eq(expectedLimits.tokenLimit);
+    expect(data.raw.limits.sponsorTransferTimeout).to.be.eq(expectedLimits.sponsorTransferTimeout);
+    expect(data.raw.limits.sponsorApproveTimeout).to.be.eq(expectedLimits.sponsorApproveTimeout);
+    expect(data.raw.limits.ownerCanTransfer).to.be.eq(expectedLimits.ownerCanTransfer);
+    expect(data.raw.limits.ownerCanDestroy).to.be.eq(expectedLimits.ownerCanDestroy);
+    expect(data.raw.limits.transfersEnabled).to.be.eq(expectedLimits.transfersEnabled);
+  });
+
   itEth('Collection address exist', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const collectionAddressForNonexistentCollection = '0x17C4E6453CC49AAAAEACA894E6D9683E00112233';
@@ -239,7 +289,7 @@
     }
     {
       await expect(peasantCollection.methods
-        .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
         .call()).to.be.rejectedWith(EXPECTED_ERROR);
     }
   });
@@ -264,10 +314,29 @@
     }
     {
       await expect(peasantCollection.methods
-        .setCollectionLimit('accountTokenOwnershipLimit', '1000')
+        .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, 1000)
         .call()).to.be.rejectedWith(EXPECTED_ERROR);
     }
   });
+
+  itEth('(!negative test!) Set limits', async ({helper}) => {
+    const invalidLimits = {
+      accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
+      transfersEnabled: 3,
+    };
+
+    const owner = await helper.eth.createAccountWithBalance(donor);
+    const {collectionAddress} = await helper.eth.createRFTCollection(owner, 'Limits', 'absolutely anything', 'ISNI');
+    const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);
+    
+    await expect(collectionEvm.methods
+      .setCollectionLimit(CollectionLimits.AccountTokenOwnership, true, invalidLimits.accountTokenOwnershipLimit)
+      .call()).to.be.rejectedWith(`can't convert value to u32 "${invalidLimits.accountTokenOwnershipLimit}"`);
+    
+    await expect(collectionEvm.methods
+      .setCollectionLimit(CollectionLimits.TransferEnabled, true, invalidLimits.transfersEnabled)
+      .call()).to.be.rejectedWith(`can't convert value to boolean "${invalidLimits.transfersEnabled}"`);
+  });
   
   itEth('destroyCollection', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
modifiedtests/src/eth/util/index.tsdiffbeforeafterboth
--- a/tests/src/eth/util/index.ts
+++ b/tests/src/eth/util/index.ts
@@ -26,6 +26,17 @@
   Allowlisted = 1,
   Generous = 2,
 }
+export enum CollectionLimits {
+  AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled
+}
 
 export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair>) => Promise<void>) => {
   const silentConsole = new SilentConsole();