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
before · tests/src/eth/abi/nonFungible.json
1[2  {3    "anonymous": false,4    "inputs": [5      {6        "indexed": true,7        "internalType": "address",8        "name": "owner",9        "type": "address"10      },11      {12        "indexed": true,13        "internalType": "address",14        "name": "approved",15        "type": "address"16      },17      {18        "indexed": true,19        "internalType": "uint256",20        "name": "tokenId",21        "type": "uint256"22      }23    ],24    "name": "Approval",25    "type": "event"26  },27  {28    "anonymous": false,29    "inputs": [30      {31        "indexed": true,32        "internalType": "address",33        "name": "owner",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "operator",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "bool",45        "name": "approved",46        "type": "bool"47      }48    ],49    "name": "ApprovalForAll",50    "type": "event"51  },52  {53    "anonymous": false,54    "inputs": [],55    "name": "MintingFinished",56    "type": "event"57  },58  {59    "anonymous": false,60    "inputs": [61      {62        "indexed": true,63        "internalType": "address",64        "name": "from",65        "type": "address"66      },67      {68        "indexed": true,69        "internalType": "address",70        "name": "to",71        "type": "address"72      },73      {74        "indexed": true,75        "internalType": "uint256",76        "name": "tokenId",77        "type": "uint256"78      }79    ],80    "name": "Transfer",81    "type": "event"82  },83  {84    "inputs": [85      {86        "components": [87          { "internalType": "address", "name": "eth", "type": "address" },88          { "internalType": "uint256", "name": "sub", "type": "uint256" }89        ],90        "internalType": "struct EthCrossAccount",91        "name": "newAdmin",92        "type": "tuple"93      }94    ],95    "name": "addCollectionAdminCross",96    "outputs": [],97    "stateMutability": "nonpayable",98    "type": "function"99  },100  {101    "inputs": [102      {103        "components": [104          { "internalType": "address", "name": "eth", "type": "address" },105          { "internalType": "uint256", "name": "sub", "type": "uint256" }106        ],107        "internalType": "struct EthCrossAccount",108        "name": "user",109        "type": "tuple"110      }111    ],112    "name": "addToCollectionAllowListCross",113    "outputs": [],114    "stateMutability": "nonpayable",115    "type": "function"116  },117  {118    "inputs": [119      { "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      {139        "components": [140          { "internalType": "address", "name": "eth", "type": "address" },141          { "internalType": "uint256", "name": "sub", "type": "uint256" }142        ],143        "internalType": "struct EthCrossAccount",144        "name": "approved",145        "type": "tuple"146      },147      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }148    ],149    "name": "approveCross",150    "outputs": [],151    "stateMutability": "nonpayable",152    "type": "function"153  },154  {155    "inputs": [156      { "internalType": "address", "name": "owner", "type": "address" }157    ],158    "name": "balanceOf",159    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],160    "stateMutability": "view",161    "type": "function"162  },163  {164    "inputs": [165      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }166    ],167    "name": "burn",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": "from",181        "type": "tuple"182      },183      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }184    ],185    "name": "burnFromCross",186    "outputs": [],187    "stateMutability": "nonpayable",188    "type": "function"189  },190  {191    "inputs": [192      {193        "components": [194          { "internalType": "address", "name": "eth", "type": "address" },195          { "internalType": "uint256", "name": "sub", "type": "uint256" }196        ],197        "internalType": "struct EthCrossAccount",198        "name": "newOwner",199        "type": "tuple"200      }201    ],202    "name": "changeCollectionOwnerCross",203    "outputs": [],204    "stateMutability": "nonpayable",205    "type": "function"206  },207  {208    "inputs": [],209    "name": "collectionAdmins",210    "outputs": [211      {212        "components": [213          { "internalType": "address", "name": "eth", "type": "address" },214          { "internalType": "uint256", "name": "sub", "type": "uint256" }215        ],216        "internalType": "struct EthCrossAccount[]",217        "name": "",218        "type": "tuple[]"219      }220    ],221    "stateMutability": "view",222    "type": "function"223  },224  {225    "inputs": [],226    "name": "collectionOwner",227    "outputs": [228      {229        "components": [230          { "internalType": "address", "name": "eth", "type": "address" },231          { "internalType": "uint256", "name": "sub", "type": "uint256" }232        ],233        "internalType": "struct EthCrossAccount",234        "name": "",235        "type": "tuple"236      }237    ],238    "stateMutability": "view",239    "type": "function"240  },241  {242    "inputs": [243      { "internalType": "string[]", "name": "keys", "type": "string[]" }244    ],245    "name": "collectionProperties",246    "outputs": [247      {248        "components": [249          { "internalType": "string", "name": "field_0", "type": "string" },250          { "internalType": "bytes", "name": "field_1", "type": "bytes" }251        ],252        "internalType": "struct Tuple23[]",253        "name": "",254        "type": "tuple[]"255      }256    ],257    "stateMutability": "view",258    "type": "function"259  },260  {261    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],262    "name": "collectionProperty",263    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],264    "stateMutability": "view",265    "type": "function"266  },267  {268    "inputs": [],269    "name": "collectionSponsor",270    "outputs": [271      {272        "components": [273          { "internalType": "address", "name": "field_0", "type": "address" },274          { "internalType": "uint256", "name": "field_1", "type": "uint256" }275        ],276        "internalType": "struct Tuple26",277        "name": "",278        "type": "tuple"279      }280    ],281    "stateMutability": "view",282    "type": "function"283  },284  {285    "inputs": [],286    "name": "confirmCollectionSponsorship",287    "outputs": [],288    "stateMutability": "nonpayable",289    "type": "function"290  },291  {292    "inputs": [],293    "name": "contractAddress",294    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],295    "stateMutability": "view",296    "type": "function"297  },298  {299    "inputs": [300      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }301    ],302    "name": "crossOwnerOf",303    "outputs": [304      {305        "components": [306          { "internalType": "address", "name": "eth", "type": "address" },307          { "internalType": "uint256", "name": "sub", "type": "uint256" }308        ],309        "internalType": "struct EthCrossAccount",310        "name": "",311        "type": "tuple"312      }313    ],314    "stateMutability": "view",315    "type": "function"316  },317  {318    "inputs": [319      { "internalType": "string[]", "name": "keys", "type": "string[]" }320    ],321    "name": "deleteCollectionProperties",322    "outputs": [],323    "stateMutability": "nonpayable",324    "type": "function"325  },326  {327    "inputs": [328      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },329      { "internalType": "string[]", "name": "keys", "type": "string[]" }330    ],331    "name": "deleteProperties",332    "outputs": [],333    "stateMutability": "nonpayable",334    "type": "function"335  },336  {337    "inputs": [],338    "name": "description",339    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],340    "stateMutability": "view",341    "type": "function"342  },343  {344    "inputs": [],345    "name": "finishMinting",346    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],347    "stateMutability": "nonpayable",348    "type": "function"349  },350  {351    "inputs": [352      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }353    ],354    "name": "getApproved",355    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],356    "stateMutability": "view",357    "type": "function"358  },359  {360    "inputs": [],361    "name": "hasCollectionPendingSponsor",362    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],363    "stateMutability": "view",364    "type": "function"365  },366  {367    "inputs": [368      { "internalType": "address", "name": "owner", "type": "address" },369      { "internalType": "address", "name": "operator", "type": "address" }370    ],371    "name": "isApprovedForAll",372    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],373    "stateMutability": "view",374    "type": "function"375  },376  {377    "inputs": [378      {379        "components": [380          { "internalType": "address", "name": "eth", "type": "address" },381          { "internalType": "uint256", "name": "sub", "type": "uint256" }382        ],383        "internalType": "struct EthCrossAccount",384        "name": "user",385        "type": "tuple"386      }387    ],388    "name": "isOwnerOrAdminCross",389    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],390    "stateMutability": "view",391    "type": "function"392  },393  {394    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],395    "name": "mint",396    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],397    "stateMutability": "nonpayable",398    "type": "function"399  },400  {401    "inputs": [402      { "internalType": "address", "name": "to", "type": "address" },403      { "internalType": "string", "name": "tokenUri", "type": "string" }404    ],405    "name": "mintWithTokenURI",406    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],407    "stateMutability": "nonpayable",408    "type": "function"409  },410  {411    "inputs": [],412    "name": "mintingFinished",413    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],414    "stateMutability": "view",415    "type": "function"416  },417  {418    "inputs": [],419    "name": "name",420    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],421    "stateMutability": "view",422    "type": "function"423  },424  {425    "inputs": [],426    "name": "nextTokenId",427    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],428    "stateMutability": "view",429    "type": "function"430  },431  {432    "inputs": [433      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }434    ],435    "name": "ownerOf",436    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],437    "stateMutability": "view",438    "type": "function"439  },440  {441    "inputs": [442      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },443      { "internalType": "string", "name": "key", "type": "string" }444    ],445    "name": "property",446    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],447    "stateMutability": "view",448    "type": "function"449  },450  {451    "inputs": [452      {453        "components": [454          { "internalType": "address", "name": "eth", "type": "address" },455          { "internalType": "uint256", "name": "sub", "type": "uint256" }456        ],457        "internalType": "struct EthCrossAccount",458        "name": "admin",459        "type": "tuple"460      }461    ],462    "name": "removeCollectionAdminCross",463    "outputs": [],464    "stateMutability": "nonpayable",465    "type": "function"466  },467  {468    "inputs": [],469    "name": "removeCollectionSponsor",470    "outputs": [],471    "stateMutability": "nonpayable",472    "type": "function"473  },474  {475    "inputs": [476      {477        "components": [478          { "internalType": "address", "name": "eth", "type": "address" },479          { "internalType": "uint256", "name": "sub", "type": "uint256" }480        ],481        "internalType": "struct EthCrossAccount",482        "name": "user",483        "type": "tuple"484      }485    ],486    "name": "removeFromCollectionAllowListCross",487    "outputs": [],488    "stateMutability": "nonpayable",489    "type": "function"490  },491  {492    "inputs": [493      { "internalType": "address", "name": "from", "type": "address" },494      { "internalType": "address", "name": "to", "type": "address" },495      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }496    ],497    "name": "safeTransferFrom",498    "outputs": [],499    "stateMutability": "nonpayable",500    "type": "function"501  },502  {503    "inputs": [504      { "internalType": "address", "name": "from", "type": "address" },505      { "internalType": "address", "name": "to", "type": "address" },506      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },507      { "internalType": "bytes", "name": "data", "type": "bytes" }508    ],509    "name": "safeTransferFrom",510    "outputs": [],511    "stateMutability": "nonpayable",512    "type": "function"513  },514  {515    "inputs": [516      { "internalType": "address", "name": "operator", "type": "address" },517      { "internalType": "bool", "name": "approved", "type": "bool" }518    ],519    "name": "setApprovalForAll",520    "outputs": [],521    "stateMutability": "nonpayable",522    "type": "function"523  },524  {525    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],526    "name": "setCollectionAccess",527    "outputs": [],528    "stateMutability": "nonpayable",529    "type": "function"530  },531  {532    "inputs": [533      { "internalType": "string", "name": "limit", "type": "string" },534      { "internalType": "uint256", "name": "value", "type": "uint256" }535    ],536    "name": "setCollectionLimit",537    "outputs": [],538    "stateMutability": "nonpayable",539    "type": "function"540  },541  {542    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],543    "name": "setCollectionMintMode",544    "outputs": [],545    "stateMutability": "nonpayable",546    "type": "function"547  },548  {549    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],550    "name": "setCollectionNesting",551    "outputs": [],552    "stateMutability": "nonpayable",553    "type": "function"554  },555  {556    "inputs": [557      { "internalType": "bool", "name": "enable", "type": "bool" },558      {559        "internalType": "address[]",560        "name": "collections",561        "type": "address[]"562      }563    ],564    "name": "setCollectionNesting",565    "outputs": [],566    "stateMutability": "nonpayable",567    "type": "function"568  },569  {570    "inputs": [571      {572        "components": [573          { "internalType": "string", "name": "key", "type": "string" },574          { "internalType": "bytes", "name": "value", "type": "bytes" }575        ],576        "internalType": "struct Property[]",577        "name": "properties",578        "type": "tuple[]"579      }580    ],581    "name": "setCollectionProperties",582    "outputs": [],583    "stateMutability": "nonpayable",584    "type": "function"585  },586  {587    "inputs": [588      {589        "components": [590          { "internalType": "address", "name": "eth", "type": "address" },591          { "internalType": "uint256", "name": "sub", "type": "uint256" }592        ],593        "internalType": "struct EthCrossAccount",594        "name": "sponsor",595        "type": "tuple"596      }597    ],598    "name": "setCollectionSponsorCross",599    "outputs": [],600    "stateMutability": "nonpayable",601    "type": "function"602  },603  {604    "inputs": [605      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },606      {607        "components": [608          { "internalType": "string", "name": "key", "type": "string" },609          { "internalType": "bytes", "name": "value", "type": "bytes" }610        ],611        "internalType": "struct Property[]",612        "name": "properties",613        "type": "tuple[]"614      }615    ],616    "name": "setProperties",617    "outputs": [],618    "stateMutability": "nonpayable",619    "type": "function"620  },621  {622    "inputs": [623      { "internalType": "string", "name": "key", "type": "string" },624      { "internalType": "bool", "name": "isMutable", "type": "bool" },625      { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },626      { "internalType": "bool", "name": "tokenOwner", "type": "bool" }627    ],628    "name": "setTokenPropertyPermission",629    "outputs": [],630    "stateMutability": "nonpayable",631    "type": "function"632  },633  {634    "inputs": [635      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }636    ],637    "name": "supportsInterface",638    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],639    "stateMutability": "view",640    "type": "function"641  },642  {643    "inputs": [],644    "name": "symbol",645    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],646    "stateMutability": "view",647    "type": "function"648  },649  {650    "inputs": [651      { "internalType": "uint256", "name": "index", "type": "uint256" }652    ],653    "name": "tokenByIndex",654    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],655    "stateMutability": "view",656    "type": "function"657  },658  {659    "inputs": [660      { "internalType": "address", "name": "owner", "type": "address" },661      { "internalType": "uint256", "name": "index", "type": "uint256" }662    ],663    "name": "tokenOfOwnerByIndex",664    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],665    "stateMutability": "view",666    "type": "function"667  },668  {669    "inputs": [670      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },671      { "internalType": "string[]", "name": "keys", "type": "string[]" }672    ],673    "name": "tokenProperties",674    "outputs": [675      {676        "components": [677          { "internalType": "string", "name": "field_0", "type": "string" },678          { "internalType": "bytes", "name": "field_1", "type": "bytes" }679        ],680        "internalType": "struct Tuple8[]",681        "name": "",682        "type": "tuple[]"683      }684    ],685    "stateMutability": "view",686    "type": "function"687  },688  {689    "inputs": [690      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }691    ],692    "name": "tokenURI",693    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],694    "stateMutability": "view",695    "type": "function"696  },697  {698    "inputs": [],699    "name": "totalSupply",700    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],701    "stateMutability": "view",702    "type": "function"703  },704  {705    "inputs": [706      { "internalType": "address", "name": "to", "type": "address" },707      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }708    ],709    "name": "transfer",710    "outputs": [],711    "stateMutability": "nonpayable",712    "type": "function"713  },714  {715    "inputs": [716      {717        "components": [718          { "internalType": "address", "name": "eth", "type": "address" },719          { "internalType": "uint256", "name": "sub", "type": "uint256" }720        ],721        "internalType": "struct EthCrossAccount",722        "name": "to",723        "type": "tuple"724      },725      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }726    ],727    "name": "transferCross",728    "outputs": [],729    "stateMutability": "nonpayable",730    "type": "function"731  },732  {733    "inputs": [734      { "internalType": "address", "name": "from", "type": "address" },735      { "internalType": "address", "name": "to", "type": "address" },736      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }737    ],738    "name": "transferFrom",739    "outputs": [],740    "stateMutability": "nonpayable",741    "type": "function"742  },743  {744    "inputs": [745      {746        "components": [747          { "internalType": "address", "name": "eth", "type": "address" },748          { "internalType": "uint256", "name": "sub", "type": "uint256" }749        ],750        "internalType": "struct EthCrossAccount",751        "name": "from",752        "type": "tuple"753      },754      {755        "components": [756          { "internalType": "address", "name": "eth", "type": "address" },757          { "internalType": "uint256", "name": "sub", "type": "uint256" }758        ],759        "internalType": "struct EthCrossAccount",760        "name": "to",761        "type": "tuple"762      },763      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }764    ],765    "name": "transferFromCross",766    "outputs": [],767    "stateMutability": "nonpayable",768    "type": "function"769  },770  {771    "inputs": [],772    "name": "uniqueCollectionType",773    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],774    "stateMutability": "view",775    "type": "function"776  }777]
after · tests/src/eth/abi/nonFungible.json
1[2  {3    "anonymous": false,4    "inputs": [5      {6        "indexed": true,7        "internalType": "address",8        "name": "owner",9        "type": "address"10      },11      {12        "indexed": true,13        "internalType": "address",14        "name": "approved",15        "type": "address"16      },17      {18        "indexed": true,19        "internalType": "uint256",20        "name": "tokenId",21        "type": "uint256"22      }23    ],24    "name": "Approval",25    "type": "event"26  },27  {28    "anonymous": false,29    "inputs": [30      {31        "indexed": true,32        "internalType": "address",33        "name": "owner",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "operator",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "bool",45        "name": "approved",46        "type": "bool"47      }48    ],49    "name": "ApprovalForAll",50    "type": "event"51  },52  {53    "anonymous": false,54    "inputs": [],55    "name": "MintingFinished",56    "type": "event"57  },58  {59    "anonymous": false,60    "inputs": [61      {62        "indexed": true,63        "internalType": "address",64        "name": "from",65        "type": "address"66      },67      {68        "indexed": true,69        "internalType": "address",70        "name": "to",71        "type": "address"72      },73      {74        "indexed": true,75        "internalType": "uint256",76        "name": "tokenId",77        "type": "uint256"78      }79    ],80    "name": "Transfer",81    "type": "event"82  },83  {84    "inputs": [85      {86        "components": [87          { "internalType": "address", "name": "eth", "type": "address" },88          { "internalType": "uint256", "name": "sub", "type": "uint256" }89        ],90        "internalType": "struct EthCrossAccount",91        "name": "newAdmin",92        "type": "tuple"93      }94    ],95    "name": "addCollectionAdminCross",96    "outputs": [],97    "stateMutability": "nonpayable",98    "type": "function"99  },100  {101    "inputs": [102      {103        "components": [104          { "internalType": "address", "name": "eth", "type": "address" },105          { "internalType": "uint256", "name": "sub", "type": "uint256" }106        ],107        "internalType": "struct EthCrossAccount",108        "name": "user",109        "type": "tuple"110      }111    ],112    "name": "addToCollectionAllowListCross",113    "outputs": [],114    "stateMutability": "nonpayable",115    "type": "function"116  },117  {118    "inputs": [119      { "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      {139        "components": [140          { "internalType": "address", "name": "eth", "type": "address" },141          { "internalType": "uint256", "name": "sub", "type": "uint256" }142        ],143        "internalType": "struct EthCrossAccount",144        "name": "approved",145        "type": "tuple"146      },147      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }148    ],149    "name": "approveCross",150    "outputs": [],151    "stateMutability": "nonpayable",152    "type": "function"153  },154  {155    "inputs": [156      { "internalType": "address", "name": "owner", "type": "address" }157    ],158    "name": "balanceOf",159    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],160    "stateMutability": "view",161    "type": "function"162  },163  {164    "inputs": [165      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }166    ],167    "name": "burn",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": "from",181        "type": "tuple"182      },183      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }184    ],185    "name": "burnFromCross",186    "outputs": [],187    "stateMutability": "nonpayable",188    "type": "function"189  },190  {191    "inputs": [192      {193        "components": [194          { "internalType": "address", "name": "eth", "type": "address" },195          { "internalType": "uint256", "name": "sub", "type": "uint256" }196        ],197        "internalType": "struct EthCrossAccount",198        "name": "newOwner",199        "type": "tuple"200      }201    ],202    "name": "changeCollectionOwnerCross",203    "outputs": [],204    "stateMutability": "nonpayable",205    "type": "function"206  },207  {208    "inputs": [],209    "name": "collectionAdmins",210    "outputs": [211      {212        "components": [213          { "internalType": "address", "name": "eth", "type": "address" },214          { "internalType": "uint256", "name": "sub", "type": "uint256" }215        ],216        "internalType": "struct EthCrossAccount[]",217        "name": "",218        "type": "tuple[]"219      }220    ],221    "stateMutability": "view",222    "type": "function"223  },224  {225    "inputs": [],226    "name": "collectionOwner",227    "outputs": [228      {229        "components": [230          { "internalType": "address", "name": "eth", "type": "address" },231          { "internalType": "uint256", "name": "sub", "type": "uint256" }232        ],233        "internalType": "struct EthCrossAccount",234        "name": "",235        "type": "tuple"236      }237    ],238    "stateMutability": "view",239    "type": "function"240  },241  {242    "inputs": [243      { "internalType": "string[]", "name": "keys", "type": "string[]" }244    ],245    "name": "collectionProperties",246    "outputs": [247      {248        "components": [249          { "internalType": "string", "name": "field_0", "type": "string" },250          { "internalType": "bytes", "name": "field_1", "type": "bytes" }251        ],252        "internalType": "struct Tuple27[]",253        "name": "",254        "type": "tuple[]"255      }256    ],257    "stateMutability": "view",258    "type": "function"259  },260  {261    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],262    "name": "collectionProperty",263    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],264    "stateMutability": "view",265    "type": "function"266  },267  {268    "inputs": [],269    "name": "collectionSponsor",270    "outputs": [271      {272        "components": [273          { "internalType": "address", "name": "field_0", "type": "address" },274          { "internalType": "uint256", "name": "field_1", "type": "uint256" }275        ],276        "internalType": "struct Tuple30",277        "name": "",278        "type": "tuple"279      }280    ],281    "stateMutability": "view",282    "type": "function"283  },284  {285    "inputs": [],286    "name": "confirmCollectionSponsorship",287    "outputs": [],288    "stateMutability": "nonpayable",289    "type": "function"290  },291  {292    "inputs": [],293    "name": "contractAddress",294    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],295    "stateMutability": "view",296    "type": "function"297  },298  {299    "inputs": [300      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }301    ],302    "name": "crossOwnerOf",303    "outputs": [304      {305        "components": [306          { "internalType": "address", "name": "eth", "type": "address" },307          { "internalType": "uint256", "name": "sub", "type": "uint256" }308        ],309        "internalType": "struct EthCrossAccount",310        "name": "",311        "type": "tuple"312      }313    ],314    "stateMutability": "view",315    "type": "function"316  },317  {318    "inputs": [319      { "internalType": "string[]", "name": "keys", "type": "string[]" }320    ],321    "name": "deleteCollectionProperties",322    "outputs": [],323    "stateMutability": "nonpayable",324    "type": "function"325  },326  {327    "inputs": [328      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },329      { "internalType": "string[]", "name": "keys", "type": "string[]" }330    ],331    "name": "deleteProperties",332    "outputs": [],333    "stateMutability": "nonpayable",334    "type": "function"335  },336  {337    "inputs": [],338    "name": "description",339    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],340    "stateMutability": "view",341    "type": "function"342  },343  {344    "inputs": [],345    "name": "finishMinting",346    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],347    "stateMutability": "nonpayable",348    "type": "function"349  },350  {351    "inputs": [352      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }353    ],354    "name": "getApproved",355    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],356    "stateMutability": "view",357    "type": "function"358  },359  {360    "inputs": [],361    "name": "hasCollectionPendingSponsor",362    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],363    "stateMutability": "view",364    "type": "function"365  },366  {367    "inputs": [368      { "internalType": "address", "name": "owner", "type": "address" },369      { "internalType": "address", "name": "operator", "type": "address" }370    ],371    "name": "isApprovedForAll",372    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],373    "stateMutability": "view",374    "type": "function"375  },376  {377    "inputs": [378      {379        "components": [380          { "internalType": "address", "name": "eth", "type": "address" },381          { "internalType": "uint256", "name": "sub", "type": "uint256" }382        ],383        "internalType": "struct EthCrossAccount",384        "name": "user",385        "type": "tuple"386      }387    ],388    "name": "isOwnerOrAdminCross",389    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],390    "stateMutability": "view",391    "type": "function"392  },393  {394    "inputs": [{ "internalType": "address", "name": "to", "type": "address" }],395    "name": "mint",396    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],397    "stateMutability": "nonpayable",398    "type": "function"399  },400  {401    "inputs": [402      { "internalType": "address", "name": "to", "type": "address" },403      { "internalType": "string", "name": "tokenUri", "type": "string" }404    ],405    "name": "mintWithTokenURI",406    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],407    "stateMutability": "nonpayable",408    "type": "function"409  },410  {411    "inputs": [],412    "name": "mintingFinished",413    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],414    "stateMutability": "view",415    "type": "function"416  },417  {418    "inputs": [],419    "name": "name",420    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],421    "stateMutability": "view",422    "type": "function"423  },424  {425    "inputs": [],426    "name": "nextTokenId",427    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],428    "stateMutability": "view",429    "type": "function"430  },431  {432    "inputs": [433      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }434    ],435    "name": "ownerOf",436    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],437    "stateMutability": "view",438    "type": "function"439  },440  {441    "inputs": [442      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },443      { "internalType": "string", "name": "key", "type": "string" }444    ],445    "name": "property",446    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],447    "stateMutability": "view",448    "type": "function"449  },450  {451    "inputs": [452      {453        "components": [454          { "internalType": "address", "name": "eth", "type": "address" },455          { "internalType": "uint256", "name": "sub", "type": "uint256" }456        ],457        "internalType": "struct EthCrossAccount",458        "name": "admin",459        "type": "tuple"460      }461    ],462    "name": "removeCollectionAdminCross",463    "outputs": [],464    "stateMutability": "nonpayable",465    "type": "function"466  },467  {468    "inputs": [],469    "name": "removeCollectionSponsor",470    "outputs": [],471    "stateMutability": "nonpayable",472    "type": "function"473  },474  {475    "inputs": [476      {477        "components": [478          { "internalType": "address", "name": "eth", "type": "address" },479          { "internalType": "uint256", "name": "sub", "type": "uint256" }480        ],481        "internalType": "struct EthCrossAccount",482        "name": "user",483        "type": "tuple"484      }485    ],486    "name": "removeFromCollectionAllowListCross",487    "outputs": [],488    "stateMutability": "nonpayable",489    "type": "function"490  },491  {492    "inputs": [493      { "internalType": "address", "name": "from", "type": "address" },494      { "internalType": "address", "name": "to", "type": "address" },495      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }496    ],497    "name": "safeTransferFrom",498    "outputs": [],499    "stateMutability": "nonpayable",500    "type": "function"501  },502  {503    "inputs": [504      { "internalType": "address", "name": "from", "type": "address" },505      { "internalType": "address", "name": "to", "type": "address" },506      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },507      { "internalType": "bytes", "name": "data", "type": "bytes" }508    ],509    "name": "safeTransferFrom",510    "outputs": [],511    "stateMutability": "nonpayable",512    "type": "function"513  },514  {515    "inputs": [516      { "internalType": "address", "name": "operator", "type": "address" },517      { "internalType": "bool", "name": "approved", "type": "bool" }518    ],519    "name": "setApprovalForAll",520    "outputs": [],521    "stateMutability": "nonpayable",522    "type": "function"523  },524  {525    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],526    "name": "setCollectionAccess",527    "outputs": [],528    "stateMutability": "nonpayable",529    "type": "function"530  },531  {532    "inputs": [533      { "internalType": "string", "name": "limit", "type": "string" },534      { "internalType": "uint256", "name": "value", "type": "uint256" }535    ],536    "name": "setCollectionLimit",537    "outputs": [],538    "stateMutability": "nonpayable",539    "type": "function"540  },541  {542    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],543    "name": "setCollectionMintMode",544    "outputs": [],545    "stateMutability": "nonpayable",546    "type": "function"547  },548  {549    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],550    "name": "setCollectionNesting",551    "outputs": [],552    "stateMutability": "nonpayable",553    "type": "function"554  },555  {556    "inputs": [557      { "internalType": "bool", "name": "enable", "type": "bool" },558      {559        "internalType": "address[]",560        "name": "collections",561        "type": "address[]"562      }563    ],564    "name": "setCollectionNesting",565    "outputs": [],566    "stateMutability": "nonpayable",567    "type": "function"568  },569  {570    "inputs": [571      {572        "components": [573          { "internalType": "string", "name": "key", "type": "string" },574          { "internalType": "bytes", "name": "value", "type": "bytes" }575        ],576        "internalType": "struct Property[]",577        "name": "properties",578        "type": "tuple[]"579      }580    ],581    "name": "setCollectionProperties",582    "outputs": [],583    "stateMutability": "nonpayable",584    "type": "function"585  },586  {587    "inputs": [588      {589        "components": [590          { "internalType": "address", "name": "eth", "type": "address" },591          { "internalType": "uint256", "name": "sub", "type": "uint256" }592        ],593        "internalType": "struct EthCrossAccount",594        "name": "sponsor",595        "type": "tuple"596      }597    ],598    "name": "setCollectionSponsorCross",599    "outputs": [],600    "stateMutability": "nonpayable",601    "type": "function"602  },603  {604    "inputs": [605      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },606      {607        "components": [608          { "internalType": "string", "name": "key", "type": "string" },609          { "internalType": "bytes", "name": "value", "type": "bytes" }610        ],611        "internalType": "struct Property[]",612        "name": "properties",613        "type": "tuple[]"614      }615    ],616    "name": "setProperties",617    "outputs": [],618    "stateMutability": "nonpayable",619    "type": "function"620  },621  {622    "inputs": [623      { "internalType": "string", "name": "key", "type": "string" },624      { "internalType": "bool", "name": "isMutable", "type": "bool" },625      { "internalType": "bool", "name": "collectionAdmin", "type": "bool" },626      { "internalType": "bool", "name": "tokenOwner", "type": "bool" }627    ],628    "name": "setTokenPropertyPermission",629    "outputs": [],630    "stateMutability": "nonpayable",631    "type": "function"632  },633  {634    "inputs": [635      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }636    ],637    "name": "supportsInterface",638    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],639    "stateMutability": "view",640    "type": "function"641  },642  {643    "inputs": [],644    "name": "symbol",645    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],646    "stateMutability": "view",647    "type": "function"648  },649  {650    "inputs": [651      { "internalType": "uint256", "name": "index", "type": "uint256" }652    ],653    "name": "tokenByIndex",654    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],655    "stateMutability": "view",656    "type": "function"657  },658  {659    "inputs": [660      { "internalType": "address", "name": "owner", "type": "address" },661      { "internalType": "uint256", "name": "index", "type": "uint256" }662    ],663    "name": "tokenOfOwnerByIndex",664    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],665    "stateMutability": "view",666    "type": "function"667  },668  {669    "inputs": [670      { "internalType": "uint256", "name": "tokenId", "type": "uint256" },671      { "internalType": "string[]", "name": "keys", "type": "string[]" }672    ],673    "name": "tokenProperties",674    "outputs": [675      {676        "components": [677          { "internalType": "string", "name": "key", "type": "string" },678          { "internalType": "bytes", "name": "value", "type": "bytes" }679        ],680        "internalType": "struct Property[]",681        "name": "",682        "type": "tuple[]"683      }684    ],685    "stateMutability": "view",686    "type": "function"687  },688  {689    "inputs": [690      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }691    ],692    "name": "tokenURI",693    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],694    "stateMutability": "view",695    "type": "function"696  },697  {698    "inputs": [],699    "name": "totalSupply",700    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],701    "stateMutability": "view",702    "type": "function"703  },704  {705    "inputs": [706      { "internalType": "address", "name": "to", "type": "address" },707      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }708    ],709    "name": "transfer",710    "outputs": [],711    "stateMutability": "nonpayable",712    "type": "function"713  },714  {715    "inputs": [716      {717        "components": [718          { "internalType": "address", "name": "eth", "type": "address" },719          { "internalType": "uint256", "name": "sub", "type": "uint256" }720        ],721        "internalType": "struct EthCrossAccount",722        "name": "to",723        "type": "tuple"724      },725      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }726    ],727    "name": "transferCross",728    "outputs": [],729    "stateMutability": "nonpayable",730    "type": "function"731  },732  {733    "inputs": [734      { "internalType": "address", "name": "from", "type": "address" },735      { "internalType": "address", "name": "to", "type": "address" },736      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }737    ],738    "name": "transferFrom",739    "outputs": [],740    "stateMutability": "nonpayable",741    "type": "function"742  },743  {744    "inputs": [745      {746        "components": [747          { "internalType": "address", "name": "eth", "type": "address" },748          { "internalType": "uint256", "name": "sub", "type": "uint256" }749        ],750        "internalType": "struct EthCrossAccount",751        "name": "from",752        "type": "tuple"753      },754      {755        "components": [756          { "internalType": "address", "name": "eth", "type": "address" },757          { "internalType": "uint256", "name": "sub", "type": "uint256" }758        ],759        "internalType": "struct EthCrossAccount",760        "name": "to",761        "type": "tuple"762      },763      { "internalType": "uint256", "name": "tokenId", "type": "uint256" }764    ],765    "name": "transferFromCross",766    "outputs": [],767    "stateMutability": "nonpayable",768    "type": "function"769  },770  {771    "inputs": [],772    "name": "uniqueCollectionType",773    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],774    "stateMutability": "view",775    "type": "function"776  }777]
modifiedtests/src/eth/abi/reFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -231,7 +231,7 @@
           { "internalType": "string", "name": "field_0", "type": "string" },
           { "internalType": "bytes", "name": "field_1", "type": "bytes" }
         ],
-        "internalType": "struct Tuple22[]",
+        "internalType": "struct Tuple26[]",
         "name": "",
         "type": "tuple[]"
       }
@@ -255,7 +255,7 @@
           { "internalType": "address", "name": "field_0", "type": "address" },
           { "internalType": "uint256", "name": "field_1", "type": "uint256" }
         ],
-        "internalType": "struct Tuple25",
+        "internalType": "struct Tuple29",
         "name": "",
         "type": "tuple"
       }
@@ -665,10 +665,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/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}) => {