1import {collectionIdToAddress, normalizeEvents} from './util/helpers';2import {evmToAddress} from '@polkadot/util-crypto';3import {itEth, expect} from '../eth/util/playgrounds';45describe('evm collection sponsoring', () => {6 itEth('sponsors mint transactions', async ({helper, privateKey}) => {7 const alice = privateKey('//Alice');89 const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'spnr', permissions: {mintMode: true}});10 await collection.setSponsor(alice, alice.address);11 await collection.confirmSponsorship(alice);1213 const minter = helper.eth.createAccount();14 expect(await helper.balance.getEthereum(minter)).to.equal(0n);1516 const address = helper.ethAddress.fromCollectionId(collection.collectionId);17 const contract = helper.ethNativeContract.collection(address, 'nft', minter);1819 await collection.addToAllowList(alice, {Ethereum: minter});2021 const nextTokenId = await contract.methods.nextTokenId().call();22 expect(nextTokenId).to.equal('1');23 const result = await contract.methods.mint(minter, nextTokenId).send();24 const events = normalizeEvents(result.events);25 expect(events).to.be.deep.equal([26 {27 address,28 event: 'Transfer',29 args: {30 from: '0x0000000000000000000000000000000000000000',31 to: minter,32 tokenId: nextTokenId,33 },34 },35 ]);36 });3738 39 40 41 42 43 44 45 4647 48 49 50 51 52 53 54 55 56 57 5859 itEth('Remove sponsor', async ({helper, privateKey}) => {60 const alice = privateKey('//Alice');6162 const owner = await helper.eth.createAccountWithBalance(alice);63 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);6465 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();66 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);67 const sponsor = await helper.eth.createAccountWithBalance(alice);68 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);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 itEth('Sponsoring collection from evm address via access list', async ({helper, privateKey}) => {84 const alice = privateKey('//Alice');8586 const owner = await helper.eth.createAccountWithBalance(alice);87 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);8889 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();90 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);91 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);92 const collection = helper.nft.getCollectionObject(collectionId);93 const sponsor = await helper.eth.createAccountWithBalance(alice);94 const collectionEvm = await helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);9596 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});97 let collectionData = (await collection.getData())!;98 const ss58Format = helper.chain.getChainProperties().ss58Format;99 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));100 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');101102 await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});103 collectionData = (await collection.getData())!;104 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));105106 const user = helper.eth.createAccount();107 const nextTokenId = await collectionEvm.methods.nextTokenId().call();108 expect(nextTokenId).to.be.equal('1');109110 const oldPermissions = (await collection.getData())!.raw.permissions; 111 expect(oldPermissions.mintMode).to.be.false;112 expect(oldPermissions.access).to.be.equal('Normal');113114 await collectionEvm.methods.setCollectionAccess(1 ).send({from: owner});115 await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});116 await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});117118 const newPermissions = (await collection.getData())!.raw.permissions; 119 expect(newPermissions.mintMode).to.be.true;120 expect(newPermissions.access).to.be.equal('AllowList');121122 const ownerBalanceBefore = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));123 const sponsorBalanceBefore = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));124125 {126 const nextTokenId = await collectionEvm.methods.nextTokenId().call();127 expect(nextTokenId).to.be.equal('1');128 const result = await collectionEvm.methods.mintWithTokenURI(129 user,130 nextTokenId,131 'Test URI',132 ).send({from: user});133 const events = normalizeEvents(result.events);134135 expect(events).to.be.deep.equal([136 {137 address: collectionIdAddress,138 event: 'Transfer',139 args: {140 from: '0x0000000000000000000000000000000000000000',141 to: user,142 tokenId: nextTokenId,143 },144 },145 ]);146147 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));148 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));149150 expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');151 expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);152 expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;153 }154 });155156 157 158 159 160 161 162 163 164165 166 167 168 169 170 171 172 173174 175 176 177178 179 180181 182 183 184 185 186 187 188 189 190191 192 193 194 195 196 197 198 199 200 201 202203 204 205206 207 208 209 210 211212 itEth('Check that transaction via EVM spend money from sponsor address', async ({helper, privateKey}) => {213 const alice = privateKey('//Alice');214215 const owner = await helper.eth.createAccountWithBalance(alice);216 const collectionHelpers = helper.ethNativeContract.collectionHelpers(owner);217218 let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();219 const collectionIdAddress = helper.ethAddress.normalizeAddress(result.events.CollectionCreated.returnValues.collectionId);220 const collectionId = helper.ethAddress.extractCollectionId(collectionIdAddress);221 const collection = helper.nft.getCollectionObject(collectionId);222 const sponsor = await helper.eth.createAccountWithBalance(alice);223 const collectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', owner);224225 result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();226 let collectionData = (await collection.getData())!;227 const ss58Format = helper.chain.getChainProperties().ss58Format;228 expect(collectionData.raw.sponsorship.Unconfirmed).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));229 await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');230231 const sponsorCollection = helper.ethNativeContract.collection(collectionIdAddress, 'nft', sponsor);232 await sponsorCollection.methods.confirmCollectionSponsorship().send();233 collectionData = (await collection.getData())!;234 expect(collectionData.raw.sponsorship.Confirmed).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));235236 const user = helper.eth.createAccount();237 await collectionEvm.methods.addCollectionAdmin(user).send();238 239 const ownerBalanceBefore = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));240 const sponsorBalanceBefore = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));241242 const userCollectionEvm = helper.ethNativeContract.collection(collectionIdAddress, 'nft', user);243 const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();244 expect(nextTokenId).to.be.equal('1');245 result = await userCollectionEvm.methods.mintWithTokenURI(246 user,247 nextTokenId,248 'Test URI',249 ).send();250251 const events = normalizeEvents(result.events);252 const address = collectionIdToAddress(collectionId);253254 expect(events).to.be.deep.equal([255 {256 address,257 event: 'Transfer',258 args: {259 from: '0x0000000000000000000000000000000000000000',260 to: user,261 tokenId: nextTokenId,262 },263 },264 ]);265 expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');266 267 const ownerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(owner));268 expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);269 const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));270 expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;271 });272});