git.delta.rocks / unique-network / refs/commits / 7d64f0034d5a

difftreelog

source

tests/src/nesting/unnest.test.ts5.4 KiBsourcehistory
1import {expect} from 'chai';2import {tokenIdToAddress} from '../eth/util/helpers';3import privateKey from '../substrate/privateKey';4import usingApi, {executeTransaction} from '../substrate/substrate-api';5import {6  createCollectionExpectSuccess,7  createItemExpectFailure,8  createItemExpectSuccess,9  getTokenOwner,10  getTopmostTokenOwner,11  normalizeAccountId,12  setCollectionLimitsExpectSuccess,13  transferExpectSuccess,14} from '../util/helpers';15import {IKeyringPair} from '@polkadot/types/types';1617let alice: IKeyringPair;18let bob: IKeyringPair;1920describe('Integration Test: Unnesting', () => {21  before(async () => {22    alice = privateKey('//Alice');23    bob = privateKey('//Bob');24  });2526  it('Allows the owner to successfully unnest a token', async () => {27    await usingApi(async api => {28      const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});29      await setCollectionLimitsExpectSuccess(alice, collection, {nestingRule: 'Owner'});30      const targetToken = await createItemExpectSuccess(alice, collection, 'NFT');31      const targetAddress = {Ethereum: tokenIdToAddress(collection, targetToken)};3233      // Create a nested token34      const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', targetAddress);3536      // Unnest37      await expect(executeTransaction(38        api,39        alice,40        api.tx.unique.transferFrom(normalizeAccountId(targetAddress), normalizeAccountId(alice), collection, nestedToken, 1),41      )).to.not.be.rejected;42      expect(await getTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Substrate: alice.address});4344      // Nest and burn45      await transferExpectSuccess(collection, nestedToken, alice, targetAddress);46      await expect(executeTransaction(47        api,48        alice,49        api.tx.unique.burnFrom(collection, normalizeAccountId(alice.address), nestedToken, 1),50      )).to.not.be.rejected;51      await expect(getTokenOwner(api, collection, nestedToken)).to.be.rejected; // 'owner == null'52    });53  });5455  // todo refungible-fungible test just in case56});5758describe('Negative Test: Unnesting', () => {59  before(async () => {60    alice = privateKey('//Alice');61    bob = privateKey('//Bob');62  });6364  it('Disallows a non-owner to unnest/burn a token', async () => {65    await usingApi(async api => {66      const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});67      await setCollectionLimitsExpectSuccess(alice, collection, {nestingRule: 'Owner'});68      const targetToken = await createItemExpectSuccess(alice, collection, 'NFT');69      const targetAddress = {Ethereum: tokenIdToAddress(collection, targetToken)};7071      // Create a nested token72      const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', targetAddress);7374      // Try to unnest75      await expect(executeTransaction(76        api,77        bob,78        api.tx.unique.transferFrom(normalizeAccountId(targetAddress), normalizeAccountId(bob), collection, nestedToken, 1),79      )).to.be.rejectedWith(/^common\.ApprovedValueTooLow$/);80      //await transferFromExpectSuccess(collection, nestedToken, bob, targetAddress, {Substrate: bob.address});81      expect(await getTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collection, targetToken).toLowerCase()});8283      // Try to burn84      await expect(executeTransaction(85        api,86        bob,87        api.tx.unique.burnFrom(collection, normalizeAccountId(bob.address), nestedToken, 1),88      )).to.not.be.rejectedWith(/^common\.ApprovedValueTooLow$/);89      expect(await getTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collection, targetToken).toLowerCase()});90    });91  });9293  it('Disallows excessive token nesting', async () => {94    await usingApi(async api => {95      const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});96      await setCollectionLimitsExpectSuccess(alice, collection, {nestingRule: 'Owner'});97      const targetToken = await createItemExpectSuccess(alice, collection, 'NFT');9899      // Create a nested token matryoshka100      const nestedToken1 = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, targetToken)});101      const nestedToken2 = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, nestedToken1)});102      // The nesting depth is limited by 2103      await createItemExpectFailure(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, nestedToken2)});104105      expect(await getTopmostTokenOwner(api, collection, nestedToken2)).to.be.deep.equal({Substrate: alice.address});106    });107  });108109  // todo another test for creating excessive depth matryoshka with Ethereum, move this one to nest ^110111  // Recursive nesting112  it('Prevents ouroboros creation', async () => {113    const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});114    await setCollectionLimitsExpectSuccess(alice, collection, {nestingRule: 'Owner'});115    const targetToken = await createItemExpectSuccess(alice, collection, 'NFT');116117    // Create a nested token ouroboros118    const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, targetToken)});119    expect(transferExpectSuccess(collection, targetToken, alice, {Ethereum: tokenIdToAddress(collection, nestedToken)})).to.be.rejectedWith(/^structure\.OuroborosDetected$/);120  });121});