--- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -36,7 +36,7 @@ use crate::{ Pallet, CollectionHandle, Config, CollectionProperties, SelfWeightOf, eth::{ - EthCrossAccount, convert_cross_account_to_uint256, CollectionPermissions as EvmPermissions, + EthCrossAccount, CollectionPermissions as EvmPermissions, CollectionLimits as EvmCollectionLimits, }, weights::WeightInfo, --- a/pallets/common/src/eth.rs +++ b/pallets/common/src/eth.rs @@ -53,15 +53,6 @@ address[0..16] == ETH_COLLECTION_PREFIX } -/// Convert `CrossAccountId` to `uint256`. -pub fn convert_cross_account_to_uint256(from: &T::CrossAccountId) -> uint256 -where - T::AccountId: AsRef<[u8; 32]>, -{ - let slice = from.as_sub().as_ref(); - uint256::from_big_endian(slice) -} - /// Convert `uint256` to `CrossAccountId`. pub fn convert_uint256_to_cross_account(from: uint256) -> T::CrossAccountId where @@ -71,22 +62,6 @@ from.to_big_endian(&mut new_admin_arr); let account_id = T::AccountId::from(new_admin_arr); T::CrossAccountId::from_sub(account_id) -} - -/// Convert `CrossAccountId` to `(address, uint256)`. -pub fn convert_cross_account_to_tuple( - cross_account_id: &T::CrossAccountId, -) -> (address, uint256) -where - T::AccountId: AsRef<[u8; 32]>, -{ - if cross_account_id.is_canonical_substrate() { - let sub = convert_cross_account_to_uint256::(cross_account_id); - (Default::default(), sub) - } else { - let eth = *cross_account_id.as_eth(); - (eth, Default::default()) - } } /// Convert tuple `(address, uint256)` to `CrossAccountId`. @@ -128,10 +103,7 @@ T::AccountId: AsRef<[u8; 32]>, { if cross_account_id.is_canonical_substrate() { - Self { - eth: Default::default(), - sub: convert_cross_account_to_uint256::(cross_account_id), - } + Self::from_sub::(cross_account_id.as_sub()) } else { Self { eth: *cross_account_id.as_eth(), --- a/pallets/evm-contract-helpers/Cargo.toml +++ b/pallets/evm-contract-helpers/Cargo.toml @@ -50,6 +50,7 @@ "pallet-evm-coder-substrate/std", "pallet-evm/std", "up-sponsorship/std", + "pallet-common/std", ] try-runtime = ["frame-support/try-runtime"] -stubgen = ["evm-coder/stubgen"] +stubgen = ["evm-coder/stubgen", "pallet-common/stubgen"] --- a/pallets/evm-contract-helpers/src/eth.rs +++ b/pallets/evm-contract-helpers/src/eth.rs @@ -175,18 +175,11 @@ /// /// @param contractAddress The contract for which a sponsor is requested. /// @return Tuble with sponsor address and his substrate mirror. If there is no confirmed sponsor error "Contract has no sponsor" throw. - fn sponsor(&self, contract_address: address) -> Result<(address, uint256)> { - let sponsor = - Pallet::::get_sponsor(contract_address).ok_or("Contract has no sponsor")?; - Ok(pallet_common::eth::convert_cross_account_to_tuple::( - &sponsor, + fn sponsor(&self, contract_address: address) -> Result { + Ok(EthCrossAccount::from_sub_cross_account::( + &Pallet::::get_sponsor(contract_address).ok_or("Contract has no sponsor")?, )) } - // fn sponsor(&self, contract_address: address) -> Result { - // Ok(EthCrossAccount::from_sub_cross_account::( - // &Pallet::::get_sponsor(contract_address).ok_or("Contract has no sponsor")?, - // )) - // } /// Check tat contract has confirmed sponsor. /// --- a/pallets/evm-contract-helpers/src/stubs/ContractHelpers.sol +++ b/pallets/evm-contract-helpers/src/stubs/ContractHelpers.sol @@ -96,11 +96,11 @@ /// @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: 0x766c4f37, /// or in textual repr: sponsor(address) - function sponsor(address contractAddress) public view returns (Tuple0 memory) { + function sponsor(address contractAddress) public view returns (EthCrossAccount memory) { require(false, stub_error); contractAddress; dummy; - return Tuple0(0x0000000000000000000000000000000000000000, 0); + return EthCrossAccount(0x0000000000000000000000000000000000000000, 0); } /// Check tat contract has confirmed sponsor. @@ -265,8 +265,8 @@ } } -/// @dev anonymous struct -struct Tuple0 { - address field_0; - uint256 field_1; +/// @dev Cross account struct +struct EthCrossAccount { + address eth; + uint256 sub; } --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -605,7 +605,7 @@ Ok(false) } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner /// @return uint256 The id of the newly minted token #[weight(>::create_item())] @@ -618,7 +618,7 @@ Ok(token_id) } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @dev `tokenId` should be obtained with `nextTokenId` method, /// unlike standard, you can't specify it manually /// @param to The new owner @@ -1070,7 +1070,7 @@ Ok(true) } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -738,7 +738,7 @@ return false; } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner /// @return uint256 The id of the newly minted token /// @dev EVM selector for this function is: 0x6a627842, @@ -750,7 +750,7 @@ return 0; } - // /// @notice Function to mint token. + // /// @notice Function to a mint token. // /// @dev `tokenId` should be obtained with `nextTokenId` method, // /// unlike standard, you can't specify it manually // /// @param to The new owner @@ -995,7 +995,7 @@ // return false; // } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token --- a/pallets/refungible/src/erc.rs +++ b/pallets/refungible/src/erc.rs @@ -637,7 +637,7 @@ Ok(false) } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner /// @return uint256 The id of the newly minted token #[weight(>::create_item())] @@ -650,7 +650,7 @@ Ok(token_id) } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @dev `tokenId` should be obtained with `nextTokenId` method, /// unlike standard, you can't specify it manually /// @param to The new owner @@ -1120,7 +1120,7 @@ Ok(true) } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token --- a/pallets/refungible/src/stubs/UniqueRefungible.sol +++ b/pallets/refungible/src/stubs/UniqueRefungible.sol @@ -733,7 +733,7 @@ return false; } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner /// @return uint256 The id of the newly minted token /// @dev EVM selector for this function is: 0x6a627842, @@ -745,7 +745,7 @@ return 0; } - // /// @notice Function to mint token. + // /// @notice Function to a mint token. // /// @dev `tokenId` should be obtained with `nextTokenId` method, // /// unlike standard, you can't specify it manually // /// @param to The new owner @@ -979,7 +979,7 @@ // return false; // } - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token --- a/tests/src/eth/abi/contractHelpers.json +++ b/tests/src/eth/abi/contractHelpers.json @@ -223,10 +223,10 @@ "outputs": [ { "components": [ - { "internalType": "address", "name": "field_0", "type": "address" }, - { "internalType": "uint256", "name": "field_1", "type": "uint256" } + { "internalType": "address", "name": "eth", "type": "address" }, + { "internalType": "uint256", "name": "sub", "type": "uint256" } ], - "internalType": "struct Tuple0", + "internalType": "struct EthCrossAccount", "name": "", "type": "tuple" } --- a/tests/src/eth/api/ContractHelpers.sol +++ b/tests/src/eth/api/ContractHelpers.sol @@ -69,7 +69,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: 0x766c4f37, /// or in textual repr: sponsor(address) - function sponsor(address contractAddress) external view returns (Tuple0 memory); + function sponsor(address contractAddress) external view returns (EthCrossAccount memory); /// Check tat contract has confirmed sponsor. /// @@ -171,8 +171,8 @@ function toggleAllowlist(address contractAddress, bool enabled) external; } -/// @dev anonymous struct -struct Tuple0 { - address field_0; - uint256 field_1; +/// @dev Cross account struct +struct EthCrossAccount { + address eth; + uint256 sub; } --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -515,14 +515,14 @@ /// or in textual repr: mintingFinished() function mintingFinished() external view returns (bool); - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner /// @return uint256 The id of the newly minted token /// @dev EVM selector for this function is: 0x6a627842, /// or in textual repr: mint(address) function mint(address to) external returns (uint256); - // /// @notice Function to mint token. + // /// @notice Function to a mint token. // /// @dev `tokenId` should be obtained with `nextTokenId` method, // /// unlike standard, you can't specify it manually // /// @param to The new owner @@ -674,7 +674,7 @@ // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[]) // function mintBulkWithTokenURI(address to, Tuple13[] memory tokens) external returns (bool); - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token --- a/tests/src/eth/api/UniqueRefungible.sol +++ b/tests/src/eth/api/UniqueRefungible.sol @@ -513,14 +513,14 @@ /// or in textual repr: mintingFinished() function mintingFinished() external view returns (bool); - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner /// @return uint256 The id of the newly minted token /// @dev EVM selector for this function is: 0x6a627842, /// or in textual repr: mint(address) function mint(address to) external returns (uint256); - // /// @notice Function to mint token. + // /// @notice Function to a mint token. // /// @dev `tokenId` should be obtained with `nextTokenId` method, // /// unlike standard, you can't specify it manually // /// @param to The new owner @@ -666,7 +666,7 @@ // /// or in textual repr: mintBulkWithTokenURI(address,(uint256,string)[]) // function mintBulkWithTokenURI(address to, Tuple12[] memory tokens) external returns (bool); - /// @notice Function to mint token. + /// @notice Function to a mint token. /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token --- a/tests/src/eth/nonFungible.test.ts +++ b/tests/src/eth/nonFungible.test.ts @@ -17,7 +17,6 @@ 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'; @@ -180,9 +179,16 @@ 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 permissions: ITokenPropertyPermission[] = properties + .map(p => { + return { + key: p.key, permission: { + tokenOwner: true, + collectionAdmin: true, + mutable: true, + }, + }; + }); const collection = await helper.nft.mintCollection(minter, { @@ -198,7 +204,7 @@ let tokenId = result.events.Transfer.returnValues.tokenId; expect(tokenId).to.be.equal(expectedTokenId); - const event = result.events.Transfer; + let 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)); @@ -206,10 +212,16 @@ expectedTokenId = await contract.methods.nextTokenId().call(); result = await contract.methods.mintCross(receiverCross, properties).send(); + 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([]); + 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()); })); }); --- a/tests/src/eth/reFungible.test.ts +++ b/tests/src/eth/reFungible.test.ts @@ -17,7 +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'; +import {ITokenPropertyPermission} from '../util/playgrounds/types'; describe('Refungible: Information getting', () => { let donor: IKeyringPair; @@ -159,7 +159,7 @@ let tokenId = result.events.Transfer.returnValues.tokenId; expect(tokenId).to.be.equal(expectedTokenId); - const event = result.events.Transfer; + let 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)); @@ -167,6 +167,12 @@ expectedTokenId = await contract.methods.nextTokenId().call(); result = await contract.methods.mintCross(receiverCross, properties).send(); + 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([]); + tokenId = result.events.Transfer.returnValues.tokenId; expect(tokenId).to.be.equal(expectedTokenId);