1234567891011121314151617import {IKeyringPair} from '@polkadot/types/types';18import {usingPlaygrounds, expect, Pallets, itSub} from './util';1920describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {21 let alice: IKeyringPair;2223 before(async () => {24 await usingPlaygrounds(async (helper, privateKey) => {25 const donor = await privateKey({url: import.meta.url});26 [alice] = await helper.arrange.createAccounts([100n], donor);27 });28 });2930 itSub('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async ({helper}) => {31 const collection = await helper.nft.mintCollection(alice, {32 name: 'name',33 description: 'descr',34 tokenPrefix: 'COL',35 tokenPropertyPermissions: [36 {key: 'data', permission: {tokenOwner: true, mutable: false, collectionAdmin: false}},37 ],38 });39 const args = [40 {properties: [{key: 'data', value: '1'}]},41 {properties: [{key: 'data', value: '2'}]},42 {properties: [{key: 'data', value: '3'}]},43 ];44 const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);45 for(const [i, token] of tokens.entries()) {46 const tokenData = await token.getData();47 expect(tokenData?.normalizedOwner.Substrate).to.be.deep.equal(helper.address.normalizeSubstrate(alice.address));48 expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);49 }50 });5152 itSub('Create 0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async ({helper}) => {53 const collection = await helper.ft.mintCollection(alice, {54 name: 'name',55 description: 'descr',56 tokenPrefix: 'COL',57 });58 const args = [59 {value: 1n},60 {value: 2n},61 {value: 3n},62 ];63 await helper.ft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, args, {Substrate: alice.address});64 expect(await collection.getBalance({Substrate: alice.address})).to.be.equal(6n);65 });6667 itSub.ifWithPallets('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', [Pallets.ReFungible], async ({helper}) => {68 const collection = await helper.rft.mintCollection(alice, {69 name: 'name',70 description: 'descr',71 tokenPrefix: 'COL',72 });73 const args = [74 {pieces: 1n},75 {pieces: 2n},76 {pieces: 3n},77 ];78 const tokens = await helper.rft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);7980 for(const [i, token] of tokens.entries()) {81 expect(await token.getBalance({Substrate: alice.address})).to.be.equal(BigInt(i + 1));82 }83 });8485 itSub('Can mint amount of items equals to collection limits', async ({helper}) => {86 const collection = await helper.nft.mintCollection(alice, {87 name: 'name',88 description: 'descr',89 tokenPrefix: 'COL',90 limits: {91 tokenLimit: 2,92 },93 });94 const args = [{}, {}];95 await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);96 });9798 itSub('Create 0x31, 0x32, 0x33 items in active NFT with property Admin', async ({helper}) => {99 const collection = await helper.nft.mintCollection(alice, {100 name: 'name',101 description: 'descr',102 tokenPrefix: 'COL',103 tokenPropertyPermissions: [104 {key: 'data', permission: {tokenOwner: false, mutable: true, collectionAdmin: true}},105 ],106 });107 const args = [108 {properties: [{key: 'data', value: '1'}]},109 {properties: [{key: 'data', value: '2'}]},110 {properties: [{key: 'data', value: '3'}]},111 ];112 const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);113 for(const [i, token] of tokens.entries()) {114 const tokenData = await token.getData();115 expect(tokenData?.normalizedOwner.Substrate).to.be.deep.equal(helper.address.normalizeSubstrate(alice.address));116 expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);117 }118 });119120 itSub('Create 0x31, 0x32, 0x33 items in active NFT with property AdminConst', async ({helper}) => {121 const collection = await helper.nft.mintCollection(alice, {122 name: 'name',123 description: 'descr',124 tokenPrefix: 'COL',125 tokenPropertyPermissions: [126 {key: 'data', permission: {tokenOwner: false, mutable: false, collectionAdmin: true}},127 ],128 });129 const args = [130 {properties: [{key: 'data', value: '1'}]},131 {properties: [{key: 'data', value: '2'}]},132 {properties: [{key: 'data', value: '3'}]},133 ];134 const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);135 for(const [i, token] of tokens.entries()) {136 const tokenData = await token.getData();137 expect(tokenData?.normalizedOwner.Substrate).to.be.deep.equal(helper.address.normalizeSubstrate(alice.address));138 expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);139 }140 });141142 itSub('Create 0x31, 0x32, 0x33 items in active NFT with property itemOwnerOrAdmin', async ({helper}) => {143 const collection = await helper.nft.mintCollection(alice, {144 name: 'name',145 description: 'descr',146 tokenPrefix: 'COL',147 tokenPropertyPermissions: [148 {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},149 ],150 });151 const args = [152 {properties: [{key: 'data', value: '1'}]},153 {properties: [{key: 'data', value: '2'}]},154 {properties: [{key: 'data', value: '3'}]},155 ];156 const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);157 for(const [i, token] of tokens.entries()) {158 const tokenData = await token.getData();159 expect(tokenData?.normalizedOwner.Substrate).to.be.equal(helper.address.normalizeSubstrate(alice.address));160 expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);161 }162 });163});164165describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => {166 let alice: IKeyringPair;167 let bob: IKeyringPair;168169 before(async () => {170 await usingPlaygrounds(async (helper, privateKey) => {171 const donor = await privateKey({url: import.meta.url});172 [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);173 });174 });175176 itSub('Regular user cannot create items in active NFT collection', async ({helper}) => {177 const collection = await helper.nft.mintCollection(alice, {178 name: 'name',179 description: 'descr',180 tokenPrefix: 'COL',181 });182 const args = [183 {},184 {},185 ];186 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(bob, collection.collectionId, {Substrate: alice.address}, args);187 await expect(mintTx()).to.be.rejectedWith(/common\.PublicMintingNotAllowed/);188 });189190 itSub('Regular user cannot create items in active Fungible collection', async ({helper}) => {191 const collection = await helper.ft.mintCollection(alice, {192 name: 'name',193 description: 'descr',194 tokenPrefix: 'COL',195 });196 const args = [197 {value: 1n},198 {value: 2n},199 {value: 3n},200 ];201 const mintTx = () => helper.ft.mintMultipleTokensWithOneOwner(bob, collection.collectionId, args, {Substrate: alice.address});202 await expect(mintTx()).to.be.rejectedWith(/common\.PublicMintingNotAllowed/);203 });204205 itSub.ifWithPallets('Regular user cannot create items in active ReFungible collection', [Pallets.ReFungible], async ({helper}) => {206 const collection = await helper.rft.mintCollection(alice, {207 name: 'name',208 description: 'descr',209 tokenPrefix: 'COL',210 });211 const args = [212 {pieces: 1n},213 {pieces: 1n},214 {pieces: 1n},215 ];216 const mintTx = () => helper.rft.mintMultipleTokensWithOneOwner(bob, collection.collectionId, {Substrate: alice.address}, args);217 await expect(mintTx()).to.be.rejectedWith(/common\.PublicMintingNotAllowed/);218 });219220 itSub('Create token in not existing collection', async ({helper}) => {221 const collectionId = 1_000_000;222 const args = [223 {},224 {},225 ];226 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(bob, collectionId, {Substrate: alice.address}, args);227 await expect(mintTx()).to.be.rejectedWith(/common\.CollectionNotFound/);228 });229230 itSub('Create NFTs that has reached the maximum data limit', async ({helper}) => {231 const collection = await helper.nft.mintCollection(alice, {232 name: 'name',233 description: 'descr',234 tokenPrefix: 'COL',235 tokenPropertyPermissions: [236 {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},237 ],238 });239 const args = [240 {properties: [{key: 'data', value: 'A'.repeat(32769)}]},241 {properties: [{key: 'data', value: 'B'.repeat(32769)}]},242 {properties: [{key: 'data', value: 'C'.repeat(32769)}]},243 ];244 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);245 await expect(mintTx()).to.be.rejectedWith('Verification Error');246 });247248 itSub.ifWithPallets('Create Refungible tokens that has reached the maximum data limit', [Pallets.ReFungible], async ({helper}) => {249 const collection = await helper.rft.mintCollection(alice, {250 name: 'name',251 description: 'descr',252 tokenPrefix: 'COL',253 tokenPropertyPermissions: [254 {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},255 ],256 });257 const args = [258 {pieces: 10n, properties: [{key: 'data', value: 'A'.repeat(32769)}]},259 {pieces: 10n, properties: [{key: 'data', value: 'B'.repeat(32769)}]},260 {pieces: 10n, properties: [{key: 'data', value: 'C'.repeat(32769)}]},261 ];262 const mintTx = () => helper.rft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);263 await expect(mintTx()).to.be.rejectedWith('Verification Error');264 });265266 itSub.ifWithPallets('Create tokens with different types', [Pallets.ReFungible], async ({helper}) => {267 const {collectionId} = await helper.nft.mintCollection(alice, {268 name: 'name',269 description: 'descr',270 tokenPrefix: 'COL',271 });272273 const types = ['NFT', 'Fungible', 'ReFungible'];274 await expect(helper.executeExtrinsic(275 alice,276 'api.tx.unique.createMultipleItems',277 [collectionId, {Substrate: alice.address}, types],278 )).to.be.rejectedWith(/nonfungible\.NotNonfungibleDataUsedToMintFungibleCollectionToken/);279 });280281 itSub('Create tokens with different data limits <> maximum data limit', async ({helper}) => {282 const collection = await helper.nft.mintCollection(alice, {283 name: 'name',284 description: 'descr',285 tokenPrefix: 'COL',286 tokenPropertyPermissions: [287 {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},288 ],289 });290 const args = [291 {properties: [{key: 'data', value: 'A'}]},292 {properties: [{key: 'data', value: 'B'.repeat(32769)}]},293 ];294 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);295 await expect(mintTx()).to.be.rejectedWith('Verification Error');296 });297298 itSub('Fails when minting tokens exceeds collectionLimits amount', async ({helper}) => {299 const collection = await helper.nft.mintCollection(alice, {300 name: 'name',301 description: 'descr',302 tokenPrefix: 'COL',303 tokenPropertyPermissions: [304 {key: 'data', permission: {tokenOwner: true, mutable: true, collectionAdmin: true}},305 ],306 limits: {307 tokenLimit: 1,308 },309 });310 const args = [311 {},312 {},313 ];314 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);315 await expect(mintTx()).to.be.rejectedWith(/common\.CollectionTokenLimitExceeded/);316 });317318 itSub('User doesnt have editing rights', async ({helper}) => {319 const collection = await helper.nft.mintCollection(alice, {320 name: 'name',321 description: 'descr',322 tokenPrefix: 'COL',323 tokenPropertyPermissions: [324 {key: 'data', permission: {tokenOwner: false, mutable: true, collectionAdmin: false}},325 ],326 });327 const args = [328 {properties: [{key: 'data', value: 'A'}]},329 ];330 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);331 await expect(mintTx()).to.be.rejectedWith(/common\.NoPermission/);332 });333334 itSub('Adding property without access rights', async ({helper}) => {335 const collection = await helper.nft.mintCollection(alice, {336 name: 'name',337 description: 'descr',338 tokenPrefix: 'COL',339 properties: [340 {341 key: 'data',342 value: 'v',343 },344 ],345 });346 const args = [347 {properties: [{key: 'data', value: 'A'}]},348 ];349 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);350 await expect(mintTx()).to.be.rejectedWith(/common\.NoPermission/);351 });352353 itSub('Adding more than 64 prps', async ({helper}) => {354 const collection = await helper.nft.mintCollection(alice, {355 name: 'name',356 description: 'descr',357 tokenPrefix: 'COL',358 });359 const prps = [];360361 for(let i = 0; i < 65; i++) {362 prps.push({key: `key${i}`, value: `value${i}`});363 }364365 const args = [366 {properties: prps},367 {properties: prps},368 {properties: prps},369 ];370371 const mintTx = () => helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);372 await expect(mintTx()).to.be.rejectedWith('Verification Error');373 });374});