1234567891011121314151617import {Contract} from 'web3-eth-contract';1819import {IKeyringPair} from '@polkadot/types/types';20import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util';212223describe('Contract calls', () => {24 let donor: IKeyringPair;2526 before(async function () {27 await usingEthPlaygrounds(async (_helper, privateKey) => {28 donor = await privateKey({filename: __filename});29 });30 });3132 itEth('Call of simple contract fee is less than 0.2 UNQ', async ({helper}) => {33 const deployer = await helper.eth.createAccountWithBalance(donor);34 const flipper = await helper.eth.deployFlipper(deployer);3536 const cost = await helper.eth.calculateFee({Ethereum: deployer}, () => flipper.methods.flip().send({from: deployer}));37 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal()))).to.be.true;38 });3940 itEth('Balance transfer fee is less than 0.2 UNQ', async ({helper}) => {41 const userA = await helper.eth.createAccountWithBalance(donor);42 const userB = helper.eth.createAccount();43 const cost = await helper.eth.calculateFee({Ethereum: userA}, () => helper.getWeb3().eth.sendTransaction({44 from: userA,45 to: userB,46 value: '1000000',47 gas: helper.eth.DEFAULT_GAS,48 }));49 const balanceB = await helper.balance.getEthereum(userB);50 expect(cost - balanceB < BigInt(0.2 * Number(helper.balance.getOneTokenNominal()))).to.be.true;51 });5253 itEth('NFT transfer is close to 0.15 UNQ', async ({helper}) => {54 const caller = await helper.eth.createAccountWithBalance(donor);55 const receiver = helper.eth.createAccount();5657 const [alice] = await helper.arrange.createAccounts([10n], donor);58 const collection = await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});59 const {tokenId} = await collection.mintToken(alice, {Ethereum: caller});6061 const address = helper.ethAddress.fromCollectionId(collection.collectionId);62 const contract = helper.ethNativeContract.collection(address, 'nft', caller);6364 const cost = await helper.eth.calculateFee({Ethereum: caller}, () => contract.methods.transfer(receiver, tokenId).send(caller));6566 const fee = Number(cost) / Number(helper.balance.getOneTokenNominal());67 const expectedFee = 0.15;68 const tolerance = 0.001;6970 expect(Math.abs(fee - expectedFee)).to.be.lessThan(tolerance);71 });72});7374describe('ERC165 tests', async () => {75 7677 let erc721MetadataCompatibleNftCollectionId: number;78 let simpleNftCollectionId: number;79 let minter: string;8081 const BASE_URI = 'base/';8283 async function checkInterface(helper: EthUniqueHelper, interfaceId: string, simpleResult: boolean, compatibleResult: boolean) {84 const simple = helper.ethNativeContract.collection(helper.ethAddress.fromCollectionId(simpleNftCollectionId), 'nft', minter);85 const compatible = helper.ethNativeContract.collection(helper.ethAddress.fromCollectionId(erc721MetadataCompatibleNftCollectionId), 'nft', minter);8687 expect(await simple.methods.supportsInterface(interfaceId).call()).to.equal(simpleResult, `empty (not ERC721Metadata compatible) NFT collection returns not ${simpleResult}`);88 expect(await compatible.methods.supportsInterface(interfaceId).call()).to.equal(compatibleResult, `ERC721Metadata compatible NFT collection returns not ${compatibleResult}`);89 }9091 before(async () => {92 await usingEthPlaygrounds(async (helper, privateKey) => {93 const donor = await privateKey({filename: __filename});94 const [alice] = await helper.arrange.createAccounts([10n], donor);95 ({collectionId: simpleNftCollectionId} = await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}));96 minter = helper.eth.createAccount();97 ({collectionId: erc721MetadataCompatibleNftCollectionId} = await helper.eth.createERC721MetadataCompatibleNFTCollection(minter, 'n', 'd', 'p', BASE_URI));98 });99 });100101 itEth('nonexistent interfaceID - 0xffffffff - always false', async ({helper}) => {102 await checkInterface(helper, '0xffffffff', false, false);103 });104105 itEth('ERC721 - 0x780e9d63 - support', async ({helper}) => {106 await checkInterface(helper, '0x780e9d63', true, true);107 });108109 itEth('ERC721Metadata - 0x5b5e139f - support', async ({helper}) => {110 await checkInterface(helper, '0x5b5e139f', false, true);111 });112113 itEth('ERC721UniqueMintable - 0x476ff149 - support', async ({helper}) => {114 await checkInterface(helper, '0x476ff149', true, true);115 });116117 itEth('ERC721Enumerable - 0x780e9d63 - support', async ({helper}) => {118 await checkInterface(helper, '0x780e9d63', true, true);119 });120121 itEth('ERC721UniqueExtensions - 0x4468500d - support', async ({helper}) => {122 await checkInterface(helper, '0x4468500d', true, true);123 });124125 itEth('ERC721Burnable - 0x42966c68 - support', async ({helper}) => {126 await checkInterface(helper, '0x42966c68', true, true);127 });128129 itEth('ERC165 - 0x01ffc9a7 - support', async ({helper}) => {130 await checkInterface(helper, '0x01ffc9a7', true, true);131 });132});