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

difftreelog

feat add eth methots for bulk properties

Trubnikov Sergey2022-10-24parent: #0321433.patch.diff
in: master

14 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -27,7 +27,7 @@
 use sp_std::vec::Vec;
 use up_data_structs::{
 	AccessMode, CollectionMode, CollectionPermissions, OwnerRestrictedSet, Property,
-	SponsoringRateLimit, SponsorshipState,
+	SponsoringRateLimit, SponsorshipState, PropertyKey,
 };
 use alloc::format;
 
@@ -97,6 +97,21 @@
 			.map_err(dispatch_to_evm::<T>)
 	}
 
+	/// Set collection properties.
+	///
+	/// @param properties Vector of properties key/value pair.
+	#[weight(<SelfWeightOf<T>>::set_collection_properties(properties.len() as u32))]
+	fn set_collection_properties(
+		&mut self,
+		caller: caller,
+		properties: Vec<(string, bytes)>,
+	) -> Result<void> {
+		for (key, value) in properties.into_iter() {
+			self.set_collection_property(caller, key, value)?;
+		}
+		Ok(())
+	}
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -123,12 +138,38 @@
 			.try_into()
 			.map_err(|_| "key too large")?;
 
-		let props = <CollectionProperties<T>>::get(self.id);
+		let props = CollectionProperties::<T>::get(self.id);
 		let prop = props.get(&key).ok_or("key not found")?;
 
 		Ok(bytes(prop.to_vec()))
 	}
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @return Vector of properties key/value pairs.
+	fn collection_properties(&self, keys: Vec<string>) -> Result<Vec<(string, bytes)>> {
+		let mut keys_ = Vec::<PropertyKey>::with_capacity(keys.len());
+		for key in keys {
+			keys_.push(
+				<Vec<u8>>::from(key)
+					.try_into()
+					.map_err(|_| Error::Revert("key too large".into()))?,
+			)
+		}
+		let properties = Pallet::<T>::filter_collection_properties(self.id, Some(keys_))
+			.map_err(dispatch_to_evm::<T>)?;
+
+		let mut properties_ = Vec::<(string, bytes)>::with_capacity(properties.len());
+		for p in properties {
+			let key =
+				string::from_utf8(p.key.into()).map_err(|e| Error::Revert(format!("{}", e)))?;
+			let value = bytes(p.value.to_vec());
+			properties_.push((key, value));
+		}
+		Ok(properties_)
+	}
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
modifiedpallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -18,7 +18,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x25d897dc
+/// @dev the ERC-165 identifier for this interface is 0x5d354410
 contract Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -33,6 +33,17 @@
 		dummy = 0;
 	}
 
+	/// Set collection properties.
+	///
+	/// @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(Tuple10[] memory properties) public {
+		require(false, stub_error);
+		properties;
+		dummy = 0;
+	}
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -59,6 +70,19 @@
 		return hex"";
 	}
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @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 (Tuple10[] memory) {
+		require(false, stub_error);
+		keys;
+		dummy;
+		return new Tuple10[](0);
+	}
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
@@ -397,6 +421,12 @@
 	}
 }
 
+/// @dev anonymous struct
+struct Tuple10 {
+	string field_0;
+	bytes field_1;
+}
+
 /// @dev the ERC-165 identifier for this interface is 0x032e5926
 contract ERC20UniqueExtensions is Dummy, ERC165 {
 	/// @dev EVM selector for this function is: 0x0ecd0ab0,
modifiedpallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -91,7 +91,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x25d897dc
+/// @dev the ERC-165 identifier for this interface is 0x5d354410
 contract Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -106,6 +106,17 @@
 		dummy = 0;
 	}
 
+	/// Set collection properties.
+	///
+	/// @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(Tuple19[] memory properties) public {
+		require(false, stub_error);
+		properties;
+		dummy = 0;
+	}
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -132,6 +143,19 @@
 		return hex"";
 	}
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @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 (Tuple19[] memory) {
+		require(false, stub_error);
+		keys;
+		dummy;
+		return new Tuple19[](0);
+	}
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
@@ -470,6 +494,12 @@
 	}
 }
 
+/// @dev anonymous struct
+struct Tuple19 {
+	string field_0;
+	bytes field_1;
+}
+
 /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 /// @dev See https://eips.ethereum.org/EIPS/eip-721
 /// @dev the ERC-165 identifier for this interface is 0x5b5e139f
modifiedpallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -91,7 +91,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x25d897dc
+/// @dev the ERC-165 identifier for this interface is 0x5d354410
 contract Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -106,6 +106,17 @@
 		dummy = 0;
 	}
 
+	/// Set collection properties.
+	///
+	/// @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(Tuple19[] memory properties) public {
+		require(false, stub_error);
+		properties;
+		dummy = 0;
+	}
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -132,6 +143,19 @@
 		return hex"";
 	}
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @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 (Tuple19[] memory) {
+		require(false, stub_error);
+		keys;
+		dummy;
+		return new Tuple19[](0);
+	}
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
@@ -470,6 +494,12 @@
 	}
 }
 
