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

difftreelog

added `collectionNestingPermissions` funtion in `Collection` interface

PraetorP2022-12-06parent: #5223dbe.patch.diff
in: master

13 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -26,7 +26,7 @@
 	weight,
 };
 use pallet_evm_coder_substrate::dispatch_to_evm;
-use sp_std::vec::Vec;
+use sp_std::{vec, vec::Vec};
 use up_data_structs::{
 	AccessMode, CollectionMode, CollectionPermissions, OwnerRestrictedSet, Property,
 	SponsoringRateLimit, SponsorshipState,
@@ -35,7 +35,9 @@
 
 use crate::{
 	Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf,
-	eth::{EthCrossAccount, convert_cross_account_to_uint256},
+	eth::{
+		EthCrossAccount, convert_cross_account_to_uint256, CollectionPermissions as EvmPermissions,
+	},
 	weights::WeightInfo,
 };
 
@@ -508,6 +510,14 @@
 		))
 	}
 
+	/// Returns permissions for a collection
+	fn collection_nesting_permissions(&self) -> Result<Vec<(EvmPermissions, bool)>> {
+		let nesting = self.collection.permissions.nesting();
+		Ok(vec![
+			(EvmPermissions::CollectionAdmin, nesting.collection_admin),
+			(EvmPermissions::TokenOwner, nesting.token_owner),
+		])
+	}
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -155,3 +155,10 @@
 		}
 	}
 }
+#[derive(Default, Debug, Clone, Copy, AbiCoder)]
+#[repr(u8)]
+pub enum CollectionPermissions {
+	#[default]
+	CollectionAdmin,
+	TokenOwner,
+}
modifiedpallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- 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 0xeecfdb34
+/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
 contract Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -263,6 +263,15 @@
 		return Tuple21(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 (Tuple24[] memory) {
+		require(false, stub_error);
+		dummy;
+		return new Tuple24[](0);
+	}
+
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
@@ -434,6 +443,17 @@
 	uint256 sub;
 }
 
+enum CollectionPermissions {
+	CollectionAdmin,
+	TokenOwner
+}
+
+/// @dev anonymous struct
+struct Tuple24 {
+	CollectionPermissions field_0;
+	bool field_1;
+}
+
 /// @dev anonymous struct
 struct Tuple21 {
 	bool field_0;
modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -119,7 +119,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0xeecfdb34
+/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
 contract Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -364,6 +364,15 @@
 		return Tuple34(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 (Tuple37[] memory) {
+		require(false, stub_error);
+		dummy;
+		return new Tuple37[](0);
+	}
+
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
@@ -535,6 +544,17 @@
 	uint256 sub;
 }
 
+enum CollectionPermissions {
+	CollectionAdmin,
+	TokenOwner
+}
+
+/// @dev anonymous struct
+struct Tuple37 {
+	CollectionPermissions field_0;
+	bool field_1;
+}
+
 /// @dev anonymous struct
 struct Tuple34 {
 	bool field_0;
modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -119,7 +119,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0xeecfdb34
+/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
 contract Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -364,6 +364,15 @@
 		return Tuple33(false, new uint256[](0));
 	}
 
+	/// Returns permissions for a collection
+	/// @dev EVM selector for this function is: 0x5b2eaf4b,
+	///  or in textual repr: collectionNestingPermissions()
+	function collectionNestingPermissions() public view returns (Tuple36[] memory) {
+		require(false, stub_error);
+		dummy;
+		return new Tuple36[](0);
+	}
+
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
@@ -535,6 +544,17 @@
 	uint256 sub;
 }
 
