12345import { 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} from './util/helpers';2324chai.use(chaiAsPromised);25const expect = chai.expect;2627describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {28 let Alice: IKeyringPair;29 let Bob: IKeyringPair;30 let Charlie: IKeyringPair;3132 before(async () => {33 await usingApi(async () => {34 Alice = privateKey('//Alice');35 Bob = privateKey('//Bob');36 Charlie = privateKey('//Charlie');37 });38 });3940 it('Execute the extrinsic and check nftItemList - owner of token', async () => {41 await usingApi(async () => {42 43 const nftCollectionId = await createCollectionExpectSuccess();44 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');45 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);4647 await transferFromExpectSuccess(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1, 'NFT');4849 50 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});51 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');52 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);53 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1, 'Fungible');5455 56 const reFungibleCollectionId = await57 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});58 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');59 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 100);60 await transferFromExpectSuccess(61 reFungibleCollectionId,62 newReFungibleTokenId,63 Bob,64 Alice,65 Charlie,66 100,67 'ReFungible',68 );69 });70 });7172 it('Should reduce allowance if value is big', async () => {73 await usingApi(async () => {74 const alice = privateKey('//Alice');75 const bob = privateKey('//Bob');76 const charlie = privateKey('//Charlie');7778 79 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});80 const newFungibleTokenId = await createFungibleItemExpectSuccess(alice, fungibleCollectionId, { Value: 500000n });8182 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob, 500000n);83 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 500000n, 'Fungible');84 expect((await getAllowance(fungibleCollectionId, newFungibleTokenId, alice.address, bob.address)).toString()).to.equal('0');85 });86 });8788 it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => {89 const collectionId = await createCollectionExpectSuccess();90 const itemId = await createItemExpectSuccess(Alice, collectionId, 'NFT', Bob.address);9192 await transferFromExpectSuccess(collectionId, itemId, Alice, Bob, Charlie);93 });94});9596describe('Negative Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {97 let Alice: IKeyringPair;98 let Bob: IKeyringPair;99 let Charlie: IKeyringPair;100101 before(async () => {102 await usingApi(async () => {103 Alice = privateKey('//Alice');104 Bob = privateKey('//Bob');105 Charlie = privateKey('//Charlie');106 });107 });108109 it('transferFrom for a collection that does not exist', async () => {110 await usingApi(async (api: ApiPromise) => {111 112 const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;113 await approveExpectFail(nftCollectionCount + 1, 1, Alice, Bob);114115 await transferFromExpectFail(nftCollectionCount + 1, 1, Bob, Alice, Charlie, 1);116117 118 const fungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;119 await approveExpectFail(fungibleCollectionCount + 1, 1, Alice, Bob);120121 await transferFromExpectFail(fungibleCollectionCount + 1, 1, Bob, Alice, Charlie, 1);122 123 const reFungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;124 await approveExpectFail(reFungibleCollectionCount + 1, 1, Alice, Bob);125126 await transferFromExpectFail(reFungibleCollectionCount + 1, 1, Bob, Alice, Charlie, 1);127 });128 });129130 131132133134135136 137138139140141142 143144145146147148 it('transferFrom for not approved address', async () => {149 await usingApi(async () => {150 151 const nftCollectionId = await createCollectionExpectSuccess();152 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');153154 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1);155156 157 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});158 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');159 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);160 161 const reFungibleCollectionId = await162 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});163 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');164 await transferFromExpectFail(165 reFungibleCollectionId,166 newReFungibleTokenId,167 Bob,168 Alice,169 Charlie,170 1,171 );172 });173 });174175 it('transferFrom incorrect token count', async () => {176 await usingApi(async () => {177 178 const nftCollectionId = await createCollectionExpectSuccess();179 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');180 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);181182 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 2);183184 185 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});186 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');187 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);188 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 2);189 190 const reFungibleCollectionId = await191 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});192 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');193 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);194 await transferFromExpectFail(195 reFungibleCollectionId,196 newReFungibleTokenId,197 Bob,198 Alice,199 Charlie,200 2,201 );202 });203 });204205 it('execute transferFrom from account that is not owner of collection', async () => {206 await usingApi(async () => {207 const Dave = privateKey('//Dave');208 209 const nftCollectionId = await createCollectionExpectSuccess();210 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');211 try {212 await approveExpectFail(nftCollectionId, newNftTokenId, Dave, Bob);213 await transferFromExpectFail(nftCollectionId, newNftTokenId, Dave, Alice, Charlie, 1);214 } catch (e) {215 216 expect(e).to.be.exist;217 }218219 220221 222 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});223 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');224 try {225 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Dave, Bob);226 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Dave, Alice, Charlie, 1);227 } catch (e) {228 229 expect(e).to.be.exist;230 }231 232 const reFungibleCollectionId = await233 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});234 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');235 try {236 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Bob);237 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Alice, Charlie, 1);238 } catch (e) {239 240 expect(e).to.be.exist;241 }242 });243 });244 it( 'transferFrom burnt token before approve NFT', async () => {245 await usingApi(async () => {246 247 const nftCollectionId = await createCollectionExpectSuccess();248 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');249 await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);250 await approveExpectFail(nftCollectionId, newNftTokenId, Alice, Bob);251 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1);252 });253 });254 it( 'transferFrom burnt token before approve Fungible', async () => {255 await usingApi(async () => {256 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});257 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');258 await burnItemExpectSuccess(Alice, fungibleCollectionId, 1, 10);259 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);260 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);261262 });263 });264 it( 'transferFrom burnt token before approve ReFungible', async () => {265 await usingApi(async () => {266 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});267 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');268 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 100);269 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);270 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice, Charlie, 1);271272 });273 });274275 it( 'transferFrom burnt token after approve NFT', async () => {276 await usingApi(async () => {277 278 const nftCollectionId = await createCollectionExpectSuccess();279 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');280 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);281 await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);282 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1);283 });284 });285 it( 'transferFrom burnt token after approve Fungible', async () => {286 await usingApi(async () => {287 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});288 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');289 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);290 await burnItemExpectSuccess(Alice, fungibleCollectionId, 1, 10);291 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);292293 });294 });295 it( 'transferFrom burnt token after approve ReFungible', async () => {296 await usingApi(async () => {297 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});298 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');299 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);300 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 100);301 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice, Charlie, 1);302303 });304 });305306 it('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async () => {307 const collectionId = await createCollectionExpectSuccess();308 const itemId = await createItemExpectSuccess(Alice, collectionId, 'NFT', Bob.address);309 await setCollectionLimitsExpectSuccess(Alice, collectionId, { ownerCanTransfer: false });310311 await transferFromExpectFail(collectionId, itemId, Alice, Bob, Charlie);312 });313});