1234567891011121314151617import {expect} from 'chai';18import privateKey from './substrate/privateKey';19import usingApi, {executeTransaction, submitTransactionAsync} from './substrate/substrate-api';20import {createCollectionExpectSuccess, createCollectionWithPropsExpectSuccess, addCollectionAdminExpectSuccess, getCreateItemsResult} from './util/helpers';2122describe('createMultipleItemsEx', () => {23 it('can initialize multiple NFT with different owners', async () => {24 const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});25 const alice = privateKey('//Alice');26 const bob = privateKey('//Bob');27 const charlie = privateKey('//Charlie');28 await usingApi(async (api) => {29 const data = [30 {31 owner: {substrate: alice.address},32 constData: '0x0000',33 }, {34 owner: {substrate: bob.address},35 constData: '0x2222',36 }, {37 owner: {substrate: charlie.address},38 constData: '0x4444',39 },40 ];4142 await executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {43 NFT: data,44 }));45 const tokens = await api.query.nonfungible.tokenData.entries(collection);46 const json = tokens.map(([, token]) => token.toJSON());47 expect(json).to.be.deep.equal(data);48 });49 });5051 it('createMultipleItemsEx with property Admin', async () => {52 const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});53 const alice = privateKey('//Alice');54 const bob = privateKey('//Bob');55 const charlie = privateKey('//Charlie');56 await usingApi(async (api) => {57 const data = [58 {59 owner: {substrate: alice.address},60 constData: '0x0000',61 }, {62 owner: {substrate: bob.address},63 constData: '0x2222',64 }, {65 owner: {substrate: charlie.address},66 constData: '0x4444',67 },68 ];6970 await expect(executeTransaction(71 api,72 alice,73 api.tx.unique.setPropertyPermissions(collection, [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]),74 )).to.not.be.rejected;7576 await executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {77 NFT: data,78 }));79 const tokens = await api.query.nonfungible.tokenData.entries(collection);80 const json = tokens.map(([, token]) => token.toJSON());81 expect(json).to.be.deep.equal(data);82 });83 });8485 it('createMultipleItemsEx with property AdminConst', async () => {86 const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});87 const alice = privateKey('//Alice');88 const bob = privateKey('//Bob');89 const charlie = privateKey('//Charlie');90 await usingApi(async (api) => {91 const data = [92 {93 owner: {substrate: alice.address},94 constData: '0x0000',95 }, {96 owner: {substrate: bob.address},97 constData: '0x2222',98 }, {99 owner: {substrate: charlie.address},100 constData: '0x4444',101 },102 ];103 await expect(executeTransaction(104 api,105 alice,106 api.tx.unique.setPropertyPermissions(collection, [{key: 'k', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}]),107 )).to.not.be.rejected;108109 await executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {110 NFT: data,111 }));112113114 const tokens = await api.query.nonfungible.tokenData.entries(collection);115 const json = tokens.map(([, token]) => token.toJSON());116 expect(json).to.be.deep.equal(data);117 });118 });119120 it('createMultipleItemsEx with property itemOwnerOrAdmin', async () => {121 const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});122 const alice = privateKey('//Alice');123 const bob = privateKey('//Bob');124 const charlie = privateKey('//Charlie');125 await usingApi(async (api) => {126 const data = [127 {128 owner: {substrate: alice.address},129 constData: '0x0000',130 }, {131 owner: {substrate: bob.address},132 constData: '0x2222',133 }, {134 owner: {substrate: charlie.address},135 constData: '0x4444',136 },137 ];138 await expect(executeTransaction(139 api,140 alice,141 api.tx.unique.setPropertyPermissions(collection, [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]),142 )).to.not.be.rejected;143144 await executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {145 NFT: data,146 }));147148149 const tokens = await api.query.nonfungible.tokenData.entries(collection);150 const json = tokens.map(([, token]) => token.toJSON());151 expect(json).to.be.deep.equal(data);152 });153 });154155 it('No editing rights', async () => {156 const collection = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],157 propPerm: [{key: 'key1', mutable: true, collectionAdmin: false, tokenOwner: false}]});158 const alice = privateKey('//Alice');159 const bob = privateKey('//Bob');160 const charlie = privateKey('//Charlie');161 await addCollectionAdminExpectSuccess(alice, collection, bob.address);162 await usingApi(async (api) => {163 const data = [164 {165 owner: {substrate: alice.address},166 }, {167 owner: {substrate: bob.address},168 }, {169 owner: {substrate: charlie.address},170 },171 ];172173 const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data});174 await executeTransaction(api, alice, tx);175176 const events = await submitTransactionAsync(alice, tx);177 const result = getCreateItemsResult(events);178179 for (const elem of result) {180 await expect(executeTransaction(181 api,182 bob,183 api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'key1', value: 'v2'}]),184 )).to.be.rejected;185 }186 });187 });188189 it('User doesnt have editing rights', async () => {190 const collection = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}],191 propPerm: [{key: 'key1', mutable: false, collectionAdmin: false, tokenOwner: false}]});192 const alice = privateKey('//Alice');193 const bob = privateKey('//Bob');194 const charlie = privateKey('//Charlie');195 await addCollectionAdminExpectSuccess(alice, collection, bob.address);196 await usingApi(async (api) => {197 const data = [198 {199 owner: {substrate: alice.address},200 }, {201 owner: {substrate: bob.address},202 }, {203 owner: {substrate: charlie.address},204 },205 ];206207 const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data});208 await executeTransaction(api, alice, tx);209210 const events = await submitTransactionAsync(alice, tx);211 const result = getCreateItemsResult(events);212213 for (const elem of result) {214 await expect(executeTransaction(215 api,216 bob,217 api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'key1', value: 'v2'}]),218 )).to.be.rejected;219 }220 });221 });222223 it('Adding property without access rights', async () => {224 const collection = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}]});225 const alice = privateKey('//Alice');226 const bob = privateKey('//Bob');227 const charlie = privateKey('//Charlie');228 await addCollectionAdminExpectSuccess(alice, collection, bob.address);229 await usingApi(async (api) => {230 const data = [231 {232 owner: {substrate: alice.address},233 }, {234 owner: {substrate: bob.address},235 }, {236 owner: {substrate: charlie.address},237 },238 ];239240 const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data});241 await executeTransaction(api, alice, tx);242243 const events = await submitTransactionAsync(alice, tx);244 const result = getCreateItemsResult(events);245246 for (const elem of result) {247 await expect(executeTransaction(248 api,249 bob,250 api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, [{key: 'key1', value: 'v2'}]),251 )).to.be.rejected;252 }253 });254 });255256 it('Adding more than 64 prps', async () => {257 const collection = await createCollectionWithPropsExpectSuccess();258 const alice = privateKey('//Alice');259 const bob = privateKey('//Bob');260 const charlie = privateKey('//Charlie');261 await addCollectionAdminExpectSuccess(alice, collection, bob.address);262 await usingApi(async (api) => {263 const data = [264 {265 owner: {substrate: alice.address},266 }, {267 owner: {substrate: bob.address},268 }, {269 owner: {substrate: charlie.address},270 },271 ];272273 const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data});274 await executeTransaction(api, alice, tx);275276 const events = await submitTransactionAsync(alice, tx);277 const result = getCreateItemsResult(events);278279 const prps = [];280281 for (let i = 0; i < 65; i++) {282 prps.push({key: `key${i}`, value: `value${i}`});283 }284285 await expect(executeTransaction(api, bob, api.tx.unique.setCollectionProperties(collection, prps))).to.be.rejectedWith(/common\.PropertyLimitReached/);286287288 for (const elem of result) {289 await expect(executeTransaction(290 api,291 bob,292 api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, prps),293 )).to.be.rejected;294 }295 });296 });297298 it('Trying to add bigger property than allowed', async () => {299 const collection = await createCollectionWithPropsExpectSuccess();300 const alice = privateKey('//Alice');301 const bob = privateKey('//Bob');302 const charlie = privateKey('//Charlie');303 await addCollectionAdminExpectSuccess(alice, collection, bob.address);304 await usingApi(async (api) => {305 const data = [306 {307 owner: {substrate: alice.address},308 }, {309 owner: {substrate: bob.address},310 }, {311 owner: {substrate: charlie.address},312 },313 ];314315 const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data});316 await executeTransaction(api, alice, tx);317318 const events = await submitTransactionAsync(alice, tx);319 const result = getCreateItemsResult(events);320321 const prps = [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}];322323 await expect(executeTransaction(api, bob, api.tx.unique.setCollectionProperties(collection, prps))).to.be.rejectedWith(/common\.NoSpaceForProperty/);324325326 for (const elem of result) {327 await expect(executeTransaction(328 api,329 bob,330 api.tx.unique.setTokenProperties(elem.collectionId, elem.itemId, prps),331 )).to.be.rejected;332 }333 });334 });335336 it('can initialize multiple NFT with different owners', async () => {337 const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});338 const alice = privateKey('//Alice');339 const bob = privateKey('//Bob');340 const charlie = privateKey('//Charlie');341 await usingApi(async (api) => {342 const data = [343 {344 owner: {substrate: alice.address},345 constData: '0x0000',346 }, {347 owner: {substrate: bob.address},348 constData: '0x2222',349 }, {350 owner: {substrate: charlie.address},351 constData: '0x4444',352 },353 ];354355 await executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {356 NFT: data,357 }));358 const tokens = await api.query.nonfungible.tokenData.entries(collection);359 const json = tokens.map(([, token]) => token.toJSON());360 expect(json).to.be.deep.equal(data);361 });362 });363364 it('can initialize multiple NFT with different owners', async () => {365 const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});366 const alice = privateKey('//Alice');367 const bob = privateKey('//Bob');368 const charlie = privateKey('//Charlie');369 await usingApi(async (api) => {370 const data = [371 {372 owner: {substrate: alice.address},373 constData: '0x0000',374 }, {375 owner: {substrate: bob.address},376 constData: '0x2222',377 }, {378 owner: {substrate: charlie.address},379 constData: '0x4444',380 },381 ];382383 await executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {384 NFT: data,385 }));386 const tokens = await api.query.nonfungible.tokenData.entries(collection);387 const json = tokens.map(([, token]) => token.toJSON());388 expect(json).to.be.deep.equal(data);389 });390 });391392 it('fails when trying to set multiple owners when creating multiple refungibles', async () => {393 const collection = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});394 const alice = privateKey('//Alice');395 const bob = privateKey('//Bob');396397 await usingApi(async (api) => {398 399 const users = new Map();400 users.set(JSON.stringify({substrate: alice.address}), 1);401 users.set(JSON.stringify({substrate: bob.address}), 1);402403 404 await expect(executeTransaction(api, alice, api.tx.unique.createMultipleItemsEx(collection, {405 RefungibleMultipleItems: [406 {users},407 {users},408 ],409 }))).to.be.rejectedWith(/^refungible\.NotRefungibleDataUsedToMintFungibleCollectionToken$/);410 });411 });412});413'';