git.delta.rocks / unique-network / refs/commits / 472f7ca19a8e

difftreelog

source

tests/src/nesting/nest.test.ts9.7 KiBsourcehistory
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: Composite nesting tests', () => {21  let alice: IKeyringPair;22  let bob: IKeyringPair;2324  before(async () => {25    await usingPlaygrounds(async (helper, privateKey) => {26      const donor = await privateKey({filename: __filename});27      [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);28    });29  });3031  /// TODO move32  itSub('Performs the full suite: bundles a token, transfers, and unnests', async ({helper}) => {33    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});34    const targetToken = await collection.mintToken(alice);3536    // Create an immediately nested token37    const nestedToken = await collection.mintToken(alice, targetToken.nestingAccount());38    expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: alice.address});39    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());4041    // Create a token to be nested42    const newToken = await collection.mintToken(alice);4344    // Nest45    await newToken.nest(alice, targetToken);46    expect(await newToken.getTopmostOwner()).to.be.deep.equal({Substrate: alice.address});47    expect(await newToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());4849    // Move bundle to different user50    await targetToken.transfer(alice, {Substrate: bob.address});51    expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});52    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());53    expect(await newToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});54    expect(await newToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());5556    // Unnest57    await newToken.unnest(bob, targetToken, {Substrate: bob.address});58    expect(await newToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});59    expect(await newToken.getOwner()).to.be.deep.equal({Substrate: bob.address});60  });61});6263describe('Integration Test: Various token type nesting', () => {64  let alice: IKeyringPair;65  let bob: IKeyringPair;66  let charlie: IKeyringPair;6768  before(async () => {69    await usingPlaygrounds(async (helper, privateKey) => {70      const donor = await privateKey({filename: __filename});71      [alice, bob, charlie] = await helper.arrange.createAccounts([200n, 10n, 10n], donor);72    });73  });7475  itSub.ifWithPallets('ReFungible: getTopmostOwner works correctly with Nesting', [Pallets.ReFungible], async({helper}) => {76    const collectionNFT = await helper.nft.mintCollection(alice, {77      permissions: {78        nesting: {79          tokenOwner: true,80        },81      },82    });83    const collectionRFT = await helper.rft.mintCollection(alice);8485    const nft = await collectionNFT.mintToken(alice, {Substrate: alice.address});86    const rft = await collectionRFT.mintToken(alice, 100n, {Substrate: alice.address});8788    expect(await rft.getTopmostOwner()).deep.equal({Substrate: alice.address});8990    await rft.transfer(alice, nft.nestingAccount(), 40n);9192    expect(await rft.getTopmostOwner()).deep.equal(null);9394    await rft.transfer(alice, nft.nestingAccount(), 60n);9596    expect(await rft.getTopmostOwner()).deep.equal({Substrate: alice.address});9798    await rft.transferFrom(alice, nft.nestingAccount(), {Substrate: alice.address}, 30n);99100    expect(await rft.getTopmostOwner()).deep.equal(null);101102    await rft.transferFrom(alice, nft.nestingAccount(), {Substrate: alice.address}, 70n);103104    expect(await rft.getTopmostOwner()).deep.equal({Substrate: alice.address});105  });106});107108describe('Negative Test: Nesting', () => {109  let alice: IKeyringPair;110  let bob: IKeyringPair;111112  before(async () => {113    await usingPlaygrounds(async (helper, privateKey) => {114      const donor = await privateKey({filename: __filename});115      [alice, bob] = await helper.arrange.createAccounts([100n, 50n], donor);116    });117  });118119  itSub('Admin (NFT): disallows an Admin to operate nesting when only TokenOwner is allowed', async ({helper}) => {120    const collection = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});121    await collection.addAdmin(alice, {Substrate: bob.address});122    const targetToken = await collection.mintToken(alice);123124    // Try to create an immediately nested token as collection admin when it's disallowed125    await expect(collection.mintToken(bob, targetToken.nestingAccount()))126      .to.be.rejectedWith(/common\.UserIsNotAllowedToNest/);127128    // Try to create a token to be nested and nest129    const newToken = await collection.mintToken(bob);130    await expect(newToken.nest(bob, targetToken))131      .to.be.rejectedWith(/common\.UserIsNotAllowedToNest/);132133    expect(await targetToken.getChildren()).to.be.length(0);134    expect(await newToken.getOwner()).to.be.deep.equal({Substrate: bob.address});135  });136137  itSub('Admin (NFT): disallows a Token Owner to operate nesting when only Admin is allowed', async ({helper}) => {138    const collectionAlice = await helper.nft.mintCollection(alice, {permissions: {access: 'AllowList', mintMode: true, nesting: {collectionAdmin: true}}});139    const targetTokenBob = await collectionAlice.mintToken(alice, {Substrate: bob.address});140    await collectionAlice.addToAllowList(alice, {Substrate: bob.address});141    await collectionAlice.addToAllowList(alice, targetTokenBob.nestingAccount());142143    // Try to create a nested token as token owner when it's disallowed144    await expect(collectionAlice.mintToken(bob, targetTokenBob.nestingAccount()))145      .to.be.rejectedWith(/common\.UserIsNotAllowedToNest/);146147    // Try to create a token to be nested and nest148    const newToken = await collectionAlice.mintToken(bob);149    await expect(newToken.nest(bob, targetTokenBob))150      .to.be.rejectedWith(/common\.UserIsNotAllowedToNest/);151152    expect(await targetTokenBob.getChildren()).to.be.length(0);153    expect(await newToken.getOwner()).to.be.deep.equal({Substrate: bob.address});154  });155156  itSub('Admin (NFT): disallows an Admin to unnest someone else\'s token', async ({helper}) => {157    const collection = await helper.nft.mintCollection(alice, {limits: {ownerCanTransfer: true}, permissions: {access: 'AllowList', mintMode: true, nesting: {collectionAdmin: true}}});158    //await collection.addAdmin(alice, {Substrate: bob.address});159    const targetToken = await collection.mintToken(alice, {Substrate: bob.address});160    await collection.addToAllowList(alice, {Substrate: bob.address});161    await collection.addToAllowList(alice, targetToken.nestingAccount());162163    // Try to nest somebody else's token164    const newToken = await collection.mintToken(bob);165    await expect(newToken.nest(alice, targetToken))166      .to.be.rejectedWith(/common\.NoPermission/);167168    // Try to unnest a token belonging to someone else as collection admin169    const nestedToken = await collection.mintToken(alice, targetToken.nestingAccount());170    await expect(nestedToken.unnest(alice, targetToken, {Substrate: bob.address}))171      .to.be.rejectedWith(/common\.AddressNotInAllowlist/);172173    expect(await targetToken.getChildren()).to.be.length(1);174    expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});175    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());176  });177178  itSub('Fungible: disallows a non-Owner to unnest someone else\'s token', async ({helper}) => {179    const collectionNFT = await helper.nft.mintCollection(alice, {permissions: {nesting: {collectionAdmin: true, tokenOwner: true}}});180    const collectionFT = await helper.ft.mintCollection(alice);181    const targetToken = await collectionNFT.mintToken(alice, {Substrate: bob.address});182183    // Nest some tokens as Alice into Bob's token184    await collectionFT.mint(alice, 5n, targetToken.nestingAccount());185186    // Try to pull it out187    await expect(collectionFT.transferFrom(alice, targetToken.nestingAccount(), {Substrate: bob.address}, 1n))188      .to.be.rejectedWith(/common\.ApprovedValueTooLow/);189    expect(await collectionFT.getBalance(targetToken.nestingAccount())).to.be.equal(5n);190  });191192  itSub('Fungible: disallows a non-Owner to unnest someone else\'s token (Restricted nesting)', async ({helper}) => {193    const collectionNFT = await helper.nft.mintCollection(alice);194    const collectionFT = await helper.ft.mintCollection(alice);195    const targetToken = await collectionNFT.mintToken(alice, {Substrate: bob.address});196197    await collectionNFT.setPermissions(alice, {nesting: {collectionAdmin: true, tokenOwner: true, restricted: [collectionFT.collectionId]}});198199    // Nest some tokens as Alice into Bob's token200    await collectionFT.mint(alice, 5n, targetToken.nestingAccount());201202    // Try to pull it out as Alice still203    await expect(collectionFT.transferFrom(alice, targetToken.nestingAccount(), {Substrate: bob.address}, 1n))204      .to.be.rejectedWith(/common\.ApprovedValueTooLow/);205    expect(await collectionFT.getBalance(targetToken.nestingAccount())).to.be.equal(5n);206  });207208});