+enum CollectionPermissions {
+	CollectionAdmin,
+	TokenOwner
+}
+
+/// @dev anonymous struct
+struct Tuple36 {
+	CollectionPermissions field_0;
+	bool field_1;
+}
+
 /// @dev anonymous struct
 struct Tuple33 {
 	bool field_0;
modifiedtests/src/eth/abi/fungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/fungible.json
+++ b/tests/src/eth/abi/fungible.json
@@ -208,6 +208,27 @@
   },
   {
     "inputs": [],
+    "name": "collectionNestingPermissions",
+    "outputs": [
+      {
+        "components": [
+          {
+            "internalType": "enum CollectionPermissions",
+            "name": "field_0",
+            "type": "uint8"
+          },
+          { "internalType": "bool", "name": "field_1", "type": "bool" }
+        ],
+        "internalType": "struct Tuple24[]",
+        "name": "",
+        "type": "tuple[]"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
     "name": "collectionNestingRestrictedCollectionIds",
     "outputs": [
       {
modifiedtests/src/eth/abi/nonFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -238,6 +238,27 @@
   },
   {
     "inputs": [],
+    "name": "collectionNestingPermissions",
+    "outputs": [
+      {
+        "components": [
+          {
+            "internalType": "enum CollectionPermissions",
+            "name": "field_0",
+            "type": "uint8"
+          },
+          { "internalType": "bool", "name": "field_1", "type": "bool" }
+        ],
+        "internalType": "struct Tuple37[]",
+        "name": "",
+        "type": "tuple[]"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
     "name": "collectionNestingRestrictedCollectionIds",
     "outputs": [
       {
modifiedtests/src/eth/abi/reFungible.jsondiffbeforeafterboth
before · tests/src/eth/abi/reFungible.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      { "internalType": "address", "name": "owner", "type": "address" }147    ],148    "name": "balanceOf",149    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],150    "stateMutability": "view",151    "type": "function"152  },153  {154    "inputs": [155      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156    ],157    "name": "burn",158    "outputs": [],159    "stateMutability": "nonpayable",160    "type": "function"161  },162  {163    "inputs": [164      {165        "components": [166          { "internalType": "address", "name": "eth", "type": "address" },167          { "internalType": "uint256", "name": "sub", "type": "uint256" }168        ],169        "internalType": "struct EthCrossAccount",170        "name": "from",171        "type": "tuple"172      },173      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174    ],175    "name": "burnFromCross",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": "newOwner",189        "type": "tuple"190      }191    ],192    "name": "changeCollectionOwnerCross",193    "outputs": [],194    "stateMutability": "nonpayable",195    "type": "function"196  },197  {198    "inputs": [],199    "name": "collectionAdmins",200    "outputs": [201      {202        "components": [203          { "internalType": "address", "name": "eth", "type": "address" },204          { "internalType": "uint256", "name": "sub", "type": "uint256" }205        ],206        "internalType": "struct EthCrossAccount[]",207        "name": "",208        "type": "tuple[]"209      }210    ],211    "stateMutability": "view",212    "type": "function"213  },214  {215    "inputs": [],216    "name": "collectionHelperAddress",217    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],218    "stateMutability": "view",219    "type": "function"220  },221  {222    "inputs": [],223    "name": "collectionNestingRestrictedCollectionIds",224    "outputs": [225      {226        "components": [227          { "internalType": "bool", "name": "field_0", "type": "bool" },228          {229            "internalType": "uint256[]",230            "name": "field_1",231            "type": "uint256[]"232          }233        ],234        "internalType": "struct Tuple33",235        "name": "",236        "type": "tuple"237      }238    ],239    "stateMutability": "view",240    "type": "function"241  },242  {243    "inputs": [],244    "name": "collectionOwner",245    "outputs": [246      {247        "components": [248          { "internalType": "address", "name": "eth", "type": "address" },249          { "internalType": "uint256", "name": "sub", "type": "uint256" }250        ],251        "internalType": "struct EthCrossAccount",252        "name": "",253        "type": "tuple"254      }255    ],256    "stateMutability": "view",257    "type": "function"258  },259  {260    "inputs": [261      { "internalType": "string[]", "name": "keys", "type": "string[]" }262    ],263    "name": "collectionProperties",264    "outputs": [265      {266        "components": [267          { "internalType": "string", "name": "key", "type": "string" },268          { "internalType": "bytes", "name": "value", "type": "bytes" }269        ],270        "internalType": "struct Property[]",271        "name": "",272        "type": "tuple[]"273      }274    ],275    "stateMutability": "view",276    "type": "function"277  },278  {279    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],280    "name": "collectionProperty",281    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],282    "stateMutability": "view",283    "type": "function"284  },285  {286    "inputs": [],287    "name": "collectionSponsor",288    "outputs": [289      {290        "components": [291          { "internalType": "address", "name": "field_0", "type": "address" },292          { "internalType": "uint256", "name": "field_1", "type": "uint256" }293        ],294        "internalType": "struct Tuple29",295        "name": "",296        "type": "tuple"297      }298    ],299    "stateMutability": "view",300    "type": "function"301  },302  {303    "inputs": [],304    "name": "confirmCollectionSponsorship",305    "outputs": [],306    "stateMutability": "nonpayable",307    "type": "function"308  },309  {310    "inputs": [],311    "name": "contractAddress",312    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],313    "stateMutability": "view",314    "type": "function"315  },316  {317    "inputs": [318      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }319    ],320    "name": "crossOwnerOf",321    "outputs": [322      {323        "components": [324          { "internalType": "address", "name": "eth", "type": "address" },325          { "internalType": "uint256", "name": "sub", "type": "uint256" }326        ],327        "internalType": "struct EthCrossAccount",328        "name": "",329        "type": "tuple"330      }331    ],332    "stateMutability": "view",333    "type": "function"334  },335  {336    "inputs": [337      { "internalType": "string[]", "name": "keys", "type": "string[]" }338    ],339    "name": "deleteCollectionProperties",340    "outputs": [],341    "stateMutability": "nonpayable",342    "type": "function"343  },344  {345    "inputs": [346      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },347      { "internalType": "string[]", "name": "keys", "type": "string[]" }348    ],349    "name": "deleteProperties",350    "outputs": [],351    "stateMutability": "nonpayable",352    "type": "function"353  },354  {355    "inputs": [],356    "name": "description",357    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],358    "stateMutability": "view",359    "type": "function"360  },361  {362    "inputs": [],363    "name": "finishMinting",364    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],365    "stateMutability": "nonpayable",366    "type": "function"367  },368  {369    "inputs": [370      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }371    ],372    "name": "getApproved",373    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],374    "stateMutability": "view",375    "type": "function"376  },377  {378    "inputs": [],379    "name": "hasCollectionPendingSponsor",380    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],381    "stateMutability": "view",382    "type": "function"383  },384  {385    "inputs": [386      { "internalType": "address", "name": "owner", "type": "address" },387      { "internalType": "address", "name": "operator", "type": "address" }388    ],389    "name": "isApprovedForAll",390    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],391    "stateMutability": "view",392    "type": "function"393  },394  {395    "inputs": [396      {397        "components": [398          { "internalType": "address", "name": "eth", "type": "address" },399          { "internalType": "uint256", "name": "sub", "type": "uint256" }400        ],401        "internalType": "struct EthCrossAccount",402        "name": "user",403        "type": "tuple"404      }405    ],406    "name": "isOwnerOrAdminCross",407    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],408    "stateMutability": "view",409    "type": "function"410  },411  {412    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],413    "name": "mint",414    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],415    "stateMutability": "nonpayable",416    "type": "function"417  },418  {419    "inputs": [420      { "internalType": "address", "name": "to", "type": "address" },421      { "internalType": "string", "name": "tokenUri", "type": "string" }422    ],423    "name": "mintWithTokenURI",424    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],425    "stateMutability": "nonpayable",426    "type": "function"427  },428  {429    "inputs": [],430    "name": "mintingFinished",431    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],432    "stateMutability": "view",433    "type": "function"434  },435  {436    "inputs": [],437    "name": "name",438    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],439    "stateMutability": "view",440    "type": "function"441  },442  {443    "inputs": [],444    "name": "nextTokenId",445    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],446    "stateMutability": "view",447    "type": "function"448  },449  {450    "inputs": [451      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }452    ],453    "name": "ownerOf",454    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],455    "stateMutability": "view",456    "type": "function"457  },458  {459    "inputs": [460      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },461      { "internalType": "string[]", "name": "keys", "type": "string[]" }462    ],463    "name": "properties",464    "outputs": [465      {466        "components": [467          { "internalType": "string", "name": "key", "type": "string" },468          { "internalType": "bytes", "name": "value", "type": "bytes" }469        ],470        "internalType": "struct Property[]",471        "name": "",472        "type": "tuple[]"473      }474    ],475    "stateMutability": "view",476    "type": "function"477  },478  {479    "inputs": [480      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },481      { "internalType": "string", "name": "key", "type": "string" }482    ],483    "name": "property",484    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],485    "stateMutability": "view",486    "type": "function"487  },488  {489    "inputs": [490      {491        "components": [492          { "internalType": "address", "name": "eth", "type": "address" },493          { "internalType": "uint256", "name": "sub", "type": "uint256" }494        ],495        "internalType": "struct EthCrossAccount",496        "name": "admin",497        "type": "tuple"498      }499    ],500    "name": "removeCollectionAdminCross",501    "outputs": [],502    "stateMutability": "nonpayable",503    "type": "function"504  },505  {506    "inputs": [],507    "name": "removeCollectionSponsor",508    "outputs": [],509    "stateMutability": "nonpayable",510    "type": "function"511  },512  {513    "inputs": [514      {515        "components": [516          { "internalType": "address", "name": "eth", "type": "address" },517          { "internalType": "uint256", "name": "sub", "type": "uint256" }518        ],519        "internalType": "struct EthCrossAccount",520        "name": "user",521        "type": "tuple"522      }523    ],524    "name": "removeFromCollectionAllowListCross",525    "outputs": [],526    "stateMutability": "nonpayable",527    "type": "function"528  },529  {530    "inputs": [531      { "internalType": "address", "name": "from", "type": "address" },532      { "internalType": "address", "name": "to", "type": "address" },533      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }534    ],535    "name": "safeTransferFrom",536    "outputs": [],537    "stateMutability": "nonpayable",538    "type": "function"539  },540  {541    "inputs": [542      { "internalType": "address", "name": "from", "type": "address" },543      { "internalType": "address", "name": "to", "type": "address" },544      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },545      { "internalType": "bytes", "name": "data", "type": "bytes" }546    ],547    "name": "safeTransferFromWithData",548    "outputs": [],549    "stateMutability": "nonpayable",550    "type": "function"551  },552  {553    "inputs": [554      { "internalType": "address", "name": "operator", "type": "address" },555      { "internalType": "bool", "name": "approved", "type": "bool" }556    ],557    "name": "setApprovalForAll",558    "outputs": [],559    "stateMutability": "nonpayable",560    "type": "function"561  },562  {563    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],564    "name": "setCollectionAccess",565    "outputs": [],566    "stateMutability": "nonpayable",567    "type": "function"568  },569  {570    "inputs": [571      { "internalType": "string", "name": "limit", "type": "string" },572      { "internalType": "uint256", "name": "value", "type": "uint256" }573    ],574    "name": "setCollectionLimit",575    "outputs": [],576    "stateMutability": "nonpayable",577    "type": "function"578  },579  {580    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],581    "name": "setCollectionMintMode",582    "outputs": [],583    "stateMutability": "nonpayable",584    "type": "function"585  },586  {587    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],588    "name": "setCollectionNesting",589    "outputs": [],590    "stateMutability": "nonpayable",591    "type": "function"592  },593  {594    "inputs": [595      { "internalType": "bool", "name": "enable", "type": "bool" },596      {597        "internalType": "address[]",598        "name": "collections",599        "type": "address[]"600      }601    ],602    "name": "setCollectionNesting",603    "outputs": [],604    "stateMutability": "nonpayable",605    "type": "function"606  },607  {608    "inputs": [609      {610        "components": [611          { "internalType": "string", "name": "key", "type": "string" },612          { "internalType": "bytes", "name": "value", "type": "bytes" }613        ],614        "internalType": "struct Property[]",615        "name": "properties",616        "type": "tuple[]"617      }618    ],619    "name": "setCollectionProperties",620    "outputs": [],621    "stateMutability": "nonpayable",622    "type": "function"623  },624  {625    "inputs": [626      {627        "components": [628          { "internalType": "address", "name": "eth", "type": "address" },629          { "internalType": "uint256", "name": "sub", "type": "uint256" }630        ],631        "internalType": "struct EthCrossAccount",632        "name": "sponsor",633        "type": "tuple"634      }635    ],636    "name": "setCollectionSponsorCross",637    "outputs": [],638    "stateMutability": "nonpayable",639    "type": "function"640  },641  {642    "inputs": [643      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },644      {645        "components": [646          { "internalType": "string", "name": "key", "type": "string" },647          { "internalType": "bytes", "name": "value", "type": "bytes" }648        ],649        "internalType": "struct Property[]",650        "name": "properties",651        "type": "tuple[]"652      }653    ],654    "name": "setProperties",655    "outputs": [],656    "stateMutability": "nonpayable",657    "type": "function"658  },659  {660    "inputs": [661      { "internalType": "string", "name": "key", "type": "string" },662      { "internalType": "bool", "name": "isMutable", "type": "bool" },663      { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },664      { "internalType": "bool", "name": "tokenOwner", "type": "bool" }665    ],666    "name": "setTokenPropertyPermission",667    "outputs": [],668    "stateMutability": "nonpayable",669    "type": "function"670  },671  {672    "inputs": [673      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }674    ],675    "name": "supportsInterface",676    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],677    "stateMutability": "view",678    "type": "function"679  },680  {681    "inputs": [],682    "name": "symbol",683    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],684    "stateMutability": "view",685    "type": "function"686  },687  {688    "inputs": [689      { "internalType": "uint256", "name": "index", "type": "uint256" }690    ],691    "name": "tokenByIndex",692    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],693    "stateMutability": "view",694    "type": "function"695  },696  {697    "inputs": [698      { "internalType": "uint256", "name": "token", "type": "uint256" }699    ],700    "name": "tokenContractAddress",701    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],702    "stateMutability": "view",703    "type": "function"704  },705  {706    "inputs": [707      { "internalType": "address", "name": "owner", "type": "address" },708      { "internalType": "uint256", "name": "index", "type": "uint256" }709    ],710    "name": "tokenOfOwnerByIndex",711    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],712    "stateMutability": "view",713    "type": "function"714  },715  {716    "inputs": [717      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }718    ],719    "name": "tokenURI",720    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],721    "stateMutability": "view",722    "type": "function"723  },724  {725    "inputs": [],726    "name": "totalSupply",727    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],728    "stateMutability": "view",729    "type": "function"730  },731  {732    "inputs": [733      { "internalType": "address", "name": "to", "type": "address" },734      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }735    ],736    "name": "transfer",737    "outputs": [],738    "stateMutability": "nonpayable",739    "type": "function"740  },741  {742    "inputs": [743      {744        "components": [745          { "internalType": "address", "name": "eth", "type": "address" },746          { "internalType": "uint256", "name": "sub", "type": "uint256" }747        ],748        "internalType": "struct EthCrossAccount",749        "name": "to",750        "type": "tuple"751      },752      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }753    ],754    "name": "transferCross",755    "outputs": [],756    "stateMutability": "nonpayable",757    "type": "function"758  },759  {760    "inputs": [761      { "internalType": "address", "name": "from", "type": "address" },762      { "internalType": "address", "name": "to", "type": "address" },763      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }764    ],765    "name": "transferFrom",766    "outputs": [],767    "stateMutability": "nonpayable",768    "type": "function"769  },770  {771    "inputs": [772      {773        "components": [774          { "internalType": "address", "name": "eth", "type": "address" },775          { "internalType": "uint256", "name": "sub", "type": "uint256" }776        ],777        "internalType": "struct EthCrossAccount",778        "name": "from",779        "type": "tuple"780      },781      {782        "components": [783          { "internalType": "address", "name": "eth", "type": "address" },784          { "internalType": "uint256", "name": "sub", "type": "uint256" }785        ],786        "internalType": "struct EthCrossAccount",787        "name": "to",788        "type": "tuple"789      },790      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }791    ],792    "name": "transferFromCross",793    "outputs": [],794    "stateMutability": "nonpayable",795    "type": "function"796  },797  {798    "inputs": [],799    "name": "uniqueCollectionType",800    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],801    "stateMutability": "view",802    "type": "function"803  }804]
after · tests/src/eth/abi/reFungible.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      { "internalType": "address", "name": "owner", "type": "address" }147    ],148    "name": "balanceOf",149    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],150    "stateMutability": "view",151    "type": "function"152  },153  {154    "inputs": [155      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }156    ],157    "name": "burn",158    "outputs": [],159    "stateMutability": "nonpayable",160    "type": "function"161  },162  {163    "inputs": [164      {165        "components": [166          { "internalType": "address", "name": "eth", "type": "address" },167          { "internalType": "uint256", "name": "sub", "type": "uint256" }168        ],169        "internalType": "struct EthCrossAccount",170        "name": "from",171        "type": "tuple"172      },173      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }174    ],175    "name": "burnFromCross",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": "newOwner",189        "type": "tuple"190      }191    ],192    "name": "changeCollectionOwnerCross",193    "outputs": [],194    "stateMutability": "nonpayable",195    "type": "function"196  },197  {198    "inputs": [],199    "name": "collectionAdmins",200    "outputs": [201      {202        "components": [203          { "internalType": "address", "name": "eth", "type": "address" },204          { "internalType": "uint256", "name": "sub", "type": "uint256" }205        ],206        "internalType": "struct EthCrossAccount[]",207        "name": "",208        "type": "tuple[]"209      }210    ],211    "stateMutability": "view",212    "type": "function"213  },214  {215    "inputs": [],216    "name": "collectionHelperAddress",217    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],218    "stateMutability": "view",219    "type": "function"220  },221  {222    "inputs": [],223    "name": "collectionNestingPermissions",224    "outputs": [225      {226        "components": [227          {228            "internalType": "enum CollectionPermissions",229            "name": "field_0",230            "type": "uint8"231          },232          { "internalType": "bool", "name": "field_1", "type": "bool" }233        ],234        "internalType": "struct Tuple36[]",235        "name": "",236        "type": "tuple[]"237      }238    ],239    "stateMutability": "view",240    "type": "function"241  },242  {243    "inputs": [],244    "name": "collectionNestingRestrictedCollectionIds",245    "outputs": [246      {247        "components": [248          { "internalType": "bool", "name": "field_0", "type": "bool" },249          {250            "internalType": "uint256[]",251            "name": "field_1",252            "type": "uint256[]"253          }254        ],255        "internalType": "struct Tuple33",256        "name": "",257        "type": "tuple"258      }259    ],260    "stateMutability": "view",261    "type": "function"262  },263  {264    "inputs": [],265    "name": "collectionOwner",266    "outputs": [267      {268        "components": [269          { "internalType": "address", "name": "eth", "type": "address" },270          { "internalType": "uint256", "name": "sub", "type": "uint256" }271        ],272        "internalType": "struct EthCrossAccount",273        "name": "",274        "type": "tuple"275      }276    ],277    "stateMutability": "view",278    "type": "function"279  },280  {281    "inputs": [282      { "internalType": "string[]", "name": "keys", "type": "string[]" }283    ],284    "name": "collectionProperties",285    "outputs": [286      {287        "components": [288          { "internalType": "string", "name": "key", "type": "string" },289          { "internalType": "bytes", "name": "value", "type": "bytes" }290        ],291        "internalType": "struct Property[]",292        "name": "",293        "type": "tuple[]"294      }295    ],296    "stateMutability": "view",297    "type": "function"298  },299  {300    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],301    "name": "collectionProperty",302    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],303    "stateMutability": "view",304    "type": "function"305  },306  {307    "inputs": [],308    "name": "collectionSponsor",309    "outputs": [310      {311        "components": [312          { "internalType": "address", "name": "field_0", "type": "address" },313          { "internalType": "uint256", "name": "field_1", "type": "uint256" }314        ],315        "internalType": "struct Tuple29",316        "name": "",317        "type": "tuple"318      }319    ],320    "stateMutability": "view",321    "type": "function"322  },323  {324    "inputs": [],325    "name": "confirmCollectionSponsorship",326    "outputs": [],327    "stateMutability": "nonpayable",328    "type": "function"329  },330  {331    "inputs": [],332    "name": "contractAddress",333    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],334    "stateMutability": "view",335    "type": "function"336  },337  {338    "inputs": [339      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }340    ],341    "name": "crossOwnerOf",342    "outputs": [343      {344        "components": [345          { "internalType": "address", "name": "eth", "type": "address" },346          { "internalType": "uint256", "name": "sub", "type": "uint256" }347        ],348        "internalType": "struct EthCrossAccount",349        "name": "",350        "type": "tuple"351      }352    ],353    "stateMutability": "view",354    "type": "function"355  },356  {357    "inputs": [358      { "internalType": "string[]", "name": "keys", "type": "string[]" }359    ],360    "name": "deleteCollectionProperties",361    "outputs": [],362    "stateMutability": "nonpayable",363    "type": "function"364  },365  {366    "inputs": [367      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },368      { "internalType": "string[]", "name": "keys", "type": "string[]" }369    ],370    "name": "deleteProperties",371    "outputs": [],372    "stateMutability": "nonpayable",373    "type": "function"374  },375  {376    "inputs": [],377    "name": "description",378    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],379    "stateMutability": "view",380    "type": "function"381  },382  {383    "inputs": [],384    "name": "finishMinting",385    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],386    "stateMutability": "nonpayable",387    "type": "function"388  },389  {390    "inputs": [391      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }392    ],393    "name": "getApproved",394    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],395    "stateMutability": "view",396    "type": "function"397  },398  {399    "inputs": [],400    "name": "hasCollectionPendingSponsor",401    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],402    "stateMutability": "view",403    "type": "function"404  },405  {406    "inputs": [407      { "internalType": "address", "name": "owner", "type": "address" },408      { "internalType": "address", "name": "operator", "type": "address" }409    ],410    "name": "isApprovedForAll",411    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],412    "stateMutability": "view",413    "type": "function"414  },415  {416    "inputs": [417      {418        "components": [419          { "internalType": "address", "name": "eth", "type": "address" },420          { "internalType": "uint256", "name": "sub", "type": "uint256" }421        ],422        "internalType": "struct EthCrossAccount",423        "name": "user",424        "type": "tuple"425      }426    ],427    "name": "isOwnerOrAdminCross",428    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],429    "stateMutability": "view",430    "type": "function"431  },432  {433    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],434    "name": "mint",435    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],436    "stateMutability": "nonpayable",437    "type": "function"438  },439  {440    "inputs": [441      { "internalType": "address", "name": "to", "type": "address" },442      { "internalType": "string", "name": "tokenUri", "type": "string" }443    ],444    "name": "mintWithTokenURI",445    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],446    "stateMutability": "nonpayable",447    "type": "function"448  },449  {450    "inputs": [],451    "name": "mintingFinished",452    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],453    "stateMutability": "view",454    "type": "function"455  },456  {457    "inputs": [],458    "name": "name",459    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],460    "stateMutability": "view",461    "type": "function"462  },463  {464    "inputs": [],465    "name": "nextTokenId",466    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],467    "stateMutability": "view",468    "type": "function"469  },470  {471    "inputs": [472      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }473    ],474    "name": "ownerOf",475    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],476    "stateMutability": "view",477    "type": "function"478  },479  {480    "inputs": [481      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },482      { "internalType": "string[]", "name": "keys", "type": "string[]" }483    ],484    "name": "properties",485    "outputs": [486      {487        "components": [488          { "internalType": "string", "name": "key", "type": "string" },489          { "internalType": "bytes", "name": "value", "type": "bytes" }490        ],491        "internalType": "struct Property[]",492        "name": "",493        "type": "tuple[]"494      }495    ],496    "stateMutability": "view",497    "type": "function"498  },499  {500    "inputs": [501      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },502      { "internalType": "string", "name": "key", "type": "string" }503    ],504    "name": "property",505    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],506    "stateMutability": "view",507    "type": "function"508  },509  {510    "inputs": [511      {512        "components": [513          { "internalType": "address", "name": "eth", "type": "address" },514          { "internalType": "uint256", "name": "sub", "type": "uint256" }515        ],516        "internalType": "struct EthCrossAccount",517        "name": "admin",518        "type": "tuple"519      }520    ],521    "name": "removeCollectionAdminCross",522    "outputs": [],523    "stateMutability": "nonpayable",524    "type": "function"525  },526  {527    "inputs": [],528    "name": "removeCollectionSponsor",529    "outputs": [],530    "stateMutability": "nonpayable",531    "type": "function"532  },533  {534    "inputs": [535      {536        "components": [537          { "internalType": "address", "name": "eth", "type": "address" },538          { "internalType": "uint256", "name": "sub", "type": "uint256" }539        ],540        "internalType": "struct EthCrossAccount",541        "name": "user",542        "type": "tuple"543      }544    ],545    "name": "removeFromCollectionAllowListCross",546    "outputs": [],547    "stateMutability": "nonpayable",548    "type": "function"549  },550  {551    "inputs": [552      { "internalType": "address", "name": "from", "type": "address" },553      { "internalType": "address", "name": "to", "type": "address" },554      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }555    ],556    "name": "safeTransferFrom",557    "outputs": [],558    "stateMutability": "nonpayable",559    "type": "function"560  },561  {562    "inputs": [563      { "internalType": "address", "name": "from", "type": "address" },564      { "internalType": "address", "name": "to", "type": "address" },565      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },566      { "internalType": "bytes", "name": "data", "type": "bytes" }567    ],568    "name": "safeTransferFromWithData",569    "outputs": [],570    "stateMutability": "nonpayable",571    "type": "function"572  },573  {574    "inputs": [575      { "internalType": "address", "name": "operator", "type": "address" },576      { "internalType": "bool", "name": "approved", "type": "bool" }577    ],578    "name": "setApprovalForAll",579    "outputs": [],580    "stateMutability": "nonpayable",581    "type": "function"582  },583  {584    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],585    "name": "setCollectionAccess",586    "outputs": [],587    "stateMutability": "nonpayable",588    "type": "function"589  },590  {591    "inputs": [592      { "internalType": "string", "name": "limit", "type": "string" },593      { "internalType": "uint256", "name": "value", "type": "uint256" }594    ],595    "name": "setCollectionLimit",596    "outputs": [],597    "stateMutability": "nonpayable",598    "type": "function"599  },600  {601    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],602    "name": "setCollectionMintMode",603    "outputs": [],604    "stateMutability": "nonpayable",605    "type": "function"606  },607  {608    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],609    "name": "setCollectionNesting",610    "outputs": [],611    "stateMutability": "nonpayable",612    "type": "function"613  },614  {615    "inputs": [616      { "internalType": "bool", "name": "enable", "type": "bool" },617      {618        "internalType": "address[]",619        "name": "collections",620        "type": "address[]"621      }622    ],623    "name": "setCollectionNesting",624    "outputs": [],625    "stateMutability": "nonpayable",626    "type": "function"627  },628  {629    "inputs": [630      {631        "components": [632          { "internalType": "string", "name": "key", "type": "string" },633          { "internalType": "bytes", "name": "value", "type": "bytes" }634        ],635        "internalType": "struct Property[]",636        "name": "properties",637        "type": "tuple[]"638      }639    ],640    "name": "setCollectionProperties",641    "outputs": [],642    "stateMutability": "nonpayable",643    "type": "function"644  },645  {646    "inputs": [647      {648        "components": [649          { "internalType": "address", "name": "eth", "type": "address" },650          { "internalType": "uint256", "name": "sub", "type": "uint256" }651        ],652        "internalType": "struct EthCrossAccount",653        "name": "sponsor",654        "type": "tuple"655      }656    ],657    "name": "setCollectionSponsorCross",658    "outputs": [],659    "stateMutability": "nonpayable",660    "type": "function"661  },662  {663    "inputs": [664      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },665      {666        "components": [667          { "internalType": "string", "name": "key", "type": "string" },668          { "internalType": "bytes", "name": "value", "type": "bytes" }669        ],670        "internalType": "struct Property[]",671        "name": "properties",672        "type": "tuple[]"673      }674    ],675    "name": "setProperties",676    "outputs": [],677    "stateMutability": "nonpayable",678    "type": "function"679  },680  {681    "inputs": [682      { "internalType": "string", "name": "key", "type": "string" },683      { "internalType": "bool", "name": "isMutable", "type": "bool" },684      { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },685      { "internalType": "bool", "name": "tokenOwner", "type": "bool" }686    ],687    "name": "setTokenPropertyPermission",688    "outputs": [],689    "stateMutability": "nonpayable",690    "type": "function"691  },692  {693    "inputs": [694      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }695    ],696    "name": "supportsInterface",697    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],698    "stateMutability": "view",699    "type": "function"700  },701  {702    "inputs": [],703    "name": "symbol",704    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],705    "stateMutability": "view",706    "type": "function"707  },708  {709    "inputs": [710      { "internalType": "uint256", "name": "index", "type": "uint256" }711    ],712    "name": "tokenByIndex",713    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],714    "stateMutability": "view",715    "type": "function"716  },717  {718    "inputs": [719      { "internalType": "uint256", "name": "token", "type": "uint256" }720    ],721    "name": "tokenContractAddress",722    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],723    "stateMutability": "view",724    "type": "function"725  },726  {727    "inputs": [728      { "internalType": "address", "name": "owner", "type": "address" },729      { "internalType": "uint256", "name": "index", "type": "uint256" }730    ],731    "name": "tokenOfOwnerByIndex",732    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],733    "stateMutability": "view",734    "type": "function"735  },736  {737    "inputs": [738      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }739    ],740    "name": "tokenURI",741    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],742    "stateMutability": "view",743    "type": "function"744  },745  {746    "inputs": [],747    "name": "totalSupply",748    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],749    "stateMutability": "view",750    "type": "function"751  },752  {753    "inputs": [754      { "internalType": "address", "name": "to", "type": "address" },755      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }756    ],757    "name": "transfer",758    "outputs": [],759    "stateMutability": "nonpayable",760    "type": "function"761  },762  {763    "inputs": [764      {765        "components": [766          { "internalType": "address", "name": "eth", "type": "address" },767          { "internalType": "uint256", "name": "sub", "type": "uint256" }768        ],769        "internalType": "struct EthCrossAccount",770        "name": "to",771        "type": "tuple"772      },773      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }774    ],775    "name": "transferCross",776    "outputs": [],777    "stateMutability": "nonpayable",778    "type": "function"779  },780  {781    "inputs": [782      { "internalType": "address", "name": "from", "type": "address" },783      { "internalType": "address", "name": "to", "type": "address" },784      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }785    ],786    "name": "transferFrom",787    "outputs": [],788    "stateMutability": "nonpayable",789    "type": "function"790  },791  {792    "inputs": [793      {794        "components": [795          { "internalType": "address", "name": "eth", "type": "address" },796          { "internalType": "uint256", "name": "sub", "type": "uint256" }797        ],798        "internalType": "struct EthCrossAccount",799        "name": "from",800        "type": "tuple"801      },802      {803        "components": [804          { "internalType": "address", "name": "eth", "type": "address" },805          { "internalType": "uint256", "name": "sub", "type": "uint256" }806        ],807        "internalType": "struct EthCrossAccount",808        "name": "to",809        "type": "tuple"810      },811      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }812    ],813    "name": "transferFromCross",814    "outputs": [],815    "stateMutability": "nonpayable",816    "type": "function"817  },818  {819    "inputs": [],820    "name": "uniqueCollectionType",821    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],822    "stateMutability": "view",823    "type": "function"824  }825]
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- 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 0xeecfdb34
+/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
 interface Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -171,6 +171,11 @@
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
 	function collectionNestingRestrictedCollectionIds() external view returns (Tuple20 memory);
 
+	/// Returns permissions for a collection
+	/// @dev EVM selector for this function is: 0x5b2eaf4b,
+	///  or in textual repr: collectionNestingPermissions()
+	function collectionNestingPermissions() external view returns (Tuple23[] memory);
+
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
@@ -284,6 +289,17 @@
 }
 
 /// @dev anonymous struct
+struct Tuple23 {
+	CollectionPermissions field_0;
+	bool field_1;
+}
+
+enum CollectionPermissions {
+	CollectionAdmin,
+	TokenOwner
+}
+
+/// @dev anonymous struct
 struct Tuple20 {
 	bool field_0;
 	uint256[] field_1;
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -80,7 +80,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0xeecfdb34
+/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
 interface Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -238,6 +238,11 @@
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
 	function collectionNestingRestrictedCollectionIds() external view returns (Tuple31 memory);
 
+	/// Returns permissions for a collection
+	/// @dev EVM selector for this function is: 0x5b2eaf4b,
+	///  or in textual repr: collectionNestingPermissions()
+	function collectionNestingPermissions() external view returns (Tuple34[] memory);
+
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
@@ -351,6 +356,17 @@
 }
 
 /// @dev anonymous struct
+struct Tuple34 {
+	CollectionPermissions field_0;
+	bool field_1;
+}
+
+enum CollectionPermissions {
+	CollectionAdmin,
+	TokenOwner
+}
+
+/// @dev anonymous struct
 struct Tuple31 {
 	bool field_0;
 	uint256[] field_1;
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -80,7 +80,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0xeecfdb34
+/// @dev the ERC-165 identifier for this interface is 0xb5e1747f
 interface Collection is Dummy, ERC165 {
 	// /// Set collection property.
 	// ///
@@ -238,6 +238,11 @@
 	///  or in textual repr: collectionNestingRestrictedCollectionIds()
 	function collectionNestingRestrictedCollectionIds() external view returns (Tuple30 memory);
 
+	/// Returns permissions for a collection
+	/// @dev EVM selector for this function is: 0x5b2eaf4b,
+	///  or in textual repr: collectionNestingPermissions()
+	function collectionNestingPermissions() external view returns (Tuple33[] memory);
+
 	/// Set the collection access method.
 	/// @param mode Access mode
 	/// 	0 for Normal
@@ -351,6 +356,17 @@
 }
 
 /// @dev anonymous struct
+struct Tuple33 {
+	CollectionPermissions field_0;
+	bool field_1;
+}
+
+enum CollectionPermissions {
+	CollectionAdmin,
+	TokenOwner
+}
+
+/// @dev anonymous struct
 struct Tuple30 {
 	bool field_0;
 	uint256[] field_1;
modifiedtests/src/eth/nesting/nest.test.tsdiffbeforeafterboth
--- a/tests/src/eth/nesting/nest.test.ts
+++ b/tests/src/eth/nesting/nest.test.ts
@@ -52,7 +52,7 @@
       expect(await contract.methods.ownerOf(secondTokenId).call()).to.be.equal(owner);
     });
     
-    itEth('NFT: collectionNestingRestrictedCollectionIds()', async ({helper}) => {
+    itEth('NFT: collectionNestingRestrictedCollectionIds() & collectionNestingPermissions', async ({helper}) => {
       const owner = await helper.eth.createAccountWithBalance(donor);
       const {collectionId: unnestedCollsectionId, collectionAddress: unnsetedCollectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');
       const unnestedContract = helper.ethNativeContract.collection(unnsetedCollectionAddress, 'nft', owner);
@@ -62,7 +62,9 @@
       expect(await contract.methods.collectionNestingRestrictedCollectionIds().call({from: owner})).to.be.like([true, []]);
       await contract.methods.setCollectionNesting(true, [unnsetedCollectionAddress]).send({from: owner});
       expect(await contract.methods.collectionNestingRestrictedCollectionIds().call({from: owner})).to.be.like([true, [unnestedCollsectionId.toString()]]);
-      
+      expect(await contract.methods.collectionNestingPermissions().call({from: owner})).to.be.like([['0', false], ['1', true]]);
+      await contract.methods.setCollectionNesting(false).send({from: owner});
+      expect(await contract.methods.collectionNestingPermissions().call({from: owner})).to.be.like([['0', false], ['1', false]]);
     });
     
     itEth('NFT: allows an Owner to nest/unnest their token (Restricted nesting)', async ({helper}) => {