1import {addToAllowListExpectSuccess, confirmSponsorshipExpectSuccess, createCollectionExpectSuccess, enablePublicMintingExpectSuccess, getDetailedCollectionInfo, setCollectionSponsorExpectSuccess} from '../util/helpers';2import {itWeb3, createEthAccount, collectionIdToAddress, GAS_ARGS, normalizeEvents, createEthAccountWithBalance, evmCollectionHelpers, getCollectionAddressFromResult, evmCollection, ethBalanceViaSub} from './util/helpers';3import nonFungibleAbi from './nonFungibleAbi.json';4import {expect} from 'chai';5import {evmToAddress} from '@polkadot/util-crypto';67describe('evm collection sponsoring', () => {8 itWeb3('sponsors mint transactions', async ({web3, privateKeyWrapper}) => {9 const alice = privateKeyWrapper('//Alice');1011 const collection = await createCollectionExpectSuccess();12 await setCollectionSponsorExpectSuccess(collection, alice.address);13 await confirmSponsorshipExpectSuccess(collection);1415 const minter = createEthAccount(web3);16 expect(await web3.eth.getBalance(minter)).to.equal('0');1718 const address = collectionIdToAddress(collection);19 const contract = new web3.eth.Contract(nonFungibleAbi as any, collectionIdToAddress(collection), {from: minter, ...GAS_ARGS});2021 await enablePublicMintingExpectSuccess(alice, collection);22 await addToAllowListExpectSuccess(alice, collection, {Ethereum: minter});2324 const nextTokenId = await contract.methods.nextTokenId().call();25 expect(nextTokenId).to.equal('1');26 const result = await contract.methods.mint(minter, nextTokenId).send();27 const events = normalizeEvents(result.events);28 expect(events).to.be.deep.equal([29 {30 address,31 event: 'Transfer',32 args: {33 from: '0x0000000000000000000000000000000000000000',34 to: minter,35 tokenId: nextTokenId,36 },37 },38 ]);39 });4041 itWeb3('Sponsoring collection from evm address via access list', async ({api, web3, privateKeyWrapper}) => {42 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);43 const collectionHelpers = evmCollectionHelpers(web3, owner);44 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();45 const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);46 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);47 const collectionEvm = evmCollection(web3, owner, collectionIdAddress);48 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});49 let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;50 const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format;51 expect(collectionSub.sponsorship.isUnconfirmed).to.be.true;52 expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));53 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');5455 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});56 collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;57 expect(collectionSub.sponsorship.isConfirmed).to.be.true;58 expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));5960 const user = createEthAccount(web3);61 const nextTokenId = await collectionEvm.methods.nextTokenId().call();62 expect(nextTokenId).to.be.equal('1');6364 const oldPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();65 expect(oldPermissions.mintMode).to.be.false;66 expect(oldPermissions.access).to.be.equal('Normal');6768 await collectionEvm.methods.setCollectionAccess(1 ).send({from: owner});69 await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});70 await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});7172 const newPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();73 expect(newPermissions.mintMode).to.be.true;74 expect(newPermissions.access).to.be.equal('AllowList');7576 const ownerBalanceBefore = await ethBalanceViaSub(api, owner);77 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);7879 {80 const nextTokenId = await collectionEvm.methods.nextTokenId().call();81 expect(nextTokenId).to.be.equal('1');82 const result = await collectionEvm.methods.mintWithTokenURI(83 user,84 nextTokenId,85 'Test URI',86 ).send({from: user});87 const events = normalizeEvents(result.events);8889 expect(events).to.be.deep.equal([90 {91 address: collectionIdAddress,92 event: 'Transfer',93 args: {94 from: '0x0000000000000000000000000000000000000000',95 to: user,96 tokenId: nextTokenId,97 },98 },99 ]);100101 const ownerBalanceAfter = await ethBalanceViaSub(api, owner);102 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);103104 expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');105 expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);106 expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;107 }108 });109110 itWeb3('Check that transaction via EVM spend money from sponsor address', async ({api, web3, privateKeyWrapper}) => {111 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);112 const collectionHelpers = evmCollectionHelpers(web3, owner);113 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();114 const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);115 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);116 const collectionEvm = evmCollection(web3, owner, collectionIdAddress);117 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();118 let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;119 const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format;120 expect(collectionSub.sponsorship.isUnconfirmed).to.be.true;121 expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));122 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');123 const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress);124 await sponsorCollection.methods.confirmCollectionSponsorship().send();125 collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;126 expect(collectionSub.sponsorship.isConfirmed).to.be.true;127 expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));128129 const user = createEthAccount(web3);130 await collectionEvm.methods.addCollectionAdmin(user).send();131 132 const ownerBalanceBefore = await ethBalanceViaSub(api, owner);133 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);134 135 136 const userCollectionEvm = evmCollection(web3, user, collectionIdAddress);137 const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();138 expect(nextTokenId).to.be.equal('1');139 result = await userCollectionEvm.methods.mintWithTokenURI(140 user,141 nextTokenId,142 'Test URI',143 ).send();144145 const events = normalizeEvents(result.events);146 const address = collectionIdToAddress(collectionId);147148 expect(events).to.be.deep.equal([149 {150 address,151 event: 'Transfer',152 args: {153 from: '0x0000000000000000000000000000000000000000',154 to: user,155 tokenId: nextTokenId,156 },157 },158 ]);159 expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');160 161 const ownerBalanceAfter = await ethBalanceViaSub(api, owner);162 expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);163 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);164 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;165 });166});