1import {addToAllowListExpectSuccess, confirmSponsorshipExpectSuccess, createCollectionExpectSuccess, enablePublicMintingExpectSuccess, getDetailedCollectionInfo, setCollectionSponsorExpectSuccess, UNIQUE} 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 42 43 44 45 46 47 48 4950 51 52 53 54 55 56 57 58 59 60 6162 itWeb3('Remove sponsor', async ({api, web3, privateKeyWrapper}) => {63 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);64 const collectionHelpers = evmCollectionHelpers(web3, owner);65 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * UNIQUE)});66 const {collectionIdAddress} = await getCollectionAddressFromResult(api, result);67 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);68 const collectionEvm = evmCollection(web3, owner, collectionIdAddress);6970 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;71 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});72 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.true;73 74 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});75 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;76 77 await collectionEvm.methods.removeCollectionSponsor().send({from: owner});78 79 const sponsorTuple = await collectionEvm.methods.collectionSponsor().call({from: owner});80 expect(sponsorTuple.field_0).to.be.eq('0x0000000000000000000000000000000000000000');81 });8283 itWeb3('Sponsoring collection from evm address via access list', async ({api, web3, privateKeyWrapper}) => {84 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);85 const collectionHelpers = evmCollectionHelpers(web3, owner);86 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * UNIQUE)});87 const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);88 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);89 const collectionEvm = evmCollection(web3, owner, collectionIdAddress);90 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});91 let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;92 const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format;93 expect(collectionSub.sponsorship.isUnconfirmed).to.be.true;94 expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));95 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');9697 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});98 collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;99 expect(collectionSub.sponsorship.isConfirmed).to.be.true;100 expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));101102 const user = createEthAccount(web3);103 const nextTokenId = await collectionEvm.methods.nextTokenId().call();104 expect(nextTokenId).to.be.equal('1');105106 const oldPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();107 expect(oldPermissions.mintMode).to.be.false;108 expect(oldPermissions.access).to.be.equal('Normal');109110 await collectionEvm.methods.setCollectionAccess(1 ).send({from: owner});111 await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});112 await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});113114 const newPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();115 expect(newPermissions.mintMode).to.be.true;116 expect(newPermissions.access).to.be.equal('AllowList');117118 const ownerBalanceBefore = await ethBalanceViaSub(api, owner);119 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);120121 {122 const nextTokenId = await collectionEvm.methods.nextTokenId().call();123 expect(nextTokenId).to.be.equal('1');124 const result = await collectionEvm.methods.mintWithTokenURI(125 user,126 nextTokenId,127 'Test URI',128 ).send({from: user});129 const events = normalizeEvents(result.events);130131 expect(events).to.be.deep.equal([132 {133 address: collectionIdAddress,134 event: 'Transfer',135 args: {136 from: '0x0000000000000000000000000000000000000000',137 to: user,138 tokenId: nextTokenId,139 },140 },141 ]);142143 const ownerBalanceAfter = await ethBalanceViaSub(api, owner);144 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);145146 expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');147 expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);148 expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;149 }150 });151152 153 154 155 156 157 158 159 160161 162 163 164 165 166 167 168 169170 171 172 173174 175 176177 178 179 180 181 182 183 184 185 186187 188 189 190 191 192 193 194 195 196 197 198199 200 201202 203 204 205 206 207208 itWeb3('Check that transaction via EVM spend money from sponsor address', async ({api, web3, privateKeyWrapper}) => {209 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);210 const collectionHelpers = evmCollectionHelpers(web3, owner);211 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * UNIQUE)});212 const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);213 const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);214 const collectionEvm = evmCollection(web3, owner, collectionIdAddress);215 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();216 let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;217 const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format;218 expect(collectionSub.sponsorship.isUnconfirmed).to.be.true;219 expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));220 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');221 const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress);222 await sponsorCollection.methods.confirmCollectionSponsorship().send();223 collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;224 expect(collectionSub.sponsorship.isConfirmed).to.be.true;225 expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));226227 const user = createEthAccount(web3);228 await collectionEvm.methods.addCollectionAdmin(user).send();229 230 const ownerBalanceBefore = await ethBalanceViaSub(api, owner);231 const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);232 233 234 const userCollectionEvm = evmCollection(web3, user, collectionIdAddress);235 const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();236 expect(nextTokenId).to.be.equal('1');237 result = await userCollectionEvm.methods.mintWithTokenURI(238 user,239 nextTokenId,240 'Test URI',241 ).send();242243 const events = normalizeEvents(result.events);244 const address = collectionIdToAddress(collectionId);245246 expect(events).to.be.deep.equal([247 {248 address,249 event: 'Transfer',250 args: {251 from: '0x0000000000000000000000000000000000000000',252 to: user,253 tokenId: nextTokenId,254 },255 },256 ]);257 expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');258 259 const ownerBalanceAfter = await ethBalanceViaSub(api, owner);260 expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);261 const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);262 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;263 });264});