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 destroyCollectionExpectSuccess,18 getAllowance,19 transferFromExpectFail,20 transferFromExpectSuccess,21 burnItemExpectSuccess,22 setCollectionLimitsExpectSuccess,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 (api) => {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 (api: ApiPromise) => {43 44 const nftCollectionId = await createCollectionExpectSuccess();45 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');46 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);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);54 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1, 'Fungible');55 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(reFungibleCollectionId,61 newReFungibleTokenId, Bob, Alice, Charlie, 100, 'ReFungible');62 });63 });6465 it('Should reduce allowance if value is big', async () => {66 await usingApi(async () => {67 const alice = privateKey('//Alice');68 const bob = privateKey('//Bob');69 const charlie = privateKey('//Charlie');7071 72 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});73 const newFungibleTokenId = await createFungibleItemExpectSuccess(alice, fungibleCollectionId, { Value: 500000n });7475 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob, 500000n);76 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, bob, alice, charlie, 500000n, 'Fungible');77 expect((await getAllowance(fungibleCollectionId, newFungibleTokenId, alice.address, bob.address)).toString()).to.equal('0');78 });79 });8081 it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => {82 const collectionId = await createCollectionExpectSuccess();83 const itemId = await createItemExpectSuccess(Alice, collectionId, 'NFT', Bob.address);8485 await transferFromExpectSuccess(collectionId, itemId, Alice, Bob, Charlie);86 });87});8889describe('Negative Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {90 let Alice: IKeyringPair;91 let Bob: IKeyringPair;92 let Charlie: IKeyringPair;9394 before(async () => {95 await usingApi(async (api) => {96 Alice = privateKey('//Alice');97 Bob = privateKey('//Bob');98 Charlie = privateKey('//Charlie');99 });100 });101102 it('transferFrom for a collection that does not exist', async () => {103 await usingApi(async (api: ApiPromise) => {104 105 const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;106 await approveExpectFail(nftCollectionCount + 1, 1, Alice, Bob);107108 await transferFromExpectFail(nftCollectionCount + 1, 1, Bob, Alice, Charlie, 1);109110 111 const fungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;112 await approveExpectFail(fungibleCollectionCount + 1, 1, Alice, Bob);113114 await transferFromExpectFail(fungibleCollectionCount + 1, 1, Bob, Alice, Charlie, 1);115 116 const reFungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;117 await approveExpectFail(reFungibleCollectionCount + 1, 1, Alice, Bob);118119 await transferFromExpectFail(reFungibleCollectionCount + 1, 1, Bob, Alice, Charlie, 1);120 });121 });122123 124125126127128129 130131132133134135 136137138139140141 it('transferFrom for not approved address', async () => {142 await usingApi(async (api: ApiPromise) => {143 144 const nftCollectionId = await createCollectionExpectSuccess();145 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');146147 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1);148149 150 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});151 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');152 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);153 154 const reFungibleCollectionId = await155 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});156 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');157 await transferFromExpectFail(reFungibleCollectionId,158 newReFungibleTokenId, Bob, Alice, Charlie, 1);159 });160 });161162 it('transferFrom incorrect token count', async () => {163 await usingApi(async (api: ApiPromise) => {164 165 const nftCollectionId = await createCollectionExpectSuccess();166 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');167 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);168169 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 2);170171 172 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});173 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');174 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);175 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 2);176 177 const reFungibleCollectionId = await178 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});179 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');180 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);181 await transferFromExpectFail(reFungibleCollectionId,182 newReFungibleTokenId, Bob, Alice, Charlie, 2);183 });184 });185186 it('execute transferFrom from account that is not owner of collection', async () => {187 await usingApi(async (api: ApiPromise) => {188 const Dave = privateKey('//Dave');189 190 const nftCollectionId = await createCollectionExpectSuccess();191 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');192 try {193 await approveExpectFail(nftCollectionId, newNftTokenId, Dave, Bob);194 await transferFromExpectFail(nftCollectionId, newNftTokenId, Dave, Alice, Charlie, 1);195 } catch (e) {196 197 expect(e).to.be.exist;198 }199200 201202 203 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});204 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');205 try {206 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Dave, Bob);207 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Dave, Alice, Charlie, 1);208 } catch (e) {209 210 expect(e).to.be.exist;211 }212 213 const reFungibleCollectionId = await214 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});215 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');216 try {217 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Bob);218 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Alice, Charlie, 1);219 } catch (e) {220 221 expect(e).to.be.exist;222 }223 });224 });225 it( 'transferFrom burnt token before approve NFT', async () => {226 await usingApi(async (api: ApiPromise) => {227 228 const nftCollectionId = await createCollectionExpectSuccess();229 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');230 await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);231 await approveExpectFail(nftCollectionId, newNftTokenId, Alice, Bob);232 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1); 233 });234 });235 it( 'transferFrom burnt token before approve Fungible', async () => {236 await usingApi(async (api: ApiPromise) => {237 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});238 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');239 await burnItemExpectSuccess(Alice, fungibleCollectionId, 1, 10);240 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob);241 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);242 243 });244 }); 245 it( 'transferFrom burnt token before approve ReFungible', async () => {246 await usingApi(async (api: ApiPromise) => {247 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});248 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');249 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);250 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);251 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice, Charlie, 1);252 253 });254 });255 256 it( 'transferFrom burnt token after approve NFT', async () => {257 await usingApi(async (api: ApiPromise) => {258 259 const nftCollectionId = await createCollectionExpectSuccess();260 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');261 await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob);262 await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);263 await transferFromExpectFail(nftCollectionId, newNftTokenId, Bob, Alice, Charlie, 1); 264 });265 });266 it( 'transferFrom burnt token after approve Fungible', async () => {267 await usingApi(async (api: ApiPromise) => {268 const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});269 const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');270 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);271 await burnItemExpectSuccess(Alice, fungibleCollectionId, 1, 10);272 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);273 274 });275 }); 276 it( 'transferFrom burnt token after approve ReFungible', async () => {277 await usingApi(async (api: ApiPromise) => {278 const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});279 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');280 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);281 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);282 await transferFromExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice, Charlie, 1);283 284 });285 });286287 it('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async () => {288 const collectionId = await createCollectionExpectSuccess();289 const itemId = await createItemExpectSuccess(Alice, collectionId, 'NFT', Bob.address);290 await setCollectionLimitsExpectSuccess(Alice, collectionId, { OwnerCanTransfer: false });291292 await transferFromExpectFail(collectionId, itemId, Alice, Bob, Charlie);293 });294});