123456import { 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 transferExpectFail,20 transferExpectSuccess,21} from './util/helpers';2223let Alice: IKeyringPair;24let Bob: IKeyringPair;25let Charlie: IKeyringPair;2627describe('Integration Test Transfer(recipient, collection_id, item_id, value)', () => {28 it('Balance transfers and check balance', async () => {29 await usingApi(async (api: ApiPromise) => {30 const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);3132 const alicePrivateKey = privateKey('//Alice');3334 const transfer = api.tx.balances.transfer(bobsPublicKey, 1n);35 const events = await submitTransactionAsync(alicePrivateKey, transfer);36 const result = getCreateItemResult(events);37 38 expect(result.success).to.be.true;3940 const [alicesBalanceAfter, bobsBalanceAfter] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);4142 43 expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;44 45 expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;46 });47 });4849 it('Inability to pay fees error message is correct', async () => {50 await usingApi(async (api) => {51 52 const pk = await findUnusedAddress(api);5354 const badTransfer = api.tx.balances.transfer(bobsPublicKey, 1n);55 56 const badTransaction = async () => {57 const events = await submitTransactionAsync(pk, badTransfer);58 const result = getCreateCollectionResult(events);59 60 expect(result.success).to.be.false;61 };62 expect(badTransaction()).to.be.rejectedWith('Inability to pay some fees , e.g. account balance too low');63 });64 });6566 it('User can transfer owned token', async () => {67 await usingApi(async () => {68 const Alice = privateKey('//Alice');69 const Bob = privateKey('//Bob');70 71 const nftCollectionId = await createCollectionExpectSuccess();72 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');73 await transferExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');74 75 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});76 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');77 await transferExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');78 79 const reFungibleCollectionId = await80 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});81 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');82 await transferExpectSuccess(83 reFungibleCollectionId,84 newReFungibleTokenId,85 Alice,86 Bob,87 100,88 'ReFungible',89 );90 });91 });92});9394describe('Negative Integration Test Transfer(recipient, collection_id, item_id, value)', () => {95 before(async () => {96 await usingApi(async () => {97 Alice = privateKey('//Alice');98 Bob = privateKey('//Bob');99 Charlie = privateKey('//Charlie');100 });101 });102 it('Transfer with not existed collection_id', async () => {103 await usingApi(async (api) => {104 105 const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;106 await transferExpectFail(nftCollectionCount + 1, 1, Alice, Bob, 1);107 108 const fungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;109 await transferExpectFail(fungibleCollectionCount + 1, 1, Alice, Bob, 1);110 111 const reFungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;112 await transferExpectFail(reFungibleCollectionCount + 1, 1, Alice, Bob, 1);113 });114 });115 it('Transfer with deleted collection_id', async () => {116 117 const nftCollectionId = await createCollectionExpectSuccess();118 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');119 await destroyCollectionExpectSuccess(nftCollectionId);120 await transferExpectFail(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');121 122 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});123 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');124 await destroyCollectionExpectSuccess(fungibleCollectionId);125 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');126 127 const reFungibleCollectionId = await128 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});129 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');130 await destroyCollectionExpectSuccess(reFungibleCollectionId);131 await transferExpectFail(132 reFungibleCollectionId,133 newReFungibleTokenId,134 Alice,135 Bob,136 1,137 'ReFungible',138 );139 });140 it('Transfer with not existed item_id', async () => {141 142 const nftCollectionId = await createCollectionExpectSuccess();143 await transferExpectFail(nftCollectionId, 2, Alice, Bob, 1, 'NFT');144 145 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});146 await transferExpectFail(fungibleCollectionId, 2, Alice, Bob, 1, 'Fungible');147 148 const reFungibleCollectionId = await149 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});150 await transferExpectFail(151 reFungibleCollectionId,152 2,153 Alice,154 Bob,155 1,156 'ReFungible',157 );158 });159 it('Transfer with deleted item_id', async () => {160 161 const nftCollectionId = await createCollectionExpectSuccess();162 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');163 await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);164 await transferExpectFail(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');165 166 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});167 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');168 await burnItemExpectSuccess(Alice, fungibleCollectionId, newFungibleTokenId, 10);169 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');170 171 const reFungibleCollectionId = await172 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});173 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');174 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);175 await transferExpectFail(176 reFungibleCollectionId,177 newReFungibleTokenId,178 Alice,179 Bob,180 1,181 'ReFungible',182 );183 });184 it('Transfer with recipient that is not owner', async () => {185 186 const nftCollectionId = await createCollectionExpectSuccess();187 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');188 await transferExpectFail(nftCollectionId, newNftTokenId, Charlie, Bob, 1, 'NFT');189 190 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});191 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');192 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Charlie, Bob, 1, 'Fungible');193 194 const reFungibleCollectionId = await195 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});196 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');197 await transferExpectFail(198 reFungibleCollectionId,199 newReFungibleTokenId,200 Charlie,201 Bob,202 1,203 'ReFungible',204 );205 });206});