1234567891011121314151617import {ApiPromise} from '@polkadot/api';18import {IKeyringPair} from '@polkadot/types/types';19import chai from 'chai';20import chaiAsPromised from 'chai-as-promised';21import {default as usingApi} from './substrate/substrate-api';22import {23 approveExpectFail,24 approveExpectSuccess,25 createCollectionExpectSuccess,26 createFungibleItemExpectSuccess,27 createItemExpectSuccess,28 getAllowance,29 transferFromExpectFail,30 transferFromExpectSuccess,31 burnItemExpectSuccess,32 setCollectionLimitsExpectSuccess,33 getCreatedCollectionCount,34} from './util/helpers';3536chai.use(chaiAsPromised);37const expect = chai.expect;3839describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {40 let alice: IKeyringPair;41 let bob: IKeyringPair;42 let charlie: IKeyringPair;4344 before(async () => {45 await usingApi(async (api, privateKeyWrapper) => {46 alice = privateKeyWrapper('//Alice');47 bob = privateKeyWrapper('//Bob');48 charlie = privateKeyWrapper('//Charlie');49 });50 });5152 it('Execute the extrinsic and check nftItemList - owner of token', async () => {53 await usingApi(async () => {54 55 const nftCollectionId = await createCollectionExpectSuccess();56 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');57 await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);5859 await transferFromExpectSuccess(nftCollectionId, newNftTokenId, bob, alice, charlie, 1, 'NFT');6061 62 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});63 const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');64 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);65 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1, 'Fungible');6667 68 const reFungibleCollectionId = await69 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});70 const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');71 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address, 100);72 await transferFromExpectSuccess(73 reFungibleCollectionId,74 newReFungibleTokenId,75 bob,76 alice,77 charlie,78 100,79 'ReFungible',80 );81 });82 });8384 it('Should reduce allowance if value is big', async () => {85 await usingApi(async (api, privateKeyWrapper) => {86 const alice = privateKeyWrapper('//Alice');87 const bob = privateKeyWrapper('//Bob');88 const charlie = privateKeyWrapper('//Charlie');8990 91 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});92 const newFungibleTokenId = await createFungibleItemExpectSuccess(alice, fungibleCollectionId, {Value: 500000n});9394 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address, 500000n);95 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 500000n, 'Fungible');96 expect(await getAllowance(api, fungibleCollectionId, alice.address, bob.address, newFungibleTokenId)).to.equal(0n);97 });98 });99100 it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => {101 const collectionId = await createCollectionExpectSuccess();102 const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address);103104 await transferFromExpectSuccess(collectionId, itemId, alice, bob, charlie);105 });106});107108describe('Negative Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {109 let alice: IKeyringPair;110 let bob: IKeyringPair;111 let charlie: IKeyringPair;112113 before(async () => {114 await usingApi(async (api, privateKeyWrapper) => {115 alice = privateKeyWrapper('//Alice');116 bob = privateKeyWrapper('//Bob');117 charlie = privateKeyWrapper('//Charlie');118 });119 });120121 it('transferFrom for a collection that does not exist', async () => {122 await usingApi(async (api: ApiPromise) => {123 124 const nftCollectionCount = await getCreatedCollectionCount(api);125 await approveExpectFail(nftCollectionCount + 1, 1, alice, bob);126127 await transferFromExpectFail(nftCollectionCount + 1, 1, bob, alice, charlie, 1);128129 130 const fungibleCollectionCount = await getCreatedCollectionCount(api);131 await approveExpectFail(fungibleCollectionCount + 1, 0, alice, bob);132133 await transferFromExpectFail(fungibleCollectionCount + 1, 0, bob, alice, charlie, 1);134 135 const reFungibleCollectionCount = await getCreatedCollectionCount(api);136 await approveExpectFail(reFungibleCollectionCount + 1, 1, alice, bob);137138 await transferFromExpectFail(reFungibleCollectionCount + 1, 1, bob, alice, charlie, 1);139 });140 });141142 143144145146147148 149150151152153154 155156157158159160 it('transferFrom for not approved address', async () => {161 await usingApi(async () => {162 163 const nftCollectionId = await createCollectionExpectSuccess();164 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');165166 await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);167168 169 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});170 const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');171 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);172 173 const reFungibleCollectionId = await174 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});175 const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');176 await transferFromExpectFail(177 reFungibleCollectionId,178 newReFungibleTokenId,179 bob,180 alice,181 charlie,182 1,183 );184 });185 });186187 it('transferFrom incorrect token count', async () => {188 await usingApi(async () => {189 190 const nftCollectionId = await createCollectionExpectSuccess();191 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');192 await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);193194 await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 2);195196 197 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});198 const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');199 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);200 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 2);201 202 const reFungibleCollectionId = await203 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});204 const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');205 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address);206 await transferFromExpectFail(207 reFungibleCollectionId,208 newReFungibleTokenId,209 bob,210 alice,211 charlie,212 2,213 );214 });215 });216217 it('execute transferFrom from account that is not owner of collection', async () => {218 await usingApi(async (api, privateKeyWrapper) => {219 const dave = privateKeyWrapper('//Dave');220 221 const nftCollectionId = await createCollectionExpectSuccess();222 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');223 try {224 await approveExpectFail(nftCollectionId, newNftTokenId, dave, bob);225 await transferFromExpectFail(nftCollectionId, newNftTokenId, dave, alice, charlie, 1);226 } catch (e) {227 228 expect(e).to.be.exist;229 }230231 232233 234 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});235 const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');236 try {237 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, dave, bob);238 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, dave, alice, charlie, 1);239 } catch (e) {240 241 expect(e).to.be.exist;242 }243 244 const reFungibleCollectionId = await245 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});246 const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');247 try {248 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, dave, bob);249 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, dave, alice, charlie, 1);250 } catch (e) {251 252 expect(e).to.be.exist;253 }254 });255 });256 it('transferFrom burnt token before approve NFT', async () => {257 await usingApi(async () => {258 259 const nftCollectionId = await createCollectionExpectSuccess();260 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');261 await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);262 await approveExpectFail(nftCollectionId, newNftTokenId, alice, bob);263 await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);264 });265 });266 it('transferFrom burnt token before approve Fungible', async () => {267 await usingApi(async () => {268 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});269 const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');270 await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);271 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);272 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);273274 });275 });276 it('transferFrom burnt token before approve ReFungible', async () => {277 await usingApi(async () => {278 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});279 const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');280 await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);281 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, alice, bob);282 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, bob, alice, charlie, 1);283284 });285 });286287 it('transferFrom burnt token after approve NFT', async () => {288 await usingApi(async () => {289 290 const nftCollectionId = await createCollectionExpectSuccess();291 const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');292 await approveExpectSuccess(nftCollectionId, newNftTokenId, alice, bob.address);293 await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1);294 await transferFromExpectFail(nftCollectionId, newNftTokenId, bob, alice, charlie, 1);295 });296 });297 it('transferFrom burnt token after approve Fungible', async () => {298 await usingApi(async () => {299 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});300 const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible');301 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address);302 await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10);303 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 1);304305 });306 });307 it('transferFrom burnt token after approve ReFungible', async () => {308 await usingApi(async () => {309 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});310 const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible');311 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address);312 await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100);313 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, bob, alice, charlie, 1);314315 });316 });317318 it('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async () => {319 const collectionId = await createCollectionExpectSuccess();320 const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address);321 await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: false});322323 await transferFromExpectFail(collectionId, itemId, alice, bob, charlie);324 });325});