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 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 44 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 51 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 57 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 80 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 113 const nftCollectionCount = await getCreatedCollectionCount(api);114 await approveExpectFail(nftCollectionCount + 1, 1, alice, bob);115116 await transferFromExpectFail(nftCollectionCount + 1, 1, bob, alice, charlie, 1);117118 119 const fungibleCollectionCount = await getCreatedCollectionCount(api);120 await approveExpectFail(fungibleCollectionCount + 1, 0, alice, bob);121122 await transferFromExpectFail(fungibleCollectionCount + 1, 0, bob, alice, charlie, 1);123 124 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 132133134135136137 138139140141142143 144145146147148149 it('transferFrom for not approved address', async () => {150 await usingApi(async () => {151 152 const nftCollectionId = await createCollectionExpectSuccess();153 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');154155 await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);156157 158 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 162 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 179 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 186 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 191 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 210 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 217 expect(e).to.be.exist;218 }219220 221222 223 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 230 expect(e).to.be.exist;231 }232 233 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 241 expect(e).to.be.exist;242 }243 });244 });245 it('transferFrom burnt token before approve NFT', async () => {246 await usingApi(async () => {247 248 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 279 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});