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 (api) => {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(reFungibleCollectionId,83 newReFungibleTokenId, Alice, Bob, 100, 'ReFungible');84 });85 });86});8788describe('Negative Integration Test Transfer(recipient, collection_id, item_id, value)', () => {89 before(async () => {90 await usingApi(async (api: ApiPromise) => {91 Alice = privateKey('//Alice');92 Bob = privateKey('//Bob');93 Charlie = privateKey('//Charlie');94 });95 });96 it('Transfer with not existed collection_id', async () => {97 await usingApi(async (api) => {98 99 const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;100 await transferExpectFail(nftCollectionCount + 1, 1, Alice, Bob, 1);101 102 const fungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;103 await transferExpectFail(fungibleCollectionCount + 1, 1, Alice, Bob, 1);104 105 const reFungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;106 await transferExpectFail(reFungibleCollectionCount + 1, 1, Alice, Bob, 1);107 });108 });109 it('Transfer with deleted collection_id', async () => {110 111 const nftCollectionId = await createCollectionExpectSuccess();112 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');113 await destroyCollectionExpectSuccess(nftCollectionId);114 await transferExpectFail(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');115 116 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});117 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');118 await destroyCollectionExpectSuccess(fungibleCollectionId);119 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');120 121 const reFungibleCollectionId = await122 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});123 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');124 await destroyCollectionExpectSuccess(reFungibleCollectionId);125 await transferExpectFail(reFungibleCollectionId,126 newReFungibleTokenId, Alice, Bob, 1, 'ReFungible');127 });128 it('Transfer with not existed item_id', async () => {129 130 const nftCollectionId = await createCollectionExpectSuccess();131 await transferExpectFail(nftCollectionId, 2, Alice, Bob, 1, 'NFT');132 133 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});134 await transferExpectFail(fungibleCollectionId, 2, Alice, Bob, 1, 'Fungible');135 136 const reFungibleCollectionId = await137 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});138 await transferExpectFail(reFungibleCollectionId,139 2, Alice, Bob, 1, 'ReFungible');140 });141 it('Transfer with deleted item_id', async () => {142 143 const nftCollectionId = await createCollectionExpectSuccess();144 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');145 await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);146 await transferExpectFail(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');147 148 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});149 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');150 await burnItemExpectSuccess(Alice, fungibleCollectionId, newFungibleTokenId, 10);151 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');152 153 const reFungibleCollectionId = await154 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});155 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');156 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);157 await transferExpectFail(reFungibleCollectionId,158 newReFungibleTokenId, Alice, Bob, 1, 'ReFungible');159 });160 it('Transfer with recipient that is not owner', async () => {161 162 const nftCollectionId = await createCollectionExpectSuccess();163 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');164 await transferExpectFail(nftCollectionId, newNftTokenId, Charlie, Bob, 1, 'NFT');165 166 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});167 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');168 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Charlie, Bob, 1, 'Fungible');169 170 const reFungibleCollectionId = await171 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});172 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');173 await transferExpectFail(reFungibleCollectionId,174 newReFungibleTokenId, Charlie, Bob, 1, 'ReFungible');175 });176});