git.delta.rocks / unique-network / refs/commits / d664736cbced

difftreelog

source

tests/src/eth/collectionSponsoring.test.ts13.4 KiBsourcehistory
1import {addToAllowListExpectSuccess, confirmSponsorshipExpectSuccess, createCollectionExpectSuccess, enablePublicMintingExpectSuccess, getDetailedCollectionInfo, setCollectionSponsorExpectSuccess, UNIQUE} from '../util/helpers';2import {itWeb3, createEthAccount, collectionIdToAddress, GAS_ARGS, normalizeEvents, createEthAccountWithBalance, evmCollectionHelpers, getCollectionAddressFromResult, evmCollection, ethBalanceViaSub} from './util/helpers';3import nonFungibleAbi from './nonFungibleAbi.json';4import {expect} from 'chai';5import {evmToAddress} from '@polkadot/util-crypto';67describe('evm collection sponsoring', () => {8  itWeb3('sponsors mint transactions', async ({web3, privateKeyWrapper}) => {9    const alice = privateKeyWrapper('//Alice');1011    const collection = await createCollectionExpectSuccess();12    await setCollectionSponsorExpectSuccess(collection, alice.address);13    await confirmSponsorshipExpectSuccess(collection);1415    const minter = createEthAccount(web3);16    expect(await web3.eth.getBalance(minter)).to.equal('0');1718    const address = collectionIdToAddress(collection);19    const contract = new web3.eth.Contract(nonFungibleAbi as any, collectionIdToAddress(collection), {from: minter, ...GAS_ARGS});2021    await enablePublicMintingExpectSuccess(alice, collection);22    await addToAllowListExpectSuccess(alice, collection, {Ethereum: minter});2324    const nextTokenId = await contract.methods.nextTokenId().call();25    expect(nextTokenId).to.equal('1');26    const result = await contract.methods.mint(minter, nextTokenId).send();27    const events = normalizeEvents(result.events);28    expect(events).to.be.deep.equal([29      {30        address,31        event: 'Transfer',32        args: {33          from: '0x0000000000000000000000000000000000000000',34          to: minter,35          tokenId: nextTokenId,36        },37      },38    ]);39  });4041  // TODO: Temprorary off. Need refactor42  // itWeb3('Set substrate sponsor', async ({api, web3, privateKeyWrapper}) => {43  //   const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);44  //   const collectionHelpers = evmCollectionHelpers(web3, owner);45  //   let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();46  //   const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);47  //   const sponsor = privateKeyWrapper('//Alice');48  //   const collectionEvm = evmCollection(web3, owner, collectionIdAddress);4950  //   expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;51  //   result = await collectionEvm.methods.setCollectionSponsorSubstrate(sponsor.addressRaw).send({from: owner});52  //   expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.true;53    54  //   const confirmTx = await api.tx.unique.confirmSponsorship(collectionId);55  //   await submitTransactionAsync(sponsor, confirmTx);56  //   expect(await collectionEvm.methods.hasCollectionPendingSponsor().call({from: owner})).to.be.false;57    58  //   const sponsorTuple = await collectionEvm.methods.collectionSponsor().call({from: owner});59  //   expect(bigIntToSub(api, BigInt(sponsorTuple[1]))).to.be.eq(sponsor.address);60  // });6162  itWeb3('Remove sponsor', async ({api, web3, privateKeyWrapper}) => {63    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);64    const collectionHelpers = evmCollectionHelpers(web3, owner);65    let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * UNIQUE)});66    const {collectionIdAddress} = await getCollectionAddressFromResult(api, result);67    const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);68    const collectionEvm = evmCollection(web3, owner, collectionIdAddress);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  itWeb3('Sponsoring collection from evm address via access list', async ({api, web3, privateKeyWrapper}) => {84    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);85    const collectionHelpers = evmCollectionHelpers(web3, owner);86    let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * UNIQUE)});87    const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);88    const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);89    const collectionEvm = evmCollection(web3, owner, collectionIdAddress);90    result = await collectionEvm.methods.setCollectionSponsor(sponsor).send({from: owner});91    let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;92    const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format;93    expect(collectionSub.sponsorship.isUnconfirmed).to.be.true;94    expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));95    await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');9697    await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor});98    collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;99    expect(collectionSub.sponsorship.isConfirmed).to.be.true;100    expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));101102    const user = createEthAccount(web3);103    const nextTokenId = await collectionEvm.methods.nextTokenId().call();104    expect(nextTokenId).to.be.equal('1');105106    const oldPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();107    expect(oldPermissions.mintMode).to.be.false;108    expect(oldPermissions.access).to.be.equal('Normal');109110    await collectionEvm.methods.setCollectionAccess(1 /*'AllowList'*/).send({from: owner});111    await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});112    await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});113114    const newPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman();115    expect(newPermissions.mintMode).to.be.true;116    expect(newPermissions.access).to.be.equal('AllowList');117118    const ownerBalanceBefore = await ethBalanceViaSub(api, owner);119    const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);120121    {122      const nextTokenId = await collectionEvm.methods.nextTokenId().call();123      expect(nextTokenId).to.be.equal('1');124      const result = await collectionEvm.methods.mintWithTokenURI(125        user,126        nextTokenId,127        'Test URI',128      ).send({from: user});129      const events = normalizeEvents(result.events);130131      expect(events).to.be.deep.equal([132        {133          address: collectionIdAddress,134          event: 'Transfer',135          args: {136            from: '0x0000000000000000000000000000000000000000',137            to: user,138            tokenId: nextTokenId,139          },140        },141      ]);142143      const ownerBalanceAfter = await ethBalanceViaSub(api, owner);144      const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);145146      expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');147      expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);148      expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;149    }150  });151152  // TODO: Temprorary off. Need refactor153  // itWeb3('Sponsoring collection from substrate address via access list', async ({api, web3, privateKeyWrapper}) => {154  //   const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);155  //   const collectionHelpers = evmCollectionHelpers(web3, owner);156  //   const result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send();157  //   const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);158  //   const sponsor = privateKeyWrapper('//Alice');159  //   const collectionEvm = evmCollection(web3, owner, collectionIdAddress);160161  //   await collectionEvm.methods.setCollectionSponsorSubstrate(sponsor.addressRaw).send({from: owner});162    163  //   const confirmTx = await api.tx.unique.confirmSponsorship(collectionId);164  //   await submitTransactionAsync(sponsor, confirmTx);165    166  //   const user = createEthAccount(web3);167  //   const nextTokenId = await collectionEvm.methods.nextTokenId().call();168  //   expect(nextTokenId).to.be.equal('1');169170  //   await collectionEvm.methods.setCollectionAccess(1 /*'AllowList'*/).send({from: owner});171  //   await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner});172  //   await collectionEvm.methods.setCollectionMintMode(true).send({from: owner});173174  //   const ownerBalanceBefore = await ethBalanceViaSub(api, owner);175  //   const sponsorBalanceBefore = (await getBalance(api, [sponsor.address]))[0];176177  //   {178  //     const nextTokenId = await collectionEvm.methods.nextTokenId().call();179  //     expect(nextTokenId).to.be.equal('1');180  //     const result = await collectionEvm.methods.mintWithTokenURI(181  //       user,182  //       nextTokenId,183  //       'Test URI',184  //     ).send({from: user});185  //     const events = normalizeEvents(result.events);186187  //     expect(events).to.be.deep.equal([188  //       {189  //         address: collectionIdAddress,190  //         event: 'Transfer',191  //         args: {192  //           from: '0x0000000000000000000000000000000000000000',193  //           to: user,194  //           tokenId: nextTokenId,195  //         },196  //       },197  //     ]);198199  //     const ownerBalanceAfter = await ethBalanceViaSub(api, owner);200  //     const sponsorBalanceAfter = (await getBalance(api, [sponsor.address]))[0];201202  //     expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');203  //     expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter);204  //     expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true;205  //   }206  // });207208  itWeb3('Check that transaction via EVM spend money from sponsor address', async ({api, web3, privateKeyWrapper}) => {209    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);210    const collectionHelpers = evmCollectionHelpers(web3, owner);211    let result = await collectionHelpers.methods.createNonfungibleCollection('Sponsor collection', '1', '1').send({value: Number(2n * UNIQUE)});212    const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);213    const sponsor = await createEthAccountWithBalance(api, web3, privateKeyWrapper);214    const collectionEvm = evmCollection(web3, owner, collectionIdAddress);215    result = await collectionEvm.methods.setCollectionSponsor(sponsor).send();216    let collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;217    const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format;218    expect(collectionSub.sponsorship.isUnconfirmed).to.be.true;219    expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));220    await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor');221    const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress);222    await sponsorCollection.methods.confirmCollectionSponsorship().send();223    collectionSub = (await getDetailedCollectionInfo(api, collectionId))!;224    expect(collectionSub.sponsorship.isConfirmed).to.be.true;225    expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format)));226227    const user = createEthAccount(web3);228    await collectionEvm.methods.addCollectionAdmin(user).send();229    230    const ownerBalanceBefore = await ethBalanceViaSub(api, owner);231    const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor);232    233  234    const userCollectionEvm = evmCollection(web3, user, collectionIdAddress);235    const nextTokenId = await userCollectionEvm.methods.nextTokenId().call();236    expect(nextTokenId).to.be.equal('1');237    result = await userCollectionEvm.methods.mintWithTokenURI(238      user,239      nextTokenId,240      'Test URI',241    ).send();242243    const events = normalizeEvents(result.events);244    const address = collectionIdToAddress(collectionId);245246    expect(events).to.be.deep.equal([247      {248        address,249        event: 'Transfer',250        args: {251          from: '0x0000000000000000000000000000000000000000',252          to: user,253          tokenId: nextTokenId,254        },255      },256    ]);257    expect(await userCollectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');258  259    const ownerBalanceAfter = await ethBalanceViaSub(api, owner);260    expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore);261    const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor);262    expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;263  });264});