From 78a995207d2e43dd4f50d742fe79fccf53497b83 Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Mon, 29 Aug 2022 14:19:27 +0000 Subject: [PATCH] fix: After rebase --- --- 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 { + 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 { /// Read item from current position, advanding decoder fn abi_read(&mut self) -> Result; + + /// 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, 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, 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` 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(>::size()) } else { None }; + let size = if !<($($ident,)+)>::is_dynamic() { Some(>::size()) } else { None }; let mut subresult = self.subresult(size)?; Ok(( $(>::abi_read(&mut subresult)?,)+ --- a/crates/evm-coder/src/solidity.rs +++ b/crates/evm-coder/src/solidity.rs @@ -192,10 +192,7 @@ write!(writer, "{}", tc.collect_tuple::()) } fn is_simple() -> bool { - true - $( - && <$ident>::is_simple() - )* + false } #[allow(unused_assignments)] fn solidity_default(writer: &mut impl fmt::Write, tc: &TypeCollector) -> fmt::Result { --- 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 FungibleHandle { /// 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 FungibleHandle { /// Burn tokens from account /// @dev Function that burns an `amount` of the tokens of a given account, --- a/pallets/fungible/src/stubs/UniqueFungible.sol +++ b/pallets/fungible/src/stubs/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 contract Dummy { uint8 dummy; string stub_error = "this contract is implemented in native"; @@ -27,49 +21,8 @@ } } -// Inline -contract ERC20Events { - event Transfer(address indexed from, address indexed to, uint256 value); - event Approval( - address indexed owner, - address indexed spender, - uint256 value - ); -} - -// Selector: 40c10f19 -contract ERC20Mintable is Dummy, ERC165 { - // Selector: mint(address,uint256) 40c10f19 - function mint(address to, uint256 amount) public returns (bool) { - require(false, stub_error); - to; - amount; - dummy = 0; - return false; - } -} - -// Selector: 63034ac5 -contract ERC20UniqueExtensions is Dummy, ERC165 { - // Selector: burnFrom(address,uint256) 79cc6790 - function burnFrom(address from, uint256 amount) public returns (bool) { - require(false, stub_error); - from; - amount; - dummy = 0; - return false; - } - - // Selector: mintBulk((address,uint256)[]) 1acf2d55 - function mintBulk(Tuple0[] memory amounts) public returns (bool) { - require(false, stub_error); - amounts; - dummy = 0; - return false; - } -} - -// Selector: 6cf113cd +/// @title A contract that allows you to work with collections. +/// @dev the ERC-165 identifier for this interface is 0xe54be640 contract Collection is Dummy, ERC165 { /// Set collection property. /// @@ -397,19 +350,51 @@ } } +/// @dev the ERC-165 identifier for this interface is 0x63034ac5 +contract 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) public returns (bool) { + require(false, stub_error); + from; + amount; + dummy = 0; + return false; + } + + /// 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) public returns (bool) { + require(false, stub_error); + amounts; + dummy = 0; + return false; + } +} + /// @dev anonymous struct struct Tuple6 { address field_0; uint256 field_1; } -/// @dev the ERC-165 identifier for this interface is 0x79cc6790 -contract ERC20UniqueExtensions is Dummy, ERC165 { - /// @dev EVM selector for this function is: 0x79cc6790, - /// or in textual repr: burnFrom(address,uint256) - function burnFrom(address from, uint256 amount) public returns (bool) { +/// @dev the ERC-165 identifier for this interface is 0x40c10f19 +contract 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) public returns (bool) { require(false, stub_error); - from; + to; amount; dummy = 0; return false; --- 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 --- 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}) => { --- 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" }], -- gitstuff