git.delta.rocks / unique-network / refs/commits / 93efc9e5e22c

difftreelog

genetate evm stubs & fix abiWriter for struct

PraetorP2022-11-23parent: #48762e7.patch.diff
in: master

13 files changed

modifiedcrates/evm-coder/src/abi/impls.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi/impls.rs
+++ b/crates/evm-coder/src/abi/impls.rs
@@ -184,8 +184,7 @@
 
 impl AbiWrite for Property {
 	fn abi_write(&self, writer: &mut AbiWriter) {
-		self.key.abi_write(writer);
-		self.value.abi_write(writer);
+		(&self.key, &self.value).abi_write(writer);
 	}
 }
 
modifiedcrates/evm-coder/src/abi/traits.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi/traits.rs
+++ b/crates/evm-coder/src/abi/traits.rs
@@ -49,3 +49,9 @@
 		Ok(writer.into())
 	}
 }
+
+impl<T: AbiWrite> AbiWrite for &T {
+	fn abi_write(&self, writer: &mut AbiWriter) {
+		T::abi_write(self, writer);
+	}
+}
modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -437,7 +437,7 @@
 	bytes value;
 }
 
-/// @dev the ERC-165 identifier for this interface is 0x29f4dcd9
+/// @dev the ERC-165 identifier for this interface is 0x5b7038cf
 contract ERC20UniqueExtensions is Dummy, ERC165 {
 	/// @notice A description for the collection.
 	/// @dev EVM selector for this function is: 0x7284e416,
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -725,7 +725,7 @@
 		&self,
 		token_id: uint256,
 		keys: Vec<string>,
-	) -> Result<Vec<(string, bytes)>> {
+	) -> Result<Vec<PropertyStruct>> {
 		let keys = keys
 			.into_iter()
 			.map(|key| {
@@ -745,7 +745,7 @@
 			let key = string::from_utf8(p.key.to_vec())
 				.map_err(|e| Error::Revert(alloc::format!("{}", e)))?;
 			let value = bytes(p.value.to_vec());
-			Ok((key, value))
+			Ok(PropertyStruct { key, value })
 		})
 		.collect::<Result<Vec<_>>>()
 	}
modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -188,11 +188,11 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0x285fb8e6,
 	///  or in textual repr: collectionProperties(string[])
