1import {expect} from 'chai';2import {getApiConnection} from '../substrate/substrate-api';3import {createCollection, mintNft, sendNft} from './util/tx';4import {NftIdTuple} from './util/fetch';5import {isNftChildOfAnother, expectTxFailure} from './util/helpers';6import {requirePallets, Pallets} from '../util/helpers';78describe('integration test: send NFT', () => {9 let api: any;10 before(async function () {11 api = await getApiConnection();12 await requirePallets(this, [Pallets.RmrkCore]);13 });1415 const maxNftId = 0xFFFFFFFF;1617 const alice = '//Alice';18 const bob = '//Bob';1920 const createTestCollection = async (issuerUri: string) => {21 return await createCollection(22 api,23 issuerUri,24 'nft-collection-metadata',25 null,26 'nft-collection',27 );28 };293031 it('send NFT to another user', async () => {32 const originalOwnerUri = alice;33 const newOwnerUri = bob;3435 const collectionId = await createTestCollection(alice);3637 const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata');3839 await sendNft(api, 'sent', originalOwnerUri, collectionId, nftId, newOwnerUri);40 });4142 it('[negative] unable to send non-existing NFT', async () => {43 const originalOwnerUri = alice;44 const newOwnerUri = bob;4546 const collectionId = 0;47 const tx = sendNft(api, 'sent', originalOwnerUri, collectionId, maxNftId, newOwnerUri);4849 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);50 });5152 it('[negative] unable to send NFT by a not-an-owner', async () => {53 const originalOwnerUri = alice;54 const newOwnerUri = bob;5556 const collectionId = await createTestCollection(alice);5758 const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata');5960 const tx = sendNft(api, 'sent', newOwnerUri, collectionId, nftId, newOwnerUri);61 await expectTxFailure(/rmrkCore\.NoPermission/, tx);62 });6364 it('send NFT to another NFT (same owner)', async () => {65 const originalOwnerUri = alice;6667 const collectionId = await createTestCollection(alice);6869 const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');70 const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');7172 const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];7374 await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);7576 const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);77 expect(isChild).to.be.true;78 });7980 it('[negative] send non-existing NFT to another NFT', async () => {81 const originalOwnerUri = alice;8283 const collectionId = await createTestCollection(alice);8485 const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');86 const childNftId = maxNftId;8788 const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];8990 const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);9192 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);9394 const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);95 expect(isChild).to.be.false;96 });9798 it('send NFT to another NFT (by not-an-owner)', async () => {99 const originalOwnerUri = alice;100101 const collectionId = await createTestCollection(alice);102103 const author = alice;104 const attacker = bob;105106 const parentNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'parent-nft-metadata');107 const childNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'child-nft-metadata');108109 const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];110111 const tx = sendNft(api, 'sent', attacker, collectionId, childNftId, newOwnerNFT);112113 await expectTxFailure(/rmrkCore\.NoPermission/, tx);114115 const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);116 expect(isChild).to.be.false;117 });118119 it('[negative] send NFT to non-existing NFT', async () => {120 const originalOwnerUri = alice;121122 const collectionId = await createTestCollection(alice);123124 const parentNftId = maxNftId;125 const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');126127 const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];128129 const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);130131 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);132133 const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);134 expect(isChild).to.be.false;135 });136137 it('send NFT to another NFT owned by another user', async () => {138 const ownerAlice = alice;139 const ownerBob = bob;140141 const aliceCollectionId = await createTestCollection(alice);142 const bobCollectionId = await createTestCollection(bob);143144 const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');145 const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');146147 const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];148149 await sendNft(api, 'pending', bob, bobCollectionId, childNftId, newOwnerNFT);150 });151152 it('[negative] unable to send NFT to itself', async () => {153 const nftOwner = alice;154 const collectionId = await createTestCollection(alice);155156 const nftId = await mintNft(api, alice, nftOwner, collectionId, 'ouroboros-nft-metadata');157158 const newOwnerNFT: NftIdTuple = [collectionId, nftId];159160 const tx = sendNft(api, 'sent', alice, collectionId, nftId, newOwnerNFT);161162 await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);163164 const isChild = await isNftChildOfAnother(api, collectionId, nftId, newOwnerNFT);165 expect(isChild).to.be.false;166 });167168 it('[negative] unable to send NFT to child NFT', async () => {169 const originalOwnerUri = alice;170171 const collectionId = await createTestCollection(alice);172173 const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');174 const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');175176 const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];177178 await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);179180 const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);181 expect(isChild).to.be.true;182183 const descendentOwner: NftIdTuple = [collectionId, childNftId];184 const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, descendentOwner);185186 await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);187 const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, descendentOwner);188 expect(isOuroboros).to.be.false;189 });190191 it('[negative] unable to send NFT to descendent NFT', async () => {192 const originalOwnerUri = alice;193194 const collectionId = await createTestCollection(alice);195196 const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');197 const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');198 const grandsonNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'grandson-nft-metadata');199200 const ownerParentNFT: NftIdTuple = [collectionId, parentNftId];201202 await sendNft(api, 'sent', alice, collectionId, childNftId, ownerParentNFT);203204 const isChild = await isNftChildOfAnother(api, collectionId, childNftId, ownerParentNFT);205 expect(isChild).to.be.true;206207 const ownerChildNFT: NftIdTuple = [collectionId, childNftId];208 await sendNft(api, 'sent', alice, collectionId, grandsonNftId, ownerChildNFT);209210 const isGrandson = await isNftChildOfAnother(api, collectionId, grandsonNftId, ownerChildNFT);211 expect(isGrandson).to.be.true;212213 const ownerGrandsonNFT: NftIdTuple = [collectionId, grandsonNftId];214 const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, ownerGrandsonNFT);215216 await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);217 const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, ownerGrandsonNFT);218 expect(isOuroboros).to.be.false;219 });220221 it('send nested NFT to another user', async () => {222 const originalOwner = alice;223 const newOwner = bob;224225 const collectionId = await createTestCollection(alice);226227 const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata');228 const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata');229230 const parentNftTuple: NftIdTuple = [collectionId, parentNftId];231232 await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple);233234 await sendNft(api, 'sent', originalOwner, collectionId, childNftId, newOwner);235 });236237 it('[negative] send nested NFT to another user (by a not-root-owner)', async () => {238 const originalOwner = alice;239 const newOwner = bob;240241 const collectionId = await createTestCollection(alice);242243 const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata');244 const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata');245246 const parentNftTuple: NftIdTuple = [collectionId, parentNftId];247248 await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple);249250 const tx = sendNft(api, 'sent', newOwner, collectionId, childNftId, newOwner);251252 await expectTxFailure(/rmrkCore\.NoPermission/, tx);253 });254255 after(() => { api.disconnect(); });256});