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

difftreelog

source

tests/src/transfer.test.ts13.2 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//56import {ApiPromise} from '@polkadot/api';7import {IKeyringPair} from '@polkadot/types/types';8import {expect} from 'chai';9import {alicesPublicKey, bobsPublicKey} from './accounts';10import getBalance from './substrate/get-balance';11import privateKey from './substrate/privateKey';12import {default as usingApi, submitTransactionAsync} from './substrate/substrate-api';13import {14  burnItemExpectSuccess, createCollectionExpectSuccess, createItemExpectSuccess,15  destroyCollectionExpectSuccess,16  findUnusedAddress,17  getCreateCollectionResult,18  getCreateItemResult,19  transferExpectFailure,20  transferExpectSuccess,21  addCollectionAdminExpectSuccess,22  getCreatedCollectionCount,23  toSubstrateAddress,24  getTokenOwner,25  normalizeAccountId,26  getBalance as getTokenBalance,27} from './util/helpers';2829let alice: IKeyringPair;30let bob: IKeyringPair;31let charlie: IKeyringPair;3233describe('Integration Test Transfer(recipient, collection_id, item_id, value)', () => {34  it('Balance transfers and check balance', async () => {35    await usingApi(async (api: ApiPromise) => {36      const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);3738      const alicePrivateKey = privateKey('//Alice');3940      const transfer = api.tx.balances.transfer(bobsPublicKey, 1n);41      const events = await submitTransactionAsync(alicePrivateKey, transfer);42      const result = getCreateItemResult(events);43      // tslint:disable-next-line:no-unused-expression44      expect(result.success).to.be.true;4546      const [alicesBalanceAfter, bobsBalanceAfter] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);4748      // tslint:disable-next-line:no-unused-expression49      expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;50      // tslint:disable-next-line:no-unused-expression51      expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;52    });53  });5455  it('Inability to pay fees error message is correct', async () => {56    await usingApi(async (api) => {57      // Find unused address58      const pk = await findUnusedAddress(api);5960      const badTransfer = api.tx.balances.transfer(bobsPublicKey, 1n);61      // const events = await submitTransactionAsync(pk, badTransfer);62      const badTransaction = async () => {63        const events = await submitTransactionAsync(pk, badTransfer);64        const result = getCreateCollectionResult(events);65        // tslint:disable-next-line:no-unused-expression66        expect(result.success).to.be.false;67      };68      await expect(badTransaction()).to.be.rejectedWith('Inability to pay some fees , e.g. account balance too low');69    });70  });7172  it('User can transfer owned token', async () => {73    await usingApi(async () => {74      const alice = privateKey('//Alice');75      const bob = privateKey('//Bob');76      // nft77      const nftCollectionId = await createCollectionExpectSuccess();78      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');79      await transferExpectSuccess(nftCollectionId, newNftTokenId, alice, bob, 1, 'NFT');80      // fungible81      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});82      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');83      await transferExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob, 1, 'Fungible');84      // reFungible85      const reFungibleCollectionId = await86      createCollectionExpectSuccess({mode: {type: 'ReFungible'}});87      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');88      await transferExpectSuccess(89        reFungibleCollectionId,90        newReFungibleTokenId,91        alice,92        bob,93        100,94        'ReFungible',95      );96    });97  });9899  it('Collection admin can transfer owned token', async () => {100    await usingApi(async () => {101      const alice = privateKey('//Alice');102      const bob = privateKey('//Bob');103      // nft104      const nftCollectionId = await createCollectionExpectSuccess();105      await addCollectionAdminExpectSuccess(alice, nftCollectionId, bob.address);106      const newNftTokenId = await createItemExpectSuccess(bob, nftCollectionId, 'NFT', bob.address);107      await transferExpectSuccess(nftCollectionId, newNftTokenId, bob, alice, 1, 'NFT');108      // fungible109      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});110      await addCollectionAdminExpectSuccess(alice, fungibleCollectionId, bob.address);111      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible', bob.address);112      await transferExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, 1, 'Fungible');113      // reFungible114      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});115      await addCollectionAdminExpectSuccess(alice, reFungibleCollectionId, bob.address);116      const newReFungibleTokenId = await createItemExpectSuccess(bob, reFungibleCollectionId, 'ReFungible', bob.address);117      await transferExpectSuccess(118        reFungibleCollectionId,119        newReFungibleTokenId,120        bob,121        alice,122        100,123        'ReFungible',124      );125    });126  });127});128129describe('Negative Integration Test Transfer(recipient, collection_id, item_id, value)', () => {130  before(async () => {131    await usingApi(async () => {132      alice = privateKey('//Alice');133      bob = privateKey('//Bob');134      charlie = privateKey('//Charlie');135    });136  });137  it('Transfer with not existed collection_id', async () => {138    await usingApi(async (api) => {139      // nft140      const nftCollectionCount = await getCreatedCollectionCount(api);141      await transferExpectFailure(nftCollectionCount + 1, 1, alice, bob, 1);142      // fungible143      const fungibleCollectionCount = await getCreatedCollectionCount(api);144      await transferExpectFailure(fungibleCollectionCount + 1, 0, alice, bob, 1);145      // reFungible146      const reFungibleCollectionCount = await getCreatedCollectionCount(api);147      await transferExpectFailure(reFungibleCollectionCount + 1, 1, alice, bob, 1);148    });149  });150  it('Transfer with deleted collection_id', async () => {151    // nft152    const nftCollectionId = await createCollectionExpectSuccess();153    const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');154    await destroyCollectionExpectSuccess(nftCollectionId);155    await transferExpectFailure(nftCollectionId, newNftTokenId, alice, bob, 1);156    // fungible157    const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});158    const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');159    await destroyCollectionExpectSuccess(fungibleCollectionId);160    await transferExpectFailure(fungibleCollectionId, newFungibleTokenId, alice, bob, 1);161    // reFungible162    const reFungibleCollectionId = await163    createCollectionExpectSuccess({mode: {type: 'ReFungible'}});164    const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');165    await destroyCollectionExpectSuccess(reFungibleCollectionId);166    await transferExpectFailure(167      reFungibleCollectionId,168      newReFungibleTokenId,169      alice,170      bob,171      1,172    );173  });174  it('Transfer with not existed item_id', async () => {175    // nft176    const nftCollectionId = await createCollectionExpectSuccess();177    await transferExpectFailure(nftCollectionId, 2, alice, bob, 1);178    // fungible179    const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});180    await transferExpectFailure(fungibleCollectionId, 2, alice, bob, 1);181    // reFungible182    const reFungibleCollectionId = await183    createCollectionExpectSuccess({mode: {type: 'ReFungible'}});184    await transferExpectFailure(185      reFungibleCollectionId,186      2,187      alice,188      bob,189      1,190    );191  });192  it('Transfer with deleted item_id', async () => {193    // nft194    const nftCollectionId = await createCollectionExpectSuccess();195    const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');196    await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);197    await transferExpectFailure(nftCollectionId, newNftTokenId, alice, bob, 1);198    // fungible199    const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});200    const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');201    await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);202    await transferExpectFailure(fungibleCollectionId, newFungibleTokenId, alice, bob, 1);203    // reFungible204    const reFungibleCollectionId = await205    createCollectionExpectSuccess({mode: {type: 'ReFungible'}});206    const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');207    await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);208    await transferExpectFailure(209      reFungibleCollectionId,210      newReFungibleTokenId,211      alice,212      bob,213      1,214    );215  });216  it('Transfer with recipient that is not owner', async () => {217    // nft218    const nftCollectionId = await createCollectionExpectSuccess();219    const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');220    await transferExpectFailure(nftCollectionId, newNftTokenId, charlie, bob, 1);221    // fungible222    const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});223    const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');224    await transferExpectFailure(fungibleCollectionId, newFungibleTokenId, charlie, bob, 1);225    // reFungible226    const reFungibleCollectionId = await227    createCollectionExpectSuccess({mode: {type: 'ReFungible'}});228    const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');229    await transferExpectFailure(230      reFungibleCollectionId,231      newReFungibleTokenId,232      charlie,233      bob,234      1,235    );236  });237});238239describe('Zero value transfer(From)', () => {240  before(async () => {241    await usingApi(async () => {242      alice = privateKey('//Alice');243      bob = privateKey('//Bob');244    });245  });246247  it('NFT', async () => {248    await usingApi(async (api: ApiPromise) => {249      const nftCollectionId = await createCollectionExpectSuccess();250      const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');251252      const transferTx = api.tx.unique.transfer(normalizeAccountId(bob), nftCollectionId, newNftTokenId, 0);253      await submitTransactionAsync(alice, transferTx);254      const address = normalizeAccountId(await getTokenOwner(api, nftCollectionId, newNftTokenId));255256      expect(toSubstrateAddress(address)).to.be.equal(alice.address);257    });258  });259260  it('RFT', async () => {261    await usingApi(async (api: ApiPromise) => {262      const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});263      const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');264      const balanceBeforeAlice = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(alice), newReFungibleTokenId);265      const balanceBeforeBob = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(bob), newReFungibleTokenId);266267      const transferTx = api.tx.unique.transfer(normalizeAccountId(bob), reFungibleCollectionId, newReFungibleTokenId, 0);268      await submitTransactionAsync(alice, transferTx);269270      const balanceAfterAlice = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(alice), newReFungibleTokenId);271      const balanceAfterBob = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(bob), newReFungibleTokenId);272273      expect((balanceBeforeAlice)).to.be.equal(balanceAfterAlice);274      expect((balanceBeforeBob)).to.be.equal(balanceAfterBob);275    });276  });277278  it('Fungible', async () => {279    await usingApi(async (api: ApiPromise) => {280      const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});281      const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');282      const balanceBeforeAlice = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(alice), newFungibleTokenId);283      const balanceBeforeBob = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(bob), newFungibleTokenId);284285      const transferTx = api.tx.unique.transfer(normalizeAccountId(bob), fungibleCollectionId, newFungibleTokenId, 0);286      await submitTransactionAsync(alice, transferTx);287288      const balanceAfterAlice = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(alice), newFungibleTokenId);289      const balanceAfterBob = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(bob), newFungibleTokenId);290291      expect((balanceBeforeAlice)).to.be.equal(balanceAfterAlice);292      expect((balanceBeforeBob)).to.be.equal(balanceAfterBob);293    });294  });295});