-	function collectionProperties(string[] memory keys) public view returns (Tuple23[] memory) {
+	function collectionProperties(string[] memory keys) public view returns (Tuple27[] memory) {
 		require(false, stub_error);
 		keys;
 		dummy;
-		return new Tuple23[](0);
+		return new Tuple27[](0);
 	}
 
 	// /// Set the sponsor of the collection.
@@ -253,10 +253,10 @@
 	/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
 	/// @dev EVM selector for this function is: 0x6ec0a9f1,
 	///  or in textual repr: collectionSponsor()
-	function collectionSponsor() public view returns (Tuple26 memory) {
+	function collectionSponsor() public view returns (Tuple30 memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple26(0x0000000000000000000000000000000000000000, 0);
+		return Tuple30(0x0000000000000000000000000000000000000000, 0);
 	}
 
 	/// Set limits for the collection.
@@ -527,13 +527,13 @@
 }
 
 /// @dev anonymous struct
-struct Tuple26 {
+struct Tuple30 {
 	address field_0;
 	uint256 field_1;
 }
 
 /// @dev anonymous struct
-struct Tuple23 {
+struct Tuple27 {
 	string field_0;
 	bytes field_1;
 }
@@ -682,7 +682,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0x0e9fc611
+/// @dev the ERC-165 identifier for this interface is 0xb8f094a0
 contract ERC721UniqueExtensions is Dummy, ERC165 {
 	/// @notice A descriptive name for a collection of NFTs in this contract
 	/// @dev EVM selector for this function is: 0x06fdde03,
@@ -730,12 +730,12 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0xefc26c69,
 	///  or in textual repr: tokenProperties(uint256,string[])
-	function tokenProperties(uint256 tokenId, string[] memory keys) public view returns (Tuple8[] memory) {
+	function tokenProperties(uint256 tokenId, string[] memory keys) public view returns (Property[] memory) {
 		require(false, stub_error);
 		tokenId;
 		keys;
 		dummy;
-		return new Tuple8[](0);
+		return new Property[](0);
 	}
 
 	/// @notice Set or reaffirm the approved address for an NFT
@@ -861,7 +861,7 @@
 	// /// @param tokens array of pairs of token ID and token URI for minted tokens
 	// /// @dev EVM selector for this function is: 0x36543006,
 	// ///  or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
-	// function mintBulkWithTokenURI(address to, Tuple11[] memory tokens) public returns (bool) {
+	// function mintBulkWithTokenURI(address to, Tuple15[] memory tokens) public returns (bool) {
 	// 	require(false, stub_error);
 	// 	to;
 	// 	tokens;
@@ -872,15 +872,9 @@
 }
 
 /// @dev anonymous struct
-struct Tuple11 {
+struct Tuple15 {
 	uint256 field_0;
 	string field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple8 {
-	string field_0;
-	bytes field_1;
 }
 
 /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -753,7 +753,7 @@
 		&self,
 		token_id: uint256,
 		keys: Vec<string>,
-	) -> Result<Vec<(string, bytes)>> {
+	) -> Result<Vec<PropertyStruct>> {
 		let keys = keys
 			.into_iter()
 			.map(|key| {
@@ -773,7 +773,7 @@
 			let key = string::from_utf8(p.key.to_vec())
 				.map_err(|e| Error::Revert(alloc::format!("{}", e)))?;
 			let value = bytes(p.value.to_vec());
-			Ok((key, value))
+			Ok(PropertyStruct { key, value })
 		})
 		.collect::<Result<Vec<_>>>()
 	}
modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -188,11 +188,11 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0x285fb8e6,
 	///  or in textual repr: collectionProperties(string[])
-	function collectionProperties(string[] memory keys) public view returns (Tuple22[] memory) {
+	function collectionProperties(string[] memory keys) public view returns (Tuple26[] memory) {
 		require(false, stub_error);
 		keys;
 		dummy;
-		return new Tuple22[](0);
+		return new Tuple26[](0);
 	}
 
 	// /// Set the sponsor of the collection.
@@ -253,10 +253,10 @@
 	/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
 	/// @dev EVM selector for this function is: 0x6ec0a9f1,
 	///  or in textual repr: collectionSponsor()
-	function collectionSponsor() public view returns (Tuple25 memory) {
+	function collectionSponsor() public view returns (Tuple29 memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple25(0x0000000000000000000000000000000000000000, 0);
+		return Tuple29(0x0000000000000000000000000000000000000000, 0);
 	}
 
 	/// Set limits for the collection.
@@ -527,13 +527,13 @@
 }
 
 /// @dev anonymous struct
-struct Tuple25 {
+struct Tuple29 {
 	address field_0;
 	uint256 field_1;
 }
 
 /// @dev anonymous struct
-struct Tuple22 {
+struct Tuple26 {
 	string field_0;
 	bytes field_1;
 }
@@ -680,7 +680,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0xab243667
+/// @dev the ERC-165 identifier for this interface is 0x1d4b64d6
 contract ERC721UniqueExtensions is Dummy, ERC165 {
 	/// @notice A descriptive name for a collection of NFTs in this contract
 	/// @dev EVM selector for this function is: 0x06fdde03,
@@ -728,12 +728,12 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0xefc26c69,
 	///  or in textual repr: tokenProperties(uint256,string[])
-	function tokenProperties(uint256 tokenId, string[] memory keys) public view returns (Tuple8[] memory) {
+	function tokenProperties(uint256 tokenId, string[] memory keys) public view returns (Property[] memory) {
 		require(false, stub_error);
 		tokenId;
 		keys;
 		dummy;
-		return new Tuple8[](0);
+		return new Property[](0);
 	}
 
 	/// @notice Transfer ownership of an RFT
@@ -849,7 +849,7 @@
 	// /// @param tokens array of pairs of token ID and token URI for minted tokens
 	// /// @dev EVM selector for this function is: 0x36543006,
 	// ///  or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
-	// function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) public returns (bool) {
+	// function mintBulkWithTokenURI(address to, Tuple14[] memory tokens) public returns (bool) {
 	// 	require(false, stub_error);
 	// 	to;
 	// 	tokens;
@@ -871,15 +871,9 @@
 }
 
 /// @dev anonymous struct
-struct Tuple10 {
+struct Tuple14 {
 	uint256 field_0;
 	string field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple8 {
-	string field_0;
-	bytes field_1;
 }
 
 /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
modifiedtests/src/eth/abi/nonFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -249,7 +249,7 @@
           { "internalType": "string", "name": "field_0", "type": "string" },
           { "internalType": "bytes", "name": "field_1", "type": "bytes" }
         ],
-        "internalType": "struct Tuple23[]",
+        "internalType": "struct Tuple27[]",
         "name": "",
         "type": "tuple[]"
       }
@@ -273,7 +273,7 @@
           { "internalType": "address", "name": "field_0", "type": "address" },
           { "internalType": "uint256", "name": "field_1", "type": "uint256" }
         ],
-        "internalType": "struct Tuple26",
+        "internalType": "struct Tuple30",
         "name": "",
         "type": "tuple"
       }
@@ -674,10 +674,10 @@
     "outputs": [
       {
         "components": [
-          { "internalType": "string", "name": "field_0", "type": "string" },
-          { "internalType": "bytes", "name": "field_1", "type": "bytes" }
+          { "internalType": "string", "name": "key", "type": "string" },
+          { "internalType": "bytes", "name": "value", "type": "bytes" }
         ],
-        "internalType": "struct Tuple8[]",
+        "internalType": "struct Property[]",
         "name": "",
         "type": "tuple[]"
       }
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      { "internalType": "address", "name": "user", "type": "address" }120    ],121    "name": "allowed",122    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],123    "stateMutability": "view",124    "type": "function"125  },126  {127    "inputs": [128      { "internalType": "address", "name": "approved", "type": "address" },129      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }130    ],131    "name": "approve",132    "outputs": [],133    "stateMutability": "nonpayable",134    "type": "function"135  },136  {137    "inputs": [138      { "internalType": "address", "name": "owner", "type": "address" }139    ],140    "name": "balanceOf",141    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],142    "stateMutability": "view",143    "type": "function"144  },145  {146    "inputs": [147      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }148    ],149    "name": "burn",150    "outputs": [],151    "stateMutability": "nonpayable",152    "type": "function"153  },154  {155    "inputs": [156      {157        "components": [158          { "internalType": "address", "name": "eth", "type": "address" },159          { "internalType": "uint256", "name": "sub", "type": "uint256" }160        ],161        "internalType": "struct EthCrossAccount",162        "name": "from",163        "type": "tuple"164      },165      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }166    ],167    "name": "burnFromCross",168    "outputs": [],169    "stateMutability": "nonpayable",170    "type": "function"171  },172  {173    "inputs": [174      {175        "components": [176          { "internalType": "address", "name": "eth", "type": "address" },177          { "internalType": "uint256", "name": "sub", "type": "uint256" }178        ],179        "internalType": "struct EthCrossAccount",180        "name": "newOwner",181        "type": "tuple"182      }183    ],184    "name": "changeCollectionOwnerCross",185    "outputs": [],186    "stateMutability": "nonpayable",187    "type": "function"188  },189  {190    "inputs": [],191    "name": "collectionAdmins",192    "outputs": [193      {194        "components": [195          { "internalType": "address", "name": "eth", "type": "address" },196          { "internalType": "uint256", "name": "sub", "type": "uint256" }197        ],198        "internalType": "struct EthCrossAccount[]",199        "name": "",200        "type": "tuple[]"201      }202    ],203    "stateMutability": "view",204    "type": "function"205  },206  {207    "inputs": [],208    "name": "collectionOwner",209    "outputs": [210      {211        "components": [212          { "internalType": "address", "name": "eth", "type": "address" },213          { "internalType": "uint256", "name": "sub", "type": "uint256" }214        ],215        "internalType": "struct EthCrossAccount",216        "name": "",217        "type": "tuple"218      }219    ],220    "stateMutability": "view",221    "type": "function"222  },223  {224    "inputs": [225      { "internalType": "string[]", "name": "keys", "type": "string[]" }226    ],227    "name": "collectionProperties",228    "outputs": [229      {230        "components": [231          { "internalType": "string", "name": "field_0", "type": "string" },232          { "internalType": "bytes", "name": "field_1", "type": "bytes" }233        ],234        "internalType": "struct Tuple22[]",235        "name": "",236        "type": "tuple[]"237      }238    ],239    "stateMutability": "view",240    "type": "function"241  },242  {243    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],244    "name": "collectionProperty",245    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],246    "stateMutability": "view",247    "type": "function"248  },249  {250    "inputs": [],251    "name": "collectionSponsor",252    "outputs": [253      {254        "components": [255          { "internalType": "address", "name": "field_0", "type": "address" },256          { "internalType": "uint256", "name": "field_1", "type": "uint256" }257        ],258        "internalType": "struct Tuple25",259        "name": "",260        "type": "tuple"261      }262    ],263    "stateMutability": "view",264    "type": "function"265  },266  {267    "inputs": [],268    "name": "confirmCollectionSponsorship",269    "outputs": [],270    "stateMutability": "nonpayable",271    "type": "function"272  },273  {274    "inputs": [],275    "name": "contractAddress",276    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],277    "stateMutability": "view",278    "type": "function"279  },280  {281    "inputs": [282      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }283    ],284    "name": "crossOwnerOf",285    "outputs": [286      {287        "components": [288          { "internalType": "address", "name": "eth", "type": "address" },289          { "internalType": "uint256", "name": "sub", "type": "uint256" }290        ],291        "internalType": "struct EthCrossAccount",292        "name": "",293        "type": "tuple"294      }295    ],296    "stateMutability": "view",297    "type": "function"298  },299  {300    "inputs": [301      { "internalType": "string[]", "name": "keys", "type": "string[]" }302    ],303    "name": "deleteCollectionProperties",304    "outputs": [],305    "stateMutability": "nonpayable",306    "type": "function"307  },308  {309    "inputs": [310      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },311      { "internalType": "string[]", "name": "keys", "type": "string[]" }312    ],313    "name": "deleteProperties",314    "outputs": [],315    "stateMutability": "nonpayable",316    "type": "function"317  },318  {319    "inputs": [],320    "name": "description",321    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],322    "stateMutability": "view",323    "type": "function"324  },325  {326    "inputs": [],327    "name": "finishMinting",328    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],329    "stateMutability": "nonpayable",330    "type": "function"331  },332  {333    "inputs": [334      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }335    ],336    "name": "getApproved",337    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],338    "stateMutability": "view",339    "type": "function"340  },341  {342    "inputs": [],343    "name": "hasCollectionPendingSponsor",344    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],345    "stateMutability": "view",346    "type": "function"347  },348  {349    "inputs": [350      { "internalType": "address", "name": "owner", "type": "address" },351      { "internalType": "address", "name": "operator", "type": "address" }352    ],353    "name": "isApprovedForAll",354    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],355    "stateMutability": "view",356    "type": "function"357  },358  {359    "inputs": [360      {361        "components": [362          { "internalType": "address", "name": "eth", "type": "address" },363          { "internalType": "uint256", "name": "sub", "type": "uint256" }364        ],365        "internalType": "struct EthCrossAccount",366        "name": "user",367        "type": "tuple"368      }369    ],370    "name": "isOwnerOrAdminCross",371    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],372    "stateMutability": "view",373    "type": "function"374  },375  {376    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],377    "name": "mint",378    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],379    "stateMutability": "nonpayable",380    "type": "function"381  },382  {383    "inputs": [384      { "internalType": "address", "name": "to", "type": "address" },385      { "internalType": "string", "name": "tokenUri", "type": "string" }386    ],387    "name": "mintWithTokenURI",388    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],389    "stateMutability": "nonpayable",390    "type": "function"391  },392  {393    "inputs": [],394    "name": "mintingFinished",395    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],396    "stateMutability": "view",397    "type": "function"398  },399  {400    "inputs": [],401    "name": "name",402    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],403    "stateMutability": "view",404    "type": "function"405  },406  {407    "inputs": [],408    "name": "nextTokenId",409    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],410    "stateMutability": "view",411    "type": "function"412  },413  {414    "inputs": [415      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }416    ],417    "name": "ownerOf",418    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],419    "stateMutability": "view",420    "type": "function"421  },422  {423    "inputs": [424      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },425      { "internalType": "string", "name": "key", "type": "string" }426    ],427    "name": "property",428    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],429    "stateMutability": "view",430    "type": "function"431  },432  {433    "inputs": [434      {435        "components": [436          { "internalType": "address", "name": "eth", "type": "address" },437          { "internalType": "uint256", "name": "sub", "type": "uint256" }438        ],439        "internalType": "struct EthCrossAccount",440        "name": "admin",441        "type": "tuple"442      }443    ],444    "name": "removeCollectionAdminCross",445    "outputs": [],446    "stateMutability": "nonpayable",447    "type": "function"448  },449  {450    "inputs": [],451    "name": "removeCollectionSponsor",452    "outputs": [],453    "stateMutability": "nonpayable",454    "type": "function"455  },456  {457    "inputs": [458      {459        "components": [460          { "internalType": "address", "name": "eth", "type": "address" },461          { "internalType": "uint256", "name": "sub", "type": "uint256" }462        ],463        "internalType": "struct EthCrossAccount",464        "name": "user",465        "type": "tuple"466      }467    ],468    "name": "removeFromCollectionAllowListCross",469    "outputs": [],470    "stateMutability": "nonpayable",471    "type": "function"472  },473  {474    "inputs": [475      { "internalType": "address", "name": "from", "type": "address" },476      { "internalType": "address", "name": "to", "type": "address" },477      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }478    ],479    "name": "safeTransferFrom",480    "outputs": [],481    "stateMutability": "nonpayable",482    "type": "function"483  },484  {485    "inputs": [486      { "internalType": "address", "name": "from", "type": "address" },487      { "internalType": "address", "name": "to", "type": "address" },488      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },489      { "internalType": "bytes", "name": "data", "type": "bytes" }490    ],491    "name": "safeTransferFromWithData",492    "outputs": [],493    "stateMutability": "nonpayable",494    "type": "function"495  },496  {497    "inputs": [498      { "internalType": "address", "name": "operator", "type": "address" },499      { "internalType": "bool", "name": "approved", "type": "bool" }500    ],501    "name": "setApprovalForAll",502    "outputs": [],503    "stateMutability": "nonpayable",504    "type": "function"505  },506  {507    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],508    "name": "setCollectionAccess",509    "outputs": [],510    "stateMutability": "nonpayable",511    "type": "function"512  },513  {514    "inputs": [515      { "internalType": "string", "name": "limit", "type": "string" },516      { "internalType": "uint256", "name": "value", "type": "uint256" }517    ],518    "name": "setCollectionLimit",519    "outputs": [],520    "stateMutability": "nonpayable",521    "type": "function"522  },523  {524    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],525    "name": "setCollectionMintMode",526    "outputs": [],527    "stateMutability": "nonpayable",528    "type": "function"529  },530  {531    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],532    "name": "setCollectionNesting",533    "outputs": [],534    "stateMutability": "nonpayable",535    "type": "function"536  },537  {538    "inputs": [539      { "internalType": "bool", "name": "enable", "type": "bool" },540      {541        "internalType": "address[]",542        "name": "collections",543        "type": "address[]"544      }545    ],546    "name": "setCollectionNesting",547    "outputs": [],548    "stateMutability": "nonpayable",549    "type": "function"550  },551  {552    "inputs": [553      {554        "components": [555          { "internalType": "string", "name": "key", "type": "string" },556          { "internalType": "bytes", "name": "value", "type": "bytes" }557        ],558        "internalType": "struct Property[]",559        "name": "properties",560        "type": "tuple[]"561      }562    ],563    "name": "setCollectionProperties",564    "outputs": [],565    "stateMutability": "nonpayable",566    "type": "function"567  },568  {569    "inputs": [570      {571        "components": [572          { "internalType": "address", "name": "eth", "type": "address" },573          { "internalType": "uint256", "name": "sub", "type": "uint256" }574        ],575        "internalType": "struct EthCrossAccount",576        "name": "sponsor",577        "type": "tuple"578      }579    ],580    "name": "setCollectionSponsorCross",581    "outputs": [],582    "stateMutability": "nonpayable",583    "type": "function"584  },585  {586    "inputs": [587      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },588      {589        "components": [590          { "internalType": "string", "name": "key", "type": "string" },591          { "internalType": "bytes", "name": "value", "type": "bytes" }592        ],593        "internalType": "struct Property[]",594        "name": "properties",595        "type": "tuple[]"596      }597    ],598    "name": "setProperties",599    "outputs": [],600    "stateMutability": "nonpayable",601    "type": "function"602  },603  {604    "inputs": [605      { "internalType": "string", "name": "key", "type": "string" },606      { "internalType": "bool", "name": "isMutable", "type": "bool" },607      { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },608      { "internalType": "bool", "name": "tokenOwner", "type": "bool" }609    ],610    "name": "setTokenPropertyPermission",611    "outputs": [],612    "stateMutability": "nonpayable",613    "type": "function"614  },615  {616    "inputs": [617      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }618    ],619    "name": "supportsInterface",620    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],621    "stateMutability": "view",622    "type": "function"623  },624  {625    "inputs": [],626    "name": "symbol",627    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],628    "stateMutability": "view",629    "type": "function"630  },631  {632    "inputs": [633      { "internalType": "uint256", "name": "index", "type": "uint256" }634    ],635    "name": "tokenByIndex",636    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],637    "stateMutability": "view",638    "type": "function"639  },640  {641    "inputs": [642      { "internalType": "uint256", "name": "token", "type": "uint256" }643    ],644    "name": "tokenContractAddress",645    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],646    "stateMutability": "view",647    "type": "function"648  },649  {650    "inputs": [651      { "internalType": "address", "name": "owner", "type": "address" },652      { "internalType": "uint256", "name": "index", "type": "uint256" }653    ],654    "name": "tokenOfOwnerByIndex",655    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],656    "stateMutability": "view",657    "type": "function"658  },659  {660    "inputs": [661      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },662      { "internalType": "string[]", "name": "keys", "type": "string[]" }663    ],664    "name": "tokenProperties",665    "outputs": [666      {667        "components": [668          { "internalType": "string", "name": "field_0", "type": "string" },669          { "internalType": "bytes", "name": "field_1", "type": "bytes" }670        ],671        "internalType": "struct Tuple8[]",672        "name": "",673        "type": "tuple[]"674      }675    ],676    "stateMutability": "view",677    "type": "function"678  },679  {680    "inputs": [681      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }682    ],683    "name": "tokenURI",684    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],685    "stateMutability": "view",686    "type": "function"687  },688  {689    "inputs": [],690    "name": "totalSupply",691    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],692    "stateMutability": "view",693    "type": "function"694  },695  {696    "inputs": [697      { "internalType": "address", "name": "to", "type": "address" },698      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }699    ],700    "name": "transfer",701    "outputs": [],702    "stateMutability": "nonpayable",703    "type": "function"704  },705  {706    "inputs": [707      {708        "components": [709          { "internalType": "address", "name": "eth", "type": "address" },710          { "internalType": "uint256", "name": "sub", "type": "uint256" }711        ],712        "internalType": "struct EthCrossAccount",713        "name": "to",714        "type": "tuple"715      },716      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }717    ],718    "name": "transferCross",719    "outputs": [],720    "stateMutability": "nonpayable",721    "type": "function"722  },723  {724    "inputs": [725      { "internalType": "address", "name": "from", "type": "address" },726      { "internalType": "address", "name": "to", "type": "address" },727      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }728    ],729    "name": "transferFrom",730    "outputs": [],731    "stateMutability": "nonpayable",732    "type": "function"733  },734  {735    "inputs": [736      {737        "components": [738          { "internalType": "address", "name": "eth", "type": "address" },739          { "internalType": "uint256", "name": "sub", "type": "uint256" }740        ],741        "internalType": "struct EthCrossAccount",742        "name": "from",743        "type": "tuple"744      },745      {746        "components": [747          { "internalType": "address", "name": "eth", "type": "address" },748          { "internalType": "uint256", "name": "sub", "type": "uint256" }749        ],750        "internalType": "struct EthCrossAccount",751        "name": "to",752        "type": "tuple"753      },754      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }755    ],756    "name": "transferFromCross",757    "outputs": [],758    "stateMutability": "nonpayable",759    "type": "function"760  },761  {762    "inputs": [],763    "name": "uniqueCollectionType",764    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],765    "stateMutability": "view",766    "type": "function"767  }768]
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      { "internalType": "address", "name": "user", "type": "address" }120    ],121    "name": "allowed",122    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],123    "stateMutability": "view",124    "type": "function"125  },126  {127    "inputs": [128      { "internalType": "address", "name": "approved", "type": "address" },129      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }130    ],131    "name": "approve",132    "outputs": [],133    "stateMutability": "nonpayable",134    "type": "function"135  },136  {137    "inputs": [138      { "internalType": "address", "name": "owner", "type": "address" }139    ],140    "name": "balanceOf",141    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],142    "stateMutability": "view",143    "type": "function"144  },145  {146    "inputs": [147      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }148    ],149    "name": "burn",150    "outputs": [],151    "stateMutability": "nonpayable",152    "type": "function"153  },154  {155    "inputs": [156      {157        "components": [158          { "internalType": "address", "name": "eth", "type": "address" },159          { "internalType": "uint256", "name": "sub", "type": "uint256" }160        ],161        "internalType": "struct EthCrossAccount",162        "name": "from",163        "type": "tuple"164      },165      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }166    ],167    "name": "burnFromCross",168    "outputs": [],169    "stateMutability": "nonpayable",170    "type": "function"171  },172  {173    "inputs": [174      {175        "components": [176          { "internalType": "address", "name": "eth", "type": "address" },177          { "internalType": "uint256", "name": "sub", "type": "uint256" }178        ],179        "internalType": "struct EthCrossAccount",180        "name": "newOwner",181        "type": "tuple"182      }183    ],184    "name": "changeCollectionOwnerCross",185    "outputs": [],186    "stateMutability": "nonpayable",187    "type": "function"188  },189  {190    "inputs": [],191    "name": "collectionAdmins",192    "outputs": [193      {194        "components": [195          { "internalType": "address", "name": "eth", "type": "address" },196          { "internalType": "uint256", "name": "sub", "type": "uint256" }197        ],198        "internalType": "struct EthCrossAccount[]",199        "name": "",200        "type": "tuple[]"201      }202    ],203    "stateMutability": "view",204    "type": "function"205  },206  {207    "inputs": [],208    "name": "collectionOwner",209    "outputs": [210      {211        "components": [212          { "internalType": "address", "name": "eth", "type": "address" },213          { "internalType": "uint256", "name": "sub", "type": "uint256" }214        ],215        "internalType": "struct EthCrossAccount",216        "name": "",217        "type": "tuple"218      }219    ],220    "stateMutability": "view",221    "type": "function"222  },223  {224    "inputs": [225      { "internalType": "string[]", "name": "keys", "type": "string[]" }226    ],227    "name": "collectionProperties",228    "outputs": [229      {230        "components": [231          { "internalType": "string", "name": "field_0", "type": "string" },232          { "internalType": "bytes", "name": "field_1", "type": "bytes" }233        ],234        "internalType": "struct Tuple26[]",235        "name": "",236        "type": "tuple[]"237      }238    ],239    "stateMutability": "view",240    "type": "function"241  },242  {243    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],244    "name": "collectionProperty",245    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],246    "stateMutability": "view",247    "type": "function"248  },249  {250    "inputs": [],251    "name": "collectionSponsor",252    "outputs": [253      {254        "components": [255          { "internalType": "address", "name": "field_0", "type": "address" },256          { "internalType": "uint256", "name": "field_1", "type": "uint256" }257        ],258        "internalType": "struct Tuple29",259        "name": "",260        "type": "tuple"261      }262    ],263    "stateMutability": "view",264    "type": "function"265  },266  {267    "inputs": [],268    "name": "confirmCollectionSponsorship",269    "outputs": [],270    "stateMutability": "nonpayable",271    "type": "function"272  },273  {274    "inputs": [],275    "name": "contractAddress",276    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],277    "stateMutability": "view",278    "type": "function"279  },280  {281    "inputs": [282      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }283    ],284    "name": "crossOwnerOf",285    "outputs": [286      {287        "components": [288          { "internalType": "address", "name": "eth", "type": "address" },289          { "internalType": "uint256", "name": "sub", "type": "uint256" }290        ],291        "internalType": "struct EthCrossAccount",292        "name": "",293        "type": "tuple"294      }295    ],296    "stateMutability": "view",297    "type": "function"298  },299  {300    "inputs": [301      { "internalType": "string[]", "name": "keys", "type": "string[]" }302    ],303    "name": "deleteCollectionProperties",304    "outputs": [],305    "stateMutability": "nonpayable",306    "type": "function"307  },308  {309    "inputs": [310      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },311      { "internalType": "string[]", "name": "keys", "type": "string[]" }312    ],313    "name": "deleteProperties",314    "outputs": [],315    "stateMutability": "nonpayable",316    "type": "function"317  },318  {319    "inputs": [],320    "name": "description",321    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],322    "stateMutability": "view",323    "type": "function"324  },325  {326    "inputs": [],327    "name": "finishMinting",328    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],329    "stateMutability": "nonpayable",330    "type": "function"331  },332  {333    "inputs": [334      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }335    ],336    "name": "getApproved",337    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],338    "stateMutability": "view",339    "type": "function"340  },341  {342    "inputs": [],343    "name": "hasCollectionPendingSponsor",344    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],345    "stateMutability": "view",346    "type": "function"347  },348  {349    "inputs": [350      { "internalType": "address", "name": "owner", "type": "address" },351      { "internalType": "address", "name": "operator", "type": "address" }352    ],353    "name": "isApprovedForAll",354    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],355    "stateMutability": "view",356    "type": "function"357  },358  {359    "inputs": [360      {361        "components": [362          { "internalType": "address", "name": "eth", "type": "address" },363          { "internalType": "uint256", "name": "sub", "type": "uint256" }364        ],365        "internalType": "struct EthCrossAccount",366        "name": "user",367        "type": "tuple"368      }369    ],370    "name": "isOwnerOrAdminCross",371    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],372    "stateMutability": "view",373    "type": "function"374  },375  {376    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],377    "name": "mint",378    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],379    "stateMutability": "nonpayable",380    "type": "function"381  },382  {383    "inputs": [384      { "internalType": "address", "name": "to", "type": "address" },385      { "internalType": "string", "name": "tokenUri", "type": "string" }386    ],387    "name": "mintWithTokenURI",388    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],389    "stateMutability": "nonpayable",390    "type": "function"391  },392  {393    "inputs": [],394    "name": "mintingFinished",395    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],396    "stateMutability": "view",397    "type": "function"398  },399  {400    "inputs": [],401    "name": "name",402    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],403    "stateMutability": "view",404    "type": "function"405  },406  {407    "inputs": [],408    "name": "nextTokenId",409    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],410    "stateMutability": "view",411    "type": "function"412  },413  {414    "inputs": [415      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }416    ],417    "name": "ownerOf",418    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],419    "stateMutability": "view",420    "type": "function"421  },422  {423    "inputs": [424      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },425      { "internalType": "string", "name": "key", "type": "string" }426    ],427    "name": "property",428    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],429    "stateMutability": "view",430    "type": "function"431  },432  {433    "inputs": [434      {435        "components": [436          { "internalType": "address", "name": "eth", "type": "address" },437          { "internalType": "uint256", "name": "sub", "type": "uint256" }438        ],439        "internalType": "struct EthCrossAccount",440        "name": "admin",441        "type": "tuple"442      }443    ],444    "name": "removeCollectionAdminCross",445    "outputs": [],446    "stateMutability": "nonpayable",447    "type": "function"448  },449  {450    "inputs": [],451    "name": "removeCollectionSponsor",452    "outputs": [],453    "stateMutability": "nonpayable",454    "type": "function"455  },456  {457    "inputs": [458      {459        "components": [460          { "internalType": "address", "name": "eth", "type": "address" },461          { "internalType": "uint256", "name": "sub", "type": "uint256" }462        ],463        "internalType": "struct EthCrossAccount",464        "name": "user",465        "type": "tuple"466      }467    ],468    "name": "removeFromCollectionAllowListCross",469    "outputs": [],470    "stateMutability": "nonpayable",471    "type": "function"472  },473  {474    "inputs": [475      { "internalType": "address", "name": "from", "type": "address" },476      { "internalType": "address", "name": "to", "type": "address" },477      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }478    ],479    "name": "safeTransferFrom",480    "outputs": [],481    "stateMutability": "nonpayable",482    "type": "function"483  },484  {485    "inputs": [486      { "internalType": "address", "name": "from", "type": "address" },487      { "internalType": "address", "name": "to", "type": "address" },488      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },489      { "internalType": "bytes", "name": "data", "type": "bytes" }490    ],491    "name": "safeTransferFromWithData",492    "outputs": [],493    "stateMutability": "nonpayable",494    "type": "function"495  },496  {497    "inputs": [498      { "internalType": "address", "name": "operator", "type": "address" },499      { "internalType": "bool", "name": "approved", "type": "bool" }500    ],501    "name": "setApprovalForAll",502    "outputs": [],503    "stateMutability": "nonpayable",504    "type": "function"505  },506  {507    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],508    "name": "setCollectionAccess",509    "outputs": [],510    "stateMutability": "nonpayable",511    "type": "function"512  },513  {514    "inputs": [515      { "internalType": "string", "name": "limit", "type": "string" },516      { "internalType": "uint256", "name": "value", "type": "uint256" }517    ],518    "name": "setCollectionLimit",519    "outputs": [],520    "stateMutability": "nonpayable",521    "type": "function"522  },523  {524    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],525    "name": "setCollectionMintMode",526    "outputs": [],527    "stateMutability": "nonpayable",528    "type": "function"529  },530  {531    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],532    "name": "setCollectionNesting",533    "outputs": [],534    "stateMutability": "nonpayable",535    "type": "function"536  },537  {538    "inputs": [539      { "internalType": "bool", "name": "enable", "type": "bool" },540      {541        "internalType": "address[]",542        "name": "collections",543        "type": "address[]"544      }545    ],546    "name": "setCollectionNesting",547    "outputs": [],548    "stateMutability": "nonpayable",549    "type": "function"550  },551  {552    "inputs": [553      {554        "components": [555          { "internalType": "string", "name": "key", "type": "string" },556          { "internalType": "bytes", "name": "value", "type": "bytes" }557        ],558        "internalType": "struct Property[]",559        "name": "properties",560        "type": "tuple[]"561      }562    ],563    "name": "setCollectionProperties",564    "outputs": [],565    "stateMutability": "nonpayable",566    "type": "function"567  },568  {569    "inputs": [570      {571        "components": [572          { "internalType": "address", "name": "eth", "type": "address" },573          { "internalType": "uint256", "name": "sub", "type": "uint256" }574        ],575        "internalType": "struct EthCrossAccount",576        "name": "sponsor",577        "type": "tuple"578      }579    ],580    "name": "setCollectionSponsorCross",581    "outputs": [],582    "stateMutability": "nonpayable",583    "type": "function"584  },585  {586    "inputs": [587      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },588      {589        "components": [590          { "internalType": "string", "name": "key", "type": "string" },591          { "internalType": "bytes", "name": "value", "type": "bytes" }592        ],593        "internalType": "struct Property[]",594        "name": "properties",595        "type": "tuple[]"596      }597    ],598    "name": "setProperties",599    "outputs": [],600    "stateMutability": "nonpayable",601    "type": "function"602  },603  {604    "inputs": [605      { "internalType": "string", "name": "key", "type": "string" },606      { "internalType": "bool", "name": "isMutable", "type": "bool" },607      { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },608      { "internalType": "bool", "name": "tokenOwner", "type": "bool" }609    ],610    "name": "setTokenPropertyPermission",611    "outputs": [],612    "stateMutability": "nonpayable",613    "type": "function"614  },615  {616    "inputs": [617      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }618    ],619    "name": "supportsInterface",620    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],621    "stateMutability": "view",622    "type": "function"623  },624  {625    "inputs": [],626    "name": "symbol",627    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],628    "stateMutability": "view",629    "type": "function"630  },631  {632    "inputs": [633      { "internalType": "uint256", "name": "index", "type": "uint256" }634    ],635    "name": "tokenByIndex",636    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],637    "stateMutability": "view",638    "type": "function"639  },640  {641    "inputs": [642      { "internalType": "uint256", "name": "token", "type": "uint256" }643    ],644    "name": "tokenContractAddress",645    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],646    "stateMutability": "view",647    "type": "function"648  },649  {650    "inputs": [651      { "internalType": "address", "name": "owner", "type": "address" },652      { "internalType": "uint256", "name": "index", "type": "uint256" }653    ],654    "name": "tokenOfOwnerByIndex",655    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],656    "stateMutability": "view",657    "type": "function"658  },659  {660    "inputs": [661      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },662      { "internalType": "string[]", "name": "keys", "type": "string[]" }663    ],664    "name": "tokenProperties",665    "outputs": [666      {667        "components": [668          { "internalType": "string", "name": "key", "type": "string" },669          { "internalType": "bytes", "name": "value", "type": "bytes" }670        ],671        "internalType": "struct Property[]",672        "name": "",673        "type": "tuple[]"674      }675    ],676    "stateMutability": "view",677    "type": "function"678  },679  {680    "inputs": [681      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }682    ],683    "name": "tokenURI",684    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],685    "stateMutability": "view",686    "type": "function"687  },688  {689    "inputs": [],690    "name": "totalSupply",691    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],692    "stateMutability": "view",693    "type": "function"694  },695  {696    "inputs": [697      { "internalType": "address", "name": "to", "type": "address" },698      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }699    ],700    "name": "transfer",701    "outputs": [],702    "stateMutability": "nonpayable",703    "type": "function"704  },705  {706    "inputs": [707      {708        "components": [709          { "internalType": "address", "name": "eth", "type": "address" },710          { "internalType": "uint256", "name": "sub", "type": "uint256" }711        ],712        "internalType": "struct EthCrossAccount",713        "name": "to",714        "type": "tuple"715      },716      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }717    ],718    "name": "transferCross",719    "outputs": [],720    "stateMutability": "nonpayable",721    "type": "function"722  },723  {724    "inputs": [725      { "internalType": "address", "name": "from", "type": "address" },726      { "internalType": "address", "name": "to", "type": "address" },727      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }728    ],729    "name": "transferFrom",730    "outputs": [],731    "stateMutability": "nonpayable",732    "type": "function"733  },734  {735    "inputs": [736      {737        "components": [738          { "internalType": "address", "name": "eth", "type": "address" },739          { "internalType": "uint256", "name": "sub", "type": "uint256" }740        ],741        "internalType": "struct EthCrossAccount",742        "name": "from",743        "type": "tuple"744      },745      {746        "components": [747          { "internalType": "address", "name": "eth", "type": "address" },748          { "internalType": "uint256", "name": "sub", "type": "uint256" }749        ],750        "internalType": "struct EthCrossAccount",751        "name": "to",752        "type": "tuple"753      },754      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }755    ],756    "name": "transferFromCross",757    "outputs": [],758    "stateMutability": "nonpayable",759    "type": "function"760  },761  {762    "inputs": [],763    "name": "uniqueCollectionType",764    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],765    "stateMutability": "view",766    "type": "function"767  }768]
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -290,7 +290,7 @@
 	bytes value;
 }
 
