git.delta.rocks / unique-network / refs/commits / 48cdcf7aa35b

difftreelog

source

tests/src/eth/collectionSponsoring.test.ts13.5 KiBsourcehistory
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  // TODO: Temprorary off. Need refactor39  // itWeb3('Set substrate sponsor', async ({api, web3, privateKeyWrapper}) => {40  //   const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);41  //   const collectionHelpers = evmCollectionHelpers(web3, owner);42  //   let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();43  //   const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);44  //   const sponsor = privateKeyWrapper('//Alice');45  //   const collectionEvm = evmCollection(web3, owner, collectionIdAddress);4647  //   expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;48  //   result = await collectionEvm.methods.setCollectionSponsorSubstrate(sponsor.addressRaw).send({from: owner});49  //   expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.true;50    51  //   const confirmTx = await api.tx.unique.confirmSponsorship(collectionId);52  //   await submitTransactionAsync(sponsor, confirmTx);53  //   expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;54    55  //   const sponsorTuple = await collectionEvm.methods.collectionSponsor().call({from: owner});56  //   expect(bigIntToSub(api, BigInt(sponsorTuple[1]))).to.be.eq(sponsor.address);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; // (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();111    expect(oldPermissions.mintMode).to.be.false;112    expect(oldPermissions.access).to.be.equal('Normal');113114    await collectionEvm.methods.setCollectionAccess(1 /*'AllowList'*/).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; // (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();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  // TODO: Temprorary off. Need refactor157  // itWeb3('Sponsoring collection from substrate address via access list', async ({api, web3, privateKeyWrapper}) => {158  //   const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);159  //   const collectionHelpers = evmCollectionHelpers(web3, owner);160  //   const result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();161  //   const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);162  //   const sponsor = privateKeyWrapper('//Alice');163  //   const collectionEvm = evmCollection(web3, owner, collectionIdAddress);164165  //   await collectionEvm.methods.setCollectionSponsorSubstrate(sponsor.addressRaw).send({from: owner});166    167  //   const confirmTx = await api.tx.unique.confirmSponsorship(collectionId);168  //   await submitTransactionAsync(sponsor, confirmTx);169    170  //   const user = createEthAccount(web3);171  //   const nextTokenId = await collectionEvm.methods.nextTokenId().call();172  //   expect(nextTokenId).to.be.equal('1');173174  //   await collectionEvm.methods.setCollectionAccess(1 /*'AllowList'*/).send({from: owner});175  //   await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});176  //   await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});177178  //   const ownerBalanceBefore = await ethBalanceViaSub(api, owner);179  //   const sponsorBalanceBefore = (await getBalance(api, [sponsor.address]))[0];180181  //   {182  //     const nextTokenId = await collectionEvm.methods.nextTokenId().call();183  //     expect(nextTokenId).to.be.equal('1');184  //     const result = await collectionEvm.methods.mintWithTokenURI(185  //       user,186  //       nextTokenId,187  //       'Test URI',188  //     ).send({from: user});189  //     const events = normalizeEvents(result.events);190191  //     expect(events).to.be.deep.equal([192  //       {193  //         address: collectionIdAddress,194  //         event: 'Transfer',195  //         args: {196  //           from: '0x0000000000000000000000000000000000000000',197  //           to: user,198  //           tokenId: nextTokenId,199  //         },200  //       },201  //     ]);202203  //     const ownerBalanceAfter = await ethBalanceViaSub(api, owner);204  //     const sponsorBalanceAfter = (await getBalance(api, [sponsor.address]))[0];205206  //     expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');207  //     expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);208  //     expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;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});