difftreelog
integration tests for erc20
in: master
1 file changed
tests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth1// 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});