-/// @dev the ERC-165 identifier for this interface is 0x29f4dcd9
+/// @dev the ERC-165 identifier for this interface is 0x5b7038cf
 interface ERC20UniqueExtensions is Dummy, ERC165 {
 	/// @notice A description for the collection.
 	/// @dev EVM selector for this function is: 0x7284e416,
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -45,7 +45,7 @@
 	/// @param properties settable properties
 	/// @dev EVM selector for this function is: 0x14ed3a6e,
 	///  or in textual repr: setProperties(uint256,(string,bytes)[])
-	function setProperties(uint256 tokenId, Tuple21[] memory properties) external;
+	function setProperties(uint256 tokenId, Property[] memory properties) external;
 
 	// /// @notice Delete token property value.
 	// /// @dev Throws error if `msg.sender` has no permission to edit the property.
@@ -95,7 +95,7 @@
 	/// @param properties Vector of properties key/value pair.
 	/// @dev EVM selector for this function is: 0x50b26b2a,
 	///  or in textual repr: setCollectionProperties((string,bytes)[])
-	function setCollectionProperties(Tuple21[] memory properties) external;
+	function setCollectionProperties(Property[] memory properties) external;
 
 	// /// Delete collection property.
 	// ///
@@ -127,7 +127,7 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0x285fb8e6,
 	///  or in textual repr: collectionProperties(string[])
-	function collectionProperties(string[] memory keys) external view returns (Tuple21[] memory);
+	function collectionProperties(string[] memory keys) external view returns (Tuple25[] memory);
 
 	// /// Set the sponsor of the collection.
 	// ///
@@ -169,7 +169,7 @@
 	/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
 	/// @dev EVM selector for this function is: 0x6ec0a9f1,
 	///  or in textual repr: collectionSponsor()
-	function collectionSponsor() external view returns (Tuple24 memory);
+	function collectionSponsor() external view returns (Tuple28 memory);
 
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
@@ -346,13 +346,13 @@
 }
 
 /// @dev anonymous struct
