1import {IKeyringPair} from '@polkadot/types/types';2import {usingPlaygrounds} from './../util/playgrounds/index';3import {itEth, expect} from '../eth/util/playgrounds';45describe('evm collection sponsoring', () => {6 let donor: IKeyringPair;7 let alice: IKeyringPair;8 let nominal: bigint;910 before(async () => {11 await usingPlaygrounds(async (helper, privateKey) => {12 donor = privateKey('//Alice');13 nominal = helper.balance.getOneTokenNominal();14 });15 });1617 beforeEach(async () => {18 await usingPlaygrounds(async (helper) => {19 [alice] = await helper.arrange.createAccounts([1000n], donor);20 });21 });2223 itEth('sponsors mint transactions', async ({helper}) => {24 const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'spnr', permissions: {mintMode: true}});25 await collection.setSponsor(alice, alice.address);26 await collection.confirmSponsorship(alice);2728 const minter = helper.eth.createAccount();29 expect(await helper.balance.getEthereum(minter)).to.equal(0n);3031 const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);32 const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', minter);3334 await collection.addToAllowList(alice, {Ethereum: minter});3536 const nextTokenId = await contract.methods.nextTokenId().call();37 expect(nextTokenId).to.equal('1');38 const result = await contract.methods.mint(minter, nextTokenId).send();39 const events = helper.eth.normalizeEvents(result.events);40 expect(events).to.be.deep.equal([41 {42 address: collectionAddress,43 event: 'Transfer',44 args: {45 from: '0x0000000000000000000000000000000000000000',46 to: minter,47 tokenId: nextTokenId,48 },49 },50 ]);51 });5253 54 55 56 57 58 59 60 6162 63 64 65 66 67 68 69 70 71 72 7374 itEth('Remove sponsor', async ({helper}) => {75 const owner = await helper.eth.createAccountWithBalance(donor);76 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);7778 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});79 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);80 const sponsor = await helper.eth.createAccountWithBalance(donor);81 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);8283 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;84 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});85 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.true;86 87 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});88 expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;89 90 await collectionEvm.methods.removeCollectionSponsor().send({from: owner});91 92 const sponsorTuple = await collectionEvm.methods.collectionSponsor().call({from: owner});93 expect(sponsorTuple.field_0).to.be.eq('0x0000000000000000000000000000000000000000');94 });9596 itEth('Sponsoring collection from evm address via access list', async ({helper}) => {97 const owner = await helper.eth.createAccountWithBalance(donor);98 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);99100 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});101 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);102 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);103 const collection = helper.nft.getCollectionObject(collectionId);104 const sponsor = await helper.eth.createAccountWithBalance(donor);105 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);106107 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});108 let collectionData = (await collection.getData())!;109 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(helper.address.ethToSubstrate(sponsor, true));110 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');111112 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});113 collectionData = (await collection.getData())!;114 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(helper.address.ethToSubstrate(sponsor, true));115116 const user = helper.eth.createAccount();117 const nextTokenId = await collectionEvm.methods.nextTokenId().call();118 expect(nextTokenId).to.be.equal('1');119120 const oldPermissions = (await collection.getData())!.raw.permissions; 121 expect(oldPermissions.mintMode).to.be.false;122 expect(oldPermissions.access).to.be.equal('Normal');123124 await collectionEvm.methods.setCollectionAccess(1 ).send({from: owner});125 await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});126 await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});127128 const newPermissions = (await collection.getData())!.raw.permissions; 129 expect(newPermissions.mintMode).to.be.true;130 expect(newPermissions.access).to.be.equal('AllowList');131132 const ownerBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));133 const sponsorBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));134135 {136 const nextTokenId = await collectionEvm.methods.nextTokenId().call();137 expect(nextTokenId).to.be.equal('1');138 const result = await collectionEvm.methods.mintWithTokenURI(139 user,140 nextTokenId,141 'Test URI',142 ).send({from: user});143 const events = helper.eth.normalizeEvents(result.events);144145 expect(events).to.be.deep.equal([146 {147 address: collectionIdAddress,148 event: 'Transfer',149 args: {150 from: '0x0000000000000000000000000000000000000000',151 to: user,152 tokenId: nextTokenId,153 },154 },155 ]);156157 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));158 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));159160 expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');161 expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);162 expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;163 }164 });165166 167 168 169 170 171 172 173 174175 176 177 178 179 180 181 182 183184 185 186 187188 189 190191 192 193 194 195 196 197 198 199 200201 202 203 204 205 206 207 208 209 210 211 212213 214 215216 217 218 219 220 221222 itEth('Check that transaction via EVM spend money from sponsor address', async ({helper}) => {223 const owner = await helper.eth.createAccountWithBalance(donor);224 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);225226 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});227 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);228 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);229 const collection = helper.nft.getCollectionObject(collectionId);230 const sponsor = await helper.eth.createAccountWithBalance(donor);231 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);232233 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();234 let collectionData = (await collection.getData())!;235 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(helper.address.ethToSubstrate(sponsor, true));236 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');237238 const sponsorCollection = helper.ethNativeContract.collection(collectionIdAddress, 'nft', sponsor);239 await sponsorCollection.methods.confirmCollectionSponsorship().send();240 collectionData = (await collection.getData())!;241 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(helper.address.ethToSubstrate(sponsor, true));242243 const user = helper.eth.createAccount();244 await collectionEvm.methods.addCollectionAdmin(user).send();245 246 const ownerBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));247 const sponsorBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));248249 const userCollectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', user);250 const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();251 expect(nextTokenId).to.be.equal('1');252 result = await userCollectionEvm.methods.mintWithTokenURI(253 user,254 nextTokenId,255 'Test URI',256 ).send();257258 const events = helper.eth.normalizeEvents(result.events);259 const address = helper.ethAddress.fromCollectionId(collectionId);260261 expect(events).to.be.deep.equal([262 {263 address,264 event: 'Transfer',265 args: {266 from: '0x0000000000000000000000000000000000000000',267 to: user,268 tokenId: nextTokenId,269 },270 },271 ]);272 expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');273 274 const ownerBalanceAfter = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));275 expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);276 const sponsorBalanceAfter = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));277 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;278 });279});