difftreelog
tests(eth-rft): fix double contract event checking
in: master
1 file changed
tests/src/eth/reFungible.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 {Pallets, requirePalletsOrSkip} from '../util';18import {expect, itEth, usingEthPlaygrounds} from './util';19import {IKeyringPair} from '@polkadot/types/types';2021describe('Refungible: Information getting', () => {22 let donor: IKeyringPair;2324 before(async function() {25 await usingEthPlaygrounds(async (helper, privateKey) => {26 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);2728 donor = await privateKey({filename: __filename});29 });30 });3132 itEth('totalSupply', async ({helper}) => {33 const caller = await helper.eth.createAccountWithBalance(donor);34 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'TotalSupply', '6', '6');35 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);3637 await contract.methods.mint(caller).send();3839 const totalSupply = await contract.methods.totalSupply().call();40 expect(totalSupply).to.equal('1');41 });4243 itEth('balanceOf', async ({helper}) => {44 const caller = await helper.eth.createAccountWithBalance(donor);45 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'BalanceOf', '6', '6');46 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);4748 await contract.methods.mint(caller).send();49 await contract.methods.mint(caller).send();50 await contract.methods.mint(caller).send();5152 const balance = await contract.methods.balanceOf(caller).call();53 expect(balance).to.equal('3');54 });5556 itEth('ownerOf', async ({helper}) => {57 const caller = await helper.eth.createAccountWithBalance(donor);58 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'OwnerOf', '6', '6');59 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);6061 const result = await contract.methods.mint(caller).send();62 const tokenId = result.events.Transfer.returnValues.tokenId;6364 const owner = await contract.methods.ownerOf(tokenId).call();65 expect(owner).to.equal(caller);66 });6768 itEth('ownerOf after burn', async ({helper}) => {69 const caller = await helper.eth.createAccountWithBalance(donor);70 const receiver = helper.eth.createAccount();71 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'OwnerOf-AfterBurn', '6', '6');72 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);7374 const result = await contract.methods.mint(caller).send();75 const tokenId = result.events.Transfer.returnValues.tokenId;76 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);7778 await tokenContract.methods.repartition(2).send();79 await tokenContract.methods.transfer(receiver, 1).send();8081 await tokenContract.methods.burnFrom(caller, 1).send();8283 const owner = await contract.methods.ownerOf(tokenId).call();84 expect(owner).to.equal(receiver);85 });8687 itEth('ownerOf for partial ownership', async ({helper}) => {88 const caller = await helper.eth.createAccountWithBalance(donor);89 const receiver = helper.eth.createAccount();90 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Partial-OwnerOf', '6', '6');91 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);9293 const result = await contract.methods.mint(caller).send();94 const tokenId = result.events.Transfer.returnValues.tokenId;95 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);9697 await tokenContract.methods.repartition(2).send();98 await tokenContract.methods.transfer(receiver, 1).send();99100 const owner = await contract.methods.ownerOf(tokenId).call();101 expect(owner).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');102 });103});104105describe('Refungible: Plain calls', () => {106 let donor: IKeyringPair;107108 before(async function() {109 await usingEthPlaygrounds(async (helper, privateKey) => {110 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);111112 donor = await privateKey({filename: __filename});113 });114 });115116 itEth('Can perform mint()', async ({helper}) => {117 const owner = await helper.eth.createAccountWithBalance(donor);118 const receiver = helper.eth.createAccount();119 const {collectionAddress} = await helper.eth.createERC721MetadataCompatibleRFTCollection(owner, 'Minty', '6', '6', '');120 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);121122 const result = await contract.methods.mintWithTokenURI(receiver, 'Test URI').send();123124 const event = result.events.Transfer;125 expect(event.address).to.equal(collectionAddress);126 expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');127 expect(event.returnValues.to).to.equal(receiver);128 const tokenId = event.returnValues.tokenId;129 expect(tokenId).to.be.equal('1');130131 expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');132 });133134 itEth.skip('Can perform mintBulk()', async ({helper}) => {135 const owner = await helper.eth.createAccountWithBalance(donor);136 const receiver = helper.eth.createAccount();137 const {collectionAddress} = await helper.eth.createERC721MetadataCompatibleRFTCollection(owner, 'MintBulky', '6', '6', '');138 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', owner);139140 {141 const nextTokenId = await contract.methods.nextTokenId().call();142 expect(nextTokenId).to.be.equal('1');143 const result = await contract.methods.mintBulkWithTokenURI(144 receiver,145 [146 [nextTokenId, 'Test URI 0'],147 [+nextTokenId + 1, 'Test URI 1'],148 [+nextTokenId + 2, 'Test URI 2'],149 ],150 ).send();151152 const events = result.events.Transfer;153 for (let i = 0; i < 2; i++) {154 const event = events[i];155 expect(event.address).to.equal(collectionAddress);156 expect(event.returnValues.from).to.equal('0x0000000000000000000000000000000000000000');157 expect(event.returnValues.to).to.equal(receiver);158 expect(event.returnValues.tokenId).to.equal(String(+nextTokenId + i));159 }160161 expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI 0');162 expect(await contract.methods.tokenURI(+nextTokenId + 1).call()).to.be.equal('Test URI 1');163 expect(await contract.methods.tokenURI(+nextTokenId + 2).call()).to.be.equal('Test URI 2');164 }165 });166167 itEth('Can perform burn()', async ({helper}) => {168 const caller = await helper.eth.createAccountWithBalance(donor);169 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Burny', '6', '6');170 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);171172 const result = await contract.methods.mint(caller).send();173 const tokenId = result.events.Transfer.returnValues.tokenId;174 {175 const result = await contract.methods.burn(tokenId).send();176 const event = result.events.Transfer;177 expect(event.address).to.equal(collectionAddress);178 expect(event.returnValues.from).to.equal(caller);179 expect(event.returnValues.to).to.equal('0x0000000000000000000000000000000000000000');180 expect(event.returnValues.tokenId).to.equal(tokenId.toString());181 }182 });183184 itEth('Can perform transferFrom()', async ({helper}) => {185 const caller = await helper.eth.createAccountWithBalance(donor);186 const receiver = helper.eth.createAccount();187 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'TransferFromy', '6', '6');188 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);189190 const result = await contract.methods.mint(caller).send();191 const tokenId = result.events.Transfer.returnValues.tokenId;192193 const tokenAddress = helper.ethAddress.fromTokenId(collectionId, tokenId);194195 const tokenContract = helper.ethNativeContract.rftToken(tokenAddress, caller);196 await tokenContract.methods.repartition(15).send();197198 {199 const tokenEvents: any = [];200 tokenContract.events.allEvents((_: any, event: any) => {201 tokenEvents.push(event);202 });203 const result = await contract.methods.transferFrom(caller, receiver, tokenId).send();204205 let event = result.events.Transfer;206 expect(event.address).to.equal(collectionAddress);207 expect(event.returnValues.from).to.equal(caller);208 expect(event.returnValues.to).to.equal(receiver);209 expect(event.returnValues.tokenId).to.equal(tokenId.toString());210211 event = tokenEvents[0];212 expect(event.address).to.equal(tokenAddress);213 expect(event.returnValues.from).to.equal(caller);214 expect(event.returnValues.to).to.equal(receiver);215 expect(event.returnValues.value).to.equal('15');216 }217218 {219 const balance = await contract.methods.balanceOf(receiver).call();220 expect(+balance).to.equal(1);221 }222223 {224 const balance = await contract.methods.balanceOf(caller).call();225 expect(+balance).to.equal(0);226 }227 });228229 itEth('Can perform transfer()', async ({helper}) => {230 const caller = await helper.eth.createAccountWithBalance(donor);231 const receiver = helper.eth.createAccount();232 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry', '6', '6');233 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);234235 const result = await contract.methods.mint(caller).send();236 const tokenId = result.events.Transfer.returnValues.tokenId;237238 {239 const result = await contract.methods.transfer(receiver, tokenId).send();240241 const event = result.events.Transfer;242 expect(event.address).to.equal(collectionAddress);243 expect(event.returnValues.from).to.equal(caller);244 expect(event.returnValues.to).to.equal(receiver);245 expect(event.returnValues.tokenId).to.equal(tokenId.toString());246 }247248 {249 const balance = await contract.methods.balanceOf(caller).call();250 expect(+balance).to.equal(0);251 }252253 {254 const balance = await contract.methods.balanceOf(receiver).call();255 expect(+balance).to.equal(1);256 }257 });258259 itEth('transfer event on transfer from partial ownership to full ownership', async ({helper}) => {260 const caller = await helper.eth.createAccountWithBalance(donor);261 const receiver = helper.eth.createAccount();262 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry-Partial-to-Full', '6', '6');263 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);264265 const result = await contract.methods.mint(caller).send();266 const tokenId = result.events.Transfer.returnValues.tokenId;267268 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);269270 await tokenContract.methods.repartition(2).send();271 await tokenContract.methods.transfer(receiver, 1).send();272273 const events: any = [];274 contract.events.allEvents((_: any, event: any) => {275 events.push(event);276 });277278 await tokenContract.methods.transfer(receiver, 1).send();279 if (events.length == 0) await helper.wait.newBlocks(1);280 const event = events[0];281282 expect(event.address).to.equal(collectionAddress);283 expect(event.returnValues.from).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');284 expect(event.returnValues.to).to.equal(receiver);285 expect(event.returnValues.tokenId).to.equal(tokenId.toString());286 });287288 itEth('transfer event on transfer from full ownership to partial ownership', async ({helper}) => {289 const caller = await helper.eth.createAccountWithBalance(donor);290 const receiver = helper.eth.createAccount();291 const {collectionId, collectionAddress} = await helper.eth.createRFTCollection(caller, 'Transferry-Full-to-Partial', '6', '6');292 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);293294 const result = await contract.methods.mint(caller).send();295 const tokenId = result.events.Transfer.returnValues.tokenId;296297 const tokenContract = helper.ethNativeContract.rftTokenById(collectionId, tokenId, caller);298299 await tokenContract.methods.repartition(2).send();300301 const events: any = [];302 contract.events.allEvents((_: any, event: any) => {303 events.push(event);304 });305306 await tokenContract.methods.transfer(receiver, 1).send();307 if (events.length == 0) await helper.wait.newBlocks(1);308 const event = events[0];309310 expect(event.address).to.equal(collectionAddress);311 expect(event.returnValues.from).to.equal(caller);312 expect(event.returnValues.to).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');313 expect(event.returnValues.tokenId).to.equal(tokenId.toString());314 });315});316317describe('RFT: Fees', () => {318 let donor: IKeyringPair;319320 before(async function() {321 await usingEthPlaygrounds(async (helper, privateKey) => {322 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);323324 donor = await privateKey({filename: __filename});325 });326 });327328 itEth('transferFrom() call fee is less than 0.2UNQ', async ({helper}) => {329 const caller = await helper.eth.createAccountWithBalance(donor);330 const receiver = helper.eth.createAccount();331 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Feeful-Transfer-From', '6', '6');332 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);333334 const result = await contract.methods.mint(caller).send();335 const tokenId = result.events.Transfer.returnValues.tokenId;336337 const cost = await helper.eth.recordCallFee(caller, () => contract.methods.transferFrom(caller, receiver, tokenId).send());338 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));339 expect(cost > 0n);340 });341342 itEth('transfer() call fee is less than 0.2UNQ', async ({helper}) => {343 const caller = await helper.eth.createAccountWithBalance(donor);344 const receiver = helper.eth.createAccount();345 const {collectionAddress} = await helper.eth.createRFTCollection(caller, 'Feeful-Transfer', '6', '6');346 const contract = helper.ethNativeContract.collection(collectionAddress, 'rft', caller);347348 const result = await contract.methods.mint(caller).send();349 const tokenId = result.events.Transfer.returnValues.tokenId;350351 const cost = await helper.eth.recordCallFee(caller, () => contract.methods.transfer(receiver, tokenId).send());352 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));353 expect(cost > 0n);354 });355});356357describe('Common metadata', () => {358 let donor: IKeyringPair;359 let alice: IKeyringPair;360361 before(async function() {362 await usingEthPlaygrounds(async (helper, privateKey) => {363 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);364365 donor = await privateKey({filename: __filename});366 [alice] = await helper.arrange.createAccounts([20n], donor);367 });368 });369370 itEth('Returns collection name', async ({helper}) => {371 const caller = helper.eth.createAccount();372 const tokenPropertyPermissions = [{373 key: 'URI',374 permission: {375 mutable: true,376 collectionAdmin: true,377 tokenOwner: false,378 },379 }];380 const collection = await helper.rft.mintCollection(381 alice,382 {383 name: 'Leviathan',384 tokenPrefix: '11',385 properties: [{key: 'ERC721Metadata', value: '1'}],386 tokenPropertyPermissions,387 },388 );389390 const contract = helper.ethNativeContract.collectionById(collection.collectionId, 'rft', caller);391 const name = await contract.methods.name().call();392 expect(name).to.equal('Leviathan');393 });394395 itEth('Returns symbol name', async ({helper}) => {396 const caller = await helper.eth.createAccountWithBalance(donor);397 const tokenPropertyPermissions = [{398 key: 'URI',399 permission: {400 mutable: true,401 collectionAdmin: true,402 tokenOwner: false,403 },404 }];405 const {collectionId} = await helper.rft.mintCollection(406 alice,407 {408 name: 'Leviathan',409 tokenPrefix: '12',410 properties: [{key: 'ERC721Metadata', value: '1'}],411 tokenPropertyPermissions,412 },413 );414415 const contract = helper.ethNativeContract.collectionById(collectionId, 'rft', caller);416 const symbol = await contract.methods.symbol().call();417 expect(symbol).to.equal('12');418 });419});