1234567891011121314151617import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api';18import {IKeyringPair} from '@polkadot/types/types';19import {20 createCollectionExpectSuccess,21 createItemExpectSuccess,22 getGenericResult,23 normalizeAccountId,24 addCollectionAdminExpectSuccess,25 getBalance,26 setCollectionLimitsExpectSuccess,27 isTokenExists,28 requirePallets,29 Pallets30} from './util/helpers';3132import chai from 'chai';33import chaiAsPromised from 'chai-as-promised';34chai.use(chaiAsPromised);35const expect = chai.expect;3637let alice: IKeyringPair;38let bob: IKeyringPair;3940describe('integration test: ext. burnItem():', () => {41 before(async () => {42 await usingApi(async (api, privateKeyWrapper) => {43 alice = privateKeyWrapper('//Alice');44 bob = privateKeyWrapper('//Bob');45 });46 });4748 it('Burn item in NFT collection', async () => {49 const createMode = 'NFT';50 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});51 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);5253 await usingApi(async (api) => {54 const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);55 const events = await submitTransactionAsync(alice, tx);56 const result = getGenericResult(events);5758 expect(result.success).to.be.true;59 60 expect(await isTokenExists(api, collectionId, tokenId)).to.be.false;61 });62 });6364 it('Burn item in Fungible collection', async () => {65 const createMode = 'Fungible';66 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 0}});67 await createItemExpectSuccess(alice, collectionId, createMode); 68 const tokenId = 0; 6970 await usingApi(async (api) => {71 72 const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);73 const events = await submitTransactionAsync(alice, tx);74 const result = getGenericResult(events);7576 77 const balance = await getBalance(api, collectionId, alice.address, 0);7879 80 expect(result.success).to.be.true;81 expect(balance).to.be.equal(9n);82 });83 });8485 it('Burn item in ReFungible collection', async function() {86 await requirePallets(this, [Pallets.ReFungible]);8788 const createMode = 'ReFungible';89 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});90 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);9192 await usingApi(async (api) => {93 const tx = api.tx.unique.burnItem(collectionId, tokenId, 100);94 const events = await submitTransactionAsync(alice, tx);95 const result = getGenericResult(events);9697 98 const balance = await getBalance(api, collectionId, alice.address, tokenId);99100 101 expect(result.success).to.be.true;102 expect(balance).to.be.equal(0n);103 });104 });105106 it('Burn owned portion of item in ReFungible collection', async function() {107 await requirePallets(this, [Pallets.ReFungible]);108109 const createMode = 'ReFungible';110 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});111 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);112113 await usingApi(async (api) => {114 115 const transfertx = api.tx.unique.transfer(normalizeAccountId(bob.address), collectionId, tokenId, 1);116 const events1 = await submitTransactionAsync(alice, transfertx);117 const result1 = getGenericResult(events1);118119 120 const bobBalanceBefore = await getBalance(api, collectionId, bob.address, tokenId);121 const aliceBalanceBefore = await getBalance(api, collectionId, alice.address, tokenId);122123 124 const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);125 const events2 = await submitTransactionAsync(bob, tx);126 const result2 = getGenericResult(events2);127128 129 const bobBalanceAfter = await getBalance(api, collectionId, bob.address, tokenId);130 const aliceBalanceAfter = await getBalance(api, collectionId, alice.address, tokenId);131 132133 134 expect(result1.success).to.be.true;135 expect(aliceBalanceBefore).to.be.equal(99n);136 expect(bobBalanceBefore).to.be.equal(1n);137138 139 expect(result2.success).to.be.true;140 expect(aliceBalanceAfter).to.be.equal(99n);141 expect(bobBalanceAfter).to.be.equal(0n);142 });143144 });145146});147148describe('integration test: ext. burnItem() with admin permissions:', () => {149 before(async () => {150 await usingApi(async (api, privateKeyWrapper) => {151 alice = privateKeyWrapper('//Alice');152 bob = privateKeyWrapper('//Bob');153 });154 });155156 it('Burn item in NFT collection', async () => {157 const createMode = 'NFT';158 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});159 await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true});160 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);161 await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);162163 await usingApi(async (api) => {164 const tx = api.tx.unique.burnFrom(collectionId, {Substrate: alice.address}, tokenId, 1);165 const events = await submitTransactionAsync(bob, tx);166 const result = getGenericResult(events);167168 expect(result.success).to.be.true;169 170 expect(await isTokenExists(api, collectionId, tokenId)).to.be.false;171 });172 });173174 175 it('Burn item in Fungible collection', async () => {176 const createMode = 'Fungible';177 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 0}});178 await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true});179 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode); 180 await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);181182 await usingApi(async (api) => {183 184 const tx = api.tx.unique.burnFrom(collectionId, normalizeAccountId(alice.address), tokenId, 1);185 const events = await submitTransactionAsync(bob, tx);186 const result = getGenericResult(events);187188 189 const balance = await getBalance(api, collectionId, alice.address, 0);190191 192 expect(result.success).to.be.true;193 expect(balance).to.be.equal(9n);194 });195 });196197 198 it('Burn item in ReFungible collection', async function() {199 await requirePallets(this, [Pallets.ReFungible]);200201 const createMode = 'ReFungible';202 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});203 await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true});204 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);205 await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);206207 await usingApi(async (api) => {208 const tx = api.tx.unique.burnFrom(collectionId, normalizeAccountId(alice.address), tokenId, 100);209 const events = await submitTransactionAsync(bob, tx);210 const result = getGenericResult(events);211 212 expect(result.success).to.be.true;213 214 expect(await isTokenExists(api, collectionId, tokenId)).to.be.false;215 });216 });217});218219describe('Negative integration test: ext. burnItem():', () => {220 before(async () => {221 await usingApi(async (api, privateKeyWrapper) => {222 alice = privateKeyWrapper('//Alice');223 bob = privateKeyWrapper('//Bob');224 });225 });226227 it('Burn a token that was never created', async () => {228 const createMode = 'NFT';229 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});230 const tokenId = 10;231232 await usingApi(async (api) => {233 const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);234 const badTransaction = async function () {235 await submitTransactionExpectFailAsync(alice, tx);236 };237 await expect(badTransaction()).to.be.rejected;238 });239240 });241242 it('Burn a token using the address that does not own it', async () => {243 const createMode = 'NFT';244 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});245 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);246247 await usingApi(async (api) => {248 const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);249 const badTransaction = async function () {250 await submitTransactionExpectFailAsync(bob, tx);251 };252 await expect(badTransaction()).to.be.rejected;253 });254255 });256257 it('Transfer a burned a token', async () => {258 const createMode = 'NFT';259 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});260 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);261262 await usingApi(async (api) => {263264 const burntx = api.tx.unique.burnItem(collectionId, tokenId, 1);265 const events1 = await submitTransactionAsync(alice, burntx);266 const result1 = getGenericResult(events1);267 expect(result1.success).to.be.true;268269 const tx = api.tx.unique.transfer(normalizeAccountId(bob.address), collectionId, tokenId, 1);270 const badTransaction = async function () {271 await submitTransactionExpectFailAsync(alice, tx);272 };273 await expect(badTransaction()).to.be.rejected;274 });275276 });277278 it('Burn more than owned in Fungible collection', async () => {279 const createMode = 'Fungible';280 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 0}});281 282 await createItemExpectSuccess(alice, collectionId, createMode);283 const tokenId = 0; 284285 await usingApi(async (api) => {286 287 const tx = api.tx.unique.burnItem(collectionId, tokenId, 11);288 const badTransaction = async function () {289 await submitTransactionExpectFailAsync(alice, tx);290 };291 await expect(badTransaction()).to.be.rejected;292293 294 const balance = await getBalance(api, collectionId, alice.address, 0);295296 297 expect(balance).to.be.equal(10n);298 });299300 });301302});