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

difftreelog

source

tests/src/transferFrom.test.ts13.8 KiBsourcehistory
1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//5import {ApiPromise} from '@polkadot/api';6import {IKeyringPair} from '@polkadot/types/types';7import chai from 'chai';8import chaiAsPromised from 'chai-as-promised';9import privateKey from './substrate/privateKey';10import {default as usingApi} from './substrate/substrate-api';11import {12  approveExpectFail,13  approveExpectSuccess,14  createCollectionExpectSuccess,15  createFungibleItemExpectSuccess,16  createItemExpectSuccess,17  getAllowance,18  transferFromExpectFail,19  transferFromExpectSuccess,20  burnItemExpectSuccess,21  setCollectionLimitsExpectSuccess,22  getCreatedCollectionCount,23} from './util/helpers';2425chai.use(chaiAsPromised);26const expect = chai.expect;2728describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {29  let alice: IKeyringPair;30  let bob: IKeyringPair;31  let charlie: IKeyringPair;3233  before(async () => {34    await usingApi(async () => {35      alice = privateKey('//Alice');36      bob = privateKey('//Bob');37      charlie = privateKey('//Charlie');38    });39  });4041  it('Execute the extrinsic and check nftItemList - owner of token', async () => {42    await usingApi(async () => {43      // nft44      const nftCollectionId = await createCollectionExpectSuccess();45      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');46      await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);4748      await transferFromExpectSuccess(nftCollectionId, newNftTokenId, bob, alice, charlie, 1, 'NFT');4950      // fungible51      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});52      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');53      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);54      await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1, 'Fungible');5556      // reFungible57      const reFungibleCollectionId = await58      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});59      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');60      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address, 100);61      await transferFromExpectSuccess(62        reFungibleCollectionId,63        newReFungibleTokenId,64        bob,65        alice,66        charlie,67        100,68        'ReFungible',69      );70    });71  });7273  it('Should reduce allowance if value is big', async () => {74    await usingApi(async (api) => {75      const alice = privateKey('//Alice');76      const bob = privateKey('//Bob');77      const charlie = privateKey('//Charlie');7879      // fungible80      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});81      const newFungibleTokenId = await createFungibleItemExpectSuccess(alice, fungibleCollectionId, {Value: 500000n});8283      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address, 500000n);84      await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 500000n, 'Fungible');85      expect(await getAllowance(api, fungibleCollectionId, alice.address, bob.address, newFungibleTokenId)).to.equal(0n);86    });87  });8889  it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => {90    const collectionId = await createCollectionExpectSuccess();91    const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address);9293    await transferFromExpectSuccess(collectionId, itemId, alice, bob, charlie);94  });95});9697describe('Negative Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {98  let alice: IKeyringPair;99  let bob: IKeyringPair;100  let charlie: IKeyringPair;101102  before(async () => {103    await usingApi(async () => {104      alice = privateKey('//Alice');105      bob = privateKey('//Bob');106      charlie = privateKey('//Charlie');107    });108  });109110  it('transferFrom for a collection that does not exist', async () => {111    await usingApi(async (api: ApiPromise) => {112      // nft113      const nftCollectionCount = await getCreatedCollectionCount(api);114      await approveExpectFail(nftCollectionCount + 1, 1, alice, bob);115116      await transferFromExpectFail(nftCollectionCount + 1, 1, bob, alice, charlie, 1);117118      // fungible119      const fungibleCollectionCount = await getCreatedCollectionCount(api);120      await approveExpectFail(fungibleCollectionCount + 1, 0, alice, bob);121122      await transferFromExpectFail(fungibleCollectionCount + 1, 0, bob, alice, charlie, 1);123      // reFungible124      const reFungibleCollectionCount = await getCreatedCollectionCount(api);125      await approveExpectFail(reFungibleCollectionCount + 1, 1, alice, bob);126127      await transferFromExpectFail(reFungibleCollectionCount + 1, 1, bob, alice, charlie, 1);128    });129  });130131  /* it('transferFrom for a collection that was destroyed', async () => {132    await usingApi(async (api: ApiPromise) => {133      this test copies approve negative test134    });135  }); */136137  /* it('transferFrom a token that does not exist', async () => {138    await usingApi(async (api: ApiPromise) => {139      this test copies approve negative test140    });141  }); */142143  /* it('transferFrom a token that was deleted', async () => {144    await usingApi(async (api: ApiPromise) => {145      this test copies approve negative test146    });147  }); */148149  it('transferFrom for not approved address', async () => {150    await usingApi(async () => {151      // nft152      const nftCollectionId = await createCollectionExpectSuccess();153      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');154155      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);156157      // fungible158      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});159      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');160      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);161      // reFungible162      const reFungibleCollectionId = await163      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});164      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');165      await transferFromExpectFail(166        reFungibleCollectionId,167        newReFungibleTokenId,168        bob,169        alice,170        charlie,171        1,172      );173    });174  });175176  it('transferFrom incorrect token count', async () => {177    await usingApi(async () => {178      // nft179      const nftCollectionId = await createCollectionExpectSuccess();180      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');181      await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);182183      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 2);184185      // fungible186      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});187      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');188      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);189      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 2);190      // reFungible191      const reFungibleCollectionId = await192      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});193      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');194      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address);195      await transferFromExpectFail(196        reFungibleCollectionId,197        newReFungibleTokenId,198        bob,199        alice,200        charlie,201        2,202      );203    });204  });205206  it('execute transferFrom from account that is not owner of collection', async () => {207    await usingApi(async () => {208      const dave = privateKey('//Dave');209      // nft210      const nftCollectionId = await createCollectionExpectSuccess();211      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');212      try {213        await approveExpectFail(nftCollectionId, newNftTokenId, dave, bob);214        await transferFromExpectFail(nftCollectionId, newNftTokenId, dave, alice, charlie, 1);215      } catch (e) {216        // tslint:disable-next-line:no-unused-expression217        expect(e).to.be.exist;218      }219220      // await transferFromExpectFail(nftCollectionId, newNftTokenId, Dave, Alice, Charlie, 1);221222      // fungible223      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});224      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');225      try {226        await approveExpectFail(fungibleCollectionId, newFungibleTokenId, dave, bob);227        await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, dave, alice, charlie, 1);228      } catch (e) {229        // tslint:disable-next-line:no-unused-expression230        expect(e).to.be.exist;231      }232      // reFungible233      const reFungibleCollectionId = await234      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});235      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');236      try {237        await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, dave, bob);238        await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, dave, alice, charlie, 1);239      } catch (e) {240        // tslint:disable-next-line:no-unused-expression241        expect(e).to.be.exist;242      }243    });244  });245  it('transferFrom burnt token before approve NFT', async () => {246    await usingApi(async () => {247      // nft248      const nftCollectionId = await createCollectionExpectSuccess();249      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');250      await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);251      await approveExpectFail(nftCollectionId, newNftTokenId, alice, bob);252      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);253    });254  });255  it('transferFrom burnt token before approve Fungible', async () => {256    await usingApi(async () => {257      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});258      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');259      await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);260      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);261      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);262263    });264  });265  it('transferFrom burnt token before approve ReFungible', async () => {266    await usingApi(async () => {267      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});268      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');269      await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);270      await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, alice, bob);271      await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, bob, alice, charlie, 1);272273    });274  });275276  it('transferFrom burnt token after approve NFT', async () => {277    await usingApi(async () => {278      // nft279      const nftCollectionId = await createCollectionExpectSuccess();280      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');281      await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);282      await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);283      await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);284    });285  });286  it('transferFrom burnt token after approve Fungible', async () => {287    await usingApi(async () => {288      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});289      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');290      await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);291      await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);292      await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);293294    });295  });296  it('transferFrom burnt token after approve ReFungible', async () => {297    await usingApi(async () => {298      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});299      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');300      await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address);301      await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);302      await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, bob, alice, charlie, 1);303304    });305  });306307  it('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async () => {308    const collectionId = await createCollectionExpectSuccess();309    const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address);310    await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: false});311312    await transferFromExpectFail(collectionId, itemId, alice, bob, charlie);313  });314});