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

difftreelog

added `mintCross` function for `UniqueExtensoins` interfaces

PraetorP2022-12-01parent: #0a1b898.patch.diff
in: master

20 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6085,7 +6085,7 @@
 
 [[package]]
 name = "pallet-fungible"
-version = "0.1.7"
+version = "0.1.9"
 dependencies = [
  "ethereum 0.14.0",
  "evm-coder",
modifiedpallets/fungible/CHANGELOG.mddiffbeforeafterboth
--- a/pallets/fungible/CHANGELOG.md
+++ b/pallets/fungible/CHANGELOG.md
@@ -4,6 +4,12 @@
 
 <!-- bureaucrate goes here -->
 
+## [0.1.9] - 2022-12-01
+
+### Added
+
+- The functions `mintCross` to `ERC20UniqueExtensions` interface.
+
 ## [0.1.8] - 2022-11-18
 
 ### Added
modifiedpallets/fungible/Cargo.tomldiffbeforeafterboth
--- a/pallets/fungible/Cargo.toml
+++ b/pallets/fungible/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "pallet-fungible"
-version = "0.1.7"
+version = "0.1.9"
 license = "GPLv3"
 edition = "2021"
 
modifiedpallets/fungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -174,6 +174,19 @@
 			.collect::<string>())
 	}
 
+	#[weight(<SelfWeightOf<T>>::create_item())]
+	fn mint_cross(&mut self, caller: caller, to: EthCrossAccount, amount: uint256) -> Result<bool> {
+		let caller = T::CrossAccountId::from_eth(caller);
+		let to = to.into_sub_cross_account::<T>()?;
+		let amount = amount.try_into().map_err(|_| "amount overflow")?;
+		let budget = self
+			.recorder
+			.weight_calls_budget(<StructureWeight<T>>::find_parent());
+		<Pallet<T>>::create_item(&self, &caller, (to, amount), &budget)
+			.map_err(dispatch_to_evm::<T>)?;
+		Ok(true)
+	}
+
 	#[weight(<SelfWeightOf<T>>::approve())]
 	fn approve_cross(
 		&mut self,
modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -152,10 +152,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 (Tuple8 memory) {
+	function collectionSponsor() public view returns (Tuple9 memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple8(0x0000000000000000000000000000000000000000, 0);
+		return Tuple9(0x0000000000000000000000000000000000000000, 0);
 	}
 
 	/// Get current collection limits.
@@ -522,7 +522,7 @@
 	bytes value;
 }
 
-/// @dev the ERC-165 identifier for this interface is 0x5b7038cf
+/// @dev the ERC-165 identifier for this interface is 0x7dee5997
 contract ERC20UniqueExtensions is Dummy, ERC165 {
 	/// @notice A description for the collection.
 	/// @dev EVM selector for this function is: 0x7284e416,
@@ -533,6 +533,16 @@
 		return "";
 	}
 
+	/// @dev EVM selector for this function is: 0x269e6158,
+	///  or in textual repr: mintCross((address,uint256),uint256)
+	function mintCross(EthCrossAccount memory to, uint256 amount) public returns (bool) {
+		require(false, stub_error);
+		to;
+		amount;
+		dummy = 0;
+		return false;
+	}
+
 	/// @dev EVM selector for this function is: 0x0ecd0ab0,
 	///  or in textual repr: approveCross((address,uint256),uint256)
 	function approveCross(EthCrossAccount memory spender, uint256 amount) public returns (bool) {
@@ -577,7 +587,7 @@
 	/// @param amounts array of pairs of account address and amount
 	/// @dev EVM selector for this function is: 0x1acf2d55,
 	///  or in textual repr: mintBulk((address,uint256)[])
-	function mintBulk(Tuple8[] memory amounts) public returns (bool) {
+	function mintBulk(Tuple9[] memory amounts) public returns (bool) {
 		require(false, stub_error);
 		amounts;
 		dummy = 0;
@@ -611,7 +621,7 @@
 }
 
 /// @dev anonymous struct
-struct Tuple8 {
+struct Tuple9 {
 	address field_0;
 	uint256 field_1;
 }
modifiedpallets/nonfungible/CHANGELOG.mddiffbeforeafterboth
--- a/pallets/nonfungible/CHANGELOG.md
+++ b/pallets/nonfungible/CHANGELOG.md
@@ -4,7 +4,7 @@
 
 <!-- bureaucrate goes here -->
 
-## [0.1.11] - 2022-12-16
+## [0.1.12] - 2022-12-16
 
 ### Added
 
@@ -14,6 +14,12 @@
 
 - Hide `setTokenPropertyPermission` function in `TokenProperties` interface.
 
+## [0.1.11] - 2022-12-01
+
+### Added
+
+- The functions `mintCross` to `ERC721UniqueExtensions` interface.
+
 ## [0.1.10] - 2022-11-18
 
 ### Added
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -1069,6 +1069,58 @@
 			.map_err(dispatch_to_evm::<T>)?;
 		Ok(true)
 	}
+
+	/// @notice Function to mint token.
+	/// @param to The new owner crossAccountId
+	/// @param properties Properties of minted token
+	/// @return uint256 The id of the newly minted token
+	#[weight(<SelfWeightOf<T>>::create_item())]
+	fn mint_cross(
+		&mut self,
+		caller: caller,
+		to: EthCrossAccount,
+		properties: Vec<PropertyStruct>,
+	) -> Result<uint256> {
+		let token_id = <TokensMinted<T>>::get(self.id)
+			.checked_add(1)
+			.ok_or("item id overflow")?;
+
+		let to = to.into_sub_cross_account::<T>()?;
+
+		let properties = properties
+			.into_iter()
+			.map(|PropertyStruct { key, value }| {
+				let key = <Vec<u8>>::from(key)
+					.try_into()
+					.map_err(|_| "key too large")?;
+
+				let value = value.0.try_into().map_err(|_| "value too large")?;
+
+				Ok(Property { key, value })
+			})
+			.collect::<Result<Vec<_>>>()?
+			.try_into()
+			.map_err(|_| Error::Revert(alloc::format!("too many properties")))?;
+
+		let caller = T::CrossAccountId::from_eth(caller);
+
+		let budget = self
+			.recorder
+			.weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+		<Pallet<T>>::create_item(
+			self,
+			&caller,
+			CreateItemData::<T> {
+				properties,
+				owner: to,
+			},
+			&budget,
+		)
+		.map_err(dispatch_to_evm::<T>)?;
+
+		Ok(token_id.into())
+	}
 }
 
 #[solidity_interface(
modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -290,10 +290,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 (Tuple30 memory) {
+	function collectionSponsor() public view returns (Tuple32 memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple30(0x0000000000000000000000000000000000000000, 0);
+		return Tuple32(0x0000000000000000000000000000000000000000, 0);
 	}
 
 	/// Get current collection limits.
@@ -655,7 +655,7 @@
 }
 
 /// @dev anonymous struct
-struct Tuple30 {
+struct Tuple32 {
 	address field_0;
 	uint256 field_1;
 }
@@ -804,7 +804,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0xb74c26b7
+/// @dev the ERC-165 identifier for this interface is 0x0e48fdb4
 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,
@@ -961,6 +961,7 @@
 		dummy;
 		return 0;
 	}
+
 	// /// @notice Function to mint multiple tokens.
 	// /// @dev `tokenIds` should be an array of consecutive numbers and first number
 	// ///  should be obtained with `nextTokenId` method
@@ -991,6 +992,19 @@
 	// 	return false;
 	// }
 
+	/// @notice Function to mint token.
+	/// @param to The new owner crossAccountId
+	/// @param properties Properties of minted token
+	/// @return uint256 The id of the newly minted token
+	/// @dev EVM selector for this function is: 0xb904db03,
+	///  or in textual repr: mintCross((address,uint256),(string,bytes)[])
+	function mintCross(EthCrossAccount memory to, Property[] memory properties) public returns (uint256) {
+		require(false, stub_error);
+		to;
+		properties;
+		dummy = 0;
+		return 0;
+	}
 }
 
 /// @dev anonymous struct
modifiedpallets/refungible/CHANGELOG.mddiffbeforeafterboth
--- a/pallets/refungible/CHANGELOG.md
+++ b/pallets/refungible/CHANGELOG.md
@@ -4,7 +4,7 @@
 
 <!-- bureaucrate goes here -->
 
-## [0.2.10] - 2022-12-16
+## [0.2.11] - 2022-12-16
 
 ### Added
 
@@ -14,6 +14,12 @@
 
 - Hide `setTokenPropertyPermission` function in `TokenProperties` interface.
 
+## [0.2.10] - 2022-12-01
+
+### Added
+
+- The functions `mintCross` to `ERC721UniqueExtensions` interface.
+
 ## [0.2.9] - 2022-11-18
 
 ### Added
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -1120,6 +1120,60 @@
 		Ok(true)
 	}
 
