1import {usingPlaygrounds} from './../util/playgrounds/index';2import {IKeyringPair} from '@polkadot/types/types';3import {normalizeEvents} from './util/helpers';4import {itEth, expect} from '../eth/util/playgrounds';56describe('evm collection sponsoring', () => {7 let donor: IKeyringPair;8 let alice: IKeyringPair;9 let nominal: bigint;1011 before(async () => {12 await usingPlaygrounds(async (helper, privateKey) => {13 donor = privateKey('//Alice');14 nominal = helper.balance.getOneTokenNominal();15 });16 });1718 beforeEach(async () => {19 await usingPlaygrounds(async (helper) => {20 [alice] = await helper.arrange.createAccounts([1000n], donor);21 });22 });2324 itEth('sponsors mint transactions', async ({helper}) => {25 const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'spnr', permissions: {mintMode: true}});26 await collection.setSponsor(alice, alice.address);27 await collection.confirmSponsorship(alice);2829 const minter = helper.eth.createAccount();30 expect(await helper.balance.getEthereum(minter)).to.equal(0n);3132 const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);33 const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', minter);3435 await collection.addToAllowList(alice, {Ethereum: minter});3637 const nextTokenId = await contract.methods.nextTokenId().call();38 expect(nextTokenId).to.equal('1');39 const result = await contract.methods.mint(minter, nextTokenId).send();40 const events = normalizeEvents(result.events);41 expect(events).to.be.deep.equal([42 {43 address: collectionAddress,44 event: 'Transfer',45 args: {46 from: '0x0000000000000000000000000000000000000000',47 to: minter,48 tokenId: nextTokenId,49 },50 },51 ]);52 });5354 55 56 57 58 59 60 61 6263 64 65 66 67 68 69 70 71 72 73 7475 itEth('Remove sponsor', async ({helper}) => {76 const owner = await helper.eth.createAccountWithBalance(donor);77 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);7879 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});80 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);81 const sponsor = await helper.eth.createAccountWithBalance(donor);82 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);8384 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;85 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});86 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.true;87 88 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});89 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;90 91 await collectionEvm.methods.removeCollectionSponsor().send({from: owner});92 93 const sponsorTuple = await collectionEvm.methods.collectionSponsor().call({from: owner});94 expect(sponsorTuple.field_0).to.be.eq('0x0000000000000000000000000000000000000000');95 });9697 itEth('Sponsoring collection from evm address via access list', async ({helper, privateKey}) => {98 const owner = await helper.eth.createAccountWithBalance(donor);99 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);100101 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});102 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);103 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);104 const collection = helper.nft.getCollectionObject(collectionId);105 const sponsor = await helper.eth.createAccountWithBalance(donor);106 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);107108 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});109 let collectionData = (await collection.getData())!;110 const ss58Format = helper.chain.getChainProperties().ss58Format;111 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));112 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');113114 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});115 collectionData = (await collection.getData())!;116 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));117118 const user = helper.eth.createAccount();119 const nextTokenId = await collectionEvm.methods.nextTokenId().call();120 expect(nextTokenId).to.be.equal('1');121122 const oldPermissions = (await collection.getData())!.raw.permissions; 123 expect(oldPermissions.mintMode).to.be.false;124 expect(oldPermissions.access).to.be.equal('Normal');125126 await collectionEvm.methods.setCollectionAccess(1 ).send({from: owner});127 await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});128 await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});129130 const newPermissions = (await collection.getData())!.raw.permissions; 131 expect(newPermissions.mintMode).to.be.true;132 expect(newPermissions.access).to.be.equal('AllowList');133134 const ownerBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));135 const sponsorBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));136137 {138 const nextTokenId = await collectionEvm.methods.nextTokenId().call();139 expect(nextTokenId).to.be.equal('1');140 const result = await collectionEvm.methods.mintWithTokenURI(141 user,142 nextTokenId,143 'Test URI',144 ).send({from: user});145 const events = normalizeEvents(result.events);146147 expect(events).to.be.deep.equal([148 {149 address: collectionIdAddress,150 event: 'Transfer',151 args: {152 from: '0x0000000000000000000000000000000000000000',153 to: user,154 tokenId: nextTokenId,155 },156 },157 ]);158159 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));160 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));161162 expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');163 expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);164 expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;165 }166 });167168 169 170 171 172 173 174 175 176177 178 179 180 181 182 183 184 185186 187 188 189190 191 192193 194 195 196 197 198 199 200 201 202203 204 205 206 207 208 209 210 211 212 213 214215 216 217218 219 220 221 222 223224 itEth('Check that transaction via EVM spend money from sponsor address', async ({helper, privateKey}) => {225 const owner = await helper.eth.createAccountWithBalance(donor);226 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);227228 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});229 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);230 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);231 const collection = helper.nft.getCollectionObject(collectionId);232 const sponsor = await helper.eth.createAccountWithBalance(donor);233 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);234235 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();236 let collectionData = (await collection.getData())!;237 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));238 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');239240 const sponsorCollection = helper.ethNativeContract.collection(collectionIdAddress, 'nft', sponsor);241 await sponsorCollection.methods.confirmCollectionSponsorship().send();242 collectionData = (await collection.getData())!;243 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));244245 const user = helper.eth.createAccount();246 await collectionEvm.methods.addCollectionAdmin(user).send();247 248 const ownerBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));249 const sponsorBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));250251 const userCollectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', user);252 const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();253 expect(nextTokenId).to.be.equal('1');254 result = await userCollectionEvm.methods.mintWithTokenURI(255 user,256 nextTokenId,257 'Test URI',258 ).send();259260 const events = normalizeEvents(result.events);261 const address = helper.ethAddress.fromCollectionId(collectionId);262263 expect(events).to.be.deep.equal([264 {265 address,266 event: 'Transfer',267 args: {268 from: '0x0000000000000000000000000000000000000000',269 to: user,270 tokenId: nextTokenId,271 },272 },273 ]);274 expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');275 276 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));277 expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);278 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));279 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;280 });281});