git.delta.rocks / unique-network / refs/commits / 0f86ef07553f

difftreelog

integration tests for erc20

Grigoriy Simonov2022-07-22parent: #b049e8d.patch.diff
in: master

1 file changed

addedtests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth
after · tests/src/eth/reFungibleToken.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {approve, createCollection, createRefungibleToken, transfer, transferFrom, UNIQUE} from '../util/helpers';18import {createEthAccount, createEthAccountWithBalance, GAS_ARGS, itWeb3, normalizeEvents, recordEthFee, recordEvents, subToEth, tokenIdToAddress, transferBalanceToEth} from './util/helpers';19import reFungibleTokenAbi from './reFungibleTokenAbi.json';2021import chai from 'chai';22import chaiAsPromised from 'chai-as-promised';23chai.use(chaiAsPromised);24const expect = chai.expect;2526describe('Refungible token: Information getting', () => {27  itWeb3('totalSupply', async ({api, web3, privateKeyWrapper}) => {28    const alice = privateKeyWrapper('//Alice');2930    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;3132    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);3334    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;3536    const address = tokenIdToAddress(collectionId, tokenId);37    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});38    const totalSupply = await contract.methods.totalSupply().call();3940    expect(totalSupply).to.equal('200');41  });4243  itWeb3('balanceOf', async ({api, web3, privateKeyWrapper}) => {44    const alice = privateKeyWrapper('//Alice');4546    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;4748    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);4950    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;5152    const address = tokenIdToAddress(collectionId, tokenId);53    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});54    const balance = await contract.methods.balanceOf(caller).call();5556    expect(balance).to.equal('200');57  });58});5960describe('Refungible: Plain calls', () => {61  itWeb3('Can perform approve()', async ({web3, api, privateKeyWrapper}) => {62    const alice = privateKeyWrapper('//Alice');6364    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;6566    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);6768    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;6970    const address = tokenIdToAddress(collectionId, tokenId);7172    const spender = createEthAccount(web3);7374    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});7576    {77      const result = await contract.methods.approve(spender, 100).send({from: owner});78      const events = normalizeEvents(result.events);7980      expect(events).to.be.deep.equal([81        {82          address,83          event: 'Approval',84          args: {85            owner,86            spender,87            value: '100',88          },89        },90      ]);91    }9293    {94      const allowance = await contract.methods.allowance(owner, spender).call();95      expect(+allowance).to.equal(100);96    }97  });9899  itWeb3('Can perform transferFrom()', async ({web3, api, privateKeyWrapper}) => {100    const alice = privateKeyWrapper('//Alice');101102    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;103104    const owner = createEthAccount(web3);105    await transferBalanceToEth(api, alice, owner);106107    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;108109    const spender = createEthAccount(web3);110    await transferBalanceToEth(api, alice, spender);111112    const receiver = createEthAccount(web3);113114    const address = tokenIdToAddress(collectionId, tokenId);115    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});116117    await contract.methods.approve(spender, 100).send();118119    {120      const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});121      const events = normalizeEvents(result.events);122      expect(events).to.be.deep.equal([123        {124          address,125          event: 'Transfer',126          args: {127            from: owner,128            to: receiver,129            value: '49',130          },131        },132        {133          address,134          event: 'Approval',135          args: {136            owner,137            spender,138            value: '51',139          },140        },141      ]);142    }143144    {145      const balance = await contract.methods.balanceOf(receiver).call();146      expect(+balance).to.equal(49);147    }148149    {150      const balance = await contract.methods.balanceOf(owner).call();151      expect(+balance).to.equal(151);152    }153  });154155  itWeb3('Can perform transfer()', async ({web3, api, privateKeyWrapper}) => {156    const alice = privateKeyWrapper('//Alice');157158    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;159160    const owner = createEthAccount(web3);161    await transferBalanceToEth(api, alice, owner);162163    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;164165    const receiver = createEthAccount(web3);166    await transferBalanceToEth(api, alice, receiver);167168    const address = tokenIdToAddress(collectionId, tokenId);169    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});170171    {172      const result = await contract.methods.transfer(receiver, 50).send({from: owner});173      const events = normalizeEvents(result.events);174      expect(events).to.be.deep.equal([175        {176          address,177          event: 'Transfer',178          args: {179            from: owner,180            to: receiver,181            value: '50',182          },183        },184      ]);185    }186187    {188      const balance = await contract.methods.balanceOf(owner).call();189      expect(+balance).to.equal(150);190    }191192    {193      const balance = await contract.methods.balanceOf(receiver).call();194      expect(+balance).to.equal(50);195    }196  });197});198199describe('Refungible: Fees', () => {200  itWeb3('approve() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {201    const alice = privateKeyWrapper('//Alice');202203    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;204205    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);206    const spender = createEthAccount(web3);207208    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;209210    const address = tokenIdToAddress(collectionId, tokenId);211    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});212213    const cost = await recordEthFee(api, owner, () => contract.methods.approve(spender, 100).send({from: owner}));214    expect(cost < BigInt(0.2 * Number(UNIQUE)));215  });216217  itWeb3('transferFrom() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {218    const alice = privateKeyWrapper('//Alice');219220    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;221222    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);223    const spender = await createEthAccountWithBalance(api, web3, privateKeyWrapper);224225    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;226227    const address = tokenIdToAddress(collectionId, tokenId);228    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});229230    await contract.methods.approve(spender, 100).send({from: owner});231232    const cost = await recordEthFee(api, spender, () => contract.methods.transferFrom(owner, spender, 100).send({from: spender}));233    expect(cost < BigInt(0.2 * Number(UNIQUE)));234  });235236  itWeb3('transfer() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {237    const alice = privateKeyWrapper('//Alice');238239    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;240241    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);242    const receiver = createEthAccount(web3);243244    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;245246    const address = tokenIdToAddress(collectionId, tokenId);247    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});248249    const cost = await recordEthFee(api, owner, () => contract.methods.transfer(receiver, 100).send({from: owner}));250    expect(cost < BigInt(0.2 * Number(UNIQUE)));251  });252});253254describe('Refungible: Substrate calls', () => {255  itWeb3('Events emitted for approve()', async ({web3, api, privateKeyWrapper}) => {256    const alice = privateKeyWrapper('//Alice');257258    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;259260    const receiver = createEthAccount(web3);261262    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;263264    const address = tokenIdToAddress(collectionId, tokenId);265    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);266267    const events = await recordEvents(contract, async () => {268      expect(await approve(api, collectionId, tokenId, alice, {Ethereum: receiver}, 100n)).to.be.true;269    });270271    expect(events).to.be.deep.equal([272      {273        address,274        event: 'Approval',275        args: {276          owner: subToEth(alice.address),277          spender: receiver,278          value: '100',279        },280      },281    ]);282  });283284  itWeb3('Events emitted for transferFrom()', async ({web3, api, privateKeyWrapper}) => {285    const alice = privateKeyWrapper('//Alice');286287    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;288    const bob = privateKeyWrapper('//Bob');289290    const receiver = createEthAccount(web3);291292    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;293    expect(await approve(api, collectionId, tokenId, alice, bob.address, 100n)).to.be.true;294295    const address = tokenIdToAddress(collectionId, tokenId);296    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);297298    const events = await recordEvents(contract, async () => {299      expect(await transferFrom(api, collectionId, tokenId, bob, alice, {Ethereum: receiver},  51n)).to.be.true;300    });301302    expect(events).to.be.deep.equal([303      {304        address,305        event: 'Transfer',306        args: {307          from: subToEth(alice.address),308          to: receiver,309          value: '51',310        },311      },312      {313        address,314        event: 'Approval',315        args: {316          owner: subToEth(alice.address),317          spender: subToEth(bob.address),318          value: '49',319        },320      },321    ]);322  });323324  itWeb3('Events emitted for transfer()', async ({web3, api, privateKeyWrapper}) => {325    const alice = privateKeyWrapper('//Alice');326327    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;328329    const receiver = createEthAccount(web3);330331    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;332333    const address = tokenIdToAddress(collectionId, tokenId);334    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);335336    const events = await recordEvents(contract, async () => {337      expect(await transfer(api, collectionId, tokenId, alice, {Ethereum: receiver},  51n)).to.be.true;338    });339340    expect(events).to.be.deep.equal([341      {342        address,343        event: 'Transfer',344        args: {345          from: subToEth(alice.address),346          to: receiver,347          value: '51',348        },349      },350    ]);351  });352});