+	/// @notice Function to mint token.
+	/// @param to The new owner crossAccountId
+	/// @param properties Properties of minted token
+	/// @return uint256 The id of the newly minted token
+	#[weight(<SelfWeightOf<T>>::create_item())]
+	fn mint_cross(
+		&mut self,
+		caller: caller,
+		to: EthCrossAccount,
+		properties: Vec<PropertyStruct>,
+	) -> Result<uint256> {
+		let token_id = <TokensMinted<T>>::get(self.id)
+			.checked_add(1)
+			.ok_or("item id overflow")?;
+
+		let to = to.into_sub_cross_account::<T>()?;
+
+		let properties = properties
+			.into_iter()
+			.map(|PropertyStruct { key, value }| {
+				let key = <Vec<u8>>::from(key)
+					.try_into()
+					.map_err(|_| "key too large")?;
+
+				let value = value.0.try_into().map_err(|_| "value too large")?;
+
+				Ok(Property { key, value })
+			})
+			.collect::<Result<Vec<_>>>()?
+			.try_into()
+			.map_err(|_| Error::Revert(alloc::format!("too many properties")))?;
+
+		let caller = T::CrossAccountId::from_eth(caller);
+
+		let budget = self
+			.recorder
+			.weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+		let users = [(to, 1)]
+			.into_iter()
+			.collect::<BTreeMap<_, _>>()
+			.try_into()
+			.unwrap();
+		<Pallet<T>>::create_item(
+			self,
+			&caller,
+			CreateItemData::<T::CrossAccountId> { users, properties },
+			&budget,
+		)
+		.map_err(dispatch_to_evm::<T>)?;
+
+		Ok(token_id.into())
+	}
+
 	/// Returns EVM address for refungible token
 	///
 	/// @param token ID of the token
modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -290,10 +290,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 (Tuple29 memory) {
+	function collectionSponsor() public view returns (Tuple31 memory) {
 		require(false, stub_error);
 		dummy;
-		return Tuple29(0x0000000000000000000000000000000000000000, 0);
+		return Tuple31(0x0000000000000000000000000000000000000000, 0);
 	}
 
 	/// Get current collection limits.
@@ -655,7 +655,7 @@
 }
 
 /// @dev anonymous struct