-struct Tuple24 {
+struct Tuple28 {
 	address field_0;
 	uint256 field_1;
 }
 
 /// @dev anonymous struct
-struct Tuple21 {
+struct Tuple25 {
 	string field_0;
 	bytes field_1;
 }
@@ -452,7 +452,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0x244543ee
+/// @dev the ERC-165 identifier for this interface is 0xb8f094a0
 interface ERC721UniqueExtensions is Dummy, ERC165 {
 	/// @notice A descriptive name for a collection of NFTs in this contract
 	/// @dev EVM selector for this function is: 0x06fdde03,
@@ -483,7 +483,7 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0xefc26c69,
 	///  or in textual repr: tokenProperties(uint256,string[])
-	function tokenProperties(uint256 tokenId, string[] memory keys) external view returns (Tuple7[] memory);
+	function tokenProperties(uint256 tokenId, string[] memory keys) external view returns (Property[] memory);
 
 	/// @notice Set or reaffirm the approved address for an NFT
 	/// @dev The zero address indicates there is no approved address.
@@ -567,20 +567,14 @@
 	// /// @param tokens array of pairs of token ID and token URI for minted tokens
 	// /// @dev EVM selector for this function is: 0x36543006,
 	// ///  or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
-	// function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) external returns (bool);
+	// function mintBulkWithTokenURI(address to, Tuple13[] memory tokens) external returns (bool);
 
 }
 
 /// @dev anonymous struct
-struct Tuple10 {
+struct Tuple13 {
 	uint256 field_0;
 	string field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple7 {
-	string field_0;
-	bytes field_1;
 }
 
 /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -127,7 +127,7 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0x285fb8e6,
 	///  or in textual repr: collectionProperties(string[])
-	function collectionProperties(string[] memory keys) external view returns (Tuple22[] memory);
+	function collectionProperties(string[] memory keys) external view returns (Tuple24[] memory);
 
 	// /// Set the sponsor of the collection.
 	// ///
@@ -169,7 +169,7 @@
 	/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.
 	/// @dev EVM selector for this function is: 0x6ec0a9f1,
 	///  or in textual repr: collectionSponsor()
-	function collectionSponsor() external view returns (Tuple25 memory);
+	function collectionSponsor() external view returns (Tuple27 memory);
 
 	/// Set limits for the collection.
 	/// @dev Throws error if limit not found.
@@ -346,13 +346,13 @@
 }
 
 /// @dev anonymous struct
-struct Tuple25 {
+struct Tuple27 {
 	address field_0;
 	uint256 field_1;
 }
 
 /// @dev anonymous struct
-struct Tuple22 {
+struct Tuple24 {
 	string field_0;
 	bytes field_1;
 }
@@ -450,7 +450,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0xab243667
+/// @dev the ERC-165 identifier for this interface is 0x1d4b64d6
 interface ERC721UniqueExtensions is Dummy, ERC165 {
 	/// @notice A descriptive name for a collection of NFTs in this contract
 	/// @dev EVM selector for this function is: 0x06fdde03,
@@ -481,7 +481,7 @@
 	/// @return Vector of properties key/value pairs.
 	/// @dev EVM selector for this function is: 0xefc26c69,
 	///  or in textual repr: tokenProperties(uint256,string[])
-	function tokenProperties(uint256 tokenId, string[] memory keys) external view returns (Tuple7[] memory);
+	function tokenProperties(uint256 tokenId, string[] memory keys) external view returns (Property[] memory);
 
 	/// @notice Transfer ownership of an RFT
 	/// @dev Throws unless `msg.sender` is the current owner. Throws if `to`
@@ -560,7 +560,7 @@
 	// /// @param tokens array of pairs of token ID and token URI for minted tokens
 	// /// @dev EVM selector for this function is: 0x36543006,
 	// ///  or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
-	// function mintBulkWithTokenURI(address to, Tuple10[] memory tokens) external returns (bool);
+	// function mintBulkWithTokenURI(address to, Tuple12[] memory tokens) external returns (bool);
 
 	/// Returns EVM address for refungible token
 	///
@@ -571,15 +571,9 @@
 }
 
 /// @dev anonymous struct
-struct Tuple10 {
+struct Tuple12 {
 	uint256 field_0;
 	string field_1;
-}
-
-/// @dev anonymous struct
-struct Tuple7 {
-	string field_0;
-	bytes field_1;
 }
 
 /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
modifiedtests/src/eth/base.test.tsdiffbeforeafterboth
--- a/tests/src/eth/base.test.ts
+++ b/tests/src/eth/base.test.ts
@@ -117,7 +117,7 @@
   });
 
   itEth('ERC721UniqueExtensions support', async ({helper}) => {
-    await checkInterface(helper, '0x922a115f', true, true);
+    await checkInterface(helper, '0xb8f094a0', true, true);
   });
 
   itEth('ERC721Burnable - 0x42966c68 - support', async ({helper}) => {