git.delta.rocks / unique-network / refs/commits / 78a995207d2e

difftreelog

fix After rebase

Trubnikov Sergey2022-08-29parent: #c288f09.patch.diff
in: master

8 files changed

modifiedcrates/evm-coder/src/abi.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/abi.rs
+++ b/crates/evm-coder/src/abi.rs
@@ -28,10 +28,13 @@
 	types::{string, self},
 };
 use crate::execution::Result;
-use crate::solidity::SolidityTypeName;
 
 const ABI_ALIGNMENT: usize = 32;
 
+trait TypeHelper<T> {
+	fn is_dynamic() -> bool;
+}
+
 /// View into RLP data, which provides method to read typed items from it
 #[derive(Clone)]
 pub struct AbiReader<'i> {
@@ -330,11 +333,18 @@
 pub trait AbiRead<T> {
 	/// Read item from current position, advanding decoder
 	fn abi_read(&mut self) -> Result<T>;
+
+	/// Size for type aligned to [`ABI_ALIGNMENT`].
 	fn size() -> usize;
 }
 
 macro_rules! impl_abi_readable {
-	($ty:ty, $method:ident) => {
+	($ty:ty, $method:ident, $dynamic:literal) => {
+		impl TypeHelper<$ty> for $ty {
+			fn is_dynamic() -> bool {
+				$dynamic
+			}
+		}
 		impl AbiRead<$ty> for AbiReader<'_> {
 			fn abi_read(&mut self) -> Result<$ty> {
 				self.$method()
@@ -347,16 +357,16 @@
 	};
 }
 
-impl_abi_readable!(u8, uint8);
-impl_abi_readable!(u32, uint32);
-impl_abi_readable!(u64, uint64);
-impl_abi_readable!(u128, uint128);
-impl_abi_readable!(U256, uint256);
-impl_abi_readable!([u8; 4], bytes4);
-impl_abi_readable!(H160, address);
-impl_abi_readable!(Vec<u8>, bytes);
-impl_abi_readable!(bool, bool);
-impl_abi_readable!(string, string);
+impl_abi_readable!(u8, uint8, false);
+impl_abi_readable!(u32, uint32, false);
+impl_abi_readable!(u64, uint64, false);
+impl_abi_readable!(u128, uint128, false);
+impl_abi_readable!(U256, uint256, false);
+impl_abi_readable!([u8; 4], bytes4, false);
+impl_abi_readable!(H160, address, false);
+impl_abi_readable!(Vec<u8>, bytes, true);
+impl_abi_readable!(bool, bool, true);
+impl_abi_readable!(string, string, true);
 
 mod sealed {
 	/// Not all types can be placed in vec, i.e `Vec<u8>` is restricted, `bytes` should be used instead
@@ -389,16 +399,24 @@
 
 macro_rules! impl_tuples {
 	($($ident:ident)+) => {
+		impl<$($ident: TypeHelper<$ident>,)+> TypeHelper<($($ident,)+)> for ($($ident,)+) {
+			fn is_dynamic() -> bool {
+				false
+				$(
+					|| <$ident>::is_dynamic()
+				)*
+			}
+		}
 		impl<$($ident),+> sealed::CanBePlacedInVec for ($($ident,)+) {}
 		impl<$($ident),+> AbiRead<($($ident,)+)> for AbiReader<'_>
 		where
 			$(
 				Self: AbiRead<$ident>,
 			)+
-			($($ident,)+): SolidityTypeName,
+			($($ident,)+): TypeHelper<($($ident,)+)>,
 		{
 			fn abi_read(&mut self) -> Result<($($ident,)+)> {
-				let size = if <($($ident,)+)>::is_simple() { Some(<Self as AbiRead<($($ident,)+)>>::size()) } else { None };
+				let size = if !<($($ident,)+)>::is_dynamic() { Some(<Self as AbiRead<($($ident,)+)>>::size()) } else { None };
 				let mut subresult = self.subresult(size)?;
 				Ok((
 					$(<Self as AbiRead<$ident>>::abi_read(&mut subresult)?,)+
modifiedcrates/evm-coder/src/solidity.rsdiffbeforeafterboth
--- a/crates/evm-coder/src/solidity.rs
+++ b/crates/evm-coder/src/solidity.rs
@@ -192,10 +192,7 @@
 				write!(writer, "{}", tc.collect_tuple::<Self>())
 			}
 			fn is_simple() -> bool {
-				true
-				$(
-					&& <$ident>::is_simple()
-				)*
+				false
 			}
 			#[allow(unused_assignments)]
 			fn solidity_default(writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result {
modifiedpallets/fungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -129,7 +129,7 @@
 	}
 }
 
-#[solidity_interface(name = "ERC20Mintable")]
+#[solidity_interface(name = ERC20Mintable)]
 impl<T: Config> FungibleHandle<T> {
 	/// Mint tokens for `to` account.
 	/// @param to account that will receive minted tokens
@@ -148,7 +148,7 @@
 	}
 }
 
-#[solidity_interface(name = "ERC20UniqueExtensions")]
+#[solidity_interface(name = ERC20UniqueExtensions)]
 impl<T: Config> FungibleHandle<T> {
 	/// Burn tokens from account
 	/// @dev Function that burns an `amount` of the tokens of a given account,
modifiedpallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
before · pallets/fungible/src/stubs/UniqueFungible.sol
1// SPDX-License-Identifier: OTHER2// This code is automatically generated34pragma solidity >=0.8.0 <0.9.0;56// Anonymous struct7struct Tuple0 {8	address field_0;9	uint256 field_1;10}1112// Common stubs holder13contract Dummy {14	uint8 dummy;15	string stub_error = "this contract is implemented in native";16}1718contract ERC165 is Dummy {19	function supportsInterface(bytes4 interfaceID)20		external21		view22		returns (bool)23	{24		require(false, stub_error);25		interfaceID;26		return true;27	}28}2930// Inline31contract ERC20Events {32	event Transfer(address indexed from, address indexed to, uint256 value);33	event Approval(34		address indexed owner,35		address indexed spender,36		uint256 value37	);38}3940// Selector: 40c10f1941contract ERC20Mintable is Dummy, ERC165 {42	// Selector: mint(address,uint256) 40c10f1943	function mint(address to, uint256 amount) public returns (bool) {44		require(false, stub_error);45		to;46		amount;47		dummy = 0;48		return false;49	}50}5152// Selector: 63034ac553contract ERC20UniqueExtensions is Dummy, ERC165 {54	// Selector: burnFrom(address,uint256) 79cc679055	function burnFrom(address from, uint256 amount) public returns (bool) {56		require(false, stub_error);57		from;58		amount;59		dummy = 0;60		return false;61	}6263	// Selector: mintBulk((address,uint256)[]) 1acf2d5564	function mintBulk(Tuple0[] memory amounts) public returns (bool) {65		require(false, stub_error);66		amounts;67		dummy = 0;68		return false;69	}70}7172// Selector: 6cf113cd73contract Collection is Dummy, ERC165 {74	/// Set collection property.75	///76	/// @param key Property key.77	/// @param value Propery value.78	/// @dev EVM selector for this function is: 0x2f073f66,79	///  or in textual repr: setCollectionProperty(string,bytes)80	function setCollectionProperty(string memory key, bytes memory value)81		public82	{83		require(false, stub_error);84		key;85		value;86		dummy = 0;87	}8889	/// Delete collection property.90	///91	/// @param key Property key.92	/// @dev EVM selector for this function is: 0x7b7debce,93	///  or in textual repr: deleteCollectionProperty(string)94	function deleteCollectionProperty(string memory key) public {95		require(false, stub_error);96		key;97		dummy = 0;98	}99100	/// Get collection property.101	///102	/// @dev Throws error if key not found.103	///104	/// @param key Property key.105	/// @return bytes The property corresponding to the key.106	/// @dev EVM selector for this function is: 0xcf24fd6d,107	///  or in textual repr: collectionProperty(string)108	function collectionProperty(string memory key)109		public110		view111		returns (bytes memory)112	{113		require(false, stub_error);114		key;115		dummy;116		return hex"";117	}118119	/// Set the sponsor of the collection.120	///121	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.122	///123	/// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.124	/// @dev EVM selector for this function is: 0x7623402e,125	///  or in textual repr: setCollectionSponsor(address)126	function setCollectionSponsor(address sponsor) public {127		require(false, stub_error);128		sponsor;129		dummy = 0;130	}131132	/// Set the substrate sponsor of the collection.133	///134	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.135	///136	/// @param sponsor Substrate address of the sponsor from whose account funds will be debited for operations with the contract.137	/// @dev EVM selector for this function is: 0xc74d6751,138	///  or in textual repr: setCollectionSponsorSubstrate(uint256)139	function setCollectionSponsorSubstrate(uint256 sponsor) public {140		require(false, stub_error);141		sponsor;142		dummy = 0;143	}144145	/// @dev EVM selector for this function is: 0x058ac185,146	///  or in textual repr: hasCollectionPendingSponsor()147	function hasCollectionPendingSponsor() public view returns (bool) {148		require(false, stub_error);149		dummy;150		return false;151	}152153	/// Collection sponsorship confirmation.154	///155	/// @dev After setting the sponsor for the collection, it must be confirmed with this function.156	/// @dev EVM selector for this function is: 0x3c50e97a,157	///  or in textual repr: confirmCollectionSponsorship()158	function confirmCollectionSponsorship() public {159		require(false, stub_error);160		dummy = 0;161	}162163	/// Remove collection sponsor.164	/// @dev EVM selector for this function is: 0x6e0326a3,165	///  or in textual repr: removeCollectionSponsor()166	function removeCollectionSponsor() public {167		require(false, stub_error);168		dummy = 0;169	}170171	/// Get current sponsor.172	///173	/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.174	/// @dev EVM selector for this function is: 0xb66bbc14,175	///  or in textual repr: getCollectionSponsor()176	function getCollectionSponsor() public view returns (Tuple6 memory) {177		require(false, stub_error);178		dummy;179		return Tuple6(0x0000000000000000000000000000000000000000, 0);180	}181182	/// Set limits for the collection.183	/// @dev Throws error if limit not found.184	/// @param limit Name of the limit. Valid names:185	/// 	"accountTokenOwnershipLimit",186	/// 	"sponsoredDataSize",187	/// 	"sponsoredDataRateLimit",188	/// 	"tokenLimit",189	/// 	"sponsorTransferTimeout",190	/// 	"sponsorApproveTimeout"191	/// @param value Value of the limit.192	/// @dev EVM selector for this function is: 0x6a3841db,193	///  or in textual repr: setCollectionLimit(string,uint32)194	function setCollectionLimit(string memory limit, uint32 value) public {195		require(false, stub_error);196		limit;197		value;198		dummy = 0;199	}200201	/// Set limits for the collection.202	/// @dev Throws error if limit not found.203	/// @param limit Name of the limit. Valid names:204	/// 	"ownerCanTransfer",205	/// 	"ownerCanDestroy",206	/// 	"transfersEnabled"207	/// @param value Value of the limit.208	/// @dev EVM selector for this function is: 0x993b7fba,209	///  or in textual repr: setCollectionLimit(string,bool)210	function setCollectionLimit(string memory limit, bool value) public {211		require(false, stub_error);212		limit;213		value;214		dummy = 0;215	}216217	/// Get contract address.218	/// @dev EVM selector for this function is: 0xf6b4dfb4,219	///  or in textual repr: contractAddress()220	function contractAddress() public view returns (address) {221		require(false, stub_error);222		dummy;223		return 0x0000000000000000000000000000000000000000;224	}225226	/// Add collection admin by substrate address.227	/// @param newAdmin Substrate administrator address.228	/// @dev EVM selector for this function is: 0x5730062b,229	///  or in textual repr: addCollectionAdminSubstrate(uint256)230	function addCollectionAdminSubstrate(uint256 newAdmin) public {231		require(false, stub_error);232		newAdmin;233		dummy = 0;234	}235236	/// Remove collection admin by substrate address.237	/// @param admin Substrate administrator address.238	/// @dev EVM selector for this function is: 0x4048fcf9,239	///  or in textual repr: removeCollectionAdminSubstrate(uint256)240	function removeCollectionAdminSubstrate(uint256 admin) public {241		require(false, stub_error);242		admin;243		dummy = 0;244	}245246	/// Add collection admin.247	/// @param newAdmin Address of the added administrator.248	/// @dev EVM selector for this function is: 0x92e462c7,249	///  or in textual repr: addCollectionAdmin(address)250	function addCollectionAdmin(address newAdmin) public {251		require(false, stub_error);252		newAdmin;253		dummy = 0;254	}255256	/// Remove collection admin.257	///258	/// @param admin Address of the removed administrator.259	/// @dev EVM selector for this function is: 0xfafd7b42,260	///  or in textual repr: removeCollectionAdmin(address)261	function removeCollectionAdmin(address admin) public {262		require(false, stub_error);263		admin;264		dummy = 0;265	}266267	/// Toggle accessibility of collection nesting.268	///269	/// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'270	/// @dev EVM selector for this function is: 0x112d4586,271	///  or in textual repr: setCollectionNesting(bool)272	function setCollectionNesting(bool enable) public {273		require(false, stub_error);274		enable;275		dummy = 0;276	}277278	/// Toggle accessibility of collection nesting.279	///280	/// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'281	/// @param collections Addresses of collections that will be available for nesting.282	/// @dev EVM selector for this function is: 0x64872396,283	///  or in textual repr: setCollectionNesting(bool,address[])284	function setCollectionNesting(bool enable, address[] memory collections)285		public286	{287		require(false, stub_error);288		enable;289		collections;290		dummy = 0;291	}292293	/// Set the collection access method.294	/// @param mode Access mode295	/// 	0 for Normal296	/// 	1 for AllowList297	/// @dev EVM selector for this function is: 0x41835d4c,298	///  or in textual repr: setCollectionAccess(uint8)299	function setCollectionAccess(uint8 mode) public {300		require(false, stub_error);301		mode;302		dummy = 0;303	}304305	/// Add the user to the allowed list.306	///307	/// @param user Address of a trusted user.308	/// @dev EVM selector for this function is: 0x67844fe6,309	///  or in textual repr: addToCollectionAllowList(address)310	function addToCollectionAllowList(address user) public {311		require(false, stub_error);312		user;313		dummy = 0;314	}315316	/// Remove the user from the allowed list.317	///318	/// @param user Address of a removed user.319	/// @dev EVM selector for this function is: 0x85c51acb,320	///  or in textual repr: removeFromCollectionAllowList(address)321	function removeFromCollectionAllowList(address user) public {322		require(false, stub_error);323		user;324		dummy = 0;325	}326327	/// Switch permission for minting.328	///329	/// @param mode Enable if "true".330	/// @dev EVM selector for this function is: 0x00018e84,331	///  or in textual repr: setCollectionMintMode(bool)332	function setCollectionMintMode(bool mode) public {333		require(false, stub_error);334		mode;335		dummy = 0;336	}337338	/// Check that account is the owner or admin of the collection339	///340	/// @param user account to verify341	/// @return "true" if account is the owner or admin342	/// @dev EVM selector for this function is: 0x9811b0c7,343	///  or in textual repr: isOwnerOrAdmin(address)344	function isOwnerOrAdmin(address user) public view returns (bool) {345		require(false, stub_error);346		user;347		dummy;348		return false;349	}350351	/// Check that substrate account is the owner or admin of the collection352	///353	/// @param user account to verify354	/// @return "true" if account is the owner or admin355	/// @dev EVM selector for this function is: 0x68910e00,356	///  or in textual repr: isOwnerOrAdminSubstrate(uint256)357	function isOwnerOrAdminSubstrate(uint256 user) public view returns (bool) {358		require(false, stub_error);359		user;360		dummy;361		return false;362	}363364	/// Returns collection type365	///366	/// @return `Fungible` or `NFT` or `ReFungible`367	/// @dev EVM selector for this function is: 0xd34b55b8,368	///  or in textual repr: uniqueCollectionType()369	function uniqueCollectionType() public returns (string memory) {370		require(false, stub_error);371		dummy = 0;372		return "";373	}374375	/// Changes collection owner to another account376	///377	/// @dev Owner can be changed only by current owner378	/// @param newOwner new owner account379	/// @dev EVM selector for this function is: 0x13af4035,380	///  or in textual repr: setOwner(address)381	function setOwner(address newOwner) public {382		require(false, stub_error);383		newOwner;384		dummy = 0;385	}386387	/// Changes collection owner to another substrate account388	///389	/// @dev Owner can be changed only by current owner390	/// @param newOwner new owner substrate account391	/// @dev EVM selector for this function is: 0xb212138f,392	///  or in textual repr: setOwnerSubstrate(uint256)393	function setOwnerSubstrate(uint256 newOwner) public {394		require(false, stub_error);395		newOwner;396		dummy = 0;397	}398}399400/// @dev anonymous struct401struct Tuple6 {402	address field_0;403	uint256 field_1;404}405406/// @dev the ERC-165 identifier for this interface is 0x79cc6790407contract ERC20UniqueExtensions is Dummy, ERC165 {408	/// @dev EVM selector for this function is: 0x79cc6790,409	///  or in textual repr: burnFrom(address,uint256)410	function burnFrom(address from, uint256 amount) public returns (bool) {411		require(false, stub_error);412		from;413		amount;414		dummy = 0;415		return false;416	}417}418419/// @dev inlined interface420contract ERC20Events {421	event Transfer(address indexed from, address indexed to, uint256 value);422	event Approval(423		address indexed owner,424		address indexed spender,425		uint256 value426	);427}428429/// @dev the ERC-165 identifier for this interface is 0x942e8b22430contract ERC20 is Dummy, ERC165, ERC20Events {431	/// @dev EVM selector for this function is: 0x06fdde03,432	///  or in textual repr: name()433	function name() public view returns (string memory) {434		require(false, stub_error);435		dummy;436		return "";437	}438439	/// @dev EVM selector for this function is: 0x95d89b41,440	///  or in textual repr: symbol()441	function symbol() public view returns (string memory) {442		require(false, stub_error);443		dummy;444		return "";445	}446447	/// @dev EVM selector for this function is: 0x18160ddd,448	///  or in textual repr: totalSupply()449	function totalSupply() public view returns (uint256) {450		require(false, stub_error);451		dummy;452		return 0;453	}454455	/// @dev EVM selector for this function is: 0x313ce567,456	///  or in textual repr: decimals()457	function decimals() public view returns (uint8) {458		require(false, stub_error);459		dummy;460		return 0;461	}462463	/// @dev EVM selector for this function is: 0x70a08231,464	///  or in textual repr: balanceOf(address)465	function balanceOf(address owner) public view returns (uint256) {466		require(false, stub_error);467		owner;468		dummy;469		return 0;470	}471472	/// @dev EVM selector for this function is: 0xa9059cbb,473	///  or in textual repr: transfer(address,uint256)474	function transfer(address to, uint256 amount) public returns (bool) {475		require(false, stub_error);476		to;477		amount;478		dummy = 0;479		return false;480	}481482	/// @dev EVM selector for this function is: 0x23b872dd,483	///  or in textual repr: transferFrom(address,address,uint256)484	function transferFrom(485		address from,486		address to,487		uint256 amount488	) public returns (bool) {489		require(false, stub_error);490		from;491		to;492		amount;493		dummy = 0;494		return false;495	}496497	/// @dev EVM selector for this function is: 0x095ea7b3,498	///  or in textual repr: approve(address,uint256)499	function approve(address spender, uint256 amount) public returns (bool) {500		require(false, stub_error);501		spender;502		amount;503		dummy = 0;504		return false;505	}506507	/// @dev EVM selector for this function is: 0xdd62ed3e,508	///  or in textual repr: allowance(address,address)509	function allowance(address owner, address spender)510		public511		view512		returns (uint256)513	{514		require(false, stub_error);515		owner;516		spender;517		dummy;518		return 0;519	}520}521522contract UniqueFungible is523	Dummy,524	ERC165,525	ERC20,526	ERC20Mintable,527	ERC20UniqueExtensions,528	Collection529{}
after · pallets/fungible/src/stubs/UniqueFungible.sol
1// SPDX-License-Identifier: OTHER2// This code is automatically generated34pragma solidity >=0.8.0 <0.9.0;56/// @dev common stubs holder7contract Dummy {8	uint8 dummy;9	string stub_error = "this contract is implemented in native";10}1112contract ERC165 is Dummy {13	function supportsInterface(bytes4 interfaceID)14		external15		view16		returns (bool)17	{18		require(false, stub_error);19		interfaceID;20		return true;21	}22}2324/// @title A contract that allows you to work with collections.25/// @dev the ERC-165 identifier for this interface is 0xe54be64026contract Collection is Dummy, ERC165 {27	/// Set collection property.28	///29	/// @param key Property key.30	/// @param value Propery value.31	/// @dev EVM selector for this function is: 0x2f073f66,32	///  or in textual repr: setCollectionProperty(string,bytes)33	function setCollectionProperty(string memory key, bytes memory value)34		public35	{36		require(false, stub_error);37		key;38		value;39		dummy = 0;40	}4142	/// Delete collection property.43	///44	/// @param key Property key.45	/// @dev EVM selector for this function is: 0x7b7debce,46	///  or in textual repr: deleteCollectionProperty(string)47	function deleteCollectionProperty(string memory key) public {48		require(false, stub_error);49		key;50		dummy = 0;51	}5253	/// Get collection property.54	///55	/// @dev Throws error if key not found.56	///57	/// @param key Property key.58	/// @return bytes The property corresponding to the key.59	/// @dev EVM selector for this function is: 0xcf24fd6d,60	///  or in textual repr: collectionProperty(string)61	function collectionProperty(string memory key)62		public63		view64		returns (bytes memory)65	{66		require(false, stub_error);67		key;68		dummy;69		return hex"";70	}7172	/// Set the sponsor of the collection.73	///74	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.75	///76	/// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.77	/// @dev EVM selector for this function is: 0x7623402e,78	///  or in textual repr: setCollectionSponsor(address)79	function setCollectionSponsor(address sponsor) public {80		require(false, stub_error);81		sponsor;82		dummy = 0;83	}8485	/// Set the substrate sponsor of the collection.86	///87	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.88	///89	/// @param sponsor Substrate address of the sponsor from whose account funds will be debited for operations with the contract.90	/// @dev EVM selector for this function is: 0xc74d6751,91	///  or in textual repr: setCollectionSponsorSubstrate(uint256)92	function setCollectionSponsorSubstrate(uint256 sponsor) public {93		require(false, stub_error);94		sponsor;95		dummy = 0;96	}9798	/// @dev EVM selector for this function is: 0x058ac185,99	///  or in textual repr: hasCollectionPendingSponsor()100	function hasCollectionPendingSponsor() public view returns (bool) {101		require(false, stub_error);102		dummy;103		return false;104	}105106	/// Collection sponsorship confirmation.107	///108	/// @dev After setting the sponsor for the collection, it must be confirmed with this function.109	/// @dev EVM selector for this function is: 0x3c50e97a,110	///  or in textual repr: confirmCollectionSponsorship()111	function confirmCollectionSponsorship() public {112		require(false, stub_error);113		dummy = 0;114	}115116	/// Remove collection sponsor.117	/// @dev EVM selector for this function is: 0x6e0326a3,118	///  or in textual repr: removeCollectionSponsor()119	function removeCollectionSponsor() public {120		require(false, stub_error);121		dummy = 0;122	}123124	/// Get current sponsor.125	///126	/// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw.127	/// @dev EVM selector for this function is: 0xb66bbc14,128	///  or in textual repr: getCollectionSponsor()129	function getCollectionSponsor() public view returns (Tuple6 memory) {130		require(false, stub_error);131		dummy;132		return Tuple6(0x0000000000000000000000000000000000000000, 0);133	}134135	/// Set limits for the collection.136	/// @dev Throws error if limit not found.137	/// @param limit Name of the limit. Valid names:138	/// 	"accountTokenOwnershipLimit",139	/// 	"sponsoredDataSize",140	/// 	"sponsoredDataRateLimit",141	/// 	"tokenLimit",142	/// 	"sponsorTransferTimeout",143	/// 	"sponsorApproveTimeout"144	/// @param value Value of the limit.145	/// @dev EVM selector for this function is: 0x6a3841db,146	///  or in textual repr: setCollectionLimit(string,uint32)147	function setCollectionLimit(string memory limit, uint32 value) public {148		require(false, stub_error);149		limit;150		value;151		dummy = 0;152	}153154	/// Set limits for the collection.155	/// @dev Throws error if limit not found.156	/// @param limit Name of the limit. Valid names:157	/// 	"ownerCanTransfer",158	/// 	"ownerCanDestroy",159	/// 	"transfersEnabled"160	/// @param value Value of the limit.161	/// @dev EVM selector for this function is: 0x993b7fba,162	///  or in textual repr: setCollectionLimit(string,bool)163	function setCollectionLimit(string memory limit, bool value) public {164		require(false, stub_error);165		limit;166		value;167		dummy = 0;168	}169170	/// Get contract address.171	/// @dev EVM selector for this function is: 0xf6b4dfb4,172	///  or in textual repr: contractAddress()173	function contractAddress() public view returns (address) {174		require(false, stub_error);175		dummy;176		return 0x0000000000000000000000000000000000000000;177	}178179	/// Add collection admin by substrate address.180	/// @param newAdmin Substrate administrator address.181	/// @dev EVM selector for this function is: 0x5730062b,182	///  or in textual repr: addCollectionAdminSubstrate(uint256)183	function addCollectionAdminSubstrate(uint256 newAdmin) public {184		require(false, stub_error);185		newAdmin;186		dummy = 0;187	}188189	/// Remove collection admin by substrate address.190	/// @param admin Substrate administrator address.191	/// @dev EVM selector for this function is: 0x4048fcf9,192	///  or in textual repr: removeCollectionAdminSubstrate(uint256)193	function removeCollectionAdminSubstrate(uint256 admin) public {194		require(false, stub_error);195		admin;196		dummy = 0;197	}198199	/// Add collection admin.200	/// @param newAdmin Address of the added administrator.201	/// @dev EVM selector for this function is: 0x92e462c7,202	///  or in textual repr: addCollectionAdmin(address)203	function addCollectionAdmin(address newAdmin) public {204		require(false, stub_error);205		newAdmin;206		dummy = 0;207	}208209	/// Remove collection admin.210	///211	/// @param admin Address of the removed administrator.212	/// @dev EVM selector for this function is: 0xfafd7b42,213	///  or in textual repr: removeCollectionAdmin(address)214	function removeCollectionAdmin(address admin) public {215		require(false, stub_error);216		admin;217		dummy = 0;218	}219220	/// Toggle accessibility of collection nesting.221	///222	/// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'223	/// @dev EVM selector for this function is: 0x112d4586,224	///  or in textual repr: setCollectionNesting(bool)225	function setCollectionNesting(bool enable) public {226		require(false, stub_error);227		enable;228		dummy = 0;229	}230231	/// Toggle accessibility of collection nesting.232	///233	/// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'234	/// @param collections Addresses of collections that will be available for nesting.235	/// @dev EVM selector for this function is: 0x64872396,236	///  or in textual repr: setCollectionNesting(bool,address[])237	function setCollectionNesting(bool enable, address[] memory collections)238		public239	{240		require(false, stub_error);241		enable;242		collections;243		dummy = 0;244	}245246	/// Set the collection access method.247	/// @param mode Access mode248	/// 	0 for Normal249	/// 	1 for AllowList250	/// @dev EVM selector for this function is: 0x41835d4c,251	///  or in textual repr: setCollectionAccess(uint8)252	function setCollectionAccess(uint8 mode) public {253		require(false, stub_error);254		mode;255		dummy = 0;256	}257258	/// Add the user to the allowed list.259	///260	/// @param user Address of a trusted user.261	/// @dev EVM selector for this function is: 0x67844fe6,262	///  or in textual repr: addToCollectionAllowList(address)263	function addToCollectionAllowList(address user) public {264		require(false, stub_error);265		user;266		dummy = 0;267	}268269	/// Remove the user from the allowed list.270	///271	/// @param user Address of a removed user.272	/// @dev EVM selector for this function is: 0x85c51acb,273	///  or in textual repr: removeFromCollectionAllowList(address)274	function removeFromCollectionAllowList(address user) public {275		require(false, stub_error);276		user;277		dummy = 0;278	}279280	/// Switch permission for minting.281	///282	/// @param mode Enable if "true".283	/// @dev EVM selector for this function is: 0x00018e84,284	///  or in textual repr: setCollectionMintMode(bool)285	function setCollectionMintMode(bool mode) public {286		require(false, stub_error);287		mode;288		dummy = 0;289	}290291	/// Check that account is the owner or admin of the collection292	///293	/// @param user account to verify294	/// @return "true" if account is the owner or admin295	/// @dev EVM selector for this function is: 0x9811b0c7,296	///  or in textual repr: isOwnerOrAdmin(address)297	function isOwnerOrAdmin(address user) public view returns (bool) {298		require(false, stub_error);299		user;300		dummy;301		return false;302	}303304	/// Check that substrate account is the owner or admin of the collection305	///306	/// @param user account to verify307	/// @return "true" if account is the owner or admin308	/// @dev EVM selector for this function is: 0x68910e00,309	///  or in textual repr: isOwnerOrAdminSubstrate(uint256)310	function isOwnerOrAdminSubstrate(uint256 user) public view returns (bool) {311		require(false, stub_error);312		user;313		dummy;314		return false;315	}316317	/// Returns collection type318	///319	/// @return `Fungible` or `NFT` or `ReFungible`320	/// @dev EVM selector for this function is: 0xd34b55b8,321	///  or in textual repr: uniqueCollectionType()322	function uniqueCollectionType() public returns (string memory) {323		require(false, stub_error);324		dummy = 0;325		return "";326	}327328	/// Changes collection owner to another account329	///330	/// @dev Owner can be changed only by current owner331	/// @param newOwner new owner account332	/// @dev EVM selector for this function is: 0x13af4035,333	///  or in textual repr: setOwner(address)334	function setOwner(address newOwner) public {335		require(false, stub_error);336		newOwner;337		dummy = 0;338	}339340	/// Changes collection owner to another substrate account341	///342	/// @dev Owner can be changed only by current owner343	/// @param newOwner new owner substrate account344	/// @dev EVM selector for this function is: 0xb212138f,345	///  or in textual repr: setOwnerSubstrate(uint256)346	function setOwnerSubstrate(uint256 newOwner) public {347		require(false, stub_error);348		newOwner;349		dummy = 0;350	}351}352353/// @dev the ERC-165 identifier for this interface is 0x63034ac5354contract ERC20UniqueExtensions is Dummy, ERC165 {355	/// Burn tokens from account356	/// @dev Function that burns an `amount` of the tokens of a given account,357	/// deducting from the sender's allowance for said account.358	/// @param from The account whose tokens will be burnt.359	/// @param amount The amount that will be burnt.360	/// @dev EVM selector for this function is: 0x79cc6790,361	///  or in textual repr: burnFrom(address,uint256)362	function burnFrom(address from, uint256 amount) public returns (bool) {363		require(false, stub_error);364		from;365		amount;366		dummy = 0;367		return false;368	}369370	/// Mint tokens for multiple accounts.371	/// @param amounts array of pairs of account address and amount372	/// @dev EVM selector for this function is: 0x1acf2d55,373	///  or in textual repr: mintBulk((address,uint256)[])374	function mintBulk(Tuple6[] memory amounts) public returns (bool) {375		require(false, stub_error);376		amounts;377		dummy = 0;378		return false;379	}380}381382/// @dev anonymous struct383struct Tuple6 {384	address field_0;385	uint256 field_1;386}387388/// @dev the ERC-165 identifier for this interface is 0x40c10f19389contract ERC20Mintable is Dummy, ERC165 {390	/// Mint tokens for `to` account.391	/// @param to account that will receive minted tokens392	/// @param amount amount of tokens to mint393	/// @dev EVM selector for this function is: 0x40c10f19,394	///  or in textual repr: mint(address,uint256)395	function mint(address to, uint256 amount) public returns (bool) {396		require(false, stub_error);397		to;398		amount;399		dummy = 0;400		return false;401	}402}403404/// @dev inlined interface405contract ERC20Events {406	event Transfer(address indexed from, address indexed to, uint256 value);407	event Approval(408		address indexed owner,409		address indexed spender,410		uint256 value411	);412}413414/// @dev the ERC-165 identifier for this interface is 0x942e8b22415contract ERC20 is Dummy, ERC165, ERC20Events {416	/// @dev EVM selector for this function is: 0x06fdde03,417	///  or in textual repr: name()418	function name() public view returns (string memory) {419		require(false, stub_error);420		dummy;421		return "";422	}423424	/// @dev EVM selector for this function is: 0x95d89b41,425	///  or in textual repr: symbol()426	function symbol() public view returns (string memory) {427		require(false, stub_error);428		dummy;429		return "";430	}431432	/// @dev EVM selector for this function is: 0x18160ddd,433	///  or in textual repr: totalSupply()434	function totalSupply() public view returns (uint256) {435		require(false, stub_error);436		dummy;437		return 0;438	}439440	/// @dev EVM selector for this function is: 0x313ce567,441	///  or in textual repr: decimals()442	function decimals() public view returns (uint8) {443		require(false, stub_error);444		dummy;445		return 0;446	}447448	/// @dev EVM selector for this function is: 0x70a08231,449	///  or in textual repr: balanceOf(address)450	function balanceOf(address owner) public view returns (uint256) {451		require(false, stub_error);452		owner;453		dummy;454		return 0;455	}456457	/// @dev EVM selector for this function is: 0xa9059cbb,458	///  or in textual repr: transfer(address,uint256)459	function transfer(address to, uint256 amount) public returns (bool) {460		require(false, stub_error);461		to;462		amount;463		dummy = 0;464		return false;465	}466467	/// @dev EVM selector for this function is: 0x23b872dd,468	///  or in textual repr: transferFrom(address,address,uint256)469	function transferFrom(470		address from,471		address to,472		uint256 amount473	) public returns (bool) {474		require(false, stub_error);475		from;476		to;477		amount;478		dummy = 0;479		return false;480	}481482	/// @dev EVM selector for this function is: 0x095ea7b3,483	///  or in textual repr: approve(address,uint256)484	function approve(address spender, uint256 amount) public returns (bool) {485		require(false, stub_error);486		spender;487		amount;488		dummy = 0;489		return false;490	}491492	/// @dev EVM selector for this function is: 0xdd62ed3e,493	///  or in textual repr: allowance(address,address)494	function allowance(address owner, address spender)495		public496		view497		returns (uint256)498	{499		require(false, stub_error);500		owner;501		spender;502		dummy;503		return 0;504	}505}506507contract UniqueFungible is508	Dummy,509	ERC165,510	ERC20,511	ERC20Mintable,512	ERC20UniqueExtensions,513	Collection514{}
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -3,13 +3,7 @@
 
 pragma solidity >=0.8.0 <0.9.0;
 
-// Anonymous struct
-struct Tuple0 {
-	address field_0;
-	uint256 field_1;
-}
-
-// Common stubs holder
+/// @dev common stubs holder
 interface Dummy {
 
 }
@@ -18,32 +12,8 @@
 	function supportsInterface(bytes4 interfaceID) external view returns (bool);
 }
 
-// Inline
-interface ERC20Events {
-	event Transfer(address indexed from, address indexed to, uint256 value);
-	event Approval(
-		address indexed owner,
-		address indexed spender,
-		uint256 value
-	);
-}
-
-// Selector: 40c10f19
-interface ERC20Mintable is Dummy, ERC165 {
-	// Selector: mint(address,uint256) 40c10f19
-	function mint(address to, uint256 amount) external returns (bool);
-}
-
-// Selector: 63034ac5
-interface ERC20UniqueExtensions is Dummy, ERC165 {
-	// Selector: burnFrom(address,uint256) 79cc6790
-	function burnFrom(address from, uint256 amount) external returns (bool);
-
-	// Selector: mintBulk((address,uint256)[]) 1acf2d55
-	function mintBulk(Tuple0[] memory amounts) external returns (bool);
-}
-
-// Selector: 6cf113cd
+/// @title A contract that allows you to work with collections.
+/// @dev the ERC-165 identifier for this interface is 0xe54be640
 interface Collection is Dummy, ERC165 {
 	/// Set collection property.
 	///
@@ -237,13 +207,56 @@
 	/// @dev EVM selector for this function is: 0xd34b55b8,
 	///  or in textual repr: uniqueCollectionType()
 	function uniqueCollectionType() external returns (string memory);
+
+	/// Changes collection owner to another account
+	///
+	/// @dev Owner can be changed only by current owner
+	/// @param newOwner new owner account
+	/// @dev EVM selector for this function is: 0x13af4035,
+	///  or in textual repr: setOwner(address)
+	function setOwner(address newOwner) external;
+
+	/// Changes collection owner to another substrate account
+	///
+	/// @dev Owner can be changed only by current owner
+	/// @param newOwner new owner substrate account
+	/// @dev EVM selector for this function is: 0xb212138f,
+	///  or in textual repr: setOwnerSubstrate(uint256)
+	function setOwnerSubstrate(uint256 newOwner) external;
 }
 
-/// @dev the ERC-165 identifier for this interface is 0x79cc6790
+/// @dev the ERC-165 identifier for this interface is 0x63034ac5
 interface ERC20UniqueExtensions is Dummy, ERC165 {
+	/// Burn tokens from account
+	/// @dev Function that burns an `amount` of the tokens of a given account,
+	/// deducting from the sender's allowance for said account.
+	/// @param from The account whose tokens will be burnt.
+	/// @param amount The amount that will be burnt.
 	/// @dev EVM selector for this function is: 0x79cc6790,
 	///  or in textual repr: burnFrom(address,uint256)
 	function burnFrom(address from, uint256 amount) external returns (bool);
+
+	/// Mint tokens for multiple accounts.
+	/// @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(Tuple6[] memory amounts) external returns (bool);
+}
+
+/// @dev anonymous struct
+struct Tuple6 {
+	address field_0;
+	uint256 field_1;
+}
+
+/// @dev the ERC-165 identifier for this interface is 0x40c10f19
+interface ERC20Mintable is Dummy, ERC165 {
+	/// Mint tokens for `to` account.
+	/// @param to account that will receive minted tokens
+	/// @param amount amount of tokens to mint
+	/// @dev EVM selector for this function is: 0x40c10f19,
+	///  or in textual repr: mint(address,uint256)
+	function mint(address to, uint256 amount) external returns (bool);
 }
 
 /// @dev inlined interface
modifiedtests/src/eth/base.test.tsdiffbeforeafterboth
--- a/tests/src/eth/base.test.ts
+++ b/tests/src/eth/base.test.ts
@@ -94,7 +94,7 @@
   });
 
   itWeb3('ERC721 support', async ({web3}) => {
-    expect(await contract(web3).methods.supportsInterface('0x58800161').call()).to.be.true;
+    expect(await contract(web3).methods.supportsInterface('0x780e9d63').call()).to.be.true;
   });
 
   itWeb3('ERC721Metadata support', async ({web3}) => {
modifiedtests/src/eth/fungibleAbi.jsondiffbeforeafterboth
--- a/tests/src/eth/fungibleAbi.json
+++ b/tests/src/eth/fungibleAbi.json
@@ -151,33 +151,6 @@
     "type": "function"
   },
   {
-    "inputs": [
-      { "internalType": "address", "name": "to", "type": "address" },
-      { "internalType": "uint256", "name": "amount", "type": "uint256" }
-    ],
-    "name": "mint",
-    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
-    "stateMutability": "nonpayable",
-    "type": "function"
-  },
-  {
-    "inputs": [
-      {
-        "components": [
-          { "internalType": "address", "name": "field_0", "type": "address" },
-          { "internalType": "uint256", "name": "field_1", "type": "uint256" }
-        ],
-        "internalType": "struct Tuple0[]",
-        "name": "amounts",
-        "type": "tuple[]"
-      }
-    ],
-    "name": "mintBulk",
-    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
-    "stateMutability": "nonpayable",
-    "type": "function"
-  },
-  {
     "inputs": [],
     "name": "getCollectionSponsor",
     "outputs": [
@@ -220,6 +193,33 @@
     "type": "function"
   },
   {
+    "inputs": [
+      { "internalType": "address", "name": "to", "type": "address" },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "mint",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          { "internalType": "address", "name": "field_0", "type": "address" },
+          { "internalType": "uint256", "name": "field_1", "type": "uint256" }
+        ],
+        "internalType": "struct Tuple6[]",
+        "name": "amounts",
+        "type": "tuple[]"
+      }
+    ],
+    "name": "mintBulk",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
     "inputs": [],
     "name": "name",
     "outputs": [{ "internalType": "string", "name": "", "type": "string" }],