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{}
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" }],