git.delta.rocks / unique-network / refs/commits / 63b9443a2b7f

difftreelog

source

tests/src/eth/nesting/nest.test.ts9.0 KiBsourcehistory
1import {ApiPromise} from '@polkadot/api';2import {Contract} from 'web3-eth-contract';3import {expect} from 'chai';4import Web3 from 'web3';5import {createEthAccountWithBalance, evmCollectionHelpers, GAS_ARGS, getCollectionAddressFromResult, itWeb3, tokenIdToAddress} from '../../eth/util/helpers';6import nonFungibleAbi from '../nonFungibleAbi.json';78const createNestingCollection = async (9  api: ApiPromise,10  web3: Web3,11  owner: string,12): Promise<{ collectionId: number, collectionAddress: string, contract: Contract }> => {13  const collectionHelper = evmCollectionHelpers(web3, owner);14        15  const result = await collectionHelper.methods16    .createNonfungibleCollection('A', 'B', 'C')17    .send();18  const {collectionIdAddress: collectionAddress, collectionId} = await getCollectionAddressFromResult(api, result);1920  const contract = new web3.eth.Contract(nonFungibleAbi as any, collectionAddress, {from: owner, ...GAS_ARGS});21  await contract.methods.setCollectionNesting(true).send({from: owner});2223  return {collectionId, collectionAddress, contract};24};2526describe('Integration Test: EVM Nesting', () => {27  itWeb3('NFT: allows an Owner to nest/unnest their token', async ({api, web3, privateKeyWrapper}) => {28    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);29    const {collectionId, contract} = await createNestingCollection(api, web3, owner);3031    // Create a token to be nested32    const nftTokenId = await contract.methods.nextTokenId().call();33    await contract.methods.mint(34      owner,35      nftTokenId,36    ).send({from: owner});3738    // Nest into a token39    const firstTargetNftTokenId = await contract.methods.nextTokenId().call();40    await contract.methods.mint(41      owner,42      firstTargetNftTokenId,43    ).send({from: owner});4445    const targetNftTokenAddress = tokenIdToAddress(collectionId, firstTargetNftTokenId);4647    await contract.methods.transfer(targetNftTokenAddress, nftTokenId).send({from: owner});48    expect(await contract.methods.ownerOf(nftTokenId).call()).to.be.equal(targetNftTokenAddress);4950    // Re-nest into another51    const secondTargetNftTokenId = await contract.methods.nextTokenId().call();52    await contract.methods.mint(53      owner,54      secondTargetNftTokenId,55    ).send({from: owner});56    const nextNftTokenAddress = tokenIdToAddress(collectionId, secondTargetNftTokenId);5758    await contract.methods.transfer(nextNftTokenAddress, nftTokenId).send({from: owner});59    expect(await contract.methods.ownerOf(nftTokenId).call()).to.be.equal(nextNftTokenAddress);60  });6162  itWeb3('NFT: allows an Owner to nest/unnest their token (Restricted nesting)', async ({api, web3, privateKeyWrapper}) => {63    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);6465    const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner);66    const {collectionAddress: collectionAddressB, contract: contractB} = await createNestingCollection(api, web3, owner);67    await contractA.methods.setCollectionNesting(true, [collectionAddressA, collectionAddressB]).send({from: owner});6869    // Create a token to nest into70    const targetNftTokenId = await contractA.methods.nextTokenId().call();71    await contractA.methods.mint(72      owner,73      targetNftTokenId,74    ).send({from: owner});75    const nftTokenAddressA1 = tokenIdToAddress(collectionIdA, targetNftTokenId);7677    // Create a token for nesting in the same collection as the target78    const nftTokenIdA = await contractA.methods.nextTokenId().call();79    await contractA.methods.mint(80      owner,81      nftTokenIdA,82    ).send({from: owner});8384    // Create a token for nesting in a different collection85    const nftTokenIdB = await contractB.methods.nextTokenId().call();86    await contractB.methods.mint(87      owner,88      nftTokenIdB,89    ).send({from: owner});9091    // Nest92    await contractA.methods.transfer(nftTokenAddressA1, nftTokenIdA).send({from: owner});93    expect(await contractA.methods.ownerOf(nftTokenIdA).call()).to.be.equal(nftTokenAddressA1);9495    await contractB.methods.transfer(nftTokenAddressA1, nftTokenIdB).send({from: owner});96    expect(await contractB.methods.ownerOf(nftTokenIdB).call()).to.be.equal(nftTokenAddressA1);97  });98});99100describe('Negative Test: EVM Nesting', async() => {101  itWeb3('NFT: disallows to nest token if nesting is disabled', async ({api, web3, privateKeyWrapper}) => {102    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);103104    const {collectionId, contract} = await createNestingCollection(api, web3, owner);105    await contract.methods.setCollectionNesting(false).send({from: owner});106107    // Create a token to nest into108    const targetNftTokenId = await contract.methods.nextTokenId().call();109    await contract.methods.mint(110      owner,111      targetNftTokenId,112    ).send({from: owner});113114    const targetNftTokenAddress = tokenIdToAddress(collectionId, targetNftTokenId);115116    // Create a token to nest117    const nftTokenId = await contract.methods.nextTokenId().call();118    await contract.methods.mint(119      owner,120      nftTokenId,121    ).send({from: owner});122123    // Try to nest124    await expect(contract.methods125      .transfer(targetNftTokenAddress, nftTokenId)126      .call({from: owner})).to.be.rejectedWith('UserIsNotAllowedToNest');127  });128  129  itWeb3('NFT: disallows a non-Owner to nest someone else\'s token', async ({api, web3, privateKeyWrapper}) => {130    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);131    const malignant = await createEthAccountWithBalance(api, web3, privateKeyWrapper);132133    const {collectionId, contract} = await createNestingCollection(api, web3, owner);134135    // Mint a token136    const targetTokenId = await contract.methods.nextTokenId().call();137    await contract.methods.mint(138      owner,139      targetTokenId,140    ).send({from: owner});141    const targetTokenAddress = tokenIdToAddress(collectionId, targetTokenId);142    143    // Mint a token belonging to a different account144    const tokenId = await contract.methods.nextTokenId().call();145    await contract.methods.mint(146      malignant,147      tokenId,148    ).send({from: owner});149      150    // Try to nest one token in another as a non-owner account151    await expect(contract.methods152      .transfer(targetTokenAddress, tokenId)153      .call({from: malignant})).to.be.rejectedWith('UserIsNotAllowedToNest');154  });155  156  itWeb3('NFT: disallows a non-Owner to nest someone else\'s token (Restricted nesting)', async ({api, web3, privateKeyWrapper}) => {157    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);158    const malignant = await createEthAccountWithBalance(api, web3, privateKeyWrapper);159160    const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner);161    const {collectionAddress: collectionAddressB, contract: contractB} = await createNestingCollection(api, web3, owner);162163    await contractA.methods.setCollectionNesting(true, [collectionAddressA, collectionAddressB]).send({from: owner});164165    // Create a token in one collection166    const nftTokenIdA = await contractA.methods.nextTokenId().call();167    await contractA.methods.mint(168      owner,169      nftTokenIdA,170    ).send({from: owner});171    const nftTokenAddressA = tokenIdToAddress(collectionIdA, nftTokenIdA);172173    // Create a token in another collection belonging to someone else174    const nftTokenIdB = await contractB.methods.nextTokenId().call();175    await contractB.methods.mint(176      malignant,177      nftTokenIdB,178    ).send({from: owner});179180    // Try to drag someone else's token into the other collection and nest181    await expect(contractB.methods182      .transfer(nftTokenAddressA, nftTokenIdB)183      .call({from: malignant})).to.be.rejectedWith('UserIsNotAllowedToNest');184  });185  186  itWeb3('NFT: disallows to nest token in an unlisted collection', async ({api, web3, privateKeyWrapper}) => {187    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);188189    const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner);190    const {contract: contractB} = await createNestingCollection(api, web3, owner);191192    await contractA.methods.setCollectionNesting(true, [collectionAddressA]).send({from: owner});193194    // Create a token in one collection195    const nftTokenIdA = await contractA.methods.nextTokenId().call();196    await contractA.methods.mint(197      owner,198      nftTokenIdA,199    ).send({from: owner});200    const nftTokenAddressA = tokenIdToAddress(collectionIdA, nftTokenIdA);201202    // Create a token in another collection203    const nftTokenIdB = await contractB.methods.nextTokenId().call();204    await contractB.methods.mint(205      owner,206      nftTokenIdB,207    ).send({from: owner});208209    // Try to nest into a token in the other collection, disallowed in the first210    await expect(contractB.methods211      .transfer(nftTokenAddressA, nftTokenIdB)212      .call()).to.be.rejectedWith('SourceCollectionIsNotAllowedToNest');213  });214});