git.delta.rocks / unique-network / refs/commits / 1792b24d2828

difftreelog

chore fix repartition tests

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

1 file changed

modifiedtests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth
before · 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  });5859  itWeb3('decimals', async ({api, web3, privateKeyWrapper}) => {60    const alice = privateKeyWrapper('//Alice');6162    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;6364    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);6566    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;6768    const address = tokenIdToAddress(collectionId, tokenId);69    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});70    const decimals = await contract.methods.decimals().call();7172    expect(decimals).to.equal('0');73  });74});7576describe('Refungible: Plain calls', () => {77  itWeb3('Can perform approve()', async ({web3, api, privateKeyWrapper}) => {78    const alice = privateKeyWrapper('//Alice');7980    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;8182    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);8384    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;8586    const address = tokenIdToAddress(collectionId, tokenId);8788    const spender = createEthAccount(web3);8990    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});9192    {93      const result = await contract.methods.approve(spender, 100).send({from: owner});94      const events = normalizeEvents(result.events);9596      expect(events).to.be.deep.equal([97        {98          address,99          event: 'Approval',100          args: {101            owner,102            spender,103            value: '100',104          },105        },106      ]);107    }108109    {110      const allowance = await contract.methods.allowance(owner, spender).call();111      expect(+allowance).to.equal(100);112    }113  });114115  itWeb3('Can perform transferFrom()', async ({web3, api, privateKeyWrapper}) => {116    const alice = privateKeyWrapper('//Alice');117118    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;119120    const owner = createEthAccount(web3);121    await transferBalanceToEth(api, alice, owner);122123    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;124125    const spender = createEthAccount(web3);126    await transferBalanceToEth(api, alice, spender);127128    const receiver = createEthAccount(web3);129130    const address = tokenIdToAddress(collectionId, tokenId);131    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});132133    await contract.methods.approve(spender, 100).send();134135    {136      const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});137      const events = normalizeEvents(result.events);138      expect(events).to.be.deep.equal([139        {140          address,141          event: 'Transfer',142          args: {143            from: owner,144            to: receiver,145            value: '49',146          },147        },148        {149          address,150          event: 'Approval',151          args: {152            owner,153            spender,154            value: '51',155          },156        },157      ]);158    }159160    {161      const balance = await contract.methods.balanceOf(receiver).call();162      expect(+balance).to.equal(49);163    }164165    {166      const balance = await contract.methods.balanceOf(owner).call();167      expect(+balance).to.equal(151);168    }169  });170171  itWeb3('Can perform transfer()', async ({web3, api, privateKeyWrapper}) => {172    const alice = privateKeyWrapper('//Alice');173174    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;175176    const owner = createEthAccount(web3);177    await transferBalanceToEth(api, alice, owner);178179    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;180181    const receiver = createEthAccount(web3);182    await transferBalanceToEth(api, alice, receiver);183184    const address = tokenIdToAddress(collectionId, tokenId);185    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});186187    {188      const result = await contract.methods.transfer(receiver, 50).send({from: owner});189      const events = normalizeEvents(result.events);190      expect(events).to.be.deep.equal([191        {192          address,193          event: 'Transfer',194          args: {195            from: owner,196            to: receiver,197            value: '50',198          },199        },200      ]);201    }202203    {204      const balance = await contract.methods.balanceOf(owner).call();205      expect(+balance).to.equal(150);206    }207208    {209      const balance = await contract.methods.balanceOf(receiver).call();210      expect(+balance).to.equal(50);211    }212  });213214  itWeb3('Can perform repartition()', async ({web3, api, privateKeyWrapper}) => {215    const alice = privateKeyWrapper('//Alice');216217    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;218219    const owner = createEthAccount(web3);220    await transferBalanceToEth(api, alice, owner);221222    const receiver = createEthAccount(web3);223    await transferBalanceToEth(api, alice, receiver);224225    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {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.repartition(200).send({from: owner});231    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(200);232    await contract.methods.transfer(receiver, 110).send({from: owner});233    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(90);234    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(110);235    236    await expect(contract.methods.repartition(80).send({from: owner})).to.eventually.be.rejected;237238    await contract.methods.transfer(receiver, 90).send({from: owner});239    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(0);240    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(200);241242    const result = await contract.methods.repartition(150).send({from: receiver});243    console.log(result.events);244    await expect(contract.methods.transfer(owner, 160).send({from: receiver})).to.eventually.be.rejected;245    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(150);246  });247248  itWeb3('Can repartition with increased amount', async ({web3, api, privateKeyWrapper}) => {249    const alice = privateKeyWrapper('//Alice');250251    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;252253    const owner = createEthAccount(web3);254    await transferBalanceToEth(api, alice, owner);255256    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;257258    const address = tokenIdToAddress(collectionId, tokenId);259    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});260261    const result = await contract.methods.repartition(200).send();262    const events = normalizeEvents(result.events);263264    expect(events).to.include.deep.members([265      {266        address,267        event: 'Transfer',268        args: {269          from: '0x0000000000000000000000000000000000000000',270          to: owner,271          value: '100',272        },273      },274    ]);275  });276277  itWeb3('Can repartition with decreased amount', async ({web3, api, privateKeyWrapper}) => {278    const alice = privateKeyWrapper('//Alice');279280    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;281282    const owner = createEthAccount(web3);283    await transferBalanceToEth(api, alice, owner);284285    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;286287    const address = tokenIdToAddress(collectionId, tokenId);288    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});289290    const result = await contract.methods.repartition(50).send();291    const events = normalizeEvents(result.events);292293    expect(events).to.include.deep.members([294      {295        address,296        event: 'Transfer',297        args: {298          from: owner,299          to: '0x0000000000000000000000000000000000000000',300          value: '50',301        },302      },303    ]);304  });305});306307describe('Refungible: Fees', () => {308  itWeb3('approve() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {309    const alice = privateKeyWrapper('//Alice');310311    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;312313    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);314    const spender = createEthAccount(web3);315316    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;317318    const address = tokenIdToAddress(collectionId, tokenId);319    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});320321    const cost = await recordEthFee(api, owner, () => contract.methods.approve(spender, 100).send({from: owner}));322    expect(cost < BigInt(0.2 * Number(UNIQUE)));323  });324325  itWeb3('transferFrom() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {326    const alice = privateKeyWrapper('//Alice');327328    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;329330    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);331    const spender = await createEthAccountWithBalance(api, web3, privateKeyWrapper);332333    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;334335    const address = tokenIdToAddress(collectionId, tokenId);336    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});337338    await contract.methods.approve(spender, 100).send({from: owner});339340    const cost = await recordEthFee(api, spender, () => contract.methods.transferFrom(owner, spender, 100).send({from: spender}));341    expect(cost < BigInt(0.2 * Number(UNIQUE)));342  });343344  itWeb3('transfer() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {345    const alice = privateKeyWrapper('//Alice');346347    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;348349    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);350    const receiver = createEthAccount(web3);351352    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;353354    const address = tokenIdToAddress(collectionId, tokenId);355    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});356357    const cost = await recordEthFee(api, owner, () => contract.methods.transfer(receiver, 100).send({from: owner}));358    expect(cost < BigInt(0.2 * Number(UNIQUE)));359  });360});361362describe('Refungible: Substrate calls', () => {363  itWeb3('Events emitted for approve()', async ({web3, api, privateKeyWrapper}) => {364    const alice = privateKeyWrapper('//Alice');365366    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;367368    const receiver = createEthAccount(web3);369370    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;371372    const address = tokenIdToAddress(collectionId, tokenId);373    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);374375    const events = await recordEvents(contract, async () => {376      expect(await approve(api, collectionId, tokenId, alice, {Ethereum: receiver}, 100n)).to.be.true;377    });378379    expect(events).to.be.deep.equal([380      {381        address,382        event: 'Approval',383        args: {384          owner: subToEth(alice.address),385          spender: receiver,386          value: '100',387        },388      },389    ]);390  });391392  itWeb3('Events emitted for transferFrom()', async ({web3, api, privateKeyWrapper}) => {393    const alice = privateKeyWrapper('//Alice');394395    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;396    const bob = privateKeyWrapper('//Bob');397398    const receiver = createEthAccount(web3);399400    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;401    expect(await approve(api, collectionId, tokenId, alice, bob.address, 100n)).to.be.true;402403    const address = tokenIdToAddress(collectionId, tokenId);404    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);405406    const events = await recordEvents(contract, async () => {407      expect(await transferFrom(api, collectionId, tokenId, bob, alice, {Ethereum: receiver},  51n)).to.be.true;408    });409410    expect(events).to.be.deep.equal([411      {412        address,413        event: 'Transfer',414        args: {415          from: subToEth(alice.address),416          to: receiver,417          value: '51',418        },419      },420      {421        address,422        event: 'Approval',423        args: {424          owner: subToEth(alice.address),425          spender: subToEth(bob.address),426          value: '49',427        },428      },429    ]);430  });431432  itWeb3('Events emitted for transfer()', async ({web3, api, privateKeyWrapper}) => {433    const alice = privateKeyWrapper('//Alice');434435    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;436437    const receiver = createEthAccount(web3);438439    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;440441    const address = tokenIdToAddress(collectionId, tokenId);442    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);443444    const events = await recordEvents(contract, async () => {445      expect(await transfer(api, collectionId, tokenId, alice, {Ethereum: receiver},  51n)).to.be.true;446    });447448    expect(events).to.be.deep.equal([449      {450        address,451        event: 'Transfer',452        args: {453          from: subToEth(alice.address),454          to: receiver,455          value: '51',456        },457      },458    ]);459  });460});
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  });5859  itWeb3('decimals', async ({api, web3, privateKeyWrapper}) => {60    const alice = privateKeyWrapper('//Alice');6162    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;6364    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);6566    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;6768    const address = tokenIdToAddress(collectionId, tokenId);69    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});70    const decimals = await contract.methods.decimals().call();7172    expect(decimals).to.equal('0');73  });74});7576describe('Refungible: Plain calls', () => {77  itWeb3('Can perform approve()', async ({web3, api, privateKeyWrapper}) => {78    const alice = privateKeyWrapper('//Alice');7980    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;8182    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);8384    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;8586    const address = tokenIdToAddress(collectionId, tokenId);8788    const spender = createEthAccount(web3);8990    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});9192    {93      const result = await contract.methods.approve(spender, 100).send({from: owner});94      const events = normalizeEvents(result.events);9596      expect(events).to.be.deep.equal([97        {98          address,99          event: 'Approval',100          args: {101            owner,102            spender,103            value: '100',104          },105        },106      ]);107    }108109    {110      const allowance = await contract.methods.allowance(owner, spender).call();111      expect(+allowance).to.equal(100);112    }113  });114115  itWeb3('Can perform transferFrom()', async ({web3, api, privateKeyWrapper}) => {116    const alice = privateKeyWrapper('//Alice');117118    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;119120    const owner = createEthAccount(web3);121    await transferBalanceToEth(api, alice, owner);122123    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;124125    const spender = createEthAccount(web3);126    await transferBalanceToEth(api, alice, spender);127128    const receiver = createEthAccount(web3);129130    const address = tokenIdToAddress(collectionId, tokenId);131    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});132133    await contract.methods.approve(spender, 100).send();134135    {136      const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});137      const events = normalizeEvents(result.events);138      expect(events).to.be.deep.equal([139        {140          address,141          event: 'Transfer',142          args: {143            from: owner,144            to: receiver,145            value: '49',146          },147        },148        {149          address,150          event: 'Approval',151          args: {152            owner,153            spender,154            value: '51',155          },156        },157      ]);158    }159160    {161      const balance = await contract.methods.balanceOf(receiver).call();162      expect(+balance).to.equal(49);163    }164165    {166      const balance = await contract.methods.balanceOf(owner).call();167      expect(+balance).to.equal(151);168    }169  });170171  itWeb3('Can perform transfer()', async ({web3, api, privateKeyWrapper}) => {172    const alice = privateKeyWrapper('//Alice');173174    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;175176    const owner = createEthAccount(web3);177    await transferBalanceToEth(api, alice, owner);178179    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;180181    const receiver = createEthAccount(web3);182    await transferBalanceToEth(api, alice, receiver);183184    const address = tokenIdToAddress(collectionId, tokenId);185    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});186187    {188      const result = await contract.methods.transfer(receiver, 50).send({from: owner});189      const events = normalizeEvents(result.events);190      expect(events).to.be.deep.equal([191        {192          address,193          event: 'Transfer',194          args: {195            from: owner,196            to: receiver,197            value: '50',198          },199        },200      ]);201    }202203    {204      const balance = await contract.methods.balanceOf(owner).call();205      expect(+balance).to.equal(150);206    }207208    {209      const balance = await contract.methods.balanceOf(receiver).call();210      expect(+balance).to.equal(50);211    }212  });213214  itWeb3('Can perform repartition()', async ({web3, api, privateKeyWrapper}) => {215    const alice = privateKeyWrapper('//Alice');216217    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;218219    const owner = createEthAccount(web3);220    await transferBalanceToEth(api, alice, owner);221222    const receiver = createEthAccount(web3);223    await transferBalanceToEth(api, alice, receiver);224225    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {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.repartition(200).send({from: owner});231    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(200);232    await contract.methods.transfer(receiver, 110).send({from: owner});233    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(90);234    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(110);235    236    await expect(contract.methods.repartition(80).send({from: owner})).to.eventually.be.rejected;237238    await contract.methods.transfer(receiver, 90).send({from: owner});239    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(0);240    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(200);241242    await contract.methods.repartition(150).send({from: receiver});243    await expect(contract.methods.transfer(owner, 160).send({from: receiver})).to.eventually.be.rejected;244    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(150);245  });246247  itWeb3('Can repartition with increased amount', async ({web3, api, privateKeyWrapper}) => {248    const alice = privateKeyWrapper('//Alice');249250    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;251252    const owner = createEthAccount(web3);253    await transferBalanceToEth(api, alice, owner);254255    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;256257    const address = tokenIdToAddress(collectionId, tokenId);258    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});259260    const result = await contract.methods.repartition(200).send();261    const events = normalizeEvents(result.events);262263    expect(events).to.deep.equal([264      {265        address,266        event: 'Transfer',267        args: {268          from: '0x0000000000000000000000000000000000000000',269          to: owner,270          value: '100',271        },272      },273    ]);274  });275276  itWeb3('Can repartition with decreased amount', async ({web3, api, privateKeyWrapper}) => {277    const alice = privateKeyWrapper('//Alice');278279    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;280281    const owner = createEthAccount(web3);282    await transferBalanceToEth(api, alice, owner);283284    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;285286    const address = tokenIdToAddress(collectionId, tokenId);287    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});288289    const result = await contract.methods.repartition(50).send();290    const events = normalizeEvents(result.events);291    expect(events).to.deep.equal([292      {293        address,294        event: 'Transfer',295        args: {296          from: owner,297          to: '0x0000000000000000000000000000000000000000',298          value: '50',299        },300      },301    ]);302  });303});304305describe('Refungible: Fees', () => {306  itWeb3('approve() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {307    const alice = privateKeyWrapper('//Alice');308309    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;310311    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);312    const spender = createEthAccount(web3);313314    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;315316    const address = tokenIdToAddress(collectionId, tokenId);317    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});318319    const cost = await recordEthFee(api, owner, () => contract.methods.approve(spender, 100).send({from: owner}));320    expect(cost < BigInt(0.2 * Number(UNIQUE)));321  });322323  itWeb3('transferFrom() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {324    const alice = privateKeyWrapper('//Alice');325326    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;327328    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);329    const spender = await createEthAccountWithBalance(api, web3, privateKeyWrapper);330331    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;332333    const address = tokenIdToAddress(collectionId, tokenId);334    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});335336    await contract.methods.approve(spender, 100).send({from: owner});337338    const cost = await recordEthFee(api, spender, () => contract.methods.transferFrom(owner, spender, 100).send({from: spender}));339    expect(cost < BigInt(0.2 * Number(UNIQUE)));340  });341342  itWeb3('transfer() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {343    const alice = privateKeyWrapper('//Alice');344345    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;346347    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);348    const receiver = createEthAccount(web3);349350    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;351352    const address = tokenIdToAddress(collectionId, tokenId);353    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});354355    const cost = await recordEthFee(api, owner, () => contract.methods.transfer(receiver, 100).send({from: owner}));356    expect(cost < BigInt(0.2 * Number(UNIQUE)));357  });358});359360describe('Refungible: Substrate calls', () => {361  itWeb3('Events emitted for approve()', async ({web3, api, privateKeyWrapper}) => {362    const alice = privateKeyWrapper('//Alice');363364    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;365366    const receiver = createEthAccount(web3);367368    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;369370    const address = tokenIdToAddress(collectionId, tokenId);371    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);372373    const events = await recordEvents(contract, async () => {374      expect(await approve(api, collectionId, tokenId, alice, {Ethereum: receiver}, 100n)).to.be.true;375    });376377    expect(events).to.be.deep.equal([378      {379        address,380        event: 'Approval',381        args: {382          owner: subToEth(alice.address),383          spender: receiver,384          value: '100',385        },386      },387    ]);388  });389390  itWeb3('Events emitted for transferFrom()', async ({web3, api, privateKeyWrapper}) => {391    const alice = privateKeyWrapper('//Alice');392393    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;394    const bob = privateKeyWrapper('//Bob');395396    const receiver = createEthAccount(web3);397398    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;399    expect(await approve(api, collectionId, tokenId, alice, bob.address, 100n)).to.be.true;400401    const address = tokenIdToAddress(collectionId, tokenId);402    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);403404    const events = await recordEvents(contract, async () => {405      expect(await transferFrom(api, collectionId, tokenId, bob, alice, {Ethereum: receiver},  51n)).to.be.true;406    });407408    expect(events).to.be.deep.equal([409      {410        address,411        event: 'Transfer',412        args: {413          from: subToEth(alice.address),414          to: receiver,415          value: '51',416        },417      },418      {419        address,420        event: 'Approval',421        args: {422          owner: subToEth(alice.address),423          spender: subToEth(bob.address),424          value: '49',425        },426      },427    ]);428  });429430  itWeb3('Events emitted for transfer()', async ({web3, api, privateKeyWrapper}) => {431    const alice = privateKeyWrapper('//Alice');432433    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;434435    const receiver = createEthAccount(web3);436437    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;438439    const address = tokenIdToAddress(collectionId, tokenId);440    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);441442    const events = await recordEvents(contract, async () => {443      expect(await transfer(api, collectionId, tokenId, alice, {Ethereum: receiver},  51n)).to.be.true;444    });445446    expect(events).to.be.deep.equal([447      {448        address,449        event: 'Transfer',450        args: {451          from: subToEth(alice.address),452          to: receiver,453          value: '51',454        },455      },456    ]);457  });458});