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, privateKey}) => {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 const ss58Format = helper.chain.getChainProperties().ss58Format;110 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));111 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');112113 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});114 collectionData = (await collection.getData())!;115 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));116117 const user = helper.eth.createAccount();118 const nextTokenId = await collectionEvm.methods.nextTokenId().call();119 expect(nextTokenId).to.be.equal('1');120121 const oldPermissions = (await collection.getData())!.raw.permissions; 122 expect(oldPermissions.mintMode).to.be.false;123 expect(oldPermissions.access).to.be.equal('Normal');124125 await collectionEvm.methods.setCollectionAccess(1 ).send({from: owner});126 await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});127 await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});128129 const newPermissions = (await collection.getData())!.raw.permissions; 130 expect(newPermissions.mintMode).to.be.true;131 expect(newPermissions.access).to.be.equal('AllowList');132133 const ownerBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));134 const sponsorBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));135136 {137 const nextTokenId = await collectionEvm.methods.nextTokenId().call();138 expect(nextTokenId).to.be.equal('1');139 const result = await collectionEvm.methods.mintWithTokenURI(140 user,141 nextTokenId,142 'Test URI',143 ).send({from: user});144 const events = helper.eth.normalizeEvents(result.events);145146 expect(events).to.be.deep.equal([147 {148 address: collectionIdAddress,149 event: 'Transfer',150 args: {151 from: '0x0000000000000000000000000000000000000000',152 to: user,153 tokenId: nextTokenId,154 },155 },156 ]);157158 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));159 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));160161 expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');162 expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);163 expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;164 }165 });166167 168 169 170 171 172 173 174 175176 177 178 179 180 181 182 183 184185 186 187 188189 190 191192 193 194 195 196 197 198 199 200 201202 203 204 205 206 207 208 209 210 211 212 213214 215 216217 218 219 220 221 222223 itEth('Check that transaction via EVM spend money from sponsor address', async ({helper, privateKey}) => {224 const owner = await helper.eth.createAccountWithBalance(donor);225 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);226227 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * nominal)});228 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);229 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);230 const collection = helper.nft.getCollectionObject(collectionId);231 const sponsor = await helper.eth.createAccountWithBalance(donor);232 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);233234 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();235 let collectionData = (await collection.getData())!;236 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));237 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');238239 const sponsorCollection = helper.ethNativeContract.collection(collectionIdAddress, 'nft', sponsor);240 await sponsorCollection.methods.confirmCollectionSponsorship().send();241 collectionData = (await collection.getData())!;242 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(helper.address.ethToSubstrate(sponsor));243244 const user = helper.eth.createAccount();245 await collectionEvm.methods.addCollectionAdmin(user).send();246 247 const ownerBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));248 const sponsorBalanceBefore = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsor));249250 const userCollectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', user);251 const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();252 expect(nextTokenId).to.be.equal('1');253 result = await userCollectionEvm.methods.mintWithTokenURI(254 user,255 nextTokenId,256 'Test URI',257 ).send();258259 const events = helper.eth.normalizeEvents(result.events);260 const address = helper.ethAddress.fromCollectionId(collectionId);261262 expect(events).to.be.deep.equal([263 {264 address,265 event: 'Transfer',266 args: {267 from: '0x0000000000000000000000000000000000000000',268 to: user,269 tokenId: nextTokenId,270 },271 },272 ]);273 expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');274 275 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));276 expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);277 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));278 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;279 });280});