git.delta.rocks / unique-network / refs/commits / 6da085670d5d

difftreelog

Skip rft tests

Max Andreev2022-12-07parent: #c19d240.patch.diff
in: master

2 files changed

modifiedtests/src/eth/collectionLimits.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionLimits.test.ts
+++ b/tests/src/eth/collectionLimits.test.ts
@@ -1,4 +1,5 @@
 import {IKeyringPair} from '@polkadot/types/types';
+import {Pallets} from '../util';
 import {expect, itEth, usingEthPlaygrounds} from './util';
 
 
@@ -13,10 +14,10 @@
 
   [
     {case: 'nft' as const, method: 'createNFTCollection' as const},
-    {case: 'rft' as const, method: 'createRFTCollection' as const},
+    {case: 'rft' as const, method: 'createRFTCollection' as const, requiredPallets: [Pallets.ReFungible]},
     {case: 'ft' as const, method: 'createFTCollection' as const},
   ].map(testCase =>
-    itEth(`for ${testCase.case}`, async ({helper}) => {
+    itEth.ifWithPallets(`for ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {
       const owner = await helper.eth.createAccountWithBalance(donor);
       const {collectionId, collectionAddress} = await helper.eth.createCollecion(testCase.method, owner, 'Limits', 'absolutely anything', 'FLO', 18);
       const limits = {
@@ -71,10 +72,10 @@
 
   [
     {case: 'nft' as const, method: 'createNFTCollection' as const},
-    {case: 'rft' as const, method: 'createRFTCollection' as const},
+    {case: 'rft' as const, method: 'createRFTCollection' as const, requiredPallets: [Pallets.ReFungible]},
     {case: 'ft' as const, method: 'createFTCollection' as const},
   ].map(testCase =>
-    itEth(`for ${testCase.case}`, async ({helper}) => {
+    itEth.ifWithPallets(`for ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {
       const invalidLimits = {
         accountTokenOwnershipLimit: BigInt(Number.MAX_SAFE_INTEGER),
         transfersEnabled: 3,
modifiedtests/src/eth/collectionProperties.test.tsdiffbeforeafterboth
before · tests/src/eth/collectionProperties.test.ts
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 {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util';18import {Pallets} from '../util';19import {IProperty, ITokenPropertyPermission} from '../util/playgrounds/types';20import {IKeyringPair} from '@polkadot/types/types';21import {TCollectionMode} from '../util/playgrounds/types';2223describe('EVM collection properties', () => {24  let donor: IKeyringPair;25  let alice: IKeyringPair;2627  before(async function() {28    await usingEthPlaygrounds(async (_helper, privateKey) => {29      donor = await privateKey({filename: __filename});30      [alice] = await _helper.arrange.createAccounts([20n], donor);31    });32  });3334  // Soft-deprecated: setCollectionProperty35  [36    {method: 'setCollectionProperties', methodParams: [[{key: 'testKey1', value: Buffer.from('testValue1')}, {key: 'testKey2', value: Buffer.from('testValue2')}]], expectedProps: [{key: 'testKey1', value: 'testValue1'}, {key: 'testKey2', value: 'testValue2'}]}, 37    {method: 'setCollectionProperty', methodParams: ['testKey', Buffer.from('testValue')], expectedProps: [{key: 'testKey', value: 'testValue'}]},38  ].map(testCase => 39    itEth(`Collection properties can be set: ${testCase.method}`, async({helper}) => {40      const caller = await helper.eth.createAccountWithBalance(donor);41      const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties: []});42      await collection.addAdmin(alice, {Ethereum: caller});4344      const address = helper.ethAddress.fromCollectionId(collection.collectionId);45      const contract = helper.ethNativeContract.collection(address, 'nft', caller, testCase.method === 'setCollectionProperty');4647      await contract.methods[testCase.method](...testCase.methodParams).send({from: caller});4849      const raw = (await collection.getData())?.raw;50      expect(raw.properties).to.deep.equal(testCase.expectedProps);51    }));5253  itEth('Cannot set invalid properties', async({helper}) => {54    const caller = await helper.eth.createAccountWithBalance(donor);55    const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties: []});56    await collection.addAdmin(alice, {Ethereum: caller});5758    const address = helper.ethAddress.fromCollectionId(collection.collectionId);59    const contract = helper.ethNativeContract.collection(address, 'nft', caller);6061    await expect(contract.methods.setCollectionProperties([{key: '', value: Buffer.from('val1')}]).send({from: caller})).to.be.rejected;62    await expect(contract.methods.setCollectionProperties([{key: 'déjà vu', value: Buffer.from('hmm...')}]).send({from: caller})).to.be.rejected;63    await expect(contract.methods.setCollectionProperties([{key: 'a'.repeat(257), value: Buffer.from('val3')}]).send({from: caller})).to.be.rejected;64    // TODO add more expects65    const raw = (await collection.getData())?.raw;66    expect(raw.properties).to.deep.equal([]);67  });686970  // Soft-deprecated: deleteCollectionProperty71  [72    {method: 'deleteCollectionProperties', methodParams: [['testKey1', 'testKey2']], expectedProps: [{key: 'testKey3', value: 'testValue3'}]},73    {method: 'deleteCollectionProperty', methodParams: ['testKey1'], expectedProps: [{key: 'testKey2', value: 'testValue2'}, {key: 'testKey3', value: 'testValue3'}]}, 74  ].map(testCase => 75    itEth(`Collection properties can be deleted: ${testCase.method}()`, async({helper}) => {76      const properties = [77        {key: 'testKey1', value: 'testValue1'},78        {key: 'testKey2', value: 'testValue2'},79        {key: 'testKey3', value: 'testValue3'}];80      const caller = await helper.eth.createAccountWithBalance(donor);81      const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties});82  83      await collection.addAdmin(alice, {Ethereum: caller});84  85      const address = helper.ethAddress.fromCollectionId(collection.collectionId);86      const contract = helper.ethNativeContract.collection(address, 'nft', caller, testCase.method === 'deleteCollectionProperty');87  88      await contract.methods[testCase.method](...testCase.methodParams).send({from: caller});89  90      const raw = (await collection.getData())?.raw;91  92      expect(raw.properties.length).to.equal(testCase.expectedProps.length);93      expect(raw.properties).to.deep.equal(testCase.expectedProps);94    }));9596  97  [98    {method: 'deleteCollectionProperties', methodParams: [['testKey2']]},99    {method: 'deleteCollectionProperty', methodParams: ['testKey2']},100  ].map(testCase => 101    itEth(`cannot ${testCase.method}() of non-owned collections`, async ({helper}) => {102      const properties = [103        {key: 'testKey1', value: 'testValue1'},104        {key: 'testKey2', value: 'testValue2'},105      ];106      const caller = await helper.eth.createAccountWithBalance(donor);107      const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties});108109      const address = helper.ethAddress.fromCollectionId(collection.collectionId);110      const collectionEvm = helper.ethNativeContract.collection(address, 'nft', caller, testCase.method === 'deleteCollectionProperty');111112      await expect(collectionEvm.methods[testCase.method](...testCase.methodParams).send({from: caller})).to.be.rejected;113      expect(await collection.getProperties()).to.deep.eq(properties);114    }));115116  itEth('Can be read', async({helper}) => {117    const caller = helper.eth.createAccount();118    const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties: [{key: 'testKey', value: 'testValue'}]});119120    const address = helper.ethAddress.fromCollectionId(collection.collectionId);121    const contract = helper.ethNativeContract.collection(address, 'nft', caller);122123    const value = await contract.methods.collectionProperty('testKey').call();124    expect(value).to.equal(helper.getWeb3().utils.toHex('testValue'));125  });126});127128describe('Supports ERC721Metadata', () => {129  let donor: IKeyringPair;130131  before(async function() {132    await usingEthPlaygrounds(async (_helper, privateKey) => {133      donor = await privateKey({filename: __filename});134    });135  });136137  const checkERC721Metadata = async (helper: EthUniqueHelper, mode: 'nft' | 'rft') => {138    const caller = await helper.eth.createAccountWithBalance(donor);139    const bruh = await helper.eth.createAccountWithBalance(donor);140141    const BASE_URI = 'base/';142    const SUFFIX = 'suffix1';143    const URI = 'uri1';144145    const collectionHelpers = helper.ethNativeContract.collectionHelpers(caller);146    const creatorMethod = mode === 'rft' ? 'createRFTCollection' : 'createNFTCollection';147148    const {collectionId, collectionAddress} = await helper.eth[creatorMethod](caller, 'n', 'd', 'p');149    const bruhCross = helper.ethCrossAccount.fromAddress(bruh);150151    const contract = helper.ethNativeContract.collectionById(collectionId, mode, caller);152    await contract.methods.addCollectionAdminCross(bruhCross).send(); // to check that admin will work too153154    const collection1 = helper.nft.getCollectionObject(collectionId);155    const data1 = await collection1.getData();156    expect(data1?.raw.flags.erc721metadata).to.be.false;157    expect(await contract.methods.supportsInterface('0x5b5e139f').call()).to.be.false;158159    await collectionHelpers.methods.makeCollectionERC721MetadataCompatible(collectionAddress, BASE_URI)160      .send({from: bruh});161162    expect(await contract.methods.supportsInterface('0x5b5e139f').call()).to.be.true;163164    const collection2 = helper.nft.getCollectionObject(collectionId);165    const data2 = await collection2.getData();166    expect(data2?.raw.flags.erc721metadata).to.be.true;167168    const propertyPermissions = data2?.raw.tokenPropertyPermissions;169    expect(propertyPermissions?.length).to.equal(2);170171    expect(propertyPermissions.find((tpp: ITokenPropertyPermission) => {172      return tpp.key === 'URI' && tpp.permission.mutable && tpp.permission.collectionAdmin && !tpp.permission.tokenOwner;173    })).to.be.not.null;174175    expect(propertyPermissions.find((tpp: ITokenPropertyPermission) => {176      return tpp.key === 'URISuffix' && tpp.permission.mutable && tpp.permission.collectionAdmin && !tpp.permission.tokenOwner;177    })).to.be.not.null;178179    expect(data2?.raw.properties?.find((property: IProperty) => {180      return property.key === 'baseURI' && property.value === BASE_URI;181    })).to.be.not.null;182183    const token1Result = await contract.methods.mint(bruh).send();184    const tokenId1 = token1Result.events.Transfer.returnValues.tokenId;185186    expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(BASE_URI);187188    await contract.methods.setProperties(tokenId1, [{key: 'URISuffix', value: Buffer.from(SUFFIX)}]).send();189    expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(BASE_URI + SUFFIX);190191    await contract.methods.setProperties(tokenId1, [{key: 'URI', value: Buffer.from(URI)}]).send();192    expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(URI);193194    await contract.methods.deleteProperties(tokenId1, ['URI']).send();195    expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(BASE_URI + SUFFIX);196197    const token2Result = await contract.methods.mintWithTokenURI(bruh, URI).send();198    const tokenId2 = token2Result.events.Transfer.returnValues.tokenId;199200    expect(await contract.methods.tokenURI(tokenId2).call()).to.equal(URI);201202    await contract.methods.deleteProperties(tokenId2, ['URI']).send();203    expect(await contract.methods.tokenURI(tokenId2).call()).to.equal(BASE_URI);204205    await contract.methods.setProperties(tokenId2, [{key: 'URISuffix', value: Buffer.from(SUFFIX)}]).send();206    expect(await contract.methods.tokenURI(tokenId2).call()).to.equal(BASE_URI + SUFFIX);207  };208209  itEth('ERC721Metadata property can be set for NFT collection', async({helper}) => {210    await checkERC721Metadata(helper, 'nft');211  });212213  itEth.ifWithPallets('ERC721Metadata property can be set for RFT collection', [Pallets.ReFungible], async({helper}) => {214    await checkERC721Metadata(helper, 'rft');215  });216});217218describe('EVM collection property', () => {219  let donor: IKeyringPair;220221  before(async function() {222    await usingEthPlaygrounds(async (_helper, privateKey) => {223      donor = await privateKey({filename: __filename});224    });225  });226227  async function testSetReadProperties(helper: EthUniqueHelper, mode: TCollectionMode) {228    const collection = await helper[mode].mintCollection(donor, {name: 'A', description: 'B', tokenPrefix: 'C'});229230    const sender = await helper.eth.createAccountWithBalance(donor, 100n);231    await collection.addAdmin(donor, {Ethereum: sender});232233    const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);234    const contract = helper.ethNativeContract.collection(collectionAddress, mode, sender);235236    const keys = ['key0', 'key1'];237238    const writeProperties = [239      helper.ethProperty.property(keys[0], 'value0'),240      helper.ethProperty.property(keys[1], 'value1'),241    ];242243    await contract.methods.setCollectionProperties(writeProperties).send();244    const readProperties = await contract.methods.collectionProperties([keys[0], keys[1]]).call();245    expect(readProperties).to.be.like(writeProperties);246  }247248  itEth('Set/read properties ft', async ({helper}) => {249    await testSetReadProperties(helper, 'ft');250  });251  itEth.ifWithPallets('Set/read properties rft', [Pallets.ReFungible], async ({helper}) => {252    await testSetReadProperties(helper, 'rft');253  });254  itEth('Set/read properties nft', async ({helper}) => {255    await testSetReadProperties(helper, 'nft');256  });257258  async function testDeleteProperties(helper: EthUniqueHelper, mode: TCollectionMode) {259    const collection = await helper[mode].mintCollection(donor, {name: 'A', description: 'B', tokenPrefix: 'C'});260261    const sender = await helper.eth.createAccountWithBalance(donor, 100n);262    await collection.addAdmin(donor, {Ethereum: sender});263264    const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);265    const contract = helper.ethNativeContract.collection(collectionAddress, mode, sender);266267    const keys = ['key0', 'key1', 'key2', 'key3'];268269    {270      const writeProperties = [271        helper.ethProperty.property(keys[0], 'value0'),272        helper.ethProperty.property(keys[1], 'value1'),273        helper.ethProperty.property(keys[2], 'value2'),274        helper.ethProperty.property(keys[3], 'value3'),275      ];276277      await contract.methods.setCollectionProperties(writeProperties).send();278      const readProperties = await contract.methods.collectionProperties([keys[0], keys[1], keys[2], keys[3]]).call();279      expect(readProperties).to.be.like(writeProperties);280    }281282    {283      const expectProperties = [284        helper.ethProperty.property(keys[0], 'value0'),285        helper.ethProperty.property(keys[1], 'value1'),286      ];287288      await contract.methods.deleteCollectionProperties([keys[2], keys[3]]).send();289      const readProperties = await contract.methods.collectionProperties([]).call();290      expect(readProperties).to.be.like(expectProperties);291    }292  }293  294  itEth('Delete properties ft', async ({helper}) => {295    await testDeleteProperties(helper, 'ft');296  });297  itEth.ifWithPallets('Delete properties rft', [Pallets.ReFungible], async ({helper}) => {298    await testDeleteProperties(helper, 'rft');299  });300  itEth('Delete properties nft', async ({helper}) => {301    await testDeleteProperties(helper, 'nft');302  });303    304});
after · tests/src/eth/collectionProperties.test.ts
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 {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util';18import {Pallets} from '../util';19import {IProperty, ITokenPropertyPermission} from '../util/playgrounds/types';20import {IKeyringPair} from '@polkadot/types/types';2122describe('EVM collection properties', () => {23  let donor: IKeyringPair;24  let alice: IKeyringPair;2526  before(async function() {27    await usingEthPlaygrounds(async (_helper, privateKey) => {28      donor = await privateKey({filename: __filename});29      [alice] = await _helper.arrange.createAccounts([20n], donor);30    });31  });3233  // Soft-deprecated: setCollectionProperty34  [35    {method: 'setCollectionProperties', methodParams: [[{key: 'testKey1', value: Buffer.from('testValue1')}, {key: 'testKey2', value: Buffer.from('testValue2')}]], expectedProps: [{key: 'testKey1', value: 'testValue1'}, {key: 'testKey2', value: 'testValue2'}]}, 36    {method: 'setCollectionProperty', methodParams: ['testKey', Buffer.from('testValue')], expectedProps: [{key: 'testKey', value: 'testValue'}]},37  ].map(testCase => 38    itEth(`Collection properties can be set: ${testCase.method}`, async({helper}) => {39      const caller = await helper.eth.createAccountWithBalance(donor);40      const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties: []});41      await collection.addAdmin(alice, {Ethereum: caller});4243      const address = helper.ethAddress.fromCollectionId(collection.collectionId);44      const contract = helper.ethNativeContract.collection(address, 'nft', caller, testCase.method === 'setCollectionProperty');4546      await contract.methods[testCase.method](...testCase.methodParams).send({from: caller});4748      const raw = (await collection.getData())?.raw;49      expect(raw.properties).to.deep.equal(testCase.expectedProps);50    }));5152  itEth('Cannot set invalid properties', async({helper}) => {53    const caller = await helper.eth.createAccountWithBalance(donor);54    const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties: []});55    await collection.addAdmin(alice, {Ethereum: caller});5657    const address = helper.ethAddress.fromCollectionId(collection.collectionId);58    const contract = helper.ethNativeContract.collection(address, 'nft', caller);5960    await expect(contract.methods.setCollectionProperties([{key: '', value: Buffer.from('val1')}]).send({from: caller})).to.be.rejected;61    await expect(contract.methods.setCollectionProperties([{key: 'déjà vu', value: Buffer.from('hmm...')}]).send({from: caller})).to.be.rejected;62    await expect(contract.methods.setCollectionProperties([{key: 'a'.repeat(257), value: Buffer.from('val3')}]).send({from: caller})).to.be.rejected;63    // TODO add more expects64    const raw = (await collection.getData())?.raw;65    expect(raw.properties).to.deep.equal([]);66  });676869  // Soft-deprecated: deleteCollectionProperty70  [71    {method: 'deleteCollectionProperties', methodParams: [['testKey1', 'testKey2']], expectedProps: [{key: 'testKey3', value: 'testValue3'}]},72    {method: 'deleteCollectionProperty', methodParams: ['testKey1'], expectedProps: [{key: 'testKey2', value: 'testValue2'}, {key: 'testKey3', value: 'testValue3'}]}, 73  ].map(testCase => 74    itEth(`Collection properties can be deleted: ${testCase.method}()`, async({helper}) => {75      const properties = [76        {key: 'testKey1', value: 'testValue1'},77        {key: 'testKey2', value: 'testValue2'},78        {key: 'testKey3', value: 'testValue3'}];79      const caller = await helper.eth.createAccountWithBalance(donor);80      const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties});81  82      await collection.addAdmin(alice, {Ethereum: caller});83  84      const address = helper.ethAddress.fromCollectionId(collection.collectionId);85      const contract = helper.ethNativeContract.collection(address, 'nft', caller, testCase.method === 'deleteCollectionProperty');86  87      await contract.methods[testCase.method](...testCase.methodParams).send({from: caller});88  89      const raw = (await collection.getData())?.raw;90  91      expect(raw.properties.length).to.equal(testCase.expectedProps.length);92      expect(raw.properties).to.deep.equal(testCase.expectedProps);93    }));9495  96  [97    {method: 'deleteCollectionProperties', methodParams: [['testKey2']]},98    {method: 'deleteCollectionProperty', methodParams: ['testKey2']},99  ].map(testCase => 100    itEth(`cannot ${testCase.method}() of non-owned collections`, async ({helper}) => {101      const properties = [102        {key: 'testKey1', value: 'testValue1'},103        {key: 'testKey2', value: 'testValue2'},104      ];105      const caller = await helper.eth.createAccountWithBalance(donor);106      const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties});107108      const address = helper.ethAddress.fromCollectionId(collection.collectionId);109      const collectionEvm = helper.ethNativeContract.collection(address, 'nft', caller, testCase.method === 'deleteCollectionProperty');110111      await expect(collectionEvm.methods[testCase.method](...testCase.methodParams).send({from: caller})).to.be.rejected;112      expect(await collection.getProperties()).to.deep.eq(properties);113    }));114115  itEth('Can be read', async({helper}) => {116    const caller = helper.eth.createAccount();117    const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'test', tokenPrefix: 'test', properties: [{key: 'testKey', value: 'testValue'}]});118119    const address = helper.ethAddress.fromCollectionId(collection.collectionId);120    const contract = helper.ethNativeContract.collection(address, 'nft', caller);121122    const value = await contract.methods.collectionProperty('testKey').call();123    expect(value).to.equal(helper.getWeb3().utils.toHex('testValue'));124  });125});126127describe('Supports ERC721Metadata', () => {128  let donor: IKeyringPair;129130  before(async function() {131    await usingEthPlaygrounds(async (_helper, privateKey) => {132      donor = await privateKey({filename: __filename});133    });134  });135136  [137    {case: 'nft' as const},138    {case: 'rft' as const, requiredPallets: [Pallets.ReFungible]},139  ].map(testCase => 140    itEth.ifWithPallets(`ERC721Metadata property can be set for ${testCase.case} collection`, testCase.requiredPallets || [], async ({helper}) => {141      const caller = await helper.eth.createAccountWithBalance(donor);142      const bruh = await helper.eth.createAccountWithBalance(donor);143  144      const BASE_URI = 'base/';145      const SUFFIX = 'suffix1';146      const URI = 'uri1';147  148      const collectionHelpers = helper.ethNativeContract.collectionHelpers(caller);149      const creatorMethod = testCase.case === 'rft' ? 'createRFTCollection' : 'createNFTCollection';150  151      const {collectionId, collectionAddress} = await helper.eth[creatorMethod](caller, 'n', 'd', 'p');152      const bruhCross = helper.ethCrossAccount.fromAddress(bruh);153  154      const contract = helper.ethNativeContract.collectionById(collectionId, testCase.case, caller);155      await contract.methods.addCollectionAdminCross(bruhCross).send(); // to check that admin will work too156  157      const collection1 = helper.nft.getCollectionObject(collectionId);158      const data1 = await collection1.getData();159      expect(data1?.raw.flags.erc721metadata).to.be.false;160      expect(await contract.methods.supportsInterface('0x5b5e139f').call()).to.be.false;161  162      await collectionHelpers.methods.makeCollectionERC721MetadataCompatible(collectionAddress, BASE_URI)163        .send({from: bruh});164  165      expect(await contract.methods.supportsInterface('0x5b5e139f').call()).to.be.true;166  167      const collection2 = helper.nft.getCollectionObject(collectionId);168      const data2 = await collection2.getData();169      expect(data2?.raw.flags.erc721metadata).to.be.true;170  171      const propertyPermissions = data2?.raw.tokenPropertyPermissions;172      expect(propertyPermissions?.length).to.equal(2);173  174      expect(propertyPermissions.find((tpp: ITokenPropertyPermission) => {175        return tpp.key === 'URI' && tpp.permission.mutable && tpp.permission.collectionAdmin && !tpp.permission.tokenOwner;176      })).to.be.not.null;177  178      expect(propertyPermissions.find((tpp: ITokenPropertyPermission) => {179        return tpp.key === 'URISuffix' && tpp.permission.mutable && tpp.permission.collectionAdmin && !tpp.permission.tokenOwner;180      })).to.be.not.null;181  182      expect(data2?.raw.properties?.find((property: IProperty) => {183        return property.key === 'baseURI' && property.value === BASE_URI;184      })).to.be.not.null;185  186      const token1Result = await contract.methods.mint(bruh).send();187      const tokenId1 = token1Result.events.Transfer.returnValues.tokenId;188  189      expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(BASE_URI);190  191      await contract.methods.setProperties(tokenId1, [{key: 'URISuffix', value: Buffer.from(SUFFIX)}]).send();192      expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(BASE_URI + SUFFIX);193  194      await contract.methods.setProperties(tokenId1, [{key: 'URI', value: Buffer.from(URI)}]).send();195      expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(URI);196  197      await contract.methods.deleteProperties(tokenId1, ['URI']).send();198      expect(await contract.methods.tokenURI(tokenId1).call()).to.equal(BASE_URI + SUFFIX);199  200      const token2Result = await contract.methods.mintWithTokenURI(bruh, URI).send();201      const tokenId2 = token2Result.events.Transfer.returnValues.tokenId;202  203      expect(await contract.methods.tokenURI(tokenId2).call()).to.equal(URI);204  205      await contract.methods.deleteProperties(tokenId2, ['URI']).send();206      expect(await contract.methods.tokenURI(tokenId2).call()).to.equal(BASE_URI);207  208      await contract.methods.setProperties(tokenId2, [{key: 'URISuffix', value: Buffer.from(SUFFIX)}]).send();209      expect(await contract.methods.tokenURI(tokenId2).call()).to.equal(BASE_URI + SUFFIX);210    }));211});212213describe('EVM collection property', () => {214  let donor: IKeyringPair;215216  before(async function() {217    await usingEthPlaygrounds(async (_helper, privateKey) => {218      donor = await privateKey({filename: __filename});219    });220  });221222  [223    {case: 'nft' as const},224    {case: 'rft' as const, requiredPallets: [Pallets.ReFungible]},225    {case: 'ft' as const},226  ].map(testCase => 227    itEth.ifWithPallets(`can set/read properties ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {228      const collection = await helper[testCase.case].mintCollection(donor, {name: 'A', description: 'B', tokenPrefix: 'C'});229230      const sender = await helper.eth.createAccountWithBalance(donor, 100n);231      await collection.addAdmin(donor, {Ethereum: sender});232  233      const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);234      const contract = helper.ethNativeContract.collection(collectionAddress, testCase.case, sender);235  236      const keys = ['key0', 'key1'];237  238      const writeProperties = [239        helper.ethProperty.property(keys[0], 'value0'),240        helper.ethProperty.property(keys[1], 'value1'),241      ];242  243      await contract.methods.setCollectionProperties(writeProperties).send();244      const readProperties = await contract.methods.collectionProperties([keys[0], keys[1]]).call();245      expect(readProperties).to.be.like(writeProperties);246    }));247248  [249    {case: 'nft' as const},250    {case: 'rft' as const, requiredPallets: [Pallets.ReFungible]},251    {case: 'ft' as const},252  ].map(testCase => 253    itEth.ifWithPallets(`can delete properties ${testCase.case}`, testCase.requiredPallets || [], async ({helper}) => {254      const collection = await helper[testCase.case].mintCollection(donor, {name: 'A', description: 'B', tokenPrefix: 'C'});255256      const sender = await helper.eth.createAccountWithBalance(donor, 100n);257      await collection.addAdmin(donor, {Ethereum: sender});258  259      const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);260      const contract = helper.ethNativeContract.collection(collectionAddress, testCase.case, sender);261  262      const keys = ['key0', 'key1', 'key2', 'key3'];263  264      {265        const writeProperties = [266          helper.ethProperty.property(keys[0], 'value0'),267          helper.ethProperty.property(keys[1], 'value1'),268          helper.ethProperty.property(keys[2], 'value2'),269          helper.ethProperty.property(keys[3], 'value3'),270        ];271  272        await contract.methods.setCollectionProperties(writeProperties).send();273        const readProperties = await contract.methods.collectionProperties([keys[0], keys[1], keys[2], keys[3]]).call();274        expect(readProperties).to.be.like(writeProperties);275      }276  277      {278        const expectProperties = [279          helper.ethProperty.property(keys[0], 'value0'),280          helper.ethProperty.property(keys[1], 'value1'),281        ];282  283        await contract.methods.deleteCollectionProperties([keys[2], keys[3]]).send();284        const readProperties = await contract.methods.collectionProperties([]).call();285        expect(readProperties).to.be.like(expectProperties);286      }287    }));288});