+/// @dev anonymous struct
+struct Tuple19 {
+	string field_0;
+	bytes field_1;
+}
+
 /// @dev the ERC-165 identifier for this interface is 0x5b5e139f
 contract ERC721Metadata is Dummy, ERC165 {
 	// /// @notice A descriptive name for a collection of NFTs in this contract
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -13,7 +13,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x25d897dc
+/// @dev the ERC-165 identifier for this interface is 0x5d354410
 interface Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -23,6 +23,13 @@
 	///  or in textual repr: setCollectionProperty(string,bytes)
 	function setCollectionProperty(string memory key, bytes memory value) external;
 
+	/// Set collection properties.
+	///
+	/// @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(Tuple10[] memory properties) external;
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -40,6 +47,14 @@
 	///  or in textual repr: collectionProperty(string)
 	function collectionProperty(string memory key) external view returns (bytes memory);
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @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 (Tuple10[] memory);
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
@@ -258,6 +273,12 @@
 	function setOwnerCross(Tuple6 memory newOwner) external;
 }
 
+/// @dev anonymous struct
+struct Tuple10 {
+	string field_0;
+	bytes field_1;
+}
+
 /// @dev the ERC-165 identifier for this interface is 0x032e5926
 interface ERC20UniqueExtensions is Dummy, ERC165 {
 	/// @dev EVM selector for this function is: 0x0ecd0ab0,
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -62,7 +62,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x25d897dc
+/// @dev the ERC-165 identifier for this interface is 0x5d354410
 interface Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -72,6 +72,13 @@
 	///  or in textual repr: setCollectionProperty(string,bytes)
 	function setCollectionProperty(string memory key, bytes memory value) external;
 
+	/// Set collection properties.
+	///
+	/// @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(Tuple19[] memory properties) external;
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -89,6 +96,14 @@
 	///  or in textual repr: collectionProperty(string)
 	function collectionProperty(string memory key) external view returns (bytes memory);
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @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 (Tuple19[] memory);
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
@@ -307,6 +322,12 @@
 	function setOwnerCross(Tuple6 memory newOwner) external;
 }
 
+/// @dev anonymous struct
+struct Tuple19 {
+	string field_0;
+	bytes field_1;
+}
+
 /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 /// @dev See https://eips.ethereum.org/EIPS/eip-721
 /// @dev the ERC-165 identifier for this interface is 0x5b5e139f
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -62,7 +62,7 @@
 }
 
 /// @title A contract that allows you to work with collections.
-/// @dev the ERC-165 identifier for this interface is 0x25d897dc
+/// @dev the ERC-165 identifier for this interface is 0x5d354410
 interface Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -72,6 +72,13 @@
 	///  or in textual repr: setCollectionProperty(string,bytes)
 	function setCollectionProperty(string memory key, bytes memory value) external;
 
+	/// Set collection properties.
+	///
+	/// @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(Tuple19[] memory properties) external;
+
 	/// Delete collection property.
 	///
 	/// @param key Property key.
@@ -89,6 +96,14 @@
 	///  or in textual repr: collectionProperty(string)
 	function collectionProperty(string memory key) external view returns (bytes memory);
 
+	/// Get collection properties.
+	///
+	/// @param keys Properties keys.
+	/// @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 (Tuple19[] memory);
+
 	/// Set the sponsor of the collection.
 	///
 	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
@@ -307,6 +322,12 @@
 	function setOwnerCross(Tuple6 memory newOwner) external;
 }
 
+/// @dev anonymous struct
+struct Tuple19 {
+	string field_0;
+	bytes field_1;
+}
+
 /// @dev the ERC-165 identifier for this interface is 0x5b5e139f
 interface ERC721Metadata is Dummy, ERC165 {
 	// /// @notice A descriptive name for a collection of NFTs in this contract
modifiedtests/src/eth/collectionProperties.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionProperties.test.ts
+++ b/tests/src/eth/collectionProperties.test.ts
@@ -161,3 +161,31 @@
     await checkERC721Metadata(helper, 'rft');
   });
 });
