git.delta.rocks / unique-network / refs/commits / 3ee9e950e03f

difftreelog

source

tests/src/createMultipleItems.test.ts24.8 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  createMultipleItemsWithPropsExpectSuccess,38  createMultipleItemsWithPropsExpectFailure,39} from './util/helpers';4041chai.use(chaiAsPromised);42const expect = chai.expect;4344describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {45  it('Create  0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => {46    await usingApi(async (api: ApiPromise) => {47      const collectionId = await createCollectionExpectSuccess();48      const itemsListIndexBefore = await getLastTokenId(api, collectionId);49      expect(itemsListIndexBefore).to.be.equal(0);50      const alice = privateKey('//Alice');51      const args = [{Nft: {const_data: '0x31'}},52        {Nft: {const_data: '0x32'}},53        {Nft: {const_data: '0x33'}}];54      const createMultipleItemsTx = api.tx.unique55        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);56      await submitTransactionAsync(alice, createMultipleItemsTx);57      const itemsListIndexAfter = await getLastTokenId(api, collectionId);58      expect(itemsListIndexAfter).to.be.equal(3);5960      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));61      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));62      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));6364      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);65      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);66      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);67    });68  });6970  it('Create  0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => {71    await usingApi(async (api: ApiPromise) => {72      const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});73      const itemsListIndexBefore = await getLastTokenId(api, collectionId);74      expect(itemsListIndexBefore).to.be.equal(0);75      const alice = privateKey('//Alice');76      const args = [77        {Fungible: {value: 1}},78        {Fungible: {value: 2}},79        {Fungible: {value: 3}},80      ];81      const createMultipleItemsTx = api.tx.unique82        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);83      await submitTransactionAsync(alice, createMultipleItemsTx);84      const token1Data = await getBalance(api, collectionId, alice.address, 0);8586      expect(token1Data).to.be.equal(6n); // 1 + 2 + 387    });88  });8990  it('Create  0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {91    await usingApi(async (api: ApiPromise) => {92      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});93      const itemsListIndexBefore = await getLastTokenId(api, collectionId);94      expect(itemsListIndexBefore).to.be.equal(0);95      const alice = privateKey('//Alice');96      const args = [97        {ReFungible: {const_data: [0x31], pieces: 1}},98        {ReFungible: {const_data: [0x32], pieces: 1}},99        {ReFungible: {const_data: [0x33], pieces: 1}},100      ];101      const createMultipleItemsTx = api.tx.unique102        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);103      await submitTransactionAsync(alice, createMultipleItemsTx);104      const itemsListIndexAfter = await getLastTokenId(api, collectionId);105      expect(itemsListIndexAfter).to.be.equal(3);106107      expect(await getBalance(api, collectionId, alice.address, 1)).to.be.equal(1n);108      expect(await getBalance(api, collectionId, alice.address, 2)).to.be.equal(1n);109      expect(await getBalance(api, collectionId, alice.address, 3)).to.be.equal(1n);110111      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);112      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);113      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);114    });115  });116117  it('Can mint amount of items equals to collection limits', async () => {118    await usingApi(async (api) => {119      const alice = privateKey('//Alice');120121      const collectionId = await createCollectionExpectSuccess();122      await setCollectionLimitsExpectSuccess(alice, collectionId, {123        tokenLimit: 2,124      });125      const args = [126        {NFT: {const_data: 'A'}},127        {NFT: {const_data: 'B'}},128      ];129      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);130      const events = await submitTransactionAsync(alice, createMultipleItemsTx);131      const result = getGenericResult(events);132      expect(result.success).to.be.true;133    });134  });135136  it('Create  0x31, 0x32, 0x33 items in active NFT with property Admin', async () => {137    await usingApi(async (api: ApiPromise) => {138      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]});139      const itemsListIndexBefore = await getLastTokenId(api, collectionId);140      expect(itemsListIndexBefore).to.be.equal(0);141      const alice = privateKey('//Alice');142      const bob = privateKey('//Bob');143      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}},144        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}},145        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}];146147      await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args);148      const itemsListIndexAfter = await getLastTokenId(api, collectionId);149      expect(itemsListIndexAfter).to.be.equal(3);150151      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));152      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));153      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));154155      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);156      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);157      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);158    });159  });160161  it('Create  0x31, 0x32, 0x33 items in active NFT with property AdminConst', async () => {162    await usingApi(async (api: ApiPromise) => {163      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}]});164      const itemsListIndexBefore = await getLastTokenId(api, collectionId);165      expect(itemsListIndexBefore).to.be.equal(0);166      const alice = privateKey('//Alice');167      const bob = privateKey('//Bob');168      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);169      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}},170        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}},171        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}];172173      await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args);174      const itemsListIndexAfter = await getLastTokenId(api, collectionId);175      expect(itemsListIndexAfter).to.be.equal(3);176177      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));178      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));179      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));180181      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);182      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);183      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);184    });185  });186187  it('Create  0x31, 0x32, 0x33 items in active NFT with property itemOwnerOrAdmin', async () => {188    await usingApi(async (api: ApiPromise) => {189      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]});190      const itemsListIndexBefore = await getLastTokenId(api, collectionId);191      expect(itemsListIndexBefore).to.be.equal(0);192      const alice = privateKey('//Alice');193      const bob = privateKey('//Bob');194      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}},195        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}},196        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}];197198      await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args);199      const itemsListIndexAfter = await getLastTokenId(api, collectionId);200      expect(itemsListIndexAfter).to.be.equal(3);201202      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(alice.address));203      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address));204      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address));205206      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);207      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);208      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);209    });210  });211});212213describe('Integration Test createMultipleItems(collection_id, owner, items_data) with collection admin permissions:', () => {214215  let alice: IKeyringPair;216  let bob: IKeyringPair;217218  before(async () => {219    await usingApi(async () => {220      alice = privateKey('//Alice');221      bob = privateKey('//Bob');222    });223  });224225  it('Create  0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => {226    await usingApi(async (api: ApiPromise) => {227      const collectionId = await createCollectionExpectSuccess();228      const itemsListIndexBefore = await getLastTokenId(api, collectionId);229      expect(itemsListIndexBefore).to.be.equal(0);230      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);231      const args = [{Nft: {const_data: '0x31'}},232        {Nft: {const_data: '0x32'}},233        {Nft: {const_data: '0x33'}}];234      const createMultipleItemsTx = api.tx.unique235        .createMultipleItems(collectionId, normalizeAccountId(bob.address), args);236      await submitTransactionAsync(bob, createMultipleItemsTx);237      const itemsListIndexAfter = await getLastTokenId(api, collectionId);238      expect(itemsListIndexAfter).to.be.equal(3);239240      expect(await getTokenOwner(api, collectionId, 1)).to.be.deep.equal(normalizeAccountId(bob.address));241      expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(bob.address));242      expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(bob.address));243244      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);245      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);246      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);247    });248  });249250  it('Create  0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => {251    await usingApi(async (api: ApiPromise) => {252      const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});253      const itemsListIndexBefore = await getLastTokenId(api, collectionId);254      expect(itemsListIndexBefore).to.be.equal(0);255      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);256      const args = [257        {Fungible: {value: 1}},258        {Fungible: {value: 2}},259        {Fungible: {value: 3}},260      ];261      const createMultipleItemsTx = api.tx.unique262        .createMultipleItems(collectionId, normalizeAccountId(bob.address), args);263      await submitTransactionAsync(bob, createMultipleItemsTx);264      const token1Data = await getBalance(api, collectionId, bob.address, 0);265266      expect(token1Data).to.be.equal(6n); // 1 + 2 + 3267    });268  });269270  it('Create  0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {271    await usingApi(async (api: ApiPromise) => {272      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});273      const itemsListIndexBefore = await getLastTokenId(api, collectionId);274      expect(itemsListIndexBefore).to.be.equal(0);275      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);276      const args = [277        {ReFungible: {const_data: [0x31], pieces: 1}},278        {ReFungible: {const_data: [0x32], pieces: 1}},279        {ReFungible: {const_data: [0x33], pieces: 1}},280      ];281      const createMultipleItemsTx = api.tx.unique282        .createMultipleItems(collectionId, normalizeAccountId(bob.address), args);283      await submitTransactionAsync(bob, createMultipleItemsTx);284      const itemsListIndexAfter = await getLastTokenId(api, collectionId);285      expect(itemsListIndexAfter).to.be.equal(3);286287      expect(await getBalance(api, collectionId, bob.address, 1)).to.be.equal(1n);288      expect(await getBalance(api, collectionId, bob.address, 2)).to.be.equal(1n);289      expect(await getBalance(api, collectionId, bob.address, 3)).to.be.equal(1n);290291      expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]);292      expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]);293      expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]);294    });295  });296});297298describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => {299300  let alice: IKeyringPair;301  let bob: IKeyringPair;302303  before(async () => {304    await usingApi(async () => {305      alice = privateKey('//Alice');306      bob = privateKey('//Bob');307    });308  });309310  it('Regular user cannot create items in active NFT collection', async () => {311    await usingApi(async (api: ApiPromise) => {312      const collectionId = await createCollectionExpectSuccess();313      const itemsListIndexBefore = await getLastTokenId(api, collectionId);314      expect(itemsListIndexBefore).to.be.equal(0);315      const args = [{Nft: {const_data: '0x31'}},316        {Nft: {const_data: '0x32'}},317        {Nft: {const_data: '0x33'}}];318      const createMultipleItemsTx = api.tx.unique319        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);320      await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;321    });322  });323324  it('Regular user cannot create items in active Fungible collection', async () => {325    await usingApi(async (api: ApiPromise) => {326      const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});327      const itemsListIndexBefore = await getLastTokenId(api, collectionId);328      expect(itemsListIndexBefore).to.be.equal(0);329      const args = [330        {Fungible: {value: 1}},331        {Fungible: {value: 2}},332        {Fungible: {value: 3}},333      ];334      const createMultipleItemsTx = api.tx.unique335        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);336      await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;337    });338  });339340  it('Regular user cannot create items in active ReFungible collection', async () => {341    await usingApi(async (api: ApiPromise) => {342      const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});343      const itemsListIndexBefore = await getLastTokenId(api, collectionId);344      expect(itemsListIndexBefore).to.be.equal(0);345      const args = [346        {ReFungible: {const_data: [0x31], pieces: 1}},347        {ReFungible: {const_data: [0x32], pieces: 1}},348        {ReFungible: {const_data: [0x33], pieces: 1}},349      ];350      const createMultipleItemsTx = api.tx.unique351        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);352      await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;353    });354  });355356  it('Create token in not existing collection', async () => {357    await usingApi(async (api: ApiPromise) => {358      const collectionId = await getCreatedCollectionCount(api) + 1;359      const createMultipleItemsTx = api.tx.unique360        .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'NFT', 'NFT']);361      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;362    });363  });364365  it('Create NFT and Re-fungible tokens that has reached the maximum data limit', async () => {366    await usingApi(async (api: ApiPromise) => {367      // NFT368      const collectionId = await createCollectionExpectSuccess();369      const alice = privateKey('//Alice');370      const args = [371        {NFT: {const_data: 'A'.repeat(2049)}},372        {NFT: {const_data: 'B'.repeat(2049)}},373        {NFT: {const_data: 'C'.repeat(2049)}},374      ];375      const createMultipleItemsTx = api.tx.unique376        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);377      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;378379      // ReFungible380      const collectionIdReFungible =381        await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});382      const argsReFungible = [383        {ReFungible: ['1'.repeat(2049), 10]},384        {ReFungible: ['2'.repeat(2049), 10]},385        {ReFungible: ['3'.repeat(2049), 10]},386      ];387      const createMultipleItemsTxFungible = api.tx.unique388        .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);389      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;390    });391  });392393  it('Create tokens with different types', async () => {394    await usingApi(async (api: ApiPromise) => {395      const collectionId = await createCollectionExpectSuccess();396      const createMultipleItemsTx = api.tx.unique397        .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'Fungible', 'ReFungible']);398      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;399      // garbage collection :-D400      await destroyCollectionExpectSuccess(collectionId);401    });402  });403404  it('Create tokens with different data limits <> maximum data limit', async () => {405    await usingApi(async (api: ApiPromise) => {406      const collectionId = await createCollectionExpectSuccess();407      const args = [408        {NFT: {const_data: 'A'}},409        {NFT: {const_data: 'B'.repeat(2049)}},410      ];411      const createMultipleItemsTx = await api.tx.unique412        .createMultipleItems(collectionId, normalizeAccountId(alice.address), args);413      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;414    });415  });416417  it('Fails when minting tokens exceeds collectionLimits amount', async () => {418    await usingApi(async (api) => {419420      const collectionId = await createCollectionExpectSuccess();421      await setCollectionLimitsExpectSuccess(alice, collectionId, {422        tokenLimit: 1,423      });424      const args = [425        {NFT: {const_data: 'A'}},426        {NFT: {const_data: 'B'}},427      ];428      const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);429      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;430    });431  });432433  it('No editing rights', async () => {434    await usingApi(async (api: ApiPromise) => {435      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],436        propPerm:   [{key: 'key1', permission: {mutable: false, collectionAdmin: false, tokenOwner: true}}]});437      const itemsListIndexBefore = await getLastTokenId(api, collectionId);438      expect(itemsListIndexBefore).to.be.equal(0);439      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);440      const args = [{Nft: {const_data: '0x31', properties: [{key: 'key1', value: 'v2'}]}},441        {Nft: {const_data: '0x32'}},442        {Nft: {const_data: '0x33'}}];443444      await createMultipleItemsWithPropsExpectFailure(bob, collectionId, args);445    });446  });447448  it('User doesnt have editing rights', async () => {449    await usingApi(async (api: ApiPromise) => {450      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],451        propPerm:   [{key: 'key1', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}]});452      const itemsListIndexBefore = await getLastTokenId(api, collectionId);453      expect(itemsListIndexBefore).to.be.equal(0);454      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);455      const args = [{Nft: {const_data: '0x31', properties: [{key: 'key1', value: 'v2'}]}},456        {Nft: {const_data: '0x32'}},457        {Nft: {const_data: '0x33'}}];458459      await createMultipleItemsWithPropsExpectFailure(bob, collectionId, args);460    });461  });462463  it('Adding property without access rights', async () => {464    await usingApi(async (api: ApiPromise) => {465      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'k', value: 'v1'}]});466      const itemsListIndexBefore = await getLastTokenId(api, collectionId);467      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);468      expect(itemsListIndexBefore).to.be.equal(0);469      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v'}]}},470        {Nft: {const_data: '0x32'}},471        {Nft: {const_data: '0x33'}}];472473      await createMultipleItemsWithPropsExpectFailure(bob, collectionId, args);474    });475  });476477  it('Adding more than 64 prps', async () => {478    await usingApi(async (api: ApiPromise) => {479      const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],480        propPerm:   [{key: 'key1', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]});481      const itemsListIndexBefore = await getLastTokenId(api, collectionId);482      expect(itemsListIndexBefore).to.be.equal(0);483      await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);484485      const prps = [];486487      for (let i = 0; i < 65; i++) {488        prps.push({key: `key${i}`, value: `value${i}`});489      }490491      const args = [{Nft: {const_data: '0x31', properties: prps}},492        {Nft: {const_data: '0x32', properties: prps}},493        {Nft: {const_data: '0x33', properties: prps}}];494495      createMultipleItemsWithPropsExpectFailure(alice, collectionId, args);496    });497  });498499  it('Trying to add bigger property than allowed', async () => {500    await usingApi(async (api: ApiPromise) => {501      const collectionId = await createCollectionWithPropsExpectSuccess({propPerm:   [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]});502      const itemsListIndexBefore = await getLastTokenId(api, collectionId);503      expect(itemsListIndexBefore).to.be.equal(0);504      const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}},505        {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}},506        {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}];507508      createMultipleItemsWithPropsExpectFailure(alice, collectionId, args);509    });510  });511});