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

difftreelog

test owner/admin unnest

Daniel Shiposha2023-01-16parent: #0170864.patch.diff
in: master

2 files changed

modifiedtests/src/nesting/nest.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/nest.test.ts
+++ b/tests/src/nesting/nest.test.ts
@@ -16,7 +16,6 @@
 
 import {IKeyringPair} from '@polkadot/types/types';
 import {expect, itSub, Pallets, usingPlaygrounds} from '../util';
-import {UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique';
 
 describe('Integration Test: Composite nesting tests', () => {
   let alice: IKeyringPair;
@@ -139,7 +138,7 @@
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
       const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 20n, 20n], donor);
+      [alice, bob, charlie] = await helper.arrange.createAccounts([50n, 10n, 10n], donor);
     });
   });
 
@@ -335,205 +334,6 @@
     const newToken = await collectionRFT.mintToken(charlie, 5n);
     await newToken.transfer(charlie, targetToken.nestingAccount(), 2n);
     expect(await newToken.getBalance(targetToken.nestingAccount())).to.be.equal(2n);
-  });
-
-  async function checkNestedRft({
-    expectedBalance,
-    childrenShouldPresent,
-    nestedRft,
-    targetNft,
-  }: {
-    expectedBalance: bigint,
-    childrenShouldPresent: boolean,
-    nestedRft: UniqueRFToken,
-    targetNft: UniqueNFToken,
-  }) {
-    const balance = await nestedRft.getBalance(targetNft.nestingAccount());
-    expect(balance).to.be.equal(expectedBalance);
-
-    const children = await targetNft.getChildren();
-
-    if (childrenShouldPresent) {
-      expect(children[0]).to.be.deep.equal({
-        collectionId: nestedRft.collectionId,
-        tokenId: nestedRft.tokenId,
-      });
-    } else {
-      expect(children.length).to.be.equal(0);
-    }
-  }
-
-  itSub.ifWithPallets('ReFungible: allows a collection owner to transfer nested token', [Pallets.ReFungible], async ({helper}) => {
-    const collectionNFT = await helper.nft.mintCollection(alice);
-    const collectionRFT = await helper.rft.mintCollection(alice, {
-      limits: {
-        ownerCanTransfer: true,
-      },
-    });
-
-    await collectionNFT.setPermissions(alice, {nesting: {tokenOwner: true}});
-
-    const targetNft = await collectionNFT.mintToken(alice, {Substrate: charlie.address});
-    const nestedRft = await collectionRFT.mintToken(alice, 5n, {Substrate: charlie.address});
-
-    await nestedRft.transfer(charlie, targetNft.nestingAccount(), 5n);
-    await checkNestedRft({
-      expectedBalance: 5n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-
-    await nestedRft.transferFrom(alice, targetNft.nestingAccount(), {Substrate: bob.address}, 2n);
-    await checkNestedRft({
-      expectedBalance: 3n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-    expect(await nestedRft.getBalance({Substrate: bob.address})).to.be.equal(2n);
-
-    await nestedRft.transferFrom(alice, targetNft.nestingAccount(), {Substrate: bob.address}, 3n);
-    await checkNestedRft({
-      expectedBalance: 0n,
-      childrenShouldPresent: false,
-      nestedRft,
-      targetNft,
-    });
-    expect(await nestedRft.getBalance({Substrate: bob.address})).to.be.equal(5n);
-  });
-
-  itSub.ifWithPallets('ReFungible: allows a collection admin to transfer nested token', [Pallets.ReFungible], async ({helper}) => {
-    const collectionNFT = await helper.nft.mintCollection(alice);
-    const collectionRFT = await helper.rft.mintCollection(alice, {
-      limits: {
-        ownerCanTransfer: true,
-      },
-    });
-    await collectionRFT.addAdmin(alice, {Substrate: bob.address});
-
-    await collectionNFT.setPermissions(alice, {nesting: {tokenOwner: true}});
-
-    const targetNft = await collectionNFT.mintToken(alice, {Substrate: charlie.address});
-    const nestedRft = await collectionRFT.mintToken(alice, 5n, {Substrate: charlie.address});
-
-    await nestedRft.transfer(charlie, targetNft.nestingAccount(), 5n);
-    await checkNestedRft({
-      expectedBalance: 5n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-
-    await nestedRft.transferFrom(bob, targetNft.nestingAccount(), {Substrate: bob.address}, 2n);
-    await checkNestedRft({
-      expectedBalance: 3n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-    expect(await nestedRft.getBalance({Substrate: bob.address})).to.be.equal(2n);
-
-    await nestedRft.transferFrom(bob, targetNft.nestingAccount(), {Substrate: bob.address}, 3n);
-    await checkNestedRft({
-      expectedBalance: 0n,
-      childrenShouldPresent: false,
-      nestedRft,
-      targetNft,
-    });
-    expect(await nestedRft.getBalance({Substrate: bob.address})).to.be.equal(5n);
-  });
-
-  itSub.ifWithPallets('ReFungible: allows a collection owner to burn nested token', [Pallets.ReFungible], async ({helper}) => {
-    const collectionNFT = await helper.nft.mintCollection(alice, {
-      limits: {
-        ownerCanTransfer: true,
-      },
-    });
-    const collectionRFT = await helper.rft.mintCollection(alice, {
-      limits: {
-        ownerCanTransfer: true,
-      },
-    });
-
-    await collectionNFT.setPermissions(alice, {nesting: {tokenOwner: true}});
-
-    const targetNft = await collectionNFT.mintToken(alice, {Substrate: charlie.address});
-    const nestedRft = await collectionRFT.mintToken(alice, 5n, {Substrate: charlie.address});
-
-    await nestedRft.transfer(charlie, targetNft.nestingAccount(), 5n);
-    await checkNestedRft({
-      expectedBalance: 5n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-
-    await nestedRft.burnFrom(alice, targetNft.nestingAccount(), 2n);
-    await checkNestedRft({
-      expectedBalance: 3n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-
-    await nestedRft.burnFrom(alice, targetNft.nestingAccount(), 3n);
-    await checkNestedRft({
-      expectedBalance: 0n,
-      childrenShouldPresent: false,
-      nestedRft,
-      targetNft,
-    });
-
-    // Check if we can burn target NFT when all nested RFTs are gone
-    await targetNft.burnFrom(alice, {Substrate: charlie.address});
-  });
-
-  itSub.ifWithPallets('ReFungible: allows a collection admin to burn nested token', [Pallets.ReFungible], async ({helper}) => {
-    const collectionNFT = await helper.nft.mintCollection(alice, {
-      limits: {
-        ownerCanTransfer: true,
-      },
-    });
-    const collectionRFT = await helper.rft.mintCollection(alice, {
-      limits: {
-        ownerCanTransfer: true,
-      },
-    });
-    await collectionNFT.addAdmin(alice, {Substrate: bob.address});
-    await collectionRFT.addAdmin(alice, {Substrate: bob.address});
-
-    await collectionNFT.setPermissions(alice, {nesting: {tokenOwner: true}});
-
-    const targetNft = await collectionNFT.mintToken(alice, {Substrate: charlie.address});
-    const nestedRft = await collectionRFT.mintToken(alice, 5n, {Substrate: charlie.address});
-
-    await nestedRft.transfer(charlie, targetNft.nestingAccount(), 5n);
-    await checkNestedRft({
-      expectedBalance: 5n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-
-    await nestedRft.burnFrom(bob, targetNft.nestingAccount(), 2n);
-    await checkNestedRft({
-      expectedBalance: 3n,
-      childrenShouldPresent: true,
-      nestedRft,
-      targetNft,
-    });
-
-    await nestedRft.burnFrom(bob, targetNft.nestingAccount(), 3n);
-    await checkNestedRft({
-      expectedBalance: 0n,
-      childrenShouldPresent: false,
-      nestedRft,
-      targetNft,
-    });
-
-    // Check if we can burn target NFT when all nested RFTs are gone
-    await targetNft.burnFrom(bob, {Substrate: charlie.address});
   });
 });
 
modifiedtests/src/nesting/unnest.test.tsdiffbeforeafterboth
before · tests/src/nesting/unnest.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {IKeyringPair} from '@polkadot/types/types';18import {expect, itSub, Pallets, usingPlaygrounds} from '../util';1920describe('Integration Test: Unnesting', () => {21  let alice: IKeyringPair;2223  before(async () => {24    await usingPlaygrounds(async (helper, privateKey) => {25      const donor = await privateKey({filename: __filename});26      [alice] = await helper.arrange.createAccounts([50n], donor);27    });28  });2930  itSub('NFT: allows the owner to successfully unnest a token', async ({helper}) => {31    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});32    const targetToken = await collection.mintToken(alice);3334    // Create a nested token35    const nestedToken = await collection.mintToken(alice, targetToken.nestingAccount());3637    // Unnest38    await expect(nestedToken.transferFrom(alice, targetToken.nestingAccount(), {Substrate: alice.address}), 'while unnesting').to.be.fulfilled;39    expect(await nestedToken.getOwner()).to.be.deep.equal({Substrate: alice.address});4041    // Nest and burn42    await nestedToken.nest(alice, targetToken);43    await expect(nestedToken.burnFrom(alice, targetToken.nestingAccount()), 'while burning').to.be.fulfilled;44    await expect(nestedToken.getOwner()).to.be.rejected;45  });4647  itSub('Fungible: allows the owner to successfully unnest a token', async ({helper}) => {48    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});49    const targetToken = await collection.mintToken(alice);5051    const collectionFT = await helper.ft.mintCollection(alice);5253    // Nest and unnest54    await collectionFT.mint(alice, 10n, targetToken.nestingAccount());55    await expect(collectionFT.transferFrom(alice, targetToken.nestingAccount(), {Substrate: alice.address}, 9n), 'while unnesting').to.be.fulfilled;56    expect(await collectionFT.getBalance({Substrate: alice.address})).to.be.equal(9n);57    expect(await collectionFT.getBalance(targetToken.nestingAccount())).to.be.equal(1n);5859    // Nest and burn60    await collectionFT.transfer(alice, targetToken.nestingAccount(), 5n);61    await expect(collectionFT.burnTokensFrom(alice, targetToken.nestingAccount(), 6n), 'while burning').to.be.fulfilled;62    expect(await collectionFT.getBalance({Substrate: alice.address})).to.be.equal(4n);63    expect(await collectionFT.getBalance(targetToken.nestingAccount())).to.be.equal(0n);64    expect(await targetToken.getChildren()).to.be.length(0);65  });6667  itSub.ifWithPallets('ReFungible: allows the owner to successfully unnest a token', [Pallets.ReFungible], async ({helper}) => {68    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});69    const targetToken = await collection.mintToken(alice);7071    const collectionRFT = await helper.rft.mintCollection(alice);7273    // Nest and unnest74    const token = await collectionRFT.mintToken(alice, 10n, targetToken.nestingAccount());75    await expect(token.transferFrom(alice, targetToken.nestingAccount(), {Substrate: alice.address}, 9n), 'while unnesting').to.be.fulfilled;76    expect(await token.getBalance({Substrate: alice.address})).to.be.equal(9n);77    expect(await token.getBalance(targetToken.nestingAccount())).to.be.equal(1n);7879    // Nest and burn80    await token.transfer(alice, targetToken.nestingAccount(), 5n);81    await expect(token.burnFrom(alice, targetToken.nestingAccount(), 6n), 'while burning').to.be.fulfilled;82    expect(await token.getBalance({Substrate: alice.address})).to.be.equal(4n);83    expect(await token.getBalance(targetToken.nestingAccount())).to.be.equal(0n);84    expect(await targetToken.getChildren()).to.be.length(0);85  });86});8788describe('Negative Test: Unnesting', () => {89  let alice: IKeyringPair;90  let bob: IKeyringPair;9192  before(async () => {93    await usingPlaygrounds(async (helper, privateKey) => {94      const donor = await privateKey({filename: __filename});95      [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);96    });97  });9899  itSub('Disallows a non-owner to unnest/burn a token', async ({helper}) => {100    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});101    const targetToken = await collection.mintToken(alice);102103    // Create a nested token104    const nestedToken = await collection.mintToken(alice, targetToken.nestingAccount());105106    // Try to unnest107    await expect(nestedToken.unnest(bob, targetToken, {Substrate: alice.address})).to.be.rejectedWith(/common\.ApprovedValueTooLow/);108    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());109110    // Try to burn111    await expect(nestedToken.burnFrom(bob, targetToken.nestingAccount())).to.be.rejectedWith(/common\.ApprovedValueTooLow/);112    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());113  });114115  // todo another test for creating excessive depth matryoshka with Ethereum?116117  // Recursive nesting118  itSub('Prevents Ouroboros creation', async ({helper}) => {119    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});120    const targetToken = await collection.mintToken(alice);121122    // Fail to create a nested token ouroboros123    const nestedToken = await collection.mintToken(alice, targetToken.nestingAccount());124    await expect(targetToken.nest(alice, nestedToken)).to.be.rejectedWith(/^structure\.OuroborosDetected$/);125  });126});