+
+describe('EVM collection property', () => {
+  itEth('Set/read properties', async ({helper, privateKey}) => {
+    const alice = await privateKey('//Alice');
+    const collection = await helper.nft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
+
+    const sender = await helper.eth.createAccountWithBalance(alice, 100n);
+    await collection.addAdmin(alice, {Ethereum: sender});
+
+    const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+    const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', sender);
+
+    const key1 = 'key1';
+    const value1 = Buffer.from('value1');
+    
+    const key2 = 'key2';
+    const value2 = Buffer.from('value2');
+
+    const writeProperties = [
+      [key1, '0x'+value1.toString('hex')],
+      [key2, '0x'+value2.toString('hex')],
+    ];
+
+    await contract.methods.setCollectionProperties(writeProperties).send();
+    const readProperties = await contract.methods.collectionProperties([key1, key2]).call();
+    expect(readProperties).to.be.like(writeProperties);
+  });
+});
modifiedtests/src/eth/fungibleAbi.jsondiffbeforeafterboth
before · tests/src/eth/fungibleAbi.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": "spender",15        "type": "address"16      },17      {18        "indexed": false,19        "internalType": "uint256",20        "name": "value",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": "from",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "to",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "uint256",45        "name": "value",46        "type": "uint256"47      }48    ],49    "name": "Transfer",50    "type": "event"51  },52  {53    "inputs": [54      { "internalType": "address", "name": "newAdmin", "type": "address" }55    ],56    "name": "addCollectionAdmin",57    "outputs": [],58    "stateMutability": "nonpayable",59    "type": "function"60  },61  {62    "inputs": [63      {64        "components": [65          { "internalType": "address", "name": "field_0", "type": "address" },66          { "internalType": "uint256", "name": "field_1", "type": "uint256" }67        ],68        "internalType": "struct Tuple6",69        "name": "newAdmin",70        "type": "tuple"71      }72    ],73    "name": "addCollectionAdminCross",74    "outputs": [],75    "stateMutability": "nonpayable",76    "type": "function"77  },78  {79    "inputs": [80      { "internalType": "address", "name": "user", "type": "address" }81    ],82    "name": "addToCollectionAllowList",83    "outputs": [],84    "stateMutability": "nonpayable",85    "type": "function"86  },87  {88    "inputs": [89      {90        "components": [91          { "internalType": "address", "name": "field_0", "type": "address" },92          { "internalType": "uint256", "name": "field_1", "type": "uint256" }93        ],94        "internalType": "struct Tuple6",95        "name": "user",96        "type": "tuple"97      }98    ],99    "name": "addToCollectionAllowListCross",100    "outputs": [],101    "stateMutability": "nonpayable",102    "type": "function"103  },104  {105    "inputs": [106      { "internalType": "address", "name": "owner", "type": "address" },107      { "internalType": "address", "name": "spender", "type": "address" }108    ],109    "name": "allowance",110    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],111    "stateMutability": "view",112    "type": "function"113  },114  {115    "inputs": [116      { "internalType": "address", "name": "user", "type": "address" }117    ],118    "name": "allowed",119    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],120    "stateMutability": "view",121    "type": "function"122  },123  {124    "inputs": [125      { "internalType": "address", "name": "spender", "type": "address" },126      { "internalType": "uint256", "name": "amount", "type": "uint256" }127    ],128    "name": "approve",129    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],130    "stateMutability": "nonpayable",131    "type": "function"132  },133  {134    "inputs": [135      {136        "components": [137          { "internalType": "address", "name": "field_0", "type": "address" },138          { "internalType": "uint256", "name": "field_1", "type": "uint256" }139        ],140        "internalType": "struct Tuple6",141        "name": "spender",142        "type": "tuple"143      },144      { "internalType": "uint256", "name": "amount", "type": "uint256" }145    ],146    "name": "approveCross",147    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],148    "stateMutability": "nonpayable",149    "type": "function"150  },151  {152    "inputs": [153      { "internalType": "address", "name": "owner", "type": "address" }154    ],155    "name": "balanceOf",156    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],157    "stateMutability": "view",158    "type": "function"159  },160  {161    "inputs": [162      { "internalType": "address", "name": "from", "type": "address" },163      { "internalType": "uint256", "name": "amount", "type": "uint256" }164    ],165    "name": "burnFrom",166    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],167    "stateMutability": "nonpayable",168    "type": "function"169  },170  {171    "inputs": [172      {173        "components": [174          { "internalType": "address", "name": "field_0", "type": "address" },175          { "internalType": "uint256", "name": "field_1", "type": "uint256" }176        ],177        "internalType": "struct Tuple6",178        "name": "from",179        "type": "tuple"180      },181      { "internalType": "uint256", "name": "amount", "type": "uint256" }182    ],183    "name": "burnFromCross",184    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],185    "stateMutability": "nonpayable",186    "type": "function"187  },188  {189    "inputs": [190      { "internalType": "address", "name": "newOwner", "type": "address" }191    ],192    "name": "changeCollectionOwner",193    "outputs": [],194    "stateMutability": "nonpayable",195    "type": "function"196  },197  {198    "inputs": [],199    "name": "collectionAdmins",200    "outputs": [201      {202        "components": [203          { "internalType": "address", "name": "field_0", "type": "address" },204          { "internalType": "uint256", "name": "field_1", "type": "uint256" }205        ],206        "internalType": "struct Tuple6[]",207        "name": "",208        "type": "tuple[]"209      }210    ],211    "stateMutability": "view",212    "type": "function"213  },214  {215    "inputs": [],216    "name": "collectionOwner",217    "outputs": [218      {219        "components": [220          { "internalType": "address", "name": "field_0", "type": "address" },221          { "internalType": "uint256", "name": "field_1", "type": "uint256" }222        ],223        "internalType": "struct Tuple6",224        "name": "",225        "type": "tuple"226      }227    ],228    "stateMutability": "view",229    "type": "function"230  },231  {232    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],233    "name": "collectionProperty",234    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],235    "stateMutability": "view",236    "type": "function"237  },238  {239    "inputs": [],240    "name": "collectionSponsor",241    "outputs": [242      {243        "components": [244          { "internalType": "address", "name": "field_0", "type": "address" },245          { "internalType": "uint256", "name": "field_1", "type": "uint256" }246        ],247        "internalType": "struct Tuple6",248        "name": "",249        "type": "tuple"250      }251    ],252    "stateMutability": "view",253    "type": "function"254  },255  {256    "inputs": [],257    "name": "confirmCollectionSponsorship",258    "outputs": [],259    "stateMutability": "nonpayable",260    "type": "function"261  },262  {263    "inputs": [],264    "name": "contractAddress",265    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],266    "stateMutability": "view",267    "type": "function"268  },269  {270    "inputs": [],271    "name": "decimals",272    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],273    "stateMutability": "view",274    "type": "function"275  },276  {277    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],278    "name": "deleteCollectionProperty",279    "outputs": [],280    "stateMutability": "nonpayable",281    "type": "function"282  },283  {284    "inputs": [],285    "name": "hasCollectionPendingSponsor",286    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],287    "stateMutability": "view",288    "type": "function"289  },290  {291    "inputs": [292      { "internalType": "address", "name": "user", "type": "address" }293    ],294    "name": "isOwnerOrAdmin",295    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],296    "stateMutability": "view",297    "type": "function"298  },299  {300    "inputs": [301      {302        "components": [303          { "internalType": "address", "name": "field_0", "type": "address" },304          { "internalType": "uint256", "name": "field_1", "type": "uint256" }305        ],306        "internalType": "struct Tuple6",307        "name": "user",308        "type": "tuple"309      }310    ],311    "name": "isOwnerOrAdminCross",312    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],313    "stateMutability": "view",314    "type": "function"315  },316  {317    "inputs": [318      { "internalType": "address", "name": "to", "type": "address" },319      { "internalType": "uint256", "name": "amount", "type": "uint256" }320    ],321    "name": "mint",322    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],323    "stateMutability": "nonpayable",324    "type": "function"325  },326  {327    "inputs": [328      {329        "components": [330          { "internalType": "address", "name": "field_0", "type": "address" },331          { "internalType": "uint256", "name": "field_1", "type": "uint256" }332        ],333        "internalType": "struct Tuple6[]",334        "name": "amounts",335        "type": "tuple[]"336      }337    ],338    "name": "mintBulk",339    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],340    "stateMutability": "nonpayable",341    "type": "function"342  },343  {344    "inputs": [],345    "name": "name",346    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],347    "stateMutability": "view",348    "type": "function"349  },350  {351    "inputs": [352      { "internalType": "address", "name": "admin", "type": "address" }353    ],354    "name": "removeCollectionAdmin",355    "outputs": [],356    "stateMutability": "nonpayable",357    "type": "function"358  },359  {360    "inputs": [361      {362        "components": [363          { "internalType": "address", "name": "field_0", "type": "address" },364          { "internalType": "uint256", "name": "field_1", "type": "uint256" }365        ],366        "internalType": "struct Tuple6",367        "name": "admin",368        "type": "tuple"369      }370    ],371    "name": "removeCollectionAdminCross",372    "outputs": [],373    "stateMutability": "nonpayable",374    "type": "function"375  },376  {377    "inputs": [],378    "name": "removeCollectionSponsor",379    "outputs": [],380    "stateMutability": "nonpayable",381    "type": "function"382  },383  {384    "inputs": [385      { "internalType": "address", "name": "user", "type": "address" }386    ],387    "name": "removeFromCollectionAllowList",388    "outputs": [],389    "stateMutability": "nonpayable",390    "type": "function"391  },392  {393    "inputs": [394      {395        "components": [396          { "internalType": "address", "name": "field_0", "type": "address" },397          { "internalType": "uint256", "name": "field_1", "type": "uint256" }398        ],399        "internalType": "struct Tuple6",400        "name": "user",401        "type": "tuple"402      }403    ],404    "name": "removeFromCollectionAllowListCross",405    "outputs": [],406    "stateMutability": "nonpayable",407    "type": "function"408  },409  {410    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],411    "name": "setCollectionAccess",412    "outputs": [],413    "stateMutability": "nonpayable",414    "type": "function"415  },416  {417    "inputs": [418      { "internalType": "string", "name": "limit", "type": "string" },419      { "internalType": "uint32", "name": "value", "type": "uint32" }420    ],421    "name": "setCollectionLimit",422    "outputs": [],423    "stateMutability": "nonpayable",424    "type": "function"425  },426  {427    "inputs": [428      { "internalType": "string", "name": "limit", "type": "string" },429      { "internalType": "bool", "name": "value", "type": "bool" }430    ],431    "name": "setCollectionLimit",432    "outputs": [],433    "stateMutability": "nonpayable",434    "type": "function"435  },436  {437    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],438    "name": "setCollectionMintMode",439    "outputs": [],440    "stateMutability": "nonpayable",441    "type": "function"442  },443  {444    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],445    "name": "setCollectionNesting",446    "outputs": [],447    "stateMutability": "nonpayable",448    "type": "function"449  },450  {451    "inputs": [452      { "internalType": "bool", "name": "enable", "type": "bool" },453      {454        "internalType": "address[]",455        "name": "collections",456        "type": "address[]"457      }458    ],459    "name": "setCollectionNesting",460    "outputs": [],461    "stateMutability": "nonpayable",462    "type": "function"463  },464  {465    "inputs": [466      { "internalType": "string", "name": "key", "type": "string" },467      { "internalType": "bytes", "name": "value", "type": "bytes" }468    ],469    "name": "setCollectionProperty",470    "outputs": [],471    "stateMutability": "nonpayable",472    "type": "function"473  },474  {475    "inputs": [476      { "internalType": "address", "name": "sponsor", "type": "address" }477    ],478    "name": "setCollectionSponsor",479    "outputs": [],480    "stateMutability": "nonpayable",481    "type": "function"482  },483  {484    "inputs": [485      {486        "components": [487          { "internalType": "address", "name": "field_0", "type": "address" },488          { "internalType": "uint256", "name": "field_1", "type": "uint256" }489        ],490        "internalType": "struct Tuple6",491        "name": "sponsor",492        "type": "tuple"493      }494    ],495    "name": "setCollectionSponsorCross",496    "outputs": [],497    "stateMutability": "nonpayable",498    "type": "function"499  },500  {501    "inputs": [502      {503        "components": [504          { "internalType": "address", "name": "field_0", "type": "address" },505          { "internalType": "uint256", "name": "field_1", "type": "uint256" }506        ],507        "internalType": "struct Tuple6",508        "name": "newOwner",509        "type": "tuple"510      }511    ],512    "name": "setOwnerCross",513    "outputs": [],514    "stateMutability": "nonpayable",515    "type": "function"516  },517  {518    "inputs": [519      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }520    ],521    "name": "supportsInterface",522    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],523    "stateMutability": "view",524    "type": "function"525  },526  {527    "inputs": [],528    "name": "symbol",529    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],530    "stateMutability": "view",531    "type": "function"532  },533  {534    "inputs": [],535    "name": "totalSupply",536    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],537    "stateMutability": "view",538    "type": "function"539  },540  {541    "inputs": [542      { "internalType": "address", "name": "to", "type": "address" },543      { "internalType": "uint256", "name": "amount", "type": "uint256" }544    ],545    "name": "transfer",546    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],547    "stateMutability": "nonpayable",548    "type": "function"549  },550  {551    "inputs": [552      { "internalType": "address", "name": "from", "type": "address" },553      { "internalType": "address", "name": "to", "type": "address" },554      { "internalType": "uint256", "name": "amount", "type": "uint256" }555    ],556    "name": "transferFrom",557    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],558    "stateMutability": "nonpayable",559    "type": "function"560  },561  {562    "inputs": [563      {564        "components": [565          { "internalType": "address", "name": "field_0", "type": "address" },566          { "internalType": "uint256", "name": "field_1", "type": "uint256" }567        ],568        "internalType": "struct Tuple6",569        "name": "from",570        "type": "tuple"571      },572      {573        "components": [574          { "internalType": "address", "name": "field_0", "type": "address" },575          { "internalType": "uint256", "name": "field_1", "type": "uint256" }576        ],577        "internalType": "struct Tuple6",578        "name": "to",579        "type": "tuple"580      },581      { "internalType": "uint256", "name": "amount", "type": "uint256" }582    ],583    "name": "transferFromCross",584    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],585    "stateMutability": "nonpayable",586    "type": "function"587  },588  {589    "inputs": [],590    "name": "uniqueCollectionType",591    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],592    "stateMutability": "view",593    "type": "function"594  }595]
after · tests/src/eth/fungibleAbi.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": "spender",15        "type": "address"16      },17      {18        "indexed": false,19        "internalType": "uint256",20        "name": "value",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": "from",34        "type": "address"35      },36      {37        "indexed": true,38        "internalType": "address",39        "name": "to",40        "type": "address"41      },42      {43        "indexed": false,44        "internalType": "uint256",45        "name": "value",46        "type": "uint256"47      }48    ],49    "name": "Transfer",50    "type": "event"51  },52  {53    "inputs": [54      { "internalType": "address", "name": "newAdmin", "type": "address" }55    ],56    "name": "addCollectionAdmin",57    "outputs": [],58    "stateMutability": "nonpayable",59    "type": "function"60  },61  {62    "inputs": [63      {64        "components": [65          { "internalType": "address", "name": "field_0", "type": "address" },66          { "internalType": "uint256", "name": "field_1", "type": "uint256" }67        ],68        "internalType": "struct Tuple6",69        "name": "newAdmin",70        "type": "tuple"71      }72    ],73    "name": "addCollectionAdminCross",74    "outputs": [],75    "stateMutability": "nonpayable",76    "type": "function"77  },78  {79    "inputs": [80      { "internalType": "address", "name": "user", "type": "address" }81    ],82    "name": "addToCollectionAllowList",83    "outputs": [],84    "stateMutability": "nonpayable",85    "type": "function"86  },87  {88    "inputs": [89      {90        "components": [91          { "internalType": "address", "name": "field_0", "type": "address" },92          { "internalType": "uint256", "name": "field_1", "type": "uint256" }93        ],94        "internalType": "struct Tuple6",95        "name": "user",96        "type": "tuple"97      }98    ],99    "name": "addToCollectionAllowListCross",100    "outputs": [],101    "stateMutability": "nonpayable",102    "type": "function"103  },104  {105    "inputs": [106      { "internalType": "address", "name": "owner", "type": "address" },107      { "internalType": "address", "name": "spender", "type": "address" }108    ],109    "name": "allowance",110    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],111    "stateMutability": "view",112    "type": "function"113  },114  {115    "inputs": [116      { "internalType": "address", "name": "user", "type": "address" }117    ],118    "name": "allowed",119    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],120    "stateMutability": "view",121    "type": "function"122  },123  {124    "inputs": [125      { "internalType": "address", "name": "spender", "type": "address" },126      { "internalType": "uint256", "name": "amount", "type": "uint256" }127    ],128    "name": "approve",129    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],130    "stateMutability": "nonpayable",131    "type": "function"132  },133  {134    "inputs": [135      {136        "components": [137          { "internalType": "address", "name": "field_0", "type": "address" },138          { "internalType": "uint256", "name": "field_1", "type": "uint256" }139        ],140        "internalType": "struct Tuple6",141        "name": "spender",142        "type": "tuple"143      },144      { "internalType": "uint256", "name": "amount", "type": "uint256" }145    ],146    "name": "approveCross",147    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],148    "stateMutability": "nonpayable",149    "type": "function"150  },151  {152    "inputs": [153      { "internalType": "address", "name": "owner", "type": "address" }154    ],155    "name": "balanceOf",156    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],157    "stateMutability": "view",158    "type": "function"159  },160  {161    "inputs": [162      { "internalType": "address", "name": "from", "type": "address" },163      { "internalType": "uint256", "name": "amount", "type": "uint256" }164    ],165    "name": "burnFrom",166    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],167    "stateMutability": "nonpayable",168    "type": "function"169  },170  {171    "inputs": [172      {173        "components": [174          { "internalType": "address", "name": "field_0", "type": "address" },175          { "internalType": "uint256", "name": "field_1", "type": "uint256" }176        ],177        "internalType": "struct Tuple6",178        "name": "from",179        "type": "tuple"180      },181      { "internalType": "uint256", "name": "amount", "type": "uint256" }182    ],183    "name": "burnFromCross",184    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],185    "stateMutability": "nonpayable",186    "type": "function"187  },188  {189    "inputs": [190      { "internalType": "address", "name": "newOwner", "type": "address" }191    ],192    "name": "changeCollectionOwner",193    "outputs": [],194    "stateMutability": "nonpayable",195    "type": "function"196  },197  {198    "inputs": [],199    "name": "collectionAdmins",200    "outputs": [201      {202        "components": [203          { "internalType": "address", "name": "field_0", "type": "address" },204          { "internalType": "uint256", "name": "field_1", "type": "uint256" }205        ],206        "internalType": "struct Tuple6[]",207        "name": "",208        "type": "tuple[]"209      }210    ],211    "stateMutability": "view",212    "type": "function"213  },214  {215    "inputs": [],216    "name": "collectionOwner",217    "outputs": [218      {219        "components": [220          { "internalType": "address", "name": "field_0", "type": "address" },221          { "internalType": "uint256", "name": "field_1", "type": "uint256" }222        ],223        "internalType": "struct Tuple6",224        "name": "",225        "type": "tuple"226      }227    ],228    "stateMutability": "view",229    "type": "function"230  },231  {232    "inputs": [233      { "internalType": "string[]", "name": "keys", "type": "string[]" }234    ],235    "name": "collectionProperties",236    "outputs": [237      {238        "components": [239          { "internalType": "string", "name": "field_0", "type": "string" },240          { "internalType": "bytes", "name": "field_1", "type": "bytes" }241        ],242        "internalType": "struct Tuple10[]",243        "name": "",244        "type": "tuple[]"245      }246    ],247    "stateMutability": "view",248    "type": "function"249  },250  {251    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],252    "name": "collectionProperty",253    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],254    "stateMutability": "view",255    "type": "function"256  },257  {258    "inputs": [],259    "name": "collectionSponsor",260    "outputs": [261      {262        "components": [263          { "internalType": "address", "name": "field_0", "type": "address" },264          { "internalType": "uint256", "name": "field_1", "type": "uint256" }265        ],266        "internalType": "struct Tuple6",267        "name": "",268        "type": "tuple"269      }270    ],271    "stateMutability": "view",272    "type": "function"273  },274  {275    "inputs": [],276    "name": "confirmCollectionSponsorship",277    "outputs": [],278    "stateMutability": "nonpayable",279    "type": "function"280  },281  {282    "inputs": [],283    "name": "contractAddress",284    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],285    "stateMutability": "view",286    "type": "function"287  },288  {289    "inputs": [],290    "name": "decimals",291    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],292    "stateMutability": "view",293    "type": "function"294  },295  {296    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],297    "name": "deleteCollectionProperty",298    "outputs": [],299    "stateMutability": "nonpayable",300    "type": "function"301  },302  {303    "inputs": [],304    "name": "hasCollectionPendingSponsor",305    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],306    "stateMutability": "view",307    "type": "function"308  },309  {310    "inputs": [311      { "internalType": "address", "name": "user", "type": "address" }312    ],313    "name": "isOwnerOrAdmin",314    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],315    "stateMutability": "view",316    "type": "function"317  },318  {319    "inputs": [320      {321        "components": [322          { "internalType": "address", "name": "field_0", "type": "address" },323          { "internalType": "uint256", "name": "field_1", "type": "uint256" }324        ],325        "internalType": "struct Tuple6",326        "name": "user",327        "type": "tuple"328      }329    ],330    "name": "isOwnerOrAdminCross",331    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],332    "stateMutability": "view",333    "type": "function"334  },335  {336    "inputs": [337      { "internalType": "address", "name": "to", "type": "address" },338      { "internalType": "uint256", "name": "amount", "type": "uint256" }339    ],340    "name": "mint",341    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],342    "stateMutability": "nonpayable",343    "type": "function"344  },345  {346    "inputs": [347      {348        "components": [349          { "internalType": "address", "name": "field_0", "type": "address" },350          { "internalType": "uint256", "name": "field_1", "type": "uint256" }351        ],352        "internalType": "struct Tuple6[]",353        "name": "amounts",354        "type": "tuple[]"355      }356    ],357    "name": "mintBulk",358    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],359    "stateMutability": "nonpayable",360    "type": "function"361  },362  {363    "inputs": [],364    "name": "name",365    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],366    "stateMutability": "view",367    "type": "function"368  },369  {370    "inputs": [371      { "internalType": "address", "name": "admin", "type": "address" }372    ],373    "name": "removeCollectionAdmin",374    "outputs": [],375    "stateMutability": "nonpayable",376    "type": "function"377  },378  {379    "inputs": [380      {381        "components": [382          { "internalType": "address", "name": "field_0", "type": "address" },383          { "internalType": "uint256", "name": "field_1", "type": "uint256" }384        ],385        "internalType": "struct Tuple6",386        "name": "admin",387        "type": "tuple"388      }389    ],390    "name": "removeCollectionAdminCross",391    "outputs": [],392    "stateMutability": "nonpayable",393    "type": "function"394  },395  {396    "inputs": [],397    "name": "removeCollectionSponsor",398    "outputs": [],399    "stateMutability": "nonpayable",400    "type": "function"401  },402  {403    "inputs": [404      { "internalType": "address", "name": "user", "type": "address" }405    ],406    "name": "removeFromCollectionAllowList",407    "outputs": [],408    "stateMutability": "nonpayable",409    "type": "function"410  },411  {412    "inputs": [413      {414        "components": [415          { "internalType": "address", "name": "field_0", "type": "address" },416          { "internalType": "uint256", "name": "field_1", "type": "uint256" }417        ],418        "internalType": "struct Tuple6",419        "name": "user",420        "type": "tuple"421      }422    ],423    "name": "removeFromCollectionAllowListCross",424    "outputs": [],425    "stateMutability": "nonpayable",426    "type": "function"427  },428  {429    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],430    "name": "setCollectionAccess",431    "outputs": [],432    "stateMutability": "nonpayable",433    "type": "function"434  },435  {436    "inputs": [437      { "internalType": "string", "name": "limit", "type": "string" },438      { "internalType": "uint32", "name": "value", "type": "uint32" }439    ],440    "name": "setCollectionLimit",441    "outputs": [],442    "stateMutability": "nonpayable",443    "type": "function"444  },445  {446    "inputs": [447      { "internalType": "string", "name": "limit", "type": "string" },448      { "internalType": "bool", "name": "value", "type": "bool" }449    ],450    "name": "setCollectionLimit",451    "outputs": [],452    "stateMutability": "nonpayable",453    "type": "function"454  },455  {456    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],457    "name": "setCollectionMintMode",458    "outputs": [],459    "stateMutability": "nonpayable",460    "type": "function"461  },462  {463    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],464    "name": "setCollectionNesting",465    "outputs": [],466    "stateMutability": "nonpayable",467    "type": "function"468  },469  {470    "inputs": [471      { "internalType": "bool", "name": "enable", "type": "bool" },472      {473        "internalType": "address[]",474        "name": "collections",475        "type": "address[]"476      }477    ],478    "name": "setCollectionNesting",479    "outputs": [],480    "stateMutability": "nonpayable",481    "type": "function"482  },483  {484    "inputs": [485      {486        "components": [487          { "internalType": "string", "name": "field_0", "type": "string" },488          { "internalType": "bytes", "name": "field_1", "type": "bytes" }489        ],490        "internalType": "struct Tuple10[]",491        "name": "properties",492        "type": "tuple[]"493      }494    ],495    "name": "setCollectionProperties",496    "outputs": [],497    "stateMutability": "nonpayable",498    "type": "function"499  },500  {501    "inputs": [502      { "internalType": "string", "name": "key", "type": "string" },503      { "internalType": "bytes", "name": "value", "type": "bytes" }504    ],505    "name": "setCollectionProperty",506    "outputs": [],507    "stateMutability": "nonpayable",508    "type": "function"509  },510  {511    "inputs": [512      { "internalType": "address", "name": "sponsor", "type": "address" }513    ],514    "name": "setCollectionSponsor",515    "outputs": [],516    "stateMutability": "nonpayable",517    "type": "function"518  },519  {520    "inputs": [521      {522        "components": [523          { "internalType": "address", "name": "field_0", "type": "address" },524          { "internalType": "uint256", "name": "field_1", "type": "uint256" }525        ],526        "internalType": "struct Tuple6",527        "name": "sponsor",528        "type": "tuple"529      }530    ],531    "name": "setCollectionSponsorCross",532    "outputs": [],533    "stateMutability": "nonpayable",534    "type": "function"535  },536  {537    "inputs": [538      {539        "components": [540          { "internalType": "address", "name": "field_0", "type": "address" },541          { "internalType": "uint256", "name": "field_1", "type": "uint256" }542        ],543        "internalType": "struct Tuple6",544        "name": "newOwner",545        "type": "tuple"546      }547    ],548    "name": "setOwnerCross",549    "outputs": [],550    "stateMutability": "nonpayable",551    "type": "function"552  },553  {554    "inputs": [555      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }556    ],557    "name": "supportsInterface",558    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],559    "stateMutability": "view",560    "type": "function"561  },562  {563    "inputs": [],564    "name": "symbol",565    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],566    "stateMutability": "view",567    "type": "function"568  },569  {570    "inputs": [],571    "name": "totalSupply",572    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],573    "stateMutability": "view",574    "type": "function"575  },576  {577    "inputs": [578      { "internalType": "address", "name": "to", "type": "address" },579      { "internalType": "uint256", "name": "amount", "type": "uint256" }580    ],581    "name": "transfer",582    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],583    "stateMutability": "nonpayable",584    "type": "function"585  },586  {587    "inputs": [588      { "internalType": "address", "name": "from", "type": "address" },589      { "internalType": "address", "name": "to", "type": "address" },590      { "internalType": "uint256", "name": "amount", "type": "uint256" }591    ],592    "name": "transferFrom",593    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],594    "stateMutability": "nonpayable",595    "type": "function"596  },597  {598    "inputs": [599      {600        "components": [601          { "internalType": "address", "name": "field_0", "type": "address" },602          { "internalType": "uint256", "name": "field_1", "type": "uint256" }603        ],604        "internalType": "struct Tuple6",605        "name": "from",606        "type": "tuple"607      },608      {609        "components": [610          { "internalType": "address", "name": "field_0", "type": "address" },611          { "internalType": "uint256", "name": "field_1", "type": "uint256" }612        ],613        "internalType": "struct Tuple6",614        "name": "to",615        "type": "tuple"616      },617      { "internalType": "uint256", "name": "amount", "type": "uint256" }618    ],619    "name": "transferFromCross",620    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],621    "stateMutability": "nonpayable",622    "type": "function"623  },624  {625    "inputs": [],626    "name": "uniqueCollectionType",627    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],628    "stateMutability": "view",629    "type": "function"630  }631]
modifiedtests/src/eth/nonFungibleAbi.jsondiffbeforeafterboth
--- a/tests/src/eth/nonFungibleAbi.json
+++ b/tests/src/eth/nonFungibleAbi.json
@@ -259,6 +259,25 @@
     "type": "function"
   },
   {
+    "inputs": [
+      { "internalType": "string[]", "name": "keys", "type": "string[]" }
+    ],
+    "name": "collectionProperties",
+    "outputs": [
+      {
+        "components": [
+          { "internalType": "string", "name": "field_0", "type": "string" },
+          { "internalType": "bytes", "name": "field_1", "type": "bytes" }
+        ],
+        "internalType": "struct Tuple19[]",
+        "name": "",
+        "type": "tuple[]"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
     "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],
     "name": "collectionProperty",
     "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
@@ -578,6 +597,23 @@
   },
   {
     "inputs": [
+      {
+        "components": [
+          { "internalType": "string", "name": "field_0", "type": "string" },
+          { "internalType": "bytes", "name": "field_1", "type": "bytes" }
+        ],
+        "internalType": "struct Tuple19[]",
+        "name": "properties",
+        "type": "tuple[]"
+      }
+    ],
+    "name": "setCollectionProperties",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       { "internalType": "string", "name": "key", "type": "string" },
       { "internalType": "bytes", "name": "value", "type": "bytes" }
     ],
modifiedtests/src/eth/reFungibleAbi.jsondiffbeforeafterboth
--- a/tests/src/eth/reFungibleAbi.json
+++ b/tests/src/eth/reFungibleAbi.json
@@ -241,6 +241,25 @@
     "type": "function"
   },
   {
+    "inputs": [
+      { "internalType": "string[]", "name": "keys", "type": "string[]" }
+    ],
+    "name": "collectionProperties",
+    "outputs": [
+      {
+        "components": [
+          { "internalType": "string", "name": "field_0", "type": "string" },
+          { "internalType": "bytes", "name": "field_1", "type": "bytes" }
+        ],
+        "internalType": "struct Tuple19[]",
+        "name": "",
+        "type": "tuple[]"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
     "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],
     "name": "collectionProperty",
     "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
@@ -560,6 +579,23 @@
   },
   {
     "inputs": [
+      {
+        "components": [
+          { "internalType": "string", "name": "field_0", "type": "string" },
+          { "internalType": "bytes", "name": "field_1", "type": "bytes" }
+        ],
+        "internalType": "struct Tuple19[]",
+        "name": "properties",
+        "type": "tuple[]"
+      }
+    ],
+    "name": "setCollectionProperties",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       { "internalType": "string", "name": "key", "type": "string" },
       { "internalType": "bytes", "name": "value", "type": "bytes" }
     ],