git.delta.rocks / unique-network / refs/commits / e760275e5cdb

difftreelog

source

tests/src/createMultipleItems.test.ts26.9 KiBsourcehistory
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {ApiPromise} from '@polkadot/api';18import {IKeyringPair} from '@polkadot/types/types';19import chai from 'chai';20import chaiAsPromised from 'chai-as-promised';21import privateKey from './substrate/privateKey';22import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync, executeTransaction} from './substrate/substrate-api';23import {24  createCollectionExpectSuccess,25  destroyCollectionExpectSuccess,26  getGenericResult,27  normalizeAccountId,28  setCollectionLimitsExpectSuccess,29  addCollectionAdminExpectSuccess,30  getBalance,31  getTokenOwner,32  getLastTokenId,33  getConstMetadata,34  getCreatedCollectionCount,35  createCollectionWithPropsExpectSuccess,36  getCreateItemsResult,37  createMultipleItemsWithPropsExpectSuccess38} from './util/helpers';3940chai.use(chaiAsPromised);41const expect = chai.expect;4243describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {44  it('Create  0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => {45    await usingApi(async (api: ApiPromise) => {46      const collectionId = await createCollectionExpectSuccess();47      const itemsListIndexBefore = await getLastTokenId(api, collectionId);48      expect(itemsListIndexBefore).to.be.equal(0);49      const alice = privateKey('//Alice');50      const args = [{Nft: {const_data: '0x31'}},51        {Nft: {const_data: '0x32'}},52        {Nft: {const_data: '0x33'}}];53      const createMultipleItemsTx = api.tx.unique54        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);55      await submitTransactionAsync(alice, createMultipleItemsTx);56      const itemsListIndexAfter = await getLastTokenId(api, collectionId);57      expect(itemsListIndexAfter).to.be.equal(3);5859      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));60      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));61      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));6263      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);64      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);65      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);66    });67  });6869  it('Create  0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => {70    await usingApi(async (api: ApiPromise) => {71      const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});72      const itemsListIndexBefore = await getLastTokenId(api, collectionId);73      expect(itemsListIndexBefore).to.be.equal(0);74      const alice = privateKey('//Alice');75      const args = [76        {Fungible: {value: 1}},77        {Fungible: {value: 2}},78        {Fungible: {value: 3}},79      ];80      const createMultipleItemsTx = api.tx.unique81        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);82      await submitTransactionAsync(alice, createMultipleItemsTx);83      const token1Data = await getBalance(api, collectionId, alice.address, 0);8485      expect(token1Data).to.be.equal(6n); // 1 + 2 + 386    });87  });8889  it('Create  0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {90    await usingApi(async (api: ApiPromise) => {91      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});92      const itemsListIndexBefore = await getLastTokenId(api, collectionId);93      expect(itemsListIndexBefore).to.be.equal(0);94      const alice = privateKey('//Alice');95      const args = [96        {ReFungible: {const_data: [0x31], pieces: 1}},97        {ReFungible: {const_data: [0x32], pieces: 1}},98        {ReFungible: {const_data: [0x33], pieces: 1}},99      ];100      const createMultipleItemsTx = api.tx.unique101        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);102      await submitTransactionAsync(alice, createMultipleItemsTx);103      const itemsListIndexAfter = await getLastTokenId(api, collectionId);104      expect(itemsListIndexAfter).to.be.equal(3);105106      expect(await getBalance(api, collectionId, alice.address, 1)).to.be.equal(1n);107      expect(await getBalance(api, collectionId, alice.address, 2)).to.be.equal(1n);108      expect(await getBalance(api, collectionId, alice.address, 3)).to.be.equal(1n);109110      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);111      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);112      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);113    });114  });115116  it('Can mint amount of items equals to collection limits', async () => {117    await usingApi(async (api) => {118      const alice = privateKey('//Alice');119120      const collectionId = await createCollectionExpectSuccess();121      await setCollectionLimitsExpectSuccess(alice, collectionId, {122        tokenLimit: 2,123      });124      const args = [125        {NFT: {const_data: 'A'}},126        {NFT: {const_data: 'B'}},127      ];128      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);129      const events = await submitTransactionAsync(alice, createMultipleItemsTx);130      const result = getGenericResult(events);131      expect(result.success).to.be.true;132    });133  });134135  it('Create  0x31, 0x32, 0x33 items in active NFT with property Admin', async () => {136    await usingApi(async (api: ApiPromise) => {137      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]});138      const itemsListIndexBefore = await getLastTokenId(api, collectionId);139      expect(itemsListIndexBefore).to.be.equal(0);140      const alice = privateKey('//Alice');141      const bob = privateKey('//Bob');142      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}},143        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}},144        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}];145146      await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args);147      const itemsListIndexAfter = await getLastTokenId(api, collectionId);148      expect(itemsListIndexAfter).to.be.equal(3);149150      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));151      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));152      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));153154      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);155      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);156      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);157    });158  });159160  it('Create  0x31, 0x32, 0x33 items in active NFT with property AdminConst', async () => {161    await usingApi(async (api: ApiPromise) => {162      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}]});163      const itemsListIndexBefore = await getLastTokenId(api, collectionId);164      expect(itemsListIndexBefore).to.be.equal(0);165      const alice = privateKey('//Alice');166      const bob = privateKey('//Bob');167      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);168      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}},169        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}},170        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}];171172      await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args);173      const itemsListIndexAfter = await getLastTokenId(api, collectionId);174      expect(itemsListIndexAfter).to.be.equal(3);175176      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));177      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));178      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));179180      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);181      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);182      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);183    });184  });185186  it('Create  0x31, 0x32, 0x33 items in active NFT with property itemOwnerOrAdmin', async () => {187    await usingApi(async (api: ApiPromise) => {188      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]});189      const itemsListIndexBefore = await getLastTokenId(api, collectionId);190      expect(itemsListIndexBefore).to.be.equal(0);191      const alice = privateKey('//Alice');192      const bob = privateKey('//Bob');193      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}},194        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}},195        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}];196197      await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args);198      const itemsListIndexAfter = await getLastTokenId(api, collectionId);199      expect(itemsListIndexAfter).to.be.equal(3);200201      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));202      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));203      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));204205      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);206      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);207      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);208    });209  });210});211212describe('Integration Test createMultipleItems(collection_id, owner, items_data) with collection admin permissions:', () => {213214  let alice: IKeyringPair;215  let bob: IKeyringPair;216217  before(async () => {218    await usingApi(async () => {219      alice = privateKey('//Alice');220      bob = privateKey('//Bob');221    });222  });223224  it('Create  0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => {225    await usingApi(async (api: ApiPromise) => {226      const collectionId = await createCollectionExpectSuccess();227      const itemsListIndexBefore = await getLastTokenId(api, collectionId);228      expect(itemsListIndexBefore).to.be.equal(0);229      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);230      const args = [{Nft: {const_data: '0x31'}},231        {Nft: {const_data: '0x32'}},232        {Nft: {const_data: '0x33'}}];233      const createMultipleItemsTx = api.tx.unique234        .createMultipleItems(collectionId, normalizeAccountId(bob.address), args);235      await submitTransactionAsync(bob, createMultipleItemsTx);236      const itemsListIndexAfter = await getLastTokenId(api, collectionId);237      expect(itemsListIndexAfter).to.be.equal(3);238239      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(bob.address));240      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(bob.address));241      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(bob.address));242243      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);244      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);245      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);246    });247  });248249  it('Create  0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => {250    await usingApi(async (api: ApiPromise) => {251      const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});252      const itemsListIndexBefore = await getLastTokenId(api, collectionId);253      expect(itemsListIndexBefore).to.be.equal(0);254      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);255      const args = [256        {Fungible: {value: 1}},257        {Fungible: {value: 2}},258        {Fungible: {value: 3}},259      ];260      const createMultipleItemsTx = api.tx.unique261        .createMultipleItems(collectionId, normalizeAccountId(bob.address), args);262      await submitTransactionAsync(bob, createMultipleItemsTx);263      const token1Data = await getBalance(api, collectionId, bob.address, 0);264265      expect(token1Data).to.be.equal(6n); // 1 + 2 + 3266    });267  });268269  it('Create  0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {270    await usingApi(async (api: ApiPromise) => {271      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});272      const itemsListIndexBefore = await getLastTokenId(api, collectionId);273      expect(itemsListIndexBefore).to.be.equal(0);274      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);275      const args = [276        {ReFungible: {const_data: [0x31], pieces: 1}},277        {ReFungible: {const_data: [0x32], pieces: 1}},278        {ReFungible: {const_data: [0x33], pieces: 1}},279      ];280      const createMultipleItemsTx = api.tx.unique281        .createMultipleItems(collectionId, normalizeAccountId(bob.address), args);282      await submitTransactionAsync(bob, createMultipleItemsTx);283      const itemsListIndexAfter = await getLastTokenId(api, collectionId);284      expect(itemsListIndexAfter).to.be.equal(3);285286      expect(await getBalance(api, collectionId, bob.address, 1)).to.be.equal(1n);287      expect(await getBalance(api, collectionId, bob.address, 2)).to.be.equal(1n);288      expect(await getBalance(api, collectionId, bob.address, 3)).to.be.equal(1n);289290      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);291      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);292      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);293    });294  });295});296297describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => {298299  let alice: IKeyringPair;300  let bob: IKeyringPair;301302  before(async () => {303    await usingApi(async () => {304      alice = privateKey('//Alice');305      bob = privateKey('//Bob');306    });307  });308309  it('Regular user cannot create items in active NFT collection', async () => {310    await usingApi(async (api: ApiPromise) => {311      const collectionId = await createCollectionExpectSuccess();312      const itemsListIndexBefore = await getLastTokenId(api, collectionId);313      expect(itemsListIndexBefore).to.be.equal(0);314      const args = [{Nft: {const_data: '0x31'}},315        {Nft: {const_data: '0x32'}},316        {Nft: {const_data: '0x33'}}];317      const createMultipleItemsTx = api.tx.unique318        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);319      await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;320    });321  });322323  it('Regular user cannot create items in active Fungible collection', async () => {324    await usingApi(async (api: ApiPromise) => {325      const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});326      const itemsListIndexBefore = await getLastTokenId(api, collectionId);327      expect(itemsListIndexBefore).to.be.equal(0);328      const args = [329        {Fungible: {value: 1}},330        {Fungible: {value: 2}},331        {Fungible: {value: 3}},332      ];333      const createMultipleItemsTx = api.tx.unique334        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);335      await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;336    });337  });338339  it('Regular user cannot create items in active ReFungible collection', async () => {340    await usingApi(async (api: ApiPromise) => {341      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});342      const itemsListIndexBefore = await getLastTokenId(api, collectionId);343      expect(itemsListIndexBefore).to.be.equal(0);344      const args = [345        {ReFungible: {const_data: [0x31], pieces: 1}},346        {ReFungible: {const_data: [0x32], pieces: 1}},347        {ReFungible: {const_data: [0x33], pieces: 1}},348      ];349      const createMultipleItemsTx = api.tx.unique350        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);351      await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;352    });353  });354355  it('Create token in not existing collection', async () => {356    await usingApi(async (api: ApiPromise) => {357      const collectionId = await getCreatedCollectionCount(api) + 1;358      const createMultipleItemsTx = api.tx.unique359        .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'NFT', 'NFT']);360      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;361    });362  });363364  it('Create NFT and Re-fungible tokens that has reached the maximum data limit', async () => {365    await usingApi(async (api: ApiPromise) => {366      // NFT367      const collectionId = await createCollectionExpectSuccess();368      const alice = privateKey('//Alice');369      const args = [370        {NFT: {const_data: 'A'.repeat(2049)}},371        {NFT: {const_data: 'B'.repeat(2049)}},372        {NFT: {const_data: 'C'.repeat(2049)}},373      ];374      const createMultipleItemsTx = api.tx.unique375        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);376      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;377378      // ReFungible379      const collectionIdReFungible =380        await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});381      const argsReFungible = [382        {ReFungible: ['1'.repeat(2049), 10]},383        {ReFungible: ['2'.repeat(2049), 10]},384        {ReFungible: ['3'.repeat(2049), 10]},385      ];386      const createMultipleItemsTxFungible = api.tx.unique387        .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);388      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;389    });390  });391392  it('Create tokens with different types', async () => {393    await usingApi(async (api: ApiPromise) => {394      const collectionId = await createCollectionExpectSuccess();395      const createMultipleItemsTx = api.tx.unique396        .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'Fungible', 'ReFungible']);397      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;398      // garbage collection :-D399      await destroyCollectionExpectSuccess(collectionId);400    });401  });402403  it('Create tokens with different data limits <> maximum data limit', async () => {404    await usingApi(async (api: ApiPromise) => {405      const collectionId = await createCollectionExpectSuccess();406      const args = [407        {NFT: {const_data: 'A'}},408        {NFT: {const_data: 'B'.repeat(2049)}},409      ];410      const createMultipleItemsTx = await api.tx.unique411        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);412      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;413    });414  });415416  it('Fails when minting tokens exceeds collectionLimits amount', async () => {417    await usingApi(async (api) => {418419      const collectionId = await createCollectionExpectSuccess();420      await setCollectionLimitsExpectSuccess(alice, collectionId, {421        tokenLimit: 1,422      });423      const args = [424        {NFT: {const_data: 'A'}},425        {NFT: {const_data: 'B'}},426      ];427      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);428      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;429    });430  });431432  it('No editing rights', async () => {433    await usingApi(async (api: ApiPromise) => {434      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],435        propPerm:   [{key: 'key1', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}]});436      const itemsListIndexBefore = await getLastTokenId(api, collectionId);437      expect(itemsListIndexBefore).to.be.equal(0);438      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);439      const args = [{Nft: {const_data: '0x31'}},440        {Nft: {const_data: '0x32'}},441        {Nft: {const_data: '0x33'}}];442443      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);444445      const events = await submitTransactionAsync(alice, createMultipleItemsTx);446      const result = getCreateItemsResult(events);447448      for (const elem of result) {449        await expect(executeTransaction(450          api,451          bob,452          api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'key1', value: 'v2'}]),453        )).to.be.rejected;454      }455456      // await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;457    });458  });459460  it('User doesnt have editing rights', async () => {461    await usingApi(async (api: ApiPromise) => {462      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],463        propPerm:   [{key: 'key1', permission: {mutable: false, collectionAdmin: false, tokenOwner: false}}]});464      const itemsListIndexBefore = await getLastTokenId(api, collectionId);465      expect(itemsListIndexBefore).to.be.equal(0);466      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);467      const args = [{Nft: {const_data: '0x31'}},468        {Nft: {const_data: '0x32'}},469        {Nft: {const_data: '0x33'}}];470471      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);472473      const events = await submitTransactionAsync(alice, createMultipleItemsTx);474      const result = getCreateItemsResult(events);475476      for (const elem of result) {477        await expect(executeTransaction(478          api,479          bob,480          api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'key1', value: 'v2'}]),481        )).to.be.rejected;482      }483    });484  });485486  it('Adding property without access rights', async () => {487    await usingApi(async (api: ApiPromise) => {488      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}]});489      const itemsListIndexBefore = await getLastTokenId(api, collectionId);490      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);491      expect(itemsListIndexBefore).to.be.equal(0);492      const args = [{Nft: {const_data: '0x31'}},493        {Nft: {const_data: '0x32'}},494        {Nft: {const_data: '0x33'}}];495496      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);497498      const events = await submitTransactionAsync(alice, createMultipleItemsTx);499      const result = getCreateItemsResult(events);500501      for (const elem of result) {502        await expect(executeTransaction(503          api,504          bob,505          api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'key1', value: 'v2'}]),506        )).to.be.rejected;507      }508    });509  });510511  it('Adding more than 64 prps', async () => {512    await usingApi(async (api: ApiPromise) => {513      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],514        propPerm:   [{key: 'key1', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]});515      const itemsListIndexBefore = await getLastTokenId(api, collectionId);516      expect(itemsListIndexBefore).to.be.equal(0);517      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);518519      const args = [{Nft: {const_data: '0x31'}},520        {Nft: {const_data: '0x32'}},521        {Nft: {const_data: '0x33'}}];522523      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);524      const events = await submitTransactionAsync(alice, createMultipleItemsTx);525526      const result = getCreateItemsResult(events);527528      const prps = [];529530      for (let i = 0; i < 65; i++) {531        prps.push({key: `key${i}`, value: `value${i}`});532      }533534      await expect(executeTransaction(api, bob, api.tx.unique.setCollectionProperties(collectionId, prps))).to.be.rejectedWith(/common\.PropertyLimitReached/);535536      for (const elem of result) {537        await expect(executeTransaction(538          api,539          bob,540          api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, prps),541        )).to.be.rejected;542      }543    });544  });545546  it('Trying to add bigger property than allowed', async () => {547    await usingApi(async (api: ApiPromise) => {548      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],549        propPerm:   [{key: 'key1', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}]});550      const itemsListIndexBefore = await getLastTokenId(api, collectionId);551      expect(itemsListIndexBefore).to.be.equal(0);552      const args = [{Nft: {const_data: '0x31'}},553        {Nft: {const_data: '0x32'}},554        {Nft: {const_data: '0x33'}}];555556      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);557558      const events = await submitTransactionAsync(alice, createMultipleItemsTx);559      const result = getCreateItemsResult(events);560561562      await expect(executeTransaction(api, alice, api.tx.unique.setCollectionProperties(collectionId, [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]))).to.be.rejectedWith(/common\.NoSpaceForProperty/);563564      for (const elem of result) {565        await expect(executeTransaction(566          api,567          bob,568          api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]),569        )).to.be.rejected;570      }571    });572  });573});