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

difftreelog

source

tests/src/transferFrom.test.ts14.4 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 {ApiPromise} from '@polkadot/api';18import {IKeyringPair} from '@polkadot/types/types';19import chai from 'chai';20import chaiAsPromised from 'chai-as-promised';21import privateKey from './substrate/privateKey';22import {default as usingApi} from './substrate/substrate-api';23import {24  approveExpectFail,25  approveExpectSuccess,26  createCollectionExpectSuccess,27  createFungibleItemExpectSuccess,28  createItemExpectSuccess,29  getAllowance,30  transferFromExpectFail,31  transferFromExpectSuccess,32  burnItemExpectSuccess,33  setCollectionLimitsExpectSuccess,34  getCreatedCollectionCount,35} from './util/helpers';3637chai.use(chaiAsPromised);38const expect = chai.expect;3940describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {41  let alice: IKeyringPair;42  let bob: IKeyringPair;43  let charlie: IKeyringPair;4445  before(async () => {46    await usingApi(async () => {47      alice = privateKey('//Alice');48      bob = privateKey('//Bob');49      charlie = privateKey('//Charlie');50    });51  });5253  it('Execute the extrinsic and check nftItemList - owner of token', async () => {54    await usingApi(async () => {55      // nft56      const nftCollectionId = await createCollectionExpectSuccess();57      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');58      await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);5960      await transferFromExpectSuccess(nftCollectionId, newNftTokenId, bob, alice, charlie, 1, 'NFT');6162      // fungible63      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});64      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');65      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);66      await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1, 'Fungible');6768      // reFungible69      const reFungibleCollectionId = await70      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});71      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');72      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address, 100);73      await transferFromExpectSuccess(74        reFungibleCollectionId,75        newReFungibleTokenId,76        bob,77        alice,78        charlie,79        100,80        'ReFungible',81      );82    });83  });8485  it('Should reduce allowance if value is big', async () => {86    await usingApi(async (api) => {87      const alice = privateKey('//Alice');88      const bob = privateKey('//Bob');89      const charlie = privateKey('//Charlie');9091      // fungible92      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});93      const newFungibleTokenId = await createFungibleItemExpectSuccess(alice, fungibleCollectionId, {Value: 500000n});9495      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address, 500000n);96      await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 500000n, 'Fungible');97      expect(await getAllowance(api, fungibleCollectionId, alice.address, bob.address, newFungibleTokenId)).to.equal(0n);98    });99  });100101  it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => {102    const collectionId = await createCollectionExpectSuccess();103    const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address);104105    await transferFromExpectSuccess(collectionId, itemId, alice, bob, charlie);106  });107});108109describe('Negative Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {110  let alice: IKeyringPair;111  let bob: IKeyringPair;112  let charlie: IKeyringPair;113114  before(async () => {115    await usingApi(async () => {116      alice = privateKey('//Alice');117      bob = privateKey('//Bob');118      charlie = privateKey('//Charlie');119    });120  });121122  it('transferFrom for a collection that does not exist', async () => {123    await usingApi(async (api: ApiPromise) => {124      // nft125      const nftCollectionCount = await getCreatedCollectionCount(api);126      await approveExpectFail(nftCollectionCount + 1, 1, alice, bob);127128      await transferFromExpectFail(nftCollectionCount + 1, 1, bob, alice, charlie, 1);129130      // fungible131      const fungibleCollectionCount = await getCreatedCollectionCount(api);132      await approveExpectFail(fungibleCollectionCount + 1, 0, alice, bob);133134      await transferFromExpectFail(fungibleCollectionCount + 1, 0, bob, alice, charlie, 1);135      // reFungible136      const reFungibleCollectionCount = await getCreatedCollectionCount(api);137      await approveExpectFail(reFungibleCollectionCount + 1, 1, alice, bob);138139      await transferFromExpectFail(reFungibleCollectionCount + 1, 1, bob, alice, charlie, 1);140    });141  });142143  /* it('transferFrom for a collection that was destroyed', async () => {144    await usingApi(async (api: ApiPromise) => {145      this test copies approve negative test146    });147  }); */148149  /* it('transferFrom a token that does not exist', async () => {150    await usingApi(async (api: ApiPromise) => {151      this test copies approve negative test152    });153  }); */154155  /* it('transferFrom a token that was deleted', async () => {156    await usingApi(async (api: ApiPromise) => {157      this test copies approve negative test158    });159  }); */160161  it('transferFrom for not approved address', async () => {162    await usingApi(async () => {163      // nft164      const nftCollectionId = await createCollectionExpectSuccess();165      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');166167      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);168169      // fungible170      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});171      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');172      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);173      // reFungible174      const reFungibleCollectionId = await175      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});176      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');177      await transferFromExpectFail(178        reFungibleCollectionId,179        newReFungibleTokenId,180        bob,181        alice,182        charlie,183        1,184      );185    });186  });187188  it('transferFrom incorrect token count', async () => {189    await usingApi(async () => {190      // nft191      const nftCollectionId = await createCollectionExpectSuccess();192      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');193      await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);194195      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 2);196197      // fungible198      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});199      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');200      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);201      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 2);202      // reFungible203      const reFungibleCollectionId = await204      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});205      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');206      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address);207      await transferFromExpectFail(208        reFungibleCollectionId,209        newReFungibleTokenId,210        bob,211        alice,212        charlie,213        2,214      );215    });216  });217218  it('execute transferFrom from account that is not owner of collection', async () => {219    await usingApi(async () => {220      const dave = privateKey('//Dave');221      // nft222      const nftCollectionId = await createCollectionExpectSuccess();223      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');224      try {225        await approveExpectFail(nftCollectionId, newNftTokenId, dave, bob);226        await transferFromExpectFail(nftCollectionId, newNftTokenId, dave, alice, charlie, 1);227      } catch (e) {228        // tslint:disable-next-line:no-unused-expression229        expect(e).to.be.exist;230      }231232      // await transferFromExpectFail(nftCollectionId, newNftTokenId, Dave, Alice, Charlie, 1);233234      // fungible235      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});236      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');237      try {238        await approveExpectFail(fungibleCollectionId, newFungibleTokenId, dave, bob);239        await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, dave, alice, charlie, 1);240      } catch (e) {241        // tslint:disable-next-line:no-unused-expression242        expect(e).to.be.exist;243      }244      // reFungible245      const reFungibleCollectionId = await246      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});247      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');248      try {249        await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, dave, bob);250        await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, dave, alice, charlie, 1);251      } catch (e) {252        // tslint:disable-next-line:no-unused-expression253        expect(e).to.be.exist;254      }255    });256  });257  it('transferFrom burnt token before approve NFT', async () => {258    await usingApi(async () => {259      // nft260      const nftCollectionId = await createCollectionExpectSuccess();261      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');262      await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);263      await approveExpectFail(nftCollectionId, newNftTokenId, alice, bob);264      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);265    });266  });267  it('transferFrom burnt token before approve Fungible', async () => {268    await usingApi(async () => {269      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});270      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');271      await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);272      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);273      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);274275    });276  });277  it('transferFrom burnt token before approve ReFungible', async () => {278    await usingApi(async () => {279      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});280      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');281      await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);282      await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, alice, bob);283      await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, bob, alice, charlie, 1);284285    });286  });287288  it('transferFrom burnt token after approve NFT', async () => {289    await usingApi(async () => {290      // nft291      const nftCollectionId = await createCollectionExpectSuccess();292      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');293      await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);294      await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);295      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);296    });297  });298  it('transferFrom burnt token after approve Fungible', async () => {299    await usingApi(async () => {300      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});301      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');302      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);303      await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);304      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);305306    });307  });308  it('transferFrom burnt token after approve ReFungible', async () => {309    await usingApi(async () => {310      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});311      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');312      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address);313      await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);314      await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, bob, alice, charlie, 1);315316    });317  });318319  it('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async () => {320    const collectionId = await createCollectionExpectSuccess();321    const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address);322    await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: false});323324    await transferFromExpectFail(collectionId, itemId, alice, bob, charlie);325  });326});