-struct Tuple29 {
+struct Tuple31 {
 	address field_0;
 	uint256 field_1;
 }
@@ -802,7 +802,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0x12f7d6c1
+/// @dev the ERC-165 identifier for this interface is 0xabf30dc2
 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,
@@ -979,6 +979,20 @@
 	// 	return false;
 	// }
 
+	/// @notice Function to mint token.
+	/// @param to The new owner crossAccountId
+	/// @param properties Properties of minted token
+	/// @return uint256 The id of the newly minted token
+	/// @dev EVM selector for this function is: 0xb904db03,
+	///  or in textual repr: mintCross((address,uint256),(string,bytes)[])
+	function mintCross(EthCrossAccount memory to, Property[] memory properties) public returns (uint256) {
+		require(false, stub_error);
+		to;
+		properties;
+		dummy = 0;
+		return 0;
+	}
+
 	/// Returns EVM address for refungible token
 	///
 	/// @param token ID of the token
modifiedtests/src/eth/abi/fungible.jsondiffbeforeafterboth
before · tests/src/eth/abi/fungible.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      {55        "components": [56          { "internalType": "address", "name": "eth", "type": "address" },57          { "internalType": "uint256", "name": "sub", "type": "uint256" }58        ],59        "internalType": "struct EthCrossAccount",60        "name": "newAdmin",61        "type": "tuple"62      }63    ],64    "name": "addCollectionAdminCross",65    "outputs": [],66    "stateMutability": "nonpayable",67    "type": "function"68  },69  {70    "inputs": [71      {72        "components": [73          { "internalType": "address", "name": "eth", "type": "address" },74          { "internalType": "uint256", "name": "sub", "type": "uint256" }75        ],76        "internalType": "struct EthCrossAccount",77        "name": "user",78        "type": "tuple"79      }80    ],81    "name": "addToCollectionAllowListCross",82    "outputs": [],83    "stateMutability": "nonpayable",84    "type": "function"85  },86  {87    "inputs": [88      { "internalType": "address", "name": "owner", "type": "address" },89      { "internalType": "address", "name": "spender", "type": "address" }90    ],91    "name": "allowance",92    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],93    "stateMutability": "view",94    "type": "function"95  },96  {97    "inputs": [98      {99        "components": [100          { "internalType": "address", "name": "eth", "type": "address" },101          { "internalType": "uint256", "name": "sub", "type": "uint256" }102        ],103        "internalType": "struct EthCrossAccount",104        "name": "user",105        "type": "tuple"106      }107    ],108    "name": "allowlistedCross",109    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],110    "stateMutability": "view",111    "type": "function"112  },113  {114    "inputs": [115      { "internalType": "address", "name": "spender", "type": "address" },116      { "internalType": "uint256", "name": "amount", "type": "uint256" }117    ],118    "name": "approve",119    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],120    "stateMutability": "nonpayable",121    "type": "function"122  },123  {124    "inputs": [125      {126        "components": [127          { "internalType": "address", "name": "eth", "type": "address" },128          { "internalType": "uint256", "name": "sub", "type": "uint256" }129        ],130        "internalType": "struct EthCrossAccount",131        "name": "spender",132        "type": "tuple"133      },134      { "internalType": "uint256", "name": "amount", "type": "uint256" }135    ],136    "name": "approveCross",137    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],138    "stateMutability": "nonpayable",139    "type": "function"140  },141  {142    "inputs": [143      { "internalType": "address", "name": "owner", "type": "address" }144    ],145    "name": "balanceOf",146    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],147    "stateMutability": "view",148    "type": "function"149  },150  {151    "inputs": [152      {153        "components": [154          { "internalType": "address", "name": "eth", "type": "address" },155          { "internalType": "uint256", "name": "sub", "type": "uint256" }156        ],157        "internalType": "struct EthCrossAccount",158        "name": "from",159        "type": "tuple"160      },161      { "internalType": "uint256", "name": "amount", "type": "uint256" }162    ],163    "name": "burnFromCross",164    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],165    "stateMutability": "nonpayable",166    "type": "function"167  },168  {169    "inputs": [170      {171        "components": [172          { "internalType": "address", "name": "eth", "type": "address" },173          { "internalType": "uint256", "name": "sub", "type": "uint256" }174        ],175        "internalType": "struct EthCrossAccount",176        "name": "newOwner",177        "type": "tuple"178      }179    ],180    "name": "changeCollectionOwnerCross",181    "outputs": [],182    "stateMutability": "nonpayable",183    "type": "function"184  },185  {186    "inputs": [],187    "name": "collectionAdmins",188    "outputs": [189      {190        "components": [191          { "internalType": "address", "name": "eth", "type": "address" },192          { "internalType": "uint256", "name": "sub", "type": "uint256" }193        ],194        "internalType": "struct EthCrossAccount[]",195        "name": "",196        "type": "tuple[]"197      }198    ],199    "stateMutability": "view",200    "type": "function"201  },202  {203    "inputs": [],204    "name": "collectionHelperAddress",205    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],206    "stateMutability": "view",207    "type": "function"208  },209  {210    "inputs": [],211    "name": "collectionLimits",212    "outputs": [213      {214        "components": [215          {216            "internalType": "enum CollectionLimits",217            "name": "field_0",218            "type": "uint8"219          },220          { "internalType": "bool", "name": "field_1", "type": "bool" },221          { "internalType": "uint256", "name": "field_2", "type": "uint256" }222        ],223        "internalType": "struct Tuple20[]",224        "name": "",225        "type": "tuple[]"226      }227    ],228    "stateMutability": "view",229    "type": "function"230  },231  {232    "inputs": [],233    "name": "collectionNestingPermissions",234    "outputs": [235      {236        "components": [237          {238            "internalType": "enum CollectionPermissions",239            "name": "field_0",240            "type": "uint8"241          },242          { "internalType": "bool", "name": "field_1", "type": "bool" }243        ],244        "internalType": "struct Tuple29[]",245        "name": "",246        "type": "tuple[]"247      }248    ],249    "stateMutability": "view",250    "type": "function"251  },252  {253    "inputs": [],254    "name": "collectionNestingRestrictedCollectionIds",255    "outputs": [256      {257        "components": [258          { "internalType": "bool", "name": "field_0", "type": "bool" },259          {260            "internalType": "uint256[]",261            "name": "field_1",262            "type": "uint256[]"263          }264        ],265        "internalType": "struct Tuple26",266        "name": "",267        "type": "tuple"268      }269    ],270    "stateMutability": "view",271    "type": "function"272  },273  {274    "inputs": [],275    "name": "collectionOwner",276    "outputs": [277      {278        "components": [279          { "internalType": "address", "name": "eth", "type": "address" },280          { "internalType": "uint256", "name": "sub", "type": "uint256" }281        ],282        "internalType": "struct EthCrossAccount",283        "name": "",284        "type": "tuple"285      }286    ],287    "stateMutability": "view",288    "type": "function"289  },290  {291    "inputs": [292      { "internalType": "string[]", "name": "keys", "type": "string[]" }293    ],294    "name": "collectionProperties",295    "outputs": [296      {297        "components": [298          { "internalType": "string", "name": "key", "type": "string" },299          { "internalType": "bytes", "name": "value", "type": "bytes" }300        ],301        "internalType": "struct Property[]",302        "name": "",303        "type": "tuple[]"304      }305    ],306    "stateMutability": "view",307    "type": "function"308  },309  {310    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],311    "name": "collectionProperty",312    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],313    "stateMutability": "view",314    "type": "function"315  },316  {317    "inputs": [],318    "name": "collectionSponsor",319    "outputs": [320      {321        "components": [322          { "internalType": "address", "name": "field_0", "type": "address" },323          { "internalType": "uint256", "name": "field_1", "type": "uint256" }324        ],325        "internalType": "struct Tuple8",326        "name": "",327        "type": "tuple"328      }329    ],330    "stateMutability": "view",331    "type": "function"332  },333  {334    "inputs": [],335    "name": "confirmCollectionSponsorship",336    "outputs": [],337    "stateMutability": "nonpayable",338    "type": "function"339  },340  {341    "inputs": [],342    "name": "contractAddress",343    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],344    "stateMutability": "view",345    "type": "function"346  },347  {348    "inputs": [],349    "name": "decimals",350    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],351    "stateMutability": "view",352    "type": "function"353  },354  {355    "inputs": [356      { "internalType": "string[]", "name": "keys", "type": "string[]" }357    ],358    "name": "deleteCollectionProperties",359    "outputs": [],360    "stateMutability": "nonpayable",361    "type": "function"362  },363  {364    "inputs": [],365    "name": "description",366    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],367    "stateMutability": "view",368    "type": "function"369  },370  {371    "inputs": [],372    "name": "hasCollectionPendingSponsor",373    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],374    "stateMutability": "view",375    "type": "function"376  },377  {378    "inputs": [379      {380        "components": [381          { "internalType": "address", "name": "eth", "type": "address" },382          { "internalType": "uint256", "name": "sub", "type": "uint256" }383        ],384        "internalType": "struct EthCrossAccount",385        "name": "user",386        "type": "tuple"387      }388    ],389    "name": "isOwnerOrAdminCross",390    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],391    "stateMutability": "view",392    "type": "function"393  },394  {395    "inputs": [396      { "internalType": "address", "name": "to", "type": "address" },397      { "internalType": "uint256", "name": "amount", "type": "uint256" }398    ],399    "name": "mint",400    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],401    "stateMutability": "nonpayable",402    "type": "function"403  },404  {405    "inputs": [406      {407        "components": [408          { "internalType": "address", "name": "field_0", "type": "address" },409          { "internalType": "uint256", "name": "field_1", "type": "uint256" }410        ],411        "internalType": "struct Tuple8[]",412        "name": "amounts",413        "type": "tuple[]"414      }415    ],416    "name": "mintBulk",417    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],418    "stateMutability": "nonpayable",419    "type": "function"420  },421  {422    "inputs": [],423    "name": "name",424    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],425    "stateMutability": "view",426    "type": "function"427  },428  {429    "inputs": [430      {431        "components": [432          { "internalType": "address", "name": "eth", "type": "address" },433          { "internalType": "uint256", "name": "sub", "type": "uint256" }434        ],435        "internalType": "struct EthCrossAccount",436        "name": "admin",437        "type": "tuple"438      }439    ],440    "name": "removeCollectionAdminCross",441    "outputs": [],442    "stateMutability": "nonpayable",443    "type": "function"444  },445  {446    "inputs": [],447    "name": "removeCollectionSponsor",448    "outputs": [],449    "stateMutability": "nonpayable",450    "type": "function"451  },452  {453    "inputs": [454      {455        "components": [456          { "internalType": "address", "name": "eth", "type": "address" },457          { "internalType": "uint256", "name": "sub", "type": "uint256" }458        ],459        "internalType": "struct EthCrossAccount",460        "name": "user",461        "type": "tuple"462      }463    ],464    "name": "removeFromCollectionAllowListCross",465    "outputs": [],466    "stateMutability": "nonpayable",467    "type": "function"468  },469  {470    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],471    "name": "setCollectionAccess",472    "outputs": [],473    "stateMutability": "nonpayable",474    "type": "function"475  },476  {477    "inputs": [478      {479        "internalType": "enum CollectionLimits",480        "name": "limit",481        "type": "uint8"482      },483      { "internalType": "bool", "name": "status", "type": "bool" },484      { "internalType": "uint256", "name": "value", "type": "uint256" }485    ],486    "name": "setCollectionLimit",487    "outputs": [],488    "stateMutability": "nonpayable",489    "type": "function"490  },491  {492    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],493    "name": "setCollectionMintMode",494    "outputs": [],495    "stateMutability": "nonpayable",496    "type": "function"497  },498  {499    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],500    "name": "setCollectionNesting",501    "outputs": [],502    "stateMutability": "nonpayable",503    "type": "function"504  },505  {506    "inputs": [507      { "internalType": "bool", "name": "enable", "type": "bool" },508      {509        "internalType": "address[]",510        "name": "collections",511        "type": "address[]"512      }513    ],514    "name": "setCollectionNesting",515    "outputs": [],516    "stateMutability": "nonpayable",517    "type": "function"518  },519  {520    "inputs": [521      {522        "components": [523          { "internalType": "string", "name": "key", "type": "string" },524          { "internalType": "bytes", "name": "value", "type": "bytes" }525        ],526        "internalType": "struct Property[]",527        "name": "properties",528        "type": "tuple[]"529      }530    ],531    "name": "setCollectionProperties",532    "outputs": [],533    "stateMutability": "nonpayable",534    "type": "function"535  },536  {537    "inputs": [538      {539        "components": [540          { "internalType": "address", "name": "eth", "type": "address" },541          { "internalType": "uint256", "name": "sub", "type": "uint256" }542        ],543        "internalType": "struct EthCrossAccount",544        "name": "sponsor",545        "type": "tuple"546      }547    ],548    "name": "setCollectionSponsorCross",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      {589        "components": [590          { "internalType": "address", "name": "eth", "type": "address" },591          { "internalType": "uint256", "name": "sub", "type": "uint256" }592        ],593        "internalType": "struct EthCrossAccount",594        "name": "to",595        "type": "tuple"596      },597      { "internalType": "uint256", "name": "amount", "type": "uint256" }598    ],599    "name": "transferCross",600    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],601    "stateMutability": "nonpayable",602    "type": "function"603  },604  {605    "inputs": [606      { "internalType": "address", "name": "from", "type": "address" },607      { "internalType": "address", "name": "to", "type": "address" },608      { "internalType": "uint256", "name": "amount", "type": "uint256" }609    ],610    "name": "transferFrom",611    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],612    "stateMutability": "nonpayable",613    "type": "function"614  },615  {616    "inputs": [617      {618        "components": [619          { "internalType": "address", "name": "eth", "type": "address" },620          { "internalType": "uint256", "name": "sub", "type": "uint256" }621        ],622        "internalType": "struct EthCrossAccount",623        "name": "from",624        "type": "tuple"625      },626      {627        "components": [628          { "internalType": "address", "name": "eth", "type": "address" },629          { "internalType": "uint256", "name": "sub", "type": "uint256" }630        ],631        "internalType": "struct EthCrossAccount",632        "name": "to",633        "type": "tuple"634      },635      { "internalType": "uint256", "name": "amount", "type": "uint256" }636    ],637    "name": "transferFromCross",638    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],639    "stateMutability": "nonpayable",640    "type": "function"641  },642  {643    "inputs": [],644    "name": "uniqueCollectionType",645    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],646    "stateMutability": "view",647    "type": "function"648  }649]
after · tests/src/eth/abi/fungible.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      {55        "components": [56          { "internalType": "address", "name": "eth", "type": "address" },57          { "internalType": "uint256", "name": "sub", "type": "uint256" }58        ],59        "internalType": "struct EthCrossAccount",60        "name": "newAdmin",61        "type": "tuple"62      }63    ],64    "name": "addCollectionAdminCross",65    "outputs": [],66    "stateMutability": "nonpayable",67    "type": "function"68  },69  {70    "inputs": [71      {72        "components": [73          { "internalType": "address", "name": "eth", "type": "address" },74          { "internalType": "uint256", "name": "sub", "type": "uint256" }75        ],76        "internalType": "struct EthCrossAccount",77        "name": "user",78        "type": "tuple"79      }80    ],81    "name": "addToCollectionAllowListCross",82    "outputs": [],83    "stateMutability": "nonpayable",84    "type": "function"85  },86  {87    "inputs": [88      { "internalType": "address", "name": "owner", "type": "address" },89      { "internalType": "address", "name": "spender", "type": "address" }90    ],91    "name": "allowance",92    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],93    "stateMutability": "view",94    "type": "function"95  },96  {97    "inputs": [98      {99        "components": [100          { "internalType": "address", "name": "eth", "type": "address" },101          { "internalType": "uint256", "name": "sub", "type": "uint256" }102        ],103        "internalType": "struct EthCrossAccount",104        "name": "user",105        "type": "tuple"106      }107    ],108    "name": "allowlistedCross",109    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],110    "stateMutability": "view",111    "type": "function"112  },113  {114    "inputs": [115      { "internalType": "address", "name": "spender", "type": "address" },116      { "internalType": "uint256", "name": "amount", "type": "uint256" }117    ],118    "name": "approve",119    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],120    "stateMutability": "nonpayable",121    "type": "function"122  },123  {124    "inputs": [125      {126        "components": [127          { "internalType": "address", "name": "eth", "type": "address" },128          { "internalType": "uint256", "name": "sub", "type": "uint256" }129        ],130        "internalType": "struct EthCrossAccount",131        "name": "spender",132        "type": "tuple"133      },134      { "internalType": "uint256", "name": "amount", "type": "uint256" }135    ],136    "name": "approveCross",137    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],138    "stateMutability": "nonpayable",139    "type": "function"140  },141  {142    "inputs": [143      { "internalType": "address", "name": "owner", "type": "address" }144    ],145    "name": "balanceOf",146    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],147    "stateMutability": "view",148    "type": "function"149  },150  {151    "inputs": [152      {153        "components": [154          { "internalType": "address", "name": "eth", "type": "address" },155          { "internalType": "uint256", "name": "sub", "type": "uint256" }156        ],157        "internalType": "struct EthCrossAccount",158        "name": "from",159        "type": "tuple"160      },161      { "internalType": "uint256", "name": "amount", "type": "uint256" }162    ],163    "name": "burnFromCross",164    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],165    "stateMutability": "nonpayable",166    "type": "function"167  },168  {169    "inputs": [170      {171        "components": [172          { "internalType": "address", "name": "eth", "type": "address" },173          { "internalType": "uint256", "name": "sub", "type": "uint256" }174        ],175        "internalType": "struct EthCrossAccount",176        "name": "newOwner",177        "type": "tuple"178      }179    ],180    "name": "changeCollectionOwnerCross",181    "outputs": [],182    "stateMutability": "nonpayable",183    "type": "function"184  },185  {186    "inputs": [],187    "name": "collectionAdmins",188    "outputs": [189      {190        "components": [191          { "internalType": "address", "name": "eth", "type": "address" },192          { "internalType": "uint256", "name": "sub", "type": "uint256" }193        ],194        "internalType": "struct EthCrossAccount[]",195        "name": "",196        "type": "tuple[]"197      }198    ],199    "stateMutability": "view",200    "type": "function"201  },202  {203    "inputs": [],204    "name": "collectionHelperAddress",205    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],206    "stateMutability": "view",207    "type": "function"208  },209  {210    "inputs": [],211    "name": "collectionLimits",212    "outputs": [213      {214        "components": [215          {216            "internalType": "enum CollectionLimits",217            "name": "field_0",218            "type": "uint8"219          },220          { "internalType": "bool", "name": "field_1", "type": "bool" },221          { "internalType": "uint256", "name": "field_2", "type": "uint256" }222        ],223        "internalType": "struct Tuple20[]",224        "name": "",225        "type": "tuple[]"226      }227    ],228    "stateMutability": "view",229    "type": "function"230  },231  {232    "inputs": [],233    "name": "collectionNestingPermissions",234    "outputs": [235      {236        "components": [237          {238            "internalType": "enum CollectionPermissions",239            "name": "field_0",240            "type": "uint8"241          },242          { "internalType": "bool", "name": "field_1", "type": "bool" }243        ],244        "internalType": "struct Tuple29[]",245        "name": "",246        "type": "tuple[]"247      }248    ],249    "stateMutability": "view",250    "type": "function"251  },252  {253    "inputs": [],254    "name": "collectionNestingRestrictedCollectionIds",255    "outputs": [256      {257        "components": [258          { "internalType": "bool", "name": "field_0", "type": "bool" },259          {260            "internalType": "uint256[]",261            "name": "field_1",262            "type": "uint256[]"263          }264        ],265        "internalType": "struct Tuple26",266        "name": "",267        "type": "tuple"268      }269    ],270    "stateMutability": "view",271    "type": "function"272  },273  {274    "inputs": [],275    "name": "collectionOwner",276    "outputs": [277      {278        "components": [279          { "internalType": "address", "name": "eth", "type": "address" },280          { "internalType": "uint256", "name": "sub", "type": "uint256" }281        ],282        "internalType": "struct EthCrossAccount",283        "name": "",284        "type": "tuple"285      }286    ],287    "stateMutability": "view",288    "type": "function"289  },290  {291    "inputs": [292      { "internalType": "string[]", "name": "keys", "type": "string[]" }293    ],294    "name": "collectionProperties",295    "outputs": [296      {297        "components": [298          { "internalType": "string", "name": "key", "type": "string" },299          { "internalType": "bytes", "name": "value", "type": "bytes" }300        ],301        "internalType": "struct Property[]",302        "name": "",303        "type": "tuple[]"304      }305    ],306    "stateMutability": "view",307    "type": "function"308  },309  {310    "inputs": [{ "internalType": "string", "name": "key", "type": "string" }],311    "name": "collectionProperty",312    "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],313    "stateMutability": "view",314    "type": "function"315  },316  {317    "inputs": [],318    "name": "collectionSponsor",319    "outputs": [320      {321        "components": [322          { "internalType": "address", "name": "field_0", "type": "address" },323          { "internalType": "uint256", "name": "field_1", "type": "uint256" }324        ],325        "internalType": "struct Tuple9",326        "name": "",327        "type": "tuple"328      }329    ],330    "stateMutability": "view",331    "type": "function"332  },333  {334    "inputs": [],335    "name": "confirmCollectionSponsorship",336    "outputs": [],337    "stateMutability": "nonpayable",338    "type": "function"339  },340  {341    "inputs": [],342    "name": "contractAddress",343    "outputs": [{ "internalType": "address", "name": "", "type": "address" }],344    "stateMutability": "view",345    "type": "function"346  },347  {348    "inputs": [],349    "name": "decimals",350    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],351    "stateMutability": "view",352    "type": "function"353  },354  {355    "inputs": [356      { "internalType": "string[]", "name": "keys", "type": "string[]" }357    ],358    "name": "deleteCollectionProperties",359    "outputs": [],360    "stateMutability": "nonpayable",361    "type": "function"362  },363  {364    "inputs": [],365    "name": "description",366    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],367    "stateMutability": "view",368    "type": "function"369  },370  {371    "inputs": [],372    "name": "hasCollectionPendingSponsor",373    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],374    "stateMutability": "view",375    "type": "function"376  },377  {378    "inputs": [379      {380        "components": [381          { "internalType": "address", "name": "eth", "type": "address" },382          { "internalType": "uint256", "name": "sub", "type": "uint256" }383        ],384        "internalType": "struct EthCrossAccount",385        "name": "user",386        "type": "tuple"387      }388    ],389    "name": "isOwnerOrAdminCross",390    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],391    "stateMutability": "view",392    "type": "function"393  },394  {395    "inputs": [396      { "internalType": "address", "name": "to", "type": "address" },397      { "internalType": "uint256", "name": "amount", "type": "uint256" }398    ],399    "name": "mint",400    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],401    "stateMutability": "nonpayable",402    "type": "function"403  },404  {405    "inputs": [406      {407        "components": [408          { "internalType": "address", "name": "field_0", "type": "address" },409          { "internalType": "uint256", "name": "field_1", "type": "uint256" }410        ],411        "internalType": "struct Tuple9[]",412        "name": "amounts",413        "type": "tuple[]"414      }415    ],416    "name": "mintBulk",417    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],418    "stateMutability": "nonpayable",419    "type": "function"420  },421  {422    "inputs": [423      {424        "components": [425          { "internalType": "address", "name": "eth", "type": "address" },426          { "internalType": "uint256", "name": "sub", "type": "uint256" }427        ],428        "internalType": "struct EthCrossAccount",429        "name": "to",430        "type": "tuple"431      },432      { "internalType": "uint256", "name": "amount", "type": "uint256" }433    ],434    "name": "mintCross",435    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],436    "stateMutability": "nonpayable",437    "type": "function"438  },439  {440    "inputs": [],441    "name": "name",442    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],443    "stateMutability": "view",444    "type": "function"445  },446  {447    "inputs": [448      {449        "components": [450          { "internalType": "address", "name": "eth", "type": "address" },451          { "internalType": "uint256", "name": "sub", "type": "uint256" }452        ],453        "internalType": "struct EthCrossAccount",454        "name": "admin",455        "type": "tuple"456      }457    ],458    "name": "removeCollectionAdminCross",459    "outputs": [],460    "stateMutability": "nonpayable",461    "type": "function"462  },463  {464    "inputs": [],465    "name": "removeCollectionSponsor",466    "outputs": [],467    "stateMutability": "nonpayable",468    "type": "function"469  },470  {471    "inputs": [472      {473        "components": [474          { "internalType": "address", "name": "eth", "type": "address" },475          { "internalType": "uint256", "name": "sub", "type": "uint256" }476        ],477        "internalType": "struct EthCrossAccount",478        "name": "user",479        "type": "tuple"480      }481    ],482    "name": "removeFromCollectionAllowListCross",483    "outputs": [],484    "stateMutability": "nonpayable",485    "type": "function"486  },487  {488    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],489    "name": "setCollectionAccess",490    "outputs": [],491    "stateMutability": "nonpayable",492    "type": "function"493  },494  {495    "inputs": [496      {497        "internalType": "enum CollectionLimits",498        "name": "limit",499        "type": "uint8"500      },501      { "internalType": "bool", "name": "status", "type": "bool" },502      { "internalType": "uint256", "name": "value", "type": "uint256" }503    ],504    "name": "setCollectionLimit",505    "outputs": [],506    "stateMutability": "nonpayable",507    "type": "function"508  },509  {510    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],511    "name": "setCollectionMintMode",512    "outputs": [],513    "stateMutability": "nonpayable",514    "type": "function"515  },516  {517    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],518    "name": "setCollectionNesting",519    "outputs": [],520    "stateMutability": "nonpayable",521    "type": "function"522  },523  {524    "inputs": [525      { "internalType": "bool", "name": "enable", "type": "bool" },526      {527        "internalType": "address[]",528        "name": "collections",529        "type": "address[]"530      }531    ],532    "name": "setCollectionNesting",533    "outputs": [],534    "stateMutability": "nonpayable",535    "type": "function"536  },537  {538    "inputs": [539      {540        "components": [541          { "internalType": "string", "name": "key", "type": "string" },542          { "internalType": "bytes", "name": "value", "type": "bytes" }543        ],544        "internalType": "struct Property[]",545        "name": "properties",546        "type": "tuple[]"547      }548    ],549    "name": "setCollectionProperties",550    "outputs": [],551    "stateMutability": "nonpayable",552    "type": "function"553  },554  {555    "inputs": [556      {557        "components": [558          { "internalType": "address", "name": "eth", "type": "address" },559          { "internalType": "uint256", "name": "sub", "type": "uint256" }560        ],561        "internalType": "struct EthCrossAccount",562        "name": "sponsor",563        "type": "tuple"564      }565    ],566    "name": "setCollectionSponsorCross",567    "outputs": [],568    "stateMutability": "nonpayable",569    "type": "function"570  },571  {572    "inputs": [573      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }574    ],575    "name": "supportsInterface",576    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],577    "stateMutability": "view",578    "type": "function"579  },580  {581    "inputs": [],582    "name": "symbol",583    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],584    "stateMutability": "view",585    "type": "function"586  },587  {588    "inputs": [],589    "name": "totalSupply",590    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],591    "stateMutability": "view",592    "type": "function"593  },594  {595    "inputs": [596      { "internalType": "address", "name": "to", "type": "address" },597      { "internalType": "uint256", "name": "amount", "type": "uint256" }598    ],599    "name": "transfer",600    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],601    "stateMutability": "nonpayable",602    "type": "function"603  },604  {605    "inputs": [606      {607        "components": [608          { "internalType": "address", "name": "eth", "type": "address" },609          { "internalType": "uint256", "name": "sub", "type": "uint256" }610        ],611        "internalType": "struct EthCrossAccount",612        "name": "to",613        "type": "tuple"614      },615      { "internalType": "uint256", "name": "amount", "type": "uint256" }616    ],617    "name": "transferCross",618    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],619    "stateMutability": "nonpayable",620    "type": "function"621  },622  {623    "inputs": [624      { "internalType": "address", "name": "from", "type": "address" },625      { "internalType": "address", "name": "to", "type": "address" },626      { "internalType": "uint256", "name": "amount", "type": "uint256" }627    ],628    "name": "transferFrom",629    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],630    "stateMutability": "nonpayable",631    "type": "function"632  },633  {634    "inputs": [635      {636        "components": [637          { "internalType": "address", "name": "eth", "type": "address" },638          { "internalType": "uint256", "name": "sub", "type": "uint256" }639        ],640        "internalType": "struct EthCrossAccount",641        "name": "from",642        "type": "tuple"643      },644      {645        "components": [646          { "internalType": "address", "name": "eth", "type": "address" },647          { "internalType": "uint256", "name": "sub", "type": "uint256" }648        ],649        "internalType": "struct EthCrossAccount",650        "name": "to",651        "type": "tuple"652      },653      { "internalType": "uint256", "name": "amount", "type": "uint256" }654    ],655    "name": "transferFromCross",656    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],657    "stateMutability": "nonpayable",658    "type": "function"659  },660  {661    "inputs": [],662    "name": "uniqueCollectionType",663    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],664    "stateMutability": "view",665    "type": "function"666  }667]
modifiedtests/src/eth/abi/nonFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -352,7 +352,7 @@
           { "internalType": "address", "name": "field_0", "type": "address" },
           { "internalType": "uint256", "name": "field_1", "type": "uint256" }
         ],
-        "internalType": "struct Tuple30",
+        "internalType": "struct Tuple32",
         "name": "",
         "type": "tuple"
       }
@@ -478,6 +478,32 @@
   },
   {
     "inputs": [
+      {
+        "components": [
+          { "internalType": "address", "name": "eth", "type": "address" },
+          { "internalType": "uint256", "name": "sub", "type": "uint256" }
+        ],
+        "internalType": "struct EthCrossAccount",
+        "name": "to",
+        "type": "tuple"
+      },
+      {
+        "components": [
+          { "internalType": "string", "name": "key", "type": "string" },
+          { "internalType": "bytes", "name": "value", "type": "bytes" }
+        ],
+        "internalType": "struct Property[]",
+        "name": "properties",
+        "type": "tuple[]"
+      }
+    ],
+    "name": "mintCross",
+    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       { "internalType": "address", "name": "to", "type": "address" },
       { "internalType": "string", "name": "tokenUri", "type": "string" }
     ],
modifiedtests/src/eth/abi/reFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -334,7 +334,7 @@
           { "internalType": "address", "name": "field_0", "type": "address" },
           { "internalType": "uint256", "name": "field_1", "type": "uint256" }
         ],
-        "internalType": "struct Tuple29",
+        "internalType": "struct Tuple31",
         "name": "",
         "type": "tuple"
       }
@@ -460,6 +460,32 @@
   },
   {
     "inputs": [
+      {
+        "components": [
+          { "internalType": "address", "name": "eth", "type": "address" },
+          { "internalType": "uint256", "name": "sub", "type": "uint256" }
+        ],
+        "internalType": "struct EthCrossAccount",
+        "name": "to",
+        "type": "tuple"
+      },
+      {
+        "components": [
+          { "internalType": "string", "name": "key", "type": "string" },
+          { "internalType": "bytes", "name": "value", "type": "bytes" }
+        ],
+        "internalType": "struct Property[]",
+        "name": "properties",
+        "type": "tuple[]"
+      }
+    ],
+    "name": "mintCross",
+    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       { "internalType": "address", "name": "to", "type": "address" },
       { "internalType": "string", "name": "tokenUri", "type": "string" }
     ],
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -102,7 +102,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 (Tuple8 memory);
+	function collectionSponsor() external view returns (Tuple9 memory);
 
 	/// Get current collection limits.
 	///
@@ -362,13 +362,17 @@
 	bytes value;
 }
 
-/// @dev the ERC-165 identifier for this interface is 0x5b7038cf
+/// @dev the ERC-165 identifier for this interface is 0x7dee5997
 interface ERC20UniqueExtensions is Dummy, ERC165 {
 	/// @notice A description for the collection.
 	/// @dev EVM selector for this function is: 0x7284e416,
 	///  or in textual repr: description()
 	function description() external view returns (string memory);
 
+	/// @dev EVM selector for this function is: 0x269e6158,
+	///  or in textual repr: mintCross((address,uint256),uint256)
+	function mintCross(EthCrossAccount memory to, uint256 amount) external returns (bool);
+
 	/// @dev EVM selector for this function is: 0x0ecd0ab0,
 	///  or in textual repr: approveCross((address,uint256),uint256)
 	function approveCross(EthCrossAccount memory spender, uint256 amount) external returns (bool);
@@ -395,7 +399,7 @@
 	/// @param amounts array of pairs of account address and amount
 	/// @dev EVM selector for this function is: 0x1acf2d55,
 	///  or in textual repr: mintBulk((address,uint256)[])
-	function mintBulk(Tuple8[] memory amounts) external returns (bool);
+	function mintBulk(Tuple9[] memory amounts) external returns (bool);
 
 	/// @dev EVM selector for this function is: 0x2ada85ff,
 	///  or in textual repr: transferCross((address,uint256),uint256)
@@ -411,7 +415,7 @@
 }
 
 /// @dev anonymous struct
-struct Tuple8 {
+struct Tuple9 {
 	address field_0;
 	uint256 field_1;
 }
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -198,7 +198,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 (Tuple27 memory);
+	function collectionSponsor() external view returns (Tuple29 memory);
 
 	/// Get current collection limits.
 	///
@@ -553,7 +553,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0xb74c26b7
+/// @dev the ERC-165 identifier for this interface is 0x0e48fdb4
 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,
@@ -652,6 +652,7 @@
 	/// @dev EVM selector for this function is: 0x75794a3c,
 	///  or in textual repr: nextTokenId()
 	function nextTokenId() external view returns (uint256);
+
 	// /// @notice Function to mint multiple tokens.
 	// /// @dev `tokenIds` should be an array of consecutive numbers and first number
 	// ///  should be obtained with `nextTokenId` method
@@ -670,6 +671,13 @@
 	// ///  or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
 	// function mintBulkWithTokenURI(address to, Tuple13[] memory tokens) external returns (bool);
 
+	/// @notice Function to mint token.
+	/// @param to The new owner crossAccountId
+	/// @param properties Properties of minted token
+	/// @return uint256 The id of the newly minted token
+	/// @dev EVM selector for this function is: 0xb904db03,
+	///  or in textual repr: mintCross((address,uint256),(string,bytes)[])
+	function mintCross(EthCrossAccount memory to, Property[] memory properties) external returns (uint256);
 }
 
 /// @dev anonymous struct
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -198,7 +198,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 (Tuple26 memory);
+	function collectionSponsor() external view returns (Tuple28 memory);
 
 	/// Get current collection limits.
 	///
@@ -551,7 +551,7 @@
 }
 
 /// @title Unique extensions for ERC721.
-/// @dev the ERC-165 identifier for this interface is 0x12f7d6c1
+/// @dev the ERC-165 identifier for this interface is 0xabf30dc2
 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,
@@ -663,6 +663,14 @@
 	// ///  or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[])
 	// function mintBulkWithTokenURI(address to, Tuple12[] memory tokens) external returns (bool);
 
+	/// @notice Function to mint token.
+	/// @param to The new owner crossAccountId
+	/// @param properties Properties of minted token
+	/// @return uint256 The id of the newly minted token
+	/// @dev EVM selector for this function is: 0xb904db03,
+	///  or in textual repr: mintCross((address,uint256),(string,bytes)[])
+	function mintCross(EthCrossAccount memory to, Property[] memory properties) external returns (uint256);
+
 	/// Returns EVM address for refungible token
 	///
 	/// @param token ID of the token
modifiedtests/src/eth/fungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/fungible.test.ts
+++ b/tests/src/eth/fungible.test.ts
@@ -78,6 +78,25 @@
     expect(event.returnValues.to).to.equal(receiver);
     expect(event.returnValues.value).to.equal('100');
   });
+  
+  
+  itEth('Can perform mintCross()', async ({helper}) => {
+    const receiverCross = helper.ethCrossAccount.fromKeyringPair(owner);
+    const ethOwner = await helper.eth.createAccountWithBalance(donor);
+    const collection = await helper.ft.mintCollection(alice);
+    await collection.addAdmin(alice, {Ethereum: ethOwner});
+
+    const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+    const contract = helper.ethNativeContract.collection(collectionAddress, 'ft', ethOwner);
+
+    const result = await contract.methods.mintCross(receiverCross, 100).send();
+    
+    const event = result.events.Transfer;
+    expect(event.address).to.equal(collectionAddress);
+    expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');
+    expect(event.returnValues.to).to.equal(helper.address.substrateToEth(owner.address));
+    expect(event.returnValues.value).to.equal('100');
+  });
 
   itEth('Can perform mintBulk()', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
modifiedtests/src/eth/nonFungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/nonFungible.test.ts
+++ b/tests/src/eth/nonFungible.test.ts
@@ -17,6 +17,8 @@
 import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
+import exp from 'constants';
+import {ITokenPropertyPermission} from '../util/playgrounds/types';
 
 
 describe('NFT: Information getting', () => {
@@ -173,7 +175,45 @@
     // const tokenUri = await contract.methods.tokenURI(nextTokenId).call();
     // expect(tokenUri).to.be.equal(`https://offchain-service.local/token-info/${nextTokenId}`);
   });
+  
+  itEth('Can perform mintCross()', async ({helper}) => {
+    const caller = await helper.eth.createAccountWithBalance(donor);
+    const receiverCross = helper.ethCrossAccount.fromKeyringPair(bob);
+    const properties = Array(5).fill(0).map((_, i) => { return {key: `key_${i}`, value: Buffer.from(`value_${i}`)}; });
+    const permissions: ITokenPropertyPermission[] = properties.map(p => { return {key: p.key, permission: {tokenOwner: true,
+      collectionAdmin: true,
+      mutable: true}}; });
+    
+    
+    const collection = await helper.nft.mintCollection(minter, {
+      tokenPrefix: 'ethp',
+      tokenPropertyPermissions: permissions,
+    });
+    await collection.addAdmin(minter, {Ethereum: caller});
+    
+    const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+    const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', caller, true);
+    let expectedTokenId = await contract.methods.nextTokenId().call();
+    let result = await contract.methods.mintCross(receiverCross, []).send();
+    let tokenId = result.events.Transfer.returnValues.tokenId;
+    expect(tokenId).to.be.equal(expectedTokenId);
+
+    const event = result.events.Transfer;
+    expect(event.address).to.be.equal(collectionAddress);
+    expect(event.returnValues.from).to.be.equal('0x0000000000000000000000000000000000000000');
+    expect(event.returnValues.to).to.be.equal(helper.address.substrateToEth(bob.address));
+    expect(await contract.methods.properties(tokenId, []).call()).to.be.like([]);
+    
+    expectedTokenId = await contract.methods.nextTokenId().call();
+    result = await contract.methods.mintCross(receiverCross, properties).send();
+    tokenId = result.events.Transfer.returnValues.tokenId;
 
+    expect(tokenId).to.be.equal(expectedTokenId);
+    
+    expect(await contract.methods.properties(tokenId, []).call()).to.be.like(properties
+      .map(p => { return helper.ethProperty.property(p.key, p.value.toString()); }));
+  });
+  
   //TODO: CORE-302 add eth methods
   itEth.skip('Can perform mintBulk()', async ({helper}) => {
     const caller = await helper.eth.createAccountWithBalance(donor);
modifiedtests/src/eth/reFungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/reFungible.test.ts
+++ b/tests/src/eth/reFungible.test.ts
@@ -17,6 +17,7 @@
 import {Pallets, requirePalletsOrSkip} from '../util';
 import {expect, itEth, usingEthPlaygrounds} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
+import { ITokenPropertyPermission } from '../util/playgrounds/types';
 
 describe('Refungible: Information getting', () => {
   let donor: IKeyringPair;
@@ -135,6 +136,44 @@
     expect(await contract.methods.crossOwnerOf(tokenId).call()).to.be.like([receiver, '0']);
     expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');
   });
+  
+  itEth('Can perform mintCross()', async ({helper}) => {
+    const caller = await helper.eth.createAccountWithBalance(donor);
+    const receiverCross = helper.ethCrossAccount.fromKeyringPair(bob);
+    const properties = Array(5).fill(0).map((_, i) => { return {key: `key_${i}`, value: Buffer.from(`value_${i}`)}; });
+    const permissions: ITokenPropertyPermission[] = properties.map(p => { return {key: p.key, permission: {tokenOwner: true,
+      collectionAdmin: true,
+      mutable: true}}; });
+    
+    
+    const collection = await helper.rft.mintCollection(minter, {
+      tokenPrefix: 'ethp',
+      tokenPropertyPermissions: permissions,
+    });
+    await collection.addAdmin(minter, {Ethereum: caller});
+    
+    const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
+    const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller, true);
+    let expectedTokenId = await contract.methods.nextTokenId().call();
+    let result = await contract.methods.mintCross(receiverCross, []).send();
+    let tokenId = result.events.Transfer.returnValues.tokenId;
+    expect(tokenId).to.be.equal(expectedTokenId);
+
+    const event = result.events.Transfer;
+    expect(event.address).to.be.equal(collectionAddress);
+    expect(event.returnValues.from).to.be.equal('0x0000000000000000000000000000000000000000');
+    expect(event.returnValues.to).to.be.equal(helper.address.substrateToEth(bob.address));
+    expect(await contract.methods.properties(tokenId, []).call()).to.be.like([]);
+    
+    expectedTokenId = await contract.methods.nextTokenId().call();
+    result = await contract.methods.mintCross(receiverCross, properties).send();
+    tokenId = result.events.Transfer.returnValues.tokenId;
+
+    expect(tokenId).to.be.equal(expectedTokenId);
+    
+    expect(await contract.methods.properties(tokenId, []).call()).to.be.like(properties
+      .map(p => { return helper.ethProperty.property(p.key, p.value.toString()); }));
+  });
 
   itEth.skip('Can perform mintBulk()', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);