git.delta.rocks / unique-network / refs/commits / 67c56fa49efc

difftreelog

Merge pull request #655 from UniqueNetwork/tests/feed-alices

kozyrevdev2022-10-18parents: #d8e7f8d #5930cd3.patch.diff
in: master
Parallel tests

139 files changed

modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -5,11 +5,11 @@
   "main": "",
   "devDependencies": {
     "@polkadot/ts": "0.4.22",
-    "@polkadot/typegen": "9.2.2",
+    "@polkadot/typegen": "9.5.1",
     "@types/chai": "^4.3.1",
     "@types/chai-as-promised": "^7.1.5",
     "@types/chai-like": "^1.1.1",
-    "@types/mocha": "^9.1.1",
+    "@types/mocha": "^10.0.0",
     "@types/node": "^17.0.35",
     "@typescript-eslint/eslint-plugin": "^5.26.0",
     "@typescript-eslint/parser": "^5.26.0",
@@ -21,34 +21,37 @@
   },
   "mocha": {
     "timeout": 9999999,
-    "require": "ts-node/register"
+    "require": ["ts-node/register"]
   },
   "scripts": {
     "lint": "eslint --ext .ts,.js src/",
     "fix": "eslint --ext .ts,.js src/ --fix",
-    "test": "mocha --timeout 9999999 -r ts-node/register './src/**/*.test.ts'",
-    "testEth": "mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.test.ts'",
-    "testEthMarketplace": "mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.test.ts'",
-    "testEthNesting": "mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.test.ts'",
-    "testEthFractionalizer": "mocha --timeout 9999999 -r ts-node/register './**/eth/fractionalizer/**/*.test.ts'",
+    "setup": "ts-node ./src/util/globalSetup.ts",
+
+    "test": "yarn setup && mocha --timeout 9999999 -r ts-node/register './src/**/*.*test.ts'",
+    "testParallelFull": "yarn testParallel && yarn testSequential",
+    "testParallel": "yarn setup && mocha --parallel --timeout 9999999 -r ts-node/register './src/**/*.test.ts'",
+    "testSequential": "yarn setup && mocha --timeout 9999999 -r ts-node/register './src/**/*.seqtest.ts'",
+    "testStructure": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./**/nesting/*.*test.ts",
+    "testEth": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.*test.ts'",
+    "testEthNesting": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.*test.ts'",
+    "testEthFractionalizer": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/fractionalizer/**/*.*test.ts'",
+    "testEthMarketplace": "yarn setup && mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.*test.ts'",
+    "testEvent": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./src/check-event/*.*test.ts",
+    "testRmrk": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./**/rmrk/*.*test.ts",
+
     "testEthPayable": "mocha --timeout 9999999 -r ts-node/register './**/eth/payable.test.ts'",
+    "testEthTokenProperties": "mocha --timeout 9999999 -r ts-node/register ./**/eth/tokenProperties.test.ts",
     "testEvmCoder": "mocha --timeout 9999999 -r ts-node/register './**/eth/evmCoder.test.ts'",
-    "load": "mocha --timeout 9999999 -r ts-node/register './**/*.load.ts'",
-    "loadTransfer": "ts-node src/transfer.nload.ts",
-    "testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts",
-    "testEvent": "mocha --timeout 9999999 -r ts-node/register ./src/check-event/*.test.ts",
     "testNesting": "mocha --timeout 9999999 -r ts-node/register ./**/nest.test.ts",
     "testUnnesting": "mocha --timeout 9999999 -r ts-node/register ./**/unnest.test.ts",
-    "testStructure": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/**.test.ts",
     "testProperties": "mocha --timeout 9999999 -r ts-node/register ./**/properties.test.ts ./**/getPropertiesRpc.test.ts",
     "testMigration": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/migration-check.test.ts",
-    "testRmrk": "mocha --timeout 9999999 -r ts-node/register ./**/rmrk/**.test.ts",
     "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts",
-    "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts",
     "testSetCollectionLimits": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionLimits.test.ts",
     "testChangeCollectionOwner": "mocha --timeout 9999999 -r ts-node/register ./**/change-collection-owner.test.ts",
     "testSetCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/setCollectionSponsor.test.ts",
-    "testConfirmSponsorship": "mocha --timeout 9999999 -r ts-node/register ./**/confirmSponsorship.test.ts",
+    "testConfirmSponsorship": "mocha --timeout 9999999 --parallel -r ts-node/register ./**/confirmSponsorship.test.ts",
     "testRemoveCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionAdmin.test.ts",
     "testRemoveCollectionSponsor": "mocha --timeout 9999999 -r ts-node/register ./**/removeCollectionSponsor.test.ts",
     "testAllowLists": "mocha --timeout 9999999 -r ts-node/register ./**/allowLists.test.ts",
@@ -78,12 +81,6 @@
     "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",
     "testScheduler": "mocha --timeout 9999999 -r ts-node/register ./**/scheduler.test.ts",
     "testSchedulingEVM": "mocha --timeout 9999999 -r ts-node/register ./**/eth/scheduling.test.ts",
-    "testXcmUnique": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmUnique.test.ts",
-    "testXcmQuartz": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmQuartz.test.ts",
-    "testXcmOpal": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmOpal.test.ts",
-    "testXcmTransferAcala": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferAcala.test.ts acalaId=2000 uniqueId=5000",
-    "testXcmTransferStatemine": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferStatemine.test.ts statemineId=1000 uniqueId=5000",
-    "testXcmTransferMoonbeam": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferMoonbeam.test.ts",
     "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",
     "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",
     "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts",
@@ -96,7 +93,18 @@
     "testFT": "mocha --timeout 9999999 -r ts-node/register ./**/fungible.test.ts",
     "testEthFT": "mocha --timeout 9999999 -r ts-node/register ./**/eth/fungible.test.ts",
     "testRPC": "mocha --timeout 9999999 -r ts-node/register ./**/rpc.test.ts",
-    "testPromotion": "mocha --timeout 9999999 -r ts-node/register ./**/app-promotion.test.ts",
+    "testPromotion": "yarn setup && mocha --timeout 9999999 -r ts-node/register ./**/app-promotion.test.ts",
+
+    "testXcmUnique": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmUnique.test.ts",
+    "testXcmQuartz": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmQuartz.test.ts",
+    "testXcmOpal": "RUN_XCM_TESTS=1 mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmOpal.test.ts",
+    "testXcmTransferAcala": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferAcala.test.ts acalaId=2000 uniqueId=5000",
+    "testXcmTransferStatemine": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferStatemine.test.ts statemineId=1000 uniqueId=5000",
+    "testXcmTransferMoonbeam": "mocha --timeout 9999999 -r ts-node/register ./**/xcm/xcmTransferMoonbeam.test.ts",
+
+    "load": "mocha --timeout 9999999 -r ts-node/register './**/*.load.ts'",
+    "loadTransfer": "ts-node src/transfer.nload.ts",
+
     "polkadot-types-fetch-metadata": "curl -H 'Content-Type: application/json' -d '{\"id\":\"1\", \"jsonrpc\":\"2.0\", \"method\": \"state_getMetadata\", \"params\":[]}' http://localhost:9933 > src/interfaces/metadata.json",
     "polkadot-types-from-defs": "ts-node ./node_modules/.bin/polkadot-types-from-defs --endpoint src/interfaces/metadata.json --input src/interfaces/ --package .",
     "polkadot-types-from-chain": "ts-node ./node_modules/.bin/polkadot-types-from-chain --endpoint src/interfaces/metadata.json --output src/interfaces/ --package .",
@@ -106,14 +114,14 @@
   "license": "SEE LICENSE IN ../LICENSE",
   "homepage": "",
   "dependencies": {
-    "@polkadot/api": "9.2.2",
-    "@polkadot/api-contract": "9.2.2",
-    "@polkadot/util-crypto": "10.1.7",
-    "bignumber.js": "^9.0.2",
+    "@polkadot/api": "9.5.1",
+    "@polkadot/api-contract": "9.5.1",
+    "@polkadot/util-crypto": "10.1.10",
+    "bignumber.js": "^9.1.0",
     "chai-as-promised": "^7.1.1",
     "chai-like": "^1.1.1",
     "find-process": "^1.4.7",
-    "solc": "0.8.14-fixed",
+    "solc": "0.8.17",
     "web3": "^1.7.3"
   },
   "standard": {
modifiedtests/src/addCollectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/addCollectionAdmin.test.ts
+++ b/tests/src/addCollectionAdmin.test.ts
@@ -15,14 +15,14 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 describe('Integration Test addCollectionAdmin(collection_id, new_admin_id):', () => {
   let donor: IKeyringPair;
 
   before(async () => {
-    await usingPlaygrounds(async (_, privateKeyWrapper) => {
-      donor = privateKeyWrapper('//Alice');
+    await usingPlaygrounds(async (_, privateKey) => {
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -44,8 +44,8 @@
   let donor: IKeyringPair;
 
   before(async () => {
-    await usingPlaygrounds(async (_, privateKeyWrapper) => {
-      donor = privateKeyWrapper('//Alice');
+    await usingPlaygrounds(async (_, privateKey) => {
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/adminTransferAndBurn.test.tsdiffbeforeafterboth
--- a/tests/src/adminTransferAndBurn.test.ts
+++ b/tests/src/adminTransferAndBurn.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from './util/playgrounds';
+import {usingPlaygrounds, expect, itSub} from './util';
 
 describe('Integration Test: ownerCanTransfer allows admins to use only transferFrom/burnFrom:', () => {
   let alice: IKeyringPair;
@@ -24,7 +24,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
     });
   });
modifiedtests/src/allowLists.test.tsdiffbeforeafterboth
--- a/tests/src/allowLists.test.ts
+++ b/tests/src/allowLists.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from './util/playgrounds';
+import {usingPlaygrounds, expect, itSub} from './util';
 import {ICollectionPermissions} from './util/playgrounds/types';
 
 describe('Integration Test ext. Allow list tests', () => {
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([30n, 10n, 10n], donor);
     });
   });
@@ -87,7 +87,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([30n, 10n, 10n], donor);
     });
   });
@@ -163,7 +163,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([30n, 10n, 10n], donor);
     });
   });
@@ -291,7 +291,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
addedtests/src/app-promotion.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/app-promotion.seqtest.ts
@@ -0,0 +1,82 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util';
+import {expect} from './eth/util';
+
+let superuser: IKeyringPair;
+let donor: IKeyringPair;
+let palletAdmin: IKeyringPair;
+
+describe('App promotion', () => {
+  before(async function () {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      requirePalletsOrSkip(this, helper, [Pallets.AppPromotion]);
+      superuser = await privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
+      palletAdmin = await privateKey('//PromotionAdmin');
+      const api = helper.getApi();
+      await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})));
+    });
+  });
+
+  after(async function () {
+    await usingPlaygrounds(async (helper) => {
+      if (helper.fetchMissingPalletNames([Pallets.AppPromotion]).length != 0) return;
+      const api = helper.getApi();
+      await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})));
+    });
+  });
+
+  describe('admin adress', () => {
+    itSub('can be set by sudo only', async ({helper}) => {
+      const api = helper.getApi();
+      const [nonAdmin] = await helper.arrange.createAccounts([10n], donor);
+      // nonAdmin can not set admin not from himself nor as a sudo
+      await expect(helper.signTransaction(nonAdmin, api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address}))).to.be.rejected;
+      await expect(helper.signTransaction(nonAdmin, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address})))).to.be.rejected;
+    });
+    
+    itSub('can be any valid CrossAccountId', async ({helper}) => {
+      // We are not going to set an eth address as a sponsor,
+      // but we do want to check, it doesn't break anything;
+      const api = helper.getApi();
+      const [account] = await helper.arrange.createAccounts([10n], donor);
+      const ethAccount = helper.address.substrateToEth(account.address); 
+      // Alice sets Ethereum address as a sudo. Then Substrate address back...
+      await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Ethereum: ethAccount})))).to.be.fulfilled;
+      await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})))).to.be.fulfilled;
+        
+      // ...It doesn't break anything;
+      const collection = await helper.nft.mintCollection(account, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'});
+      await expect(helper.signTransaction(account, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected;
+    });
+  
+    itSub('can be reassigned', async ({helper}) => {
+      const api = helper.getApi();
+      const [oldAdmin, newAdmin, collectionOwner] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
+      const collection  = await helper.nft.mintCollection(collectionOwner, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'});
+        
+      await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: oldAdmin.address})))).to.be.fulfilled;
+      await expect(helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: newAdmin.address})))).to.be.fulfilled;
+      await expect(helper.signTransaction(oldAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected;
+        
+      await expect(helper.signTransaction(newAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.fulfilled;
+    });
+  });
+});
+
modifiedtests/src/app-promotion.test.tsdiffbeforeafterboth
--- a/tests/src/app-promotion.test.ts
+++ b/tests/src/app-promotion.test.ts
@@ -15,17 +15,15 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util/playgrounds';
-import {encodeAddress} from '@polkadot/util-crypto';
-import {stringToU8a} from '@polkadot/util';
+import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from './util';
 import {DevUniqueHelper} from './util/playgrounds/unique.dev';
-import {itEth, expect, SponsoringMode} from './eth/util/playgrounds';
+import {itEth, expect, SponsoringMode} from './eth/util';
 
-let alice: IKeyringPair;
+let donor: IKeyringPair;
 let palletAdmin: IKeyringPair;
 let nominal: bigint;
-const palletAddress = calculatePalleteAddress('appstake');
-let accounts: IKeyringPair[] = [];
+let palletAddress: string;
+let accounts: IKeyringPair[];
 const LOCKING_PERIOD = 20n; // 20 blocks of relay
 const UNLOCKING_PERIOD = 10n; // 10 blocks of parachain
 const rewardAvailableInBlock = (stakedInBlock: bigint) => {
@@ -37,14 +35,11 @@
   before(async function () {
     await usingPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.AppPromotion]);
-      alice = privateKey('//Alice');
-      palletAdmin = privateKey('//Charlie'); // TODO use custom address
-      const api = helper.getApi();
-      await helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})));
+      donor = await privateKey({filename: __filename});
+      palletAddress = helper.arrange.calculatePalletAddress('appstake');
+      palletAdmin = await privateKey('//PromotionAdmin');
       nominal = helper.balance.getOneTokenNominal();
-      await helper.balance.transferToSubstrate(alice, palletAdmin.address, 1000n * nominal);
-      await helper.balance.transferToSubstrate(alice, palletAddress, 1000n * nominal);
-      accounts = await helper.arrange.createCrowd(100, 1000n, alice); // create accounts-pool to speed up tests
+      accounts = await helper.arrange.createCrowd(100, 1000n, donor); // create accounts-pool to speed up tests
     });
   });
 
@@ -76,7 +71,7 @@
     });
   
     itSub('should allow to create maximum 10 stakes for account', async ({helper}) => {
-      const [staker] = await helper.arrange.createAccounts([2000n], alice);
+      const [staker] = await helper.arrange.createAccounts([2000n], donor);
       for (let i = 0; i < 10; i++) {
         await helper.staking.stake(staker, 100n * nominal);
       }
@@ -144,7 +139,7 @@
       expect(await helper.balance.getSubstrate(staker.address) / nominal).to.be.equal(999n);
   
       // staker can transfer:
-      await helper.balance.transferToSubstrate(staker, alice.address, 998n * nominal);
+      await helper.balance.transferToSubstrate(staker, donor.address, 998n * nominal);
       expect(await helper.balance.getSubstrate(staker.address) / nominal).to.be.equal(1n);
     });
   
@@ -224,55 +219,7 @@
     });
   });
   
-  describe('admin adress', () => {
-    itSub('can be set by sudo only', async ({helper}) => {
-      const api = helper.getApi();
-      const nonAdmin = accounts.pop()!;
-      // nonAdmin can not set admin not from himself nor as a sudo
-      await expect(helper.signTransaction(nonAdmin, api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address}))).to.be.rejected;
-      await expect(helper.signTransaction(nonAdmin, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: nonAdmin.address})))).to.be.rejected;
-  
-      // Alice can
-      await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})))).to.be.fulfilled;
-    });
-    
-    itSub('can be any valid CrossAccountId', async ({helper}) => {
-      // We are not going to set an eth address as a sponsor,
-      // but we do want to check, it doesn't break anything;
-      const api = helper.getApi();
-      const account = accounts.pop()!;
-      const ethAccount = helper.address.substrateToEth(account.address); 
-      // Alice sets Ethereum address as a sudo. Then Substrate address back...
-      await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Ethereum: ethAccount})))).to.be.fulfilled;
-      await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})))).to.be.fulfilled;
-        
-      // ...It doesn't break anything;
-      const collection = await helper.nft.mintCollection(account, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'});
-      await expect(helper.signTransaction(account, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected;
-    });
-  
-    itSub('can be reassigned', async ({helper}) => {
-      const api = helper.getApi();
-      const [oldAdmin, newAdmin, collectionOwner] = [accounts.pop()!, accounts.pop()!, accounts.pop()!];
-      const collection  = await helper.nft.mintCollection(collectionOwner, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion'});
-        
-      await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: oldAdmin.address})))).to.be.fulfilled;
-      await expect(helper.signTransaction(alice, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: newAdmin.address})))).to.be.fulfilled;
-      await expect(helper.signTransaction(oldAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.rejected;
-        
-      await expect(helper.signTransaction(newAdmin, api.tx.appPromotion.sponsorCollection(collection.collectionId))).to.be.fulfilled;
-    });
-  });
-  
   describe('collection sponsoring', () => {
-    before(async function () {
-      await usingPlaygrounds(async (helper) => {
-        const api = helper.getApi();
-        const tx = api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address}));
-        await helper.signTransaction(alice, tx);
-      });
-    });
-  
     itSub('should actually sponsor transactions', async ({helper}) => {
       const api = helper.getApi();
       const [collectionOwner, tokenSender, receiver] = [accounts.pop()!, accounts.pop()!, accounts.pop()!];
@@ -343,7 +290,7 @@
     itSub('should not overwrite collection limits set by the owner earlier', async ({helper}) => {
       const api = helper.getApi();
       const limits = {ownerCanDestroy: true, ownerCanTransfer: true, sponsorTransferTimeout: 0};
-      const collectionWithLimits = await helper.nft.mintCollection(alice, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion', limits});
+      const collectionWithLimits = await helper.nft.mintCollection(accounts.pop()!, {name: 'New', description: 'New Collection', tokenPrefix: 'Promotion', limits});
   
       await expect(helper.signTransaction(palletAdmin, api.tx.appPromotion.sponsorCollection(collectionWithLimits.collectionId))).to.be.fulfilled;
       expect((await collectionWithLimits.getData())?.raw.limits).to.be.deep.contain(limits);
@@ -416,7 +363,7 @@
   
   describe('contract sponsoring', () => {
     itEth('should set palletes address as a sponsor', async ({helper}) => {
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
   
@@ -432,7 +379,7 @@
     });
   
     itEth('should overwrite sponsoring mode and existed sponsor', async ({helper}) => {
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
   
@@ -459,7 +406,7 @@
     });
   
     itEth('can be overwritten by contract owner', async ({helper}) => {
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
   
@@ -480,7 +427,7 @@
   
     itEth('can not be set by non admin', async ({helper}) => {
       const nonAdmin = accounts.pop()!;
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
   
@@ -499,18 +446,18 @@
   
     itEth('should actually sponsor transactions', async ({helper}) => {
       // Contract caller
-      const caller = await helper.eth.createAccountWithBalance(alice, 1000n);
+      const caller = await helper.eth.createAccountWithBalance(donor, 1000n);
       const palletBalanceBefore = await helper.balance.getSubstrate(palletAddress);
           
       // Deploy flipper
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner); // await deployFlipper(web3, contractOwner);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
       
       // Owner sets to sponsor every tx
       await contractHelper.methods.setSponsoringRateLimit(flipper.options.address, 0).send({from: contractOwner});
       await contractHelper.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: contractOwner});
-      await helper.eth.transferBalanceFromSubstrate(alice, flipper.options.address, 1000n); // transferBalanceToEth(api, alice, flipper.options.address, 1000n);
+      await helper.eth.transferBalanceFromSubstrate(donor, flipper.options.address, 1000n); // transferBalanceToEth(api, alice, flipper.options.address, 1000n);
   
       // Set promotion to the Flipper
       await helper.executeExtrinsic(palletAdmin, 'api.tx.appPromotion.sponsorContract', [flipper.options.address], true);
@@ -533,10 +480,10 @@
   
   describe('stopSponsoringContract', () => {  
     itEth('should remove pallet address from contract sponsors', async ({helper}) => {
-      const caller = await helper.eth.createAccountWithBalance(alice, 1000n);
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const caller = await helper.eth.createAccountWithBalance(donor, 1000n);
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner);
-      await helper.eth.transferBalanceFromSubstrate(alice, flipper.options.address);
+      await helper.eth.transferBalanceFromSubstrate(donor, flipper.options.address);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
   
       await contractHelper.methods.setSponsoringMode(flipper.options.address, SponsoringMode.Generous).send({from: contractOwner});
@@ -557,12 +504,12 @@
   
       // caller payed for call
       expect(1000n * nominal > callerBalance).to.be.true;
-      expect(contractBalanceAfter).to.be.equal(1000n * nominal);
+      expect(contractBalanceAfter).to.be.equal(100n * nominal);
     });
   
     itEth('can not be called by non-admin', async ({helper}) => {
       const nonAdmin = accounts.pop()!;
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner);
   
       await helper.executeExtrinsic(palletAdmin, 'api.tx.appPromotion.sponsorContract', [flipper.options.address]);
@@ -572,7 +519,7 @@
   
     itEth('should not affect a contract which is not sponsored by pallete', async ({helper}) => {
       const nonAdmin = accounts.pop()!;
-      const contractOwner = (await helper.eth.createAccountWithBalance(alice, 1000n)).toLowerCase();
+      const contractOwner = (await helper.eth.createAccountWithBalance(donor, 1000n)).toLowerCase();
       const flipper = await helper.eth.deployFlipper(contractOwner);
       const contractHelper = helper.ethNativeContract.contractHelpers(contractOwner);
       await expect(contractHelper.methods.selfSponsoredEnable(flipper.options.address).send()).to.be.fulfilled;
@@ -613,7 +560,7 @@
       await helper.staking.stake(staker, 200n * nominal);
   
       // wait rewards are available:
-      const [_, stake2] = await helper.staking.getTotalStakedPerBlock({Substrate: staker.address});
+      const [_stake1, stake2] = await helper.staking.getTotalStakedPerBlock({Substrate: staker.address});
       await helper.wait.forRelayBlockNumber(rewardAvailableInBlock(stake2.block));
   
       const payoutToStaker = (await helper.admin.payoutStakers(palletAdmin, 100)).find((payout) => payout.staker === staker.address)?.payout;
@@ -678,7 +625,7 @@
   
     itSub.skip('can be paid 1000 rewards in a time', async ({helper}) => {
       // all other stakes should be unstaked
-      const oneHundredStakers = await helper.arrange.createCrowd(100, 1050n, alice);
+      const oneHundredStakers = await helper.arrange.createCrowd(100, 1050n, donor);
   
       // stakers stakes 10 times each
       for (let i = 0; i < 10; i++) {
@@ -689,7 +636,6 @@
     });
   
     itSub.skip('can handle 40.000 rewards', async ({helper}) => {
-      const [donor] = await helper.arrange.createAccounts([7_000_000n], alice);
       const crowdStakes = async () => {
         // each account in the crowd stakes 2 times
         const crowd = await helper.arrange.createCrowd(500, 300n, donor);
@@ -706,11 +652,6 @@
     });
   });
 });
-
-function calculatePalleteAddress(palletId: any) {
-  const address = stringToU8a(('modl' + palletId).padEnd(32, '\0'));
-  return encodeAddress(address);
-}
 
 function calculateIncome(base: bigint, calcPeriod: bigint, iter = 0): bigint {
   const DAY = 7200n;
modifiedtests/src/approve.test.tsdiffbeforeafterboth
--- a/tests/src/approve.test.ts
+++ b/tests/src/approve.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds';
+import {expect, itSub, Pallets, usingPlaygrounds} from './util';
 
 
 describe('Integration Test approve(spender, collection_id, item_id, amount):', () => {
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -104,7 +104,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -141,7 +141,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -184,7 +184,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -227,7 +227,7 @@
   });
 });
 
-describe('Approved amount decreases by the transferred amount.:', () => {
+describe('Approved amount decreases by the transferred amount:', () => {
   let alice: IKeyringPair;
   let bob: IKeyringPair;
   let charlie: IKeyringPair;
@@ -235,7 +235,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
     });
   });
@@ -265,7 +265,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -320,7 +320,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -357,7 +357,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
     });
   });
@@ -423,7 +423,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
     });
   });
@@ -474,7 +474,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -495,7 +495,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
modifiedtests/src/block-production.test.tsdiffbeforeafterboth
--- a/tests/src/block-production.test.ts
+++ b/tests/src/block-production.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {ApiPromise} from '@polkadot/api';
-import {expect, itSub} from './util/playgrounds';
+import {expect, itSub} from './util';
 
 const BLOCK_TIME_MS = 12000;
 const TOLERANCE_MS = 3000;
modifiedtests/src/burnItem.test.tsdiffbeforeafterboth
--- a/tests/src/burnItem.test.ts
+++ b/tests/src/burnItem.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds';
+import {expect, itSub, Pallets, usingPlaygrounds} from './util';
 
 
 describe('integration test: ext. burnItem():', () => {
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
@@ -80,7 +80,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
@@ -123,7 +123,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
modifiedtests/src/calibrate.tsdiffbeforeafterboth
--- a/tests/src/calibrate.ts
+++ b/tests/src/calibrate.ts
@@ -1,6 +1,6 @@
 import {IKeyringPair} from '@polkadot/types/types';
 
-import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util/playgrounds';
+import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util';
 
 
 function linearRegression(points: { x: bigint, y: bigint }[]) {
@@ -56,9 +56,9 @@
   }).reduce((a, b) => a + b, 0n) / BigInt(points.length));
 }
 
-async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => IKeyringPair) {
-  const alice = privateKey('//Alice');
-  const bob = privateKey('//Bob');
+async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => Promise<IKeyringPair>) {
+  const alice = await privateKey('//Alice');
+  const bob = await privateKey('//Bob');
   const dataPoints = [];
 
   {
@@ -106,8 +106,8 @@
   }
 }
 
-async function calibrateMinGasPrice(helper: EthUniqueHelper, privateKey: (account: string) => IKeyringPair) {
-  const alice = privateKey('//Alice');
+async function calibrateMinGasPrice(helper: EthUniqueHelper, privateKey: (account: string) => Promise<IKeyringPair>) {
+  const alice = await privateKey('//Alice');
   const caller = await helper.eth.createAccountWithBalance(alice);
   const receiver = helper.eth.createAccount();
   const dataPoints = [];
modifiedtests/src/change-collection-owner.test.tsdiffbeforeafterboth
--- a/tests/src/change-collection-owner.test.ts
+++ b/tests/src/change-collection-owner.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from './util/playgrounds';
+import {usingPlaygrounds, expect, itSub} from './util';
 
 describe('Integration Test changeCollectionOwner(collection_id, new_owner):', () => {
   let alice: IKeyringPair;
@@ -23,7 +23,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
@@ -46,7 +46,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -108,7 +108,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
modifiedtests/src/check-event/burnItemEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/burnItemEvent.test.ts
+++ b/tests/src/check-event/burnItemEvent.test.ts
@@ -16,7 +16,7 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from '../util/playgrounds';
+import {usingPlaygrounds, expect, itSub} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 
@@ -24,7 +24,7 @@
   let alice: IKeyringPair;
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/check-event/createCollectionEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/createCollectionEvent.test.ts
+++ b/tests/src/check-event/createCollectionEvent.test.ts
@@ -16,14 +16,14 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect} from '../util/playgrounds';
+import {usingPlaygrounds, itSub, expect} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 describe('Create collection event ', () => {
   let alice: IKeyringPair;
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/check-event/createItemEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/createItemEvent.test.ts
+++ b/tests/src/check-event/createItemEvent.test.ts
@@ -16,14 +16,14 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from '../util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 describe('Create Item event ', () => {
   let alice: IKeyringPair;
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/check-event/createMultipleItemsEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/createMultipleItemsEvent.test.ts
+++ b/tests/src/check-event/createMultipleItemsEvent.test.ts
@@ -16,14 +16,14 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect} from '../util/playgrounds';
+import {usingPlaygrounds, itSub, expect} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 describe('Create Multiple Items Event event ', () => {
   let alice: IKeyringPair;
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/check-event/destroyCollectionEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/destroyCollectionEvent.test.ts
+++ b/tests/src/check-event/destroyCollectionEvent.test.ts
@@ -16,14 +16,14 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from '../util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 describe('Destroy collection event ', () => {
   let alice: IKeyringPair;
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/check-event/transferEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/transferEvent.test.ts
+++ b/tests/src/check-event/transferEvent.test.ts
@@ -16,7 +16,7 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from '../util/playgrounds';
+import {usingPlaygrounds, expect, itSub} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 describe('Transfer event ', () => {
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor);
     });
   });
modifiedtests/src/check-event/transferFromEvent.test.tsdiffbeforeafterboth
--- a/tests/src/check-event/transferFromEvent.test.ts
+++ b/tests/src/check-event/transferFromEvent.test.ts
@@ -16,7 +16,7 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from '../util/playgrounds';
+import {usingPlaygrounds, expect, itSub} from '../util';
 import {IEvent} from '../util/playgrounds/types';
 
 describe('Transfer event ', () => {
@@ -24,7 +24,7 @@
   let bob: IKeyringPair;
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor);
     });
   });
modifiedtests/src/confirmSponsorship.test.tsdiffbeforeafterboth
--- a/tests/src/confirmSponsorship.test.ts
+++ b/tests/src/confirmSponsorship.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds';
+import {usingPlaygrounds, expect, itSub, Pallets} from './util';
 
 async function setSponsorHelper(collection: any, signer: IKeyringPair, sponsorAddress: string) {
   await collection.setSponsor(signer, sponsorAddress);
@@ -37,7 +37,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie, zeroBalance] = await helper.arrange.createAccounts([100n, 100n, 100n, 0n], donor);
     });
   });
@@ -73,7 +73,7 @@
   });
 
   itSub('Fungible: Transfer fees are paid by the sponsor after confirmation', async ({helper}) => {
-    const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+    const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
     await collection.setSponsor(alice, bob.address);
     await collection.confirmSponsorship(bob);
     const bobBalanceBefore = await helper.balance.getSubstrate(bob.address);
@@ -109,7 +109,9 @@
   });
 
   itSub('NFT: Sponsoring of transfers is rate limited', async ({helper}) => {
-    const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+    const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: {
+      sponsorTransferTimeout: 1000,
+    }});
     await collection.setSponsor(alice, bob.address);
     await collection.confirmSponsorship(bob);
 
@@ -125,7 +127,9 @@
   });
 
   itSub('Fungible: Sponsoring is rate limited', async ({helper}) => {
-    const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+    const collection = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: {
+      sponsorTransferTimeout: 1000,
+    }});
     await collection.setSponsor(alice, bob.address);
     await collection.confirmSponsorship(bob);
 
@@ -141,7 +145,9 @@
   });
 
   itSub.ifWithPallets('ReFungible: Sponsoring is rate limited', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+    const collection = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: {
+      sponsorTransferTimeout: 1000,
+    }});
     await collection.setSponsor(alice, bob.address);
     await collection.confirmSponsorship(bob);
 
@@ -157,7 +163,10 @@
   });
 
   itSub('NFT: Sponsoring of createItem is rate limited', async ({helper}) => {
-    const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+    const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL', limits: {
+      sponsoredDataRateLimit: {blocks: 1000},
+      sponsorTransferTimeout: 1000,
+    }});
     await collection.setSponsor(alice, bob.address);
     await collection.confirmSponsorship(bob);
     await collection.setPermissions(alice, {mintMode: true, access: 'AllowList'});
@@ -183,13 +192,13 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie, ownerZeroBalance, senderZeroBalance] = await helper.arrange.createAccounts([100n, 100n, 100n, 0n, 0n], donor);
     });
   });
 
   itSub('(!negative test!) Confirm sponsorship for a collection that never existed', async ({helper}) => {
-    const collectionId = 1_000_000;
+    const collectionId = (1 << 32) - 1;
     const confirmSponsorshipTx = async () => helper.collection.confirmSponsorship(bob, collectionId);
     await expect(confirmSponsorshipTx()).to.be.rejectedWith(/common\.CollectionNotFound/);
   });
modifiedtests/src/connection.test.tsdiffbeforeafterboth
--- a/tests/src/connection.test.ts
+++ b/tests/src/connection.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {itSub, expect, usingPlaygrounds} from './util/playgrounds';
+import {itSub, expect, usingPlaygrounds} from './util';
 
 describe('Connection smoke test', () => {
   itSub('Connection can be established', async ({helper}) => {
modifiedtests/src/createCollection.test.tsdiffbeforeafterboth
--- a/tests/src/createCollection.test.ts
+++ b/tests/src/createCollection.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds';
+import {usingPlaygrounds, expect, itSub, Pallets} from './util';
 import {ICollectionCreationOptions, IProperty} from './util/playgrounds/types';
 import {UniqueHelper} from './util/playgrounds/unique';
 
@@ -49,7 +49,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([100n], donor);
     });
   });
@@ -110,7 +110,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([100n], donor);
     });
   });
modifiedtests/src/createItem.test.tsdiffbeforeafterboth
--- a/tests/src/createItem.test.ts
+++ b/tests/src/createItem.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds';
+import {usingPlaygrounds, expect, itSub, Pallets} from './util';
 import {IProperty, ICrossAccountId} from './util/playgrounds/types';
 import {UniqueHelper} from './util/playgrounds/unique';
 
@@ -50,7 +50,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
@@ -179,7 +179,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
modifiedtests/src/createMultipleItems.test.tsdiffbeforeafterboth
--- a/tests/src/createMultipleItems.test.ts
+++ b/tests/src/createMultipleItems.test.ts
@@ -15,14 +15,14 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, Pallets, itSub} from './util/playgrounds';
+import {usingPlaygrounds, expect, Pallets, itSub} from './util';
 
 describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {
   let alice: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([100n], donor);
     });
   });
@@ -168,7 +168,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
modifiedtests/src/createMultipleItemsEx.test.tsdiffbeforeafterboth
--- a/tests/src/createMultipleItemsEx.test.ts
+++ b/tests/src/createMultipleItemsEx.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, Pallets, itSub} from './util/playgrounds';
+import {usingPlaygrounds, expect, Pallets, itSub} from './util';
 import {IProperty} from './util/playgrounds/types';
 
 describe('Integration Test: createMultipleItemsEx', () => {
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
@@ -264,7 +264,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
     });
   });
addedtests/src/creditFeesToTreasury.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/creditFeesToTreasury.seqtest.ts
@@ -0,0 +1,165 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import './interfaces/augment-api-consts';
+import {IKeyringPair} from '@polkadot/types/types';
+import {ApiPromise} from '@polkadot/api';
+import {usingPlaygrounds, expect, itSub} from './util';
+
+const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z';
+const saneMinimumFee = 0.05;
+const saneMaximumFee = 0.5;
+const createCollectionDeposit = 100;
+
+// Skip the inflation block pauses if the block is close to inflation block
+// until the inflation happens
+/*eslint no-async-promise-executor: "off"*/
+function skipInflationBlock(api: ApiPromise): Promise<void> {
+  const promise = new Promise<void>(async (resolve) => {
+    const blockInterval = api.consts.inflation.inflationBlockInterval.toNumber();
+    const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => {
+      const currentBlock = head.number.toNumber();
+      if (currentBlock % blockInterval < blockInterval - 10) {
+        unsubscribe();
+        resolve();
+      } else {
+        console.log(`Skipping inflation block, current block: ${currentBlock}`);
+      }
+    });
+  });
+
+  return promise;
+}
+
+describe('integration test: Fees must be credited to Treasury:', () => {
+  let alice: IKeyringPair;
+  let bob: IKeyringPair;
+
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
+    });
+  });
+
+  itSub('Total issuance does not change', async ({helper}) => {
+    const api = helper.getApi();
+    await skipInflationBlock(api);
+    await helper.wait.newBlocks(1);
+
+    const totalBefore = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt();
+
+    await helper.balance.transferToSubstrate(alice, bob.address, 1n);
+
+    const totalAfter = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt();
+
+    expect(totalAfter).to.be.equal(totalBefore);
+  });
+
+  itSub('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async ({helper}) => {
+    await skipInflationBlock(helper.getApi());
+    await helper.wait.newBlocks(1);
+
+    const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY);
+    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
+
+    const amount = 1n;
+    await helper.balance.transferToSubstrate(alice, bob.address, amount);
+
+    const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY);
+    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
+
+    const fee = aliceBalanceBefore - aliceBalanceAfter - amount;
+    const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore;
+
+    expect(treasuryIncrease).to.be.equal(fee);
+  });
+
+  itSub('Treasury balance increased by failed tx fee', async ({helper}) => {
+    const api = helper.getApi();
+    await helper.wait.newBlocks(1);
+
+    const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY);
+    const bobBalanceBefore = await helper.balance.getSubstrate(bob.address);
+
+    await expect(helper.signTransaction(bob, api.tx.balances.setBalance(alice.address, 0, 0))).to.be.rejected;
+
+    const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY);
+    const bobBalanceAfter = await helper.balance.getSubstrate(bob.address);
+
+    const fee = bobBalanceBefore - bobBalanceAfter;
+    const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore;
+
+    expect(treasuryIncrease).to.be.equal(fee);
+  });
+
+  itSub('NFT Transactions also send fees to Treasury', async ({helper}) => {
+    await skipInflationBlock(helper.getApi());
+    await helper.wait.newBlocks(1);
+
+    const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY);
+    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
+
+    await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});
+
+    const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY);
+    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
+    const fee = aliceBalanceBefore - aliceBalanceAfter;
+    const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore;
+
+    expect(treasuryIncrease).to.be.equal(fee);
+  });
+
+  itSub('Fees are sane', async ({helper}) => {
+    const unique = helper.balance.getOneTokenNominal();
+    await skipInflationBlock(helper.getApi());
+    await helper.wait.newBlocks(1);
+
+    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
+
+    await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});
+
+    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
+    const fee = aliceBalanceBefore - aliceBalanceAfter;
+
+    expect(fee / unique < BigInt(Math.ceil(saneMaximumFee + createCollectionDeposit))).to.be.true;
+    expect(fee / unique < BigInt(Math.ceil(saneMinimumFee  + createCollectionDeposit))).to.be.true;
+  });
+
+  itSub('NFT Transfer fee is close to 0.1 Unique', async ({helper}) => {
+    await skipInflationBlock(helper.getApi());
+    await helper.wait.newBlocks(1);
+
+    const collection = await helper.nft.mintCollection(alice, {
+      name: 'test',
+      description: 'test',
+      tokenPrefix: 'test',
+    });
+    // const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');
+    const token = await collection.mintToken(alice, {Substrate: alice.address});
+
+    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
+    await token.transfer(alice, {Substrate: bob.address});
+    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
+
+    const fee = Number(aliceBalanceBefore - aliceBalanceAfter) / Number(helper.balance.getOneTokenNominal());
+    const expectedTransferFee = 0.1;
+    // fee drifts because of NextFeeMultiplier
+    const tolerance = 0.001;
+
+    expect(Math.abs(fee - expectedTransferFee)).to.be.lessThan(tolerance);
+  });
+});
deletedtests/src/creditFeesToTreasury.test.tsdiffbeforeafterboth
--- a/tests/src/creditFeesToTreasury.test.ts
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
-// This file is part of Unique Network.
-
-// Unique Network is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Unique Network is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
-
-import './interfaces/augment-api-consts';
-import {IKeyringPair} from '@polkadot/types/types';
-import {ApiPromise} from '@polkadot/api';
-import {usingPlaygrounds, expect, itSub} from './util/playgrounds';
-
-const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z';
-const saneMinimumFee = 0.05;
-const saneMaximumFee = 0.5;
-const createCollectionDeposit = 100;
-
-// Skip the inflation block pauses if the block is close to inflation block
-// until the inflation happens
-/*eslint no-async-promise-executor: "off"*/
-function skipInflationBlock(api: ApiPromise): Promise<void> {
-  const promise = new Promise<void>(async (resolve) => {
-    const blockInterval = api.consts.inflation.inflationBlockInterval.toNumber();
-    const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => {
-      const currentBlock = head.number.toNumber();
-      if (currentBlock % blockInterval < blockInterval - 10) {
-        unsubscribe();
-        resolve();
-      } else {
-        console.log(`Skipping inflation block, current block: ${currentBlock}`);
-      }
-    });
-  });
-
-  return promise;
-}
-
-describe('integration test: Fees must be credited to Treasury:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
-    });
-  });
-
-  itSub('Total issuance does not change', async ({helper}) => {
-    const api = helper.getApi();
-    await skipInflationBlock(api);
-    await helper.wait.newBlocks(1);
-
-    const totalBefore = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt();
-
-    await helper.balance.transferToSubstrate(alice, bob.address, 1n);
-
-    const totalAfter = (await helper.callRpc('api.query.balances.totalIssuance', [])).toBigInt();
-
-    expect(totalAfter).to.be.equal(totalBefore);
-  });
-
-  itSub('Sender balance decreased by fee+sent amount, Treasury balance increased by fee', async ({helper}) => {
-    await skipInflationBlock(helper.getApi());
-    await helper.wait.newBlocks(1);
-
-    const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY);
-    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
-
-    const amount = 1n;
-    await helper.balance.transferToSubstrate(alice, bob.address, amount);
-
-    const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY);
-    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
-
-    const fee = aliceBalanceBefore - aliceBalanceAfter - amount;
-    const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore;
-
-    expect(treasuryIncrease).to.be.equal(fee);
-  });
-
-  itSub('Treasury balance increased by failed tx fee', async ({helper}) => {
-    const api = helper.getApi();
-    await helper.wait.newBlocks(1);
-
-    const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY);
-    const bobBalanceBefore = await helper.balance.getSubstrate(bob.address);
-
-    await expect(helper.signTransaction(bob, api.tx.balances.setBalance(alice.address, 0, 0))).to.be.rejected;
-
-    const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY);
-    const bobBalanceAfter = await helper.balance.getSubstrate(bob.address);
-
-    const fee = bobBalanceBefore - bobBalanceAfter;
-    const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore;
-
-    expect(treasuryIncrease).to.be.equal(fee);
-  });
-
-  itSub('NFT Transactions also send fees to Treasury', async ({helper}) => {
-    await skipInflationBlock(helper.getApi());
-    await helper.wait.newBlocks(1);
-
-    const treasuryBalanceBefore = await helper.balance.getSubstrate(TREASURY);
-    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
-
-    await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});
-
-    const treasuryBalanceAfter = await helper.balance.getSubstrate(TREASURY);
-    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
-    const fee = aliceBalanceBefore - aliceBalanceAfter;
-    const treasuryIncrease = treasuryBalanceAfter - treasuryBalanceBefore;
-
-    expect(treasuryIncrease).to.be.equal(fee);
-  });
-
-  itSub('Fees are sane', async ({helper}) => {
-    const unique = helper.balance.getOneTokenNominal();
-    await skipInflationBlock(helper.getApi());
-    await helper.wait.newBlocks(1);
-
-    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
-
-    await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});
-
-    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
-    const fee = aliceBalanceBefore - aliceBalanceAfter;
-
-    expect(fee / unique < BigInt(Math.ceil(saneMaximumFee + createCollectionDeposit))).to.be.true;
-    expect(fee / unique < BigInt(Math.ceil(saneMinimumFee  + createCollectionDeposit))).to.be.true;
-  });
-
-  itSub('NFT Transfer fee is close to 0.1 Unique', async ({helper}) => {
-    await skipInflationBlock(helper.getApi());
-    await helper.wait.newBlocks(1);
-
-    const collection = await helper.nft.mintCollection(alice, {
-      name: 'test',
-      description: 'test',
-      tokenPrefix: 'test',
-    });
-    // const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');
-    const token = await collection.mintToken(alice, {Substrate: alice.address});
-
-    const aliceBalanceBefore = await helper.balance.getSubstrate(alice.address);
-    await token.transfer(alice, {Substrate: bob.address});
-    const aliceBalanceAfter = await helper.balance.getSubstrate(alice.address);
-
-    const fee = Number(aliceBalanceBefore - aliceBalanceAfter) / Number(helper.balance.getOneTokenNominal());
-    const expectedTransferFee = 0.1;
-    // fee drifts because of NextFeeMultiplier
-    const tolerance = 0.001;
-
-    expect(Math.abs(fee - expectedTransferFee)).to.be.lessThan(tolerance);
-  });
-});
modifiedtests/src/destroyCollection.test.tsdiffbeforeafterboth
--- a/tests/src/destroyCollection.test.ts
+++ b/tests/src/destroyCollection.test.ts
@@ -15,14 +15,14 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, expect, usingPlaygrounds, Pallets} from './util/playgrounds';
+import {itSub, expect, usingPlaygrounds, Pallets} from './util';
 
 describe('integration test: ext. destroyCollection():', () => {
   let alice: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([100n], donor);
     });
   });
@@ -62,7 +62,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
modifiedtests/src/enableDisableTransfer.test.tsdiffbeforeafterboth
--- a/tests/src/enableDisableTransfer.test.ts
+++ b/tests/src/enableDisableTransfer.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 describe('Enable/Disable Transfers', () => {
   let alice: IKeyringPair;
@@ -23,7 +23,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
@@ -62,7 +62,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
modifiedtests/src/eth/allowlist.test.tsdiffbeforeafterboth
--- a/tests/src/eth/allowlist.test.ts
+++ b/tests/src/eth/allowlist.test.ts
@@ -15,14 +15,14 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds';
+import {itEth, usingEthPlaygrounds, expect} from './util';
 
 describe('EVM contract allowlist', () => {
   let donor: IKeyringPair;
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -70,7 +70,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/base.test.tsdiffbeforeafterboth
--- a/tests/src/eth/base.test.ts
+++ b/tests/src/eth/base.test.ts
@@ -17,7 +17,7 @@
 import {Contract} from 'web3-eth-contract';
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util/playgrounds';
+import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util';
 
 
 describe('Contract calls', () => {
@@ -25,7 +25,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -78,7 +78,7 @@
 
   before(async () => {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       const [alice] = await helper.arrange.createAccounts([10n], donor);
       ({collectionId: collection} = await helper.nft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'}));
       minter = helper.eth.createAccount();
modifiedtests/src/eth/collectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionAdmin.test.ts
+++ b/tests/src/eth/collectionAdmin.test.ts
@@ -14,7 +14,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds';
+import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util';
 
 async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise<any>) {
   const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));
@@ -32,7 +32,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -144,7 +144,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -272,7 +272,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -314,7 +314,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/collectionProperties.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionProperties.test.ts
+++ b/tests/src/eth/collectionProperties.test.ts
@@ -1,4 +1,20 @@
-import {itEth, usingEthPlaygrounds, expect} from './util/playgrounds';
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {itEth, usingEthPlaygrounds, expect} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 
 describe('EVM collection properties', () => {
@@ -7,7 +23,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await _helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/eth/collectionSponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionSponsoring.test.ts
+++ b/tests/src/eth/collectionSponsoring.test.ts
@@ -1,6 +1,22 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds} from './../util/playgrounds/index';
-import {itEth, expect} from '../eth/util/playgrounds';
+import {usingPlaygrounds} from '../util/index';
+import {itEth, expect} from './util';
 
 describe('evm collection sponsoring', () => {
   let donor: IKeyringPair;
@@ -9,17 +25,12 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
+      [alice] = await helper.arrange.createAccounts([100n], donor);
       nominal = helper.balance.getOneTokenNominal();
     });
   });
-
-  beforeEach(async () => {
-    await usingPlaygrounds(async (helper) => {
-      [alice] = await helper.arrange.createAccounts([1000n], donor);
-    });
-  });
-
+  
   itEth('sponsors mint transactions', async ({helper}) => {
     const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'spnr', permissions: {mintMode: true}});
     await collection.setSponsor(alice, alice.address);
modifiedtests/src/eth/contractSponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/eth/contractSponsoring.test.ts
+++ b/tests/src/eth/contractSponsoring.test.ts
@@ -16,8 +16,8 @@
 
 import {IKeyringPair} from '@polkadot/types/types';
 import {EthUniqueHelper} from './util/playgrounds/unique.dev';
-import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from '../eth/util/playgrounds';
-import {usingPlaygrounds} from '../util/playgrounds';
+import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from './util';
+import {usingPlaygrounds} from '../util';
 import {CompiledContract} from './util/playgrounds/types';
 
 describe('Sponsoring EVM contracts', () => {
@@ -25,11 +25,11 @@
 
   before(async () => {
     await usingPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
-  itEth('Self sponsored can be set by the address that deployed the contract', async ({helper, privateKey}) => {
+  itEth('Self sponsored can be set by the address that deployed the contract', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const flipper = await helper.eth.deployFlipper(owner);
     const helpers = helper.ethNativeContract.contractHelpers(owner);
@@ -378,7 +378,7 @@
     // Balance should be taken from flipper instead of caller
     // FIXME the comment is wrong! What check should be here?
     const balanceAfter = await helper.balance.getEthereum(flipper.options.address);
-    expect(balanceAfter).to.be.equals(originalFlipperBalance);
+    expect(balanceAfter).to.be.equal(originalFlipperBalance);
   });
 
   itEth('Sponsoring is set, an address that has UNQ can send a transaction and it works. User balance should not change', async ({helper}) => {
@@ -406,7 +406,7 @@
     const sponsorBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(sponsor));
     const callerBalanceAfter = await helper.balance.getSubstrate(await helper.address.ethToSubstrate(caller));
     expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true;
-    expect(callerBalanceAfter).to.be.equals(callerBalanceBefore);
+    expect(callerBalanceAfter).to.be.equal(callerBalanceBefore);
   });
 
   itEth('Sponsoring is limited, with setContractRateLimit. The limitation is working if transactions are sent more often, the sender pays the commission.', async ({helper}) => {
@@ -431,23 +431,24 @@
 
     await flipper.methods.flip().send({from: caller});
     expect(await flipper.methods.getValue().call()).to.be.true;
-    expect(await helper.balance.getEthereum(caller)).to.be.equals(originalCallerBalance);
+    expect(await helper.balance.getEthereum(caller)).to.be.equal(originalCallerBalance);
 
     const newFlipperBalance = await helper.balance.getEthereum(sponsor);
-    expect(newFlipperBalance).to.be.not.equals(originalFlipperBalance);
+    expect(newFlipperBalance).to.be.not.equal(originalFlipperBalance);
 
     await flipper.methods.flip().send({from: caller});
+    // todo:playgrounds fails rarely (expected 99893341659775672580n to equal 99912598679356033129n) (again, 99893341659775672580n)
     expect(await helper.balance.getEthereum(sponsor)).to.be.equal(newFlipperBalance);
-    expect(await helper.balance.getEthereum(caller)).to.be.not.equals(originalCallerBalance);
+    expect(await helper.balance.getEthereum(caller)).to.be.not.equal(originalCallerBalance);
   });
 
   // TODO: Find a way to calculate default rate limit
-  itEth('Default rate limit equals 7200', async ({helper}) => {
+  itEth('Default rate limit equal 7200', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const helpers = helper.ethNativeContract.contractHelpers(owner);
     const flipper = await helper.eth.deployFlipper(owner);
 
-    expect(await helpers.methods.sponsoringRateLimit(flipper.options.address).call()).to.be.equals('7200');
+    expect(await helpers.methods.sponsoringRateLimit(flipper.options.address).call()).to.be.equal('7200');
   });
 });
 
@@ -490,24 +491,18 @@
   }
 
   before(async () => {
-    await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+    await usingEthPlaygrounds(async (helper, privateKey) => {
+      donor = await privateKey({filename: __filename});
+      [alice] = await helper.arrange.createAccounts([100n], donor);
     });
   });
-
-  beforeEach(async () => {
-    await usingPlaygrounds(async (helper) => {
-      [alice] = await helper.arrange.createAccounts([1000n], donor);
-    });
-  });  
 
-
   itEth('Default fee limit', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const helpers = helper.ethNativeContract.contractHelpers(owner);
     const flipper = await helper.eth.deployFlipper(owner);
 
-    expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equals('115792089237316195423570985008687907853269984665640564039457584007913129639935');
+    expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equal('115792089237316195423570985008687907853269984665640564039457584007913129639935');
   });
 
   itEth('Set fee limit', async ({helper}) => {
@@ -516,7 +511,7 @@
     const flipper = await helper.eth.deployFlipper(owner);
 
     await helpers.methods.setSponsoringFeeLimit(flipper.options.address, 100).send();
-    expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equals('100');
+    expect(await helpers.methods.sponsoringFeeLimit(flipper.options.address).call()).to.be.equal('100');
   });
 
   itEth('Negative test - set fee limit by non-owner', async ({helper}) => {
@@ -554,7 +549,7 @@
     expect(await helper.balance.getEthereum(user)).to.not.be.equal(originalUserBalance);
   });
 
-  itEth('Negative test - check that evm.call transactions exceeding fee limit are not executed', async ({helper, privateKey}) => {
+  itEth('Negative test - check that evm.call transactions exceeding fee limit are not executed', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
     const sponsor = await helper.eth.createAccountWithBalance(donor);
     const helpers = helper.ethNativeContract.contractHelpers(owner);
modifiedtests/src/eth/createNFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createNFTCollection.test.ts
+++ b/tests/src/eth/createNFTCollection.test.ts
@@ -16,7 +16,7 @@
 
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {expect, itEth, usingEthPlaygrounds} from './util';
 
 
 describe('Create NFT collection from EVM', () => {
@@ -24,7 +24,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -35,24 +35,17 @@
     const description = 'Some description';
     const prefix = 'token prefix';
 
-    // todo:playgrounds this might fail when in async environment.
-    const collectionCountBefore = +(await helper.callRpc('api.rpc.unique.collectionStats')).created;
     const {collectionId} = await helper.eth.createNonfungibleCollection(owner, name, description, prefix);
-    const collectionCountAfter = +(await helper.callRpc('api.rpc.unique.collectionStats')).created;
-
-    const collection = helper.nft.getCollectionObject(collectionId);
-    const data = (await collection.getData())!;
+    const data = (await helper.rft.getData(collectionId))!;
     
-    expect(collectionCountAfter - collectionCountBefore).to.be.eq(1);
-    expect(collectionId).to.be.eq(collectionCountAfter);
     expect(data.name).to.be.eq(name);
     expect(data.description).to.be.eq(description);
     expect(data.raw.tokenPrefix).to.be.eq(prefix);
     expect(data.raw.mode).to.be.eq('NFT');
   });
 
-  // todo:playgrounds this test will fail when in async environment.
-  itEth('Check collection address exist', async ({helper}) => {
+  // this test will occasionally fail when in async environment.
+  itEth.skip('Check collection address exist', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
 
     const expectedCollectionId = +(await helper.callRpc('api.rpc.unique.collectionStats')).created + 1;
@@ -151,7 +144,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       nominal = helper.balance.getOneTokenNominal();
     });
   });
modifiedtests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createRFTCollection.test.ts
+++ b/tests/src/eth/createRFTCollection.test.ts
@@ -16,8 +16,8 @@
 
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
-import {Pallets, requirePalletsOrSkip} from '../util/playgrounds';
-import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {Pallets, requirePalletsOrSkip} from '../util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
 
 
 describe('Create RFT collection from EVM', () => {
@@ -26,7 +26,7 @@
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -37,23 +37,17 @@
     const description = 'Some description';
     const prefix = 'token prefix';
   
-    // todo:playgrounds this might fail when in async environment.
-    const collectionCountBefore = +(await helper.callRpc('api.rpc.unique.collectionStats')).created;
     const {collectionId} = await helper.eth.createRefungibleCollection(owner, name, description, prefix);
-    const collectionCountAfter = +(await helper.callRpc('api.rpc.unique.collectionStats')).created;
-  
     const data = (await helper.rft.getData(collectionId))!;
 
-    expect(collectionCountAfter - collectionCountBefore).to.be.eq(1);
-    expect(collectionId).to.be.eq(collectionCountAfter);
     expect(data.name).to.be.eq(name);
     expect(data.description).to.be.eq(description);
     expect(data.raw.tokenPrefix).to.be.eq(prefix);
     expect(data.raw.mode).to.be.eq('ReFungible');
   });
-
-  // todo:playgrounds this test will fail when in async environment.
-  itEth('Check collection address exist', async ({helper}) => {
+  
+  // this test will occasionally fail when in async environment.
+  itEth.skip('Check collection address exist', async ({helper}) => {
     const owner = await helper.eth.createAccountWithBalance(donor);
 
     const expectedCollectionId = +(await helper.callRpc('api.rpc.unique.collectionStats')).created + 1;
@@ -153,7 +147,7 @@
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       nominal = helper.balance.getOneTokenNominal();
     });
   });
modifiedtests/src/eth/crossTransfer.test.tsdiffbeforeafterboth
--- a/tests/src/eth/crossTransfer.test.ts
+++ b/tests/src/eth/crossTransfer.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {itEth, usingEthPlaygrounds} from './util';
 import {CrossAccountId} from '../util/playgrounds/unique';
 import {IKeyringPair} from '@polkadot/types/types';
 
@@ -26,7 +26,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
     });
   });
@@ -69,7 +69,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
     });
   });
modifiedtests/src/eth/evmCoder.test.tsdiffbeforeafterboth
--- a/tests/src/eth/evmCoder.test.ts
+++ b/tests/src/eth/evmCoder.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itEth, expect, usingEthPlaygrounds} from './util/playgrounds';
+import {itEth, expect, usingEthPlaygrounds} from './util';
 
 const getContractSource = (collectionAddress: string, contractAddress: string): string => {
   return `
@@ -59,7 +59,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
   
modifiedtests/src/eth/fractionalizer/fractionalizer.test.tsdiffbeforeafterboth
--- a/tests/src/eth/fractionalizer/fractionalizer.test.ts
+++ b/tests/src/eth/fractionalizer/fractionalizer.test.ts
@@ -22,9 +22,9 @@
 
 import {Contract} from 'web3-eth-contract';
 
-import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util/playgrounds';
+import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util';
 import {CompiledContract} from '../util/playgrounds/types';
-import {requirePalletsOrSkip, Pallets} from '../../util/playgrounds';
+import {requirePalletsOrSkip, Pallets} from '../../util';
 
 
 let compiledFractionalizer: CompiledContract;
@@ -85,7 +85,7 @@
   before(async function() {
     await usingEthPlaygrounds(async (helper: EthUniqueHelper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -225,7 +225,7 @@
   before(async function() {
     await usingEthPlaygrounds(async (helper: EthUniqueHelper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/fungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/fungible.test.ts
+++ b/tests/src/eth/fungible.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {expect, itEth, usingEthPlaygrounds} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 
 describe('Fungible: Information getting', () => {
@@ -23,7 +23,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
@@ -55,7 +55,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
@@ -224,7 +224,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
@@ -277,7 +277,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
@@ -294,9 +294,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+    
     await collection.approveTokens(alice, {Ethereum: receiver}, 100n);
-
+    if (events.length == 0) await helper.wait.newBlocks(1);
     const event = events[0];
+
     expect(event.event).to.be.equal('Approval');
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.owner).to.be.equal(helper.address.substrateToEth(alice.address));
@@ -318,9 +320,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+
     await collection.transferFrom(bob, {Substrate: alice.address}, {Ethereum: receiver}, 51n);
-
+    if (events.length == 0) await helper.wait.newBlocks(1);
     let event = events[0];
+
     expect(event.event).to.be.equal('Transfer');
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address));
@@ -347,9 +351,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+    
     await collection.transfer(alice, {Ethereum:receiver}, 51n);
-
+    if (events.length == 0) await helper.wait.newBlocks(1);
     const event = events[0];
+
     expect(event.event).to.be.equal('Transfer');
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address));
modifiedtests/src/eth/helpersSmoke.test.tsdiffbeforeafterboth
--- a/tests/src/eth/helpersSmoke.test.ts
+++ b/tests/src/eth/helpersSmoke.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {expect, itEth, usingEthPlaygrounds} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 
 describe('Helpers sanity check', () => {
@@ -22,7 +22,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
   
modifiedtests/src/eth/marketplace/marketplace.test.tsdiffbeforeafterboth
--- a/tests/src/eth/marketplace/marketplace.test.ts
+++ b/tests/src/eth/marketplace/marketplace.test.ts
@@ -14,10 +14,9 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {usingPlaygrounds} from './../../util/playgrounds/index';
 import {IKeyringPair} from '@polkadot/types/types';
 import {readFile} from 'fs/promises';
-import {itEth, expect, SponsoringMode} from '../util/playgrounds';
+import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from '../util';
 
 describe('Matcher contract usage', () => {
   const PRICE = 2000n;
@@ -29,17 +28,17 @@
   let sellerMirror: string;
 
   before(async () => {
-    await usingPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+    await usingEthPlaygrounds(async (_helper, privateKey) => {
+      donor = await privateKey({filename: __filename});
     }); 
   });
 
   beforeEach(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      [alice] = await helper.arrange.createAccounts([10000n], donor);
+    await usingEthPlaygrounds(async (helper, privateKey) => {
+      [alice] = await helper.arrange.createAccounts([1000n], donor);
       aliceMirror = helper.address.substrateToEth(alice.address).toLowerCase();
       aliceDoubleMirror = helper.address.ethToSubstrate(aliceMirror);
-      seller = privateKey(`//Seller/${Date.now()}`);
+      seller = await privateKey(`//Seller/${Date.now()}`);
       sellerMirror = helper.address.substrateToEth(seller.address).toLowerCase();
 
       await helper.balance.transferToSubstrate(donor, aliceDoubleMirror, 10_000_000_000_000_000_000n);
modifiedtests/src/eth/migration.test.tsdiffbeforeafterboth
--- a/tests/src/eth/migration.test.ts
+++ b/tests/src/eth/migration.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {expect, itEth, usingEthPlaygrounds} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 
 describe('EVM Migrations', () => {
@@ -22,7 +22,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      superuser = privateKey('//Alice');
+      superuser = await privateKey('//Alice');
     });
   });
   
modifiedtests/src/eth/nesting/nest.test.tsdiffbeforeafterboth
--- a/tests/src/eth/nesting/nest.test.ts
+++ b/tests/src/eth/nesting/nest.test.ts
@@ -1,7 +1,7 @@
 import {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
 
-import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util/playgrounds';
+import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util';
 
 const createNestingCollection = async (
   helper: EthUniqueHelper,
@@ -21,7 +21,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/nonFungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/nonFungible.test.ts
+++ b/tests/src/eth/nonFungible.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util/playgrounds';
+import {itEth, usingEthPlaygrounds, expect, EthUniqueHelper} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
 
@@ -25,7 +25,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -75,7 +75,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -137,7 +137,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -318,7 +318,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -371,7 +371,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
@@ -385,9 +385,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+
     const {tokenId} = await collection.mintToken(alice);
+    if (events.length == 0) await helper.wait.newBlocks(1);
+    const event = events[0];
 
-    const event = events[0];
     expect(event.event).to.be.equal('Transfer');
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal('0x0000000000000000000000000000000000000000');
@@ -408,8 +410,9 @@
     });
 
     await token.burn(alice);
+    if (events.length == 0) await helper.wait.newBlocks(1);
+    const event = events[0];
 
-    const event = events[0];
     expect(event.event).to.be.equal('Transfer');
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address));
@@ -432,8 +435,9 @@
     });
 
     await token.approve(alice, {Ethereum: receiver});
+    if (events.length == 0) await helper.wait.newBlocks(1);
+    const event = events[0];
 
-    const event = events[0];
     expect(event.event).to.be.equal('Approval');
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.owner).to.be.equal(helper.address.substrateToEth(alice.address));
@@ -458,8 +462,9 @@
     });
 
     await token.transferFrom(bob, {Substrate: alice.address}, {Ethereum: receiver});
-    
+    if (events.length == 0) await helper.wait.newBlocks(1);
     const event = events[0];
+
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address));
     expect(event.returnValues.to).to.be.equal(receiver);
@@ -481,8 +486,9 @@
     });
 
     await token.transfer(alice, {Ethereum: receiver});
-    
+    if (events.length == 0) await helper.wait.newBlocks(1);
     const event = events[0];
+
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address));
     expect(event.returnValues.to).to.be.equal(receiver);
@@ -496,7 +502,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
modifiedtests/src/eth/payable.test.tsdiffbeforeafterboth
--- a/tests/src/eth/payable.test.ts
+++ b/tests/src/eth/payable.test.ts
@@ -16,14 +16,14 @@
 
 import {IKeyringPair} from '@polkadot/types/types';
 
-import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util/playgrounds';
+import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util';
 
 describe('EVM payable contracts', () => {
   let donor: IKeyringPair;
 
   before(async function() {
     await usingEthPlaygrounds(async (_, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -68,7 +68,7 @@
     expect(await contract.methods.getUnaccounted().call()).to.be.equal(weiCount.toString());
   });
 
-  itEth('Balance can be retrieved from evm contract', async({helper, privateKey}) => {
+  itEth('Balance can be retrieved from evm contract', async({helper}) => {
     const FEE_BALANCE = 10n * helper.balance.getOneTokenNominal();
     const CONTRACT_BALANCE = 1n * helper.balance.getOneTokenNominal();
 
@@ -80,7 +80,7 @@
 
     await web3.eth.sendTransaction({from: deployer, to: contract.options.address, value: CONTRACT_BALANCE.toString(), gas: helper.eth.DEFAULT_GAS});
 
-    const receiver = privateKey(`//Receiver${Date.now()}`);
+    const [receiver] = await helper.arrange.createAccounts([0n], donor);
 
     // First receive balance on eth balance of bob
     {
@@ -110,7 +110,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/proxy/fungibleProxy.test.tsdiffbeforeafterboth
--- a/tests/src/eth/proxy/fungibleProxy.test.ts
+++ b/tests/src/eth/proxy/fungibleProxy.test.ts
@@ -17,7 +17,7 @@
 import {expect} from 'chai';
 import {readFile} from 'fs/promises';
 import {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util/playgrounds';
+import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util';
 
 async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) {
   // Proxy owner has no special privilegies, we don't need to reuse them
@@ -37,7 +37,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -76,7 +76,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/eth/proxy/nonFungibleProxy.test.tsdiffbeforeafterboth
--- a/tests/src/eth/proxy/nonFungibleProxy.test.ts
+++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts
@@ -16,7 +16,7 @@
 
 import {readFile} from 'fs/promises';
 import {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util/playgrounds';
+import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util';
 
 
 async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) {
@@ -37,7 +37,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -94,7 +94,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/eth/reFungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/reFungible.test.ts
+++ b/tests/src/eth/reFungible.test.ts
@@ -14,8 +14,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {Pallets, requirePalletsOrSkip} from '../util/playgrounds';
-import {expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {Pallets, requirePalletsOrSkip} from '../util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 
 describe('Refungible: Information getting', () => {
@@ -25,7 +25,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -117,7 +117,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -286,9 +286,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+
     await tokenContract.methods.transfer(receiver, 1).send();
+    if (events.length == 0) await helper.wait.newBlocks(1);
+    const event = events[0];
 
-    const event = events[0];
     expect(event.address).to.equal(collectionAddress);
     expect(event.returnValues.from).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');
     expect(event.returnValues.to).to.equal(receiver);
@@ -312,9 +314,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+
     await tokenContract.methods.transfer(receiver, 1).send();
+    if (events.length == 0) await helper.wait.newBlocks(1);
+    const event = events[0];
 
-    const event = events[0];
     expect(event.address).to.equal(collectionAddress);
     expect(event.returnValues.from).to.equal(caller);
     expect(event.returnValues.to).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');
@@ -329,7 +333,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -370,7 +374,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
modifiedtests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth
--- a/tests/src/eth/reFungibleToken.test.ts
+++ b/tests/src/eth/reFungibleToken.test.ts
@@ -14,8 +14,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {Pallets, requirePalletsOrSkip} from '../util/playgrounds';
-import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util/playgrounds';
+import {Pallets, requirePalletsOrSkip} from '../util';
+import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
 
@@ -28,7 +28,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([20n], donor);
     });
   });
@@ -72,7 +72,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
@@ -136,7 +136,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([50n], donor);
     });
   });
@@ -311,6 +311,7 @@
     });
     await tokenContract.methods.burnFrom(caller, 1).send();
 
+    if (events.length == 0) await helper.wait.newBlocks(1);
     const event = events[0];
     expect(event.address).to.be.equal(collectionAddress);
     expect(event.returnValues.from).to.be.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF');
@@ -327,7 +328,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([50n], donor);
     });
   });
@@ -382,7 +383,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([50n], donor);
     });
   });
@@ -399,9 +400,11 @@
     contract.events.allEvents((_: any, event: any) => {
       events.push(event);
     });
+
     expect(await token.approve(alice, {Ethereum: receiver}, 100n)).to.be.true;
-
+    if (events.length == 0) await helper.wait.newBlocks(1);
     const event = events[0];
+
     expect(event.event).to.be.equal('Approval');
     expect(event.address).to.be.equal(tokenAddress);
     expect(event.returnValues.owner).to.be.equal(helper.address.substrateToEth(alice.address));
@@ -425,6 +428,7 @@
     });
 
     expect(await token.transferFrom(bob, {Substrate: alice.address}, {Ethereum: receiver},  51n)).to.be.true;
+    if (events.length == 0) await helper.wait.newBlocks(1);
 
     let event = events[0];
     expect(event.event).to.be.equal('Transfer');
@@ -455,8 +459,9 @@
     });
 
     expect(await token.transfer(alice, {Ethereum: receiver},  51n)).to.be.true;
+    if (events.length == 0) await helper.wait.newBlocks(1);
+    const event = events[0];
 
-    const event = events[0];
     expect(event.event).to.be.equal('Transfer');
     expect(event.address).to.be.equal(tokenAddress);
     expect(event.returnValues.from).to.be.equal(helper.address.substrateToEth(alice.address));
@@ -472,7 +477,7 @@
     await usingEthPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/sponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/eth/sponsoring.test.ts
+++ b/tests/src/eth/sponsoring.test.ts
@@ -15,15 +15,15 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itEth, expect, SponsoringMode} from '../eth/util/playgrounds';
-import {usingPlaygrounds} from './../util/playgrounds/index';
+import {itEth, expect, SponsoringMode} from './util';
+import {usingPlaygrounds} from '../util/index';
 
 describe('EVM sponsoring', () => {
   let donor: IKeyringPair;
 
   before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+    await usingPlaygrounds(async (_helper, privateKey) => {
+      donor = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/eth/tokenProperties.test.tsdiffbeforeafterboth
--- a/tests/src/eth/tokenProperties.test.ts
+++ b/tests/src/eth/tokenProperties.test.ts
@@ -1,32 +1,45 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {itEth, usingEthPlaygrounds, expect} from './util';
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds} from './../util/playgrounds/index';
-import {itEth, expect} from '../eth/util/playgrounds';
 
 describe('EVM token properties', () => {
   let donor: IKeyringPair;
   let alice: IKeyringPair;
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
-      [alice] = await helper.arrange.createAccounts([1000n], donor);
+  before(async function() {
+    await usingEthPlaygrounds(async (helper, privateKey) => {
+      donor = await privateKey({filename: __filename});
+      [alice] = await helper.arrange.createAccounts([100n], donor);
     });
   });
 
   itEth('Can be reconfigured', async({helper}) => {
     const caller = await helper.eth.createAccountWithBalance(donor);
-
     for(const [mutable,collectionAdmin, tokenOwner] of cartesian([], [false, true], [false, true], [false, true])) {
-      const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'ethp'});
+      const collection = await helper.nft.mintCollection(alice);
       await collection.addAdmin(alice, {Ethereum: caller});
-
+      
       const address = helper.ethAddress.fromCollectionId(collection.collectionId);
       const contract = helper.ethNativeContract.collection(address, 'nft', caller);
-
+  
       await contract.methods.setTokenPropertyPermission('testKey', mutable, collectionAdmin, tokenOwner).send({from: caller});
   
-      const state = await collection.getPropertyPermissions();
-      expect(state).to.be.deep.equal([{
+      expect(await collection.getPropertyPermissions()).to.be.deep.equal([{
         key: 'testKey',
         permission: {mutable, collectionAdmin, tokenOwner},
       }]);
@@ -36,7 +49,6 @@
   itEth('Can be set', async({helper}) => {
     const caller = await helper.eth.createAccountWithBalance(donor);
     const collection = await helper.nft.mintCollection(alice, {
-      tokenPrefix: 'ethp',
       tokenPropertyPermissions: [{
         key: 'testKey',
         permission: {
@@ -60,7 +72,6 @@
   itEth('Can be deleted', async({helper}) => {
     const caller = await helper.eth.createAccountWithBalance(donor);
     const collection = await helper.nft.mintCollection(alice, {
-      tokenPrefix: 'ethp',
       tokenPropertyPermissions: [{
         key: 'testKey',
         permission: {
@@ -69,11 +80,11 @@
         },
       }],
     });
+    
+    const token = await collection.mintToken(alice);
+    await token.setProperties(alice, [{key: 'testKey', value: 'testValue'}]);
 
     await collection.addAdmin(alice, {Ethereum: caller});
-
-    const token = await collection.mintToken(alice);
-    await token.setProperties(alice, [{key: 'testKey', value: 'testValue'}]);
 
     const address = helper.ethAddress.fromCollectionId(collection.collectionId);
     const contract = helper.ethNativeContract.collection(address, 'nft', caller);
@@ -85,9 +96,8 @@
   });
 
   itEth('Can be read', async({helper}) => {
-    const caller = await helper.eth.createAccountWithBalance(donor);
+    const caller = helper.eth.createAccount();
     const collection = await helper.nft.mintCollection(alice, {
-      tokenPrefix: 'ethp',
       tokenPropertyPermissions: [{
         key: 'testKey',
         permission: {
@@ -95,6 +105,7 @@
         },
       }],
     });
+  
     const token = await collection.mintToken(alice);
     await token.setProperties(alice, [{key: 'testKey', value: 'testValue'}]);
 
@@ -116,4 +127,4 @@
   for(const value of args[0]) {
     yield* cartesian([...internalRest, value], ...args.slice(1)) as any;
   }
-}
\ No newline at end of file
+}
addedtests/src/eth/util/index.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/eth/util/index.ts
@@ -0,0 +1,83 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+import * as path from 'path';
+import {IKeyringPair} from '@polkadot/types/types';
+
+import config from '../../config';
+
+import {EthUniqueHelper} from './playgrounds/unique.dev';
+import {SilentLogger, SilentConsole} from '../../util/playgrounds/unique.dev';
+
+export {EthUniqueHelper} from './playgrounds/unique.dev';
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+import chaiLike from 'chai-like';
+import {getTestSeed, requirePalletsOrSkip} from '../../util';
+
+chai.use(chaiAsPromised);
+chai.use(chaiLike);
+export const expect = chai.expect;
+
+export enum SponsoringMode {
+  Disabled = 0,
+  Allowlisted = 1,
+  Generous = 2,
+}
+
+export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair>) => Promise<void>) => {
+  const silentConsole = new SilentConsole();
+  silentConsole.enable();
+
+  const helper = new EthUniqueHelper(new SilentLogger());
+
+  try {
+    await helper.connect(config.substrateUrl);
+    await helper.connectWeb3(config.substrateUrl);
+    const ss58Format = helper.chain.getChainProperties().ss58Format;
+    const privateKey = async (seed: string | {filename: string}) => {
+      if (typeof seed === 'string') {
+        return helper.util.fromSeed(seed, ss58Format);
+      }
+      else {
+        const actualSeed = getTestSeed(seed.filename);
+        let account = helper.util.fromSeed(actualSeed, ss58Format);
+        if (await helper.balance.getSubstrate(account.address) == 0n) {
+          console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`);
+          account = helper.util.fromSeed('//Alice', ss58Format);
+        }
+        return account;
+      }
+    };
+    await code(helper, privateKey);
+  }
+  finally {
+    await helper.disconnect();
+    silentConsole.disable();
+  }
+};
+  
+export async function itEth(name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair> }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
+  (opts.only ? it.only : 
+    opts.skip ? it.skip : it)(name, async function() {
+    await usingEthPlaygrounds(async (helper, privateKey) => {
+      if (opts.requiredPallets) {
+        requirePalletsOrSkip(this, helper, opts.requiredPallets);
+      }
+
+      await cb({helper, privateKey});
+    });
+  });
+}
+
+export async function itEthIfWithPallet(name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair> }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
+  return itEth(name, cb, {requiredPallets: required, ...opts});
+}
+
+itEth.only = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair> }) => any) => itEth(name, cb, {only: true});
+itEth.skip = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair> }) => any) => itEth(name, cb, {skip: true});
+
+itEthIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair> }) => any) => itEthIfWithPallet(name, required, cb, {only: true});
+itEthIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair> }) => any) => itEthIfWithPallet(name, required, cb, {skip: true});
+itEth.ifWithPallets = itEthIfWithPallet;
deletedtests/src/eth/util/playgrounds/index.tsdiffbeforeafterboth
--- a/tests/src/eth/util/playgrounds/index.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-import {IKeyringPair} from '@polkadot/types/types';
-
-import config from '../../../config';
-
-import {EthUniqueHelper} from './unique.dev';
-import {SilentLogger, SilentConsole} from '../../../util/playgrounds/unique.dev';
-
-export {EthUniqueHelper} from './unique.dev';
-
-import chai from 'chai';
-import chaiAsPromised from 'chai-as-promised';
-import chaiLike from 'chai-like';
-import {requirePalletsOrSkip} from '../../../util/playgrounds';
-chai.use(chaiAsPromised);
-chai.use(chaiLike);
-export const expect = chai.expect;
-
-export enum SponsoringMode {
-  Disabled = 0,
-  Allowlisted = 1,
-  Generous = 2,
-}
-
-export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  const silentConsole = new SilentConsole();
-  silentConsole.enable();
-
-  const helper = new EthUniqueHelper(new SilentLogger());
-
-  try {
-    await helper.connect(config.substrateUrl);
-    await helper.connectWeb3(config.substrateUrl);
-    const ss58Format = helper.chain.getChainProperties().ss58Format;
-    const privateKey = (seed: string) => helper.util.fromSeed(seed, ss58Format);
-    await code(helper, privateKey);
-  }
-  finally {
-    await helper.disconnect();
-    silentConsole.disable();
-  }
-};
-  
-export async function itEth(name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
-  (opts.only ? it.only : 
-    opts.skip ? it.skip : it)(name, async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
-      if (opts.requiredPallets) {
-        requirePalletsOrSkip(this, helper, opts.requiredPallets);
-      }
-
-      await cb({helper, privateKey});
-    });
-  });
-}
-
-export async function itEthIfWithPallet(name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
-  return itEth(name, cb, {requiredPallets: required, ...opts});
-}
-
-itEth.only = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEth(name, cb, {only: true});
-itEth.skip = (name: string, cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEth(name, cb, {skip: true});
-
-itEthIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEthIfWithPallet(name, required, cb, {only: true});
-itEthIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: EthUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itEthIfWithPallet(name, required, cb, {skip: true});
-itEth.ifWithPallets = itEthIfWithPallet;
modifiedtests/src/eth/util/playgrounds/unique.dev.tsdiffbeforeafterboth
--- a/tests/src/eth/util/playgrounds/unique.dev.ts
+++ b/tests/src/eth/util/playgrounds/unique.dev.ts
@@ -142,14 +142,14 @@
     return account.address;
   }
 
-  async createAccountWithBalance(donor: IKeyringPair, amount=1000n) {
+  async createAccountWithBalance(donor: IKeyringPair, amount=100n) {
     const account = this.createAccount();
     await this.transferBalanceFromSubstrate(donor, account, amount);
   
     return account;
   }
 
-  async transferBalanceFromSubstrate(donor: IKeyringPair, recepient: string, amount=1000n, inTokens=true) {
+  async transferBalanceFromSubstrate(donor: IKeyringPair, recepient: string, amount=100n, inTokens=true) {
     return await this.helper.balance.transferToSubstrate(donor, evmToAddress(recepient), amount * (inTokens ? this.helper.balance.getOneTokenNominal() : 1n));
   }
   
modifiedtests/src/fungible.test.tsdiffbeforeafterboth
--- a/tests/src/fungible.test.ts
+++ b/tests/src/fungible.test.ts
@@ -15,17 +15,18 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 const U128_MAX = (1n << 128n) - 1n;
 
 describe('integration test: Fungible functionality:', () => {
+  let donor: IKeyringPair;
   let alice: IKeyringPair;
   let bob: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);
     });
   });
@@ -43,9 +44,9 @@
     expect(aliceBalance).to.be.equal(U128_MAX);
   });
   
-  itSub('RPC method tokenOnewrs for fungible collection and token', async ({helper, privateKey}) => {
+  itSub('RPC method tokenOnewrs for fungible collection and token', async ({helper}) => {
     const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
-    const facelessCrowd = Array(7).fill(0).map((_, i) => ({Substrate: privateKey(`//Alice+${i}`).address}));
+    const facelessCrowd = (await helper.arrange.createAccounts(Array(7).fill(0n), donor)).map(keyring => {return {Substrate: keyring.address};});
 
     const collection = await helper.ft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});
 
@@ -64,7 +65,7 @@
     expect(owners).to.deep.include.members([{Substrate: alice.address}, ethAcc, {Substrate: bob.address}, ...facelessCrowd]);
     expect(owners.length).to.be.equal(10);
     
-    const eleven = privateKey('//ALice+11');
+    const [eleven] = await helper.arrange.createAccounts([0n], donor);
     expect(await collection.transfer(alice, {Substrate: eleven.address}, 10n)).to.be.true;
     expect((await collection.getTop10Owners()).length).to.be.equal(10);
   });
modifiedtests/src/getPropertiesRpc.test.tsdiffbeforeafterboth
--- a/tests/src/getPropertiesRpc.test.ts
+++ b/tests/src/getPropertiesRpc.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 import {UniqueHelper, UniqueNFTCollection} from './util/playgrounds/unique';
 
 const collectionProps = [
@@ -63,7 +63,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (_, privateKey) => {
-      alice = privateKey('//Alice');
+      alice = await privateKey({filename: __filename});
     });
   });
 
modifiedtests/src/inflation.test.tsdiffbeforeafterboth
--- a/tests/src/inflation.test.ts
+++ b/tests/src/inflation.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from './util/playgrounds';
+import {expect, itSub, usingPlaygrounds} from './util';
 
 // todo:playgrounds requires sudo, look into on the later stage
 describe('integration test: Inflation', () => {
@@ -23,7 +23,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (_, privateKey) => {
-      superuser = privateKey('//Alice');
+      superuser = await privateKey('//Alice');
     });
   });
   
modifiedtests/src/interfaces/augment-api-consts.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-consts.ts
+++ b/tests/src/interfaces/augment-api-consts.ts
@@ -8,7 +8,7 @@
 import type { ApiTypes, AugmentedConst } from '@polkadot/api-base/types';
 import type { Option, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { Codec } from '@polkadot/types-codec/types';
-import type { Perbill, Permill } from '@polkadot/types/interfaces/runtime';
+import type { Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime';
 import type { FrameSupportPalletId, FrameSupportWeightsRuntimeDbWeight, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, SpVersionRuntimeVersion, XcmV1MultiLocation } from '@polkadot/types/lookup';
 
 export type __AugmentedConst<ApiType extends ApiTypes> = AugmentedConst<ApiType>;
@@ -97,7 +97,7 @@
        * The maximum weight that may be scheduled per block for any dispatchables of less
        * priority than `schedule::HARD_DEADLINE`.
        **/
-      maximumWeight: u64 & AugmentedConst<ApiType>;
+      maximumWeight: Weight & AugmentedConst<ApiType>;
       /**
        * The maximum number of scheduled calls in the queue for a single block.
        * Not strictly enforced, but used for weight estimation.
@@ -126,7 +126,7 @@
        **/
       dbWeight: FrameSupportWeightsRuntimeDbWeight & AugmentedConst<ApiType>;
       /**
-       * The designated SS85 prefix of this chain.
+       * The designated SS58 prefix of this chain.
        * 
        * This replaces the "ss58Format" property declared in the chain spec. Reason is
        * that the runtime should know about the prefix in order to make use of it as
modifiedtests/src/interfaces/augment-api-events.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-events.ts
+++ b/tests/src/interfaces/augment-api-events.ts
@@ -8,7 +8,7 @@
 import type { ApiTypes, AugmentedEvent } from '@polkadot/api-base/types';
 import type { Bytes, Null, Option, Result, U256, U8aFixed, bool, u128, u32, u64, u8 } from '@polkadot/types-codec';
 import type { ITuple } from '@polkadot/types-codec/types';
-import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
+import type { AccountId32, H160, H256, Weight } from '@polkadot/types/interfaces/runtime';
 import type { EthereumLog, EvmCoreErrorExitReason, FrameSupportScheduleLookupError, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, RmrkTraitsNftAccountIdOrCollectionNftTuple, SpRuntimeDispatchError, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetMultiAssets, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup';
 
 export type __AugmentedEvent<ApiType extends ApiTypes> = AugmentedEvent<ApiType>;
@@ -184,11 +184,11 @@
       /**
        * Downward message is overweight and was placed in the overweight queue.
        **/
-      OverweightEnqueued: AugmentedEvent<ApiType, [messageId: U8aFixed, overweightIndex: u64, requiredWeight: u64], { messageId: U8aFixed, overweightIndex: u64, requiredWeight: u64 }>;
+      OverweightEnqueued: AugmentedEvent<ApiType, [messageId: U8aFixed, overweightIndex: u64, requiredWeight: Weight], { messageId: U8aFixed, overweightIndex: u64, requiredWeight: Weight }>;
       /**
        * Downward message from the overweight queue was executed.
        **/
-      OverweightServiced: AugmentedEvent<ApiType, [overweightIndex: u64, weightUsed: u64], { overweightIndex: u64, weightUsed: u64 }>;
+      OverweightServiced: AugmentedEvent<ApiType, [overweightIndex: u64, weightUsed: Weight], { overweightIndex: u64, weightUsed: Weight }>;
       /**
        * Downward message is unsupported version of XCM.
        **/
@@ -196,7 +196,7 @@
       /**
        * The weight limit for handling downward messages was reached.
        **/
-      WeightExhausted: AugmentedEvent<ApiType, [messageId: U8aFixed, remainingWeight: u64, requiredWeight: u64], { messageId: U8aFixed, remainingWeight: u64, requiredWeight: u64 }>;
+      WeightExhausted: AugmentedEvent<ApiType, [messageId: U8aFixed, remainingWeight: Weight, requiredWeight: Weight], { messageId: U8aFixed, remainingWeight: Weight, requiredWeight: Weight }>;
       /**
        * Generic event
        **/
@@ -290,7 +290,7 @@
       /**
        * Downward messages were processed using the given weight.
        **/
-      DownwardMessagesProcessed: AugmentedEvent<ApiType, [weightUsed: u64, dmqHead: H256], { weightUsed: u64, dmqHead: H256 }>;
+      DownwardMessagesProcessed: AugmentedEvent<ApiType, [weightUsed: Weight, dmqHead: H256], { weightUsed: Weight, dmqHead: H256 }>;
       /**
        * Some downward messages have been received and will be processed.
        **/
@@ -378,7 +378,7 @@
        * 
        * \[ id, pallet index, call index, actual weight, max budgeted weight \]
        **/
-      NotifyOverweight: AugmentedEvent<ApiType, [u64, u8, u8, u64, u64]>;
+      NotifyOverweight: AugmentedEvent<ApiType, [u64, u8, u8, Weight, Weight]>;
       /**
        * A given location which had a version change subscription was dropped owing to an error
        * migrating the location to our new XCM format.
@@ -769,19 +769,19 @@
       /**
        * Some XCM failed.
        **/
-      Fail: AugmentedEvent<ApiType, [messageHash: Option<H256>, error: XcmV2TraitsError, weight: u64], { messageHash: Option<H256>, error: XcmV2TraitsError, weight: u64 }>;
+      Fail: AugmentedEvent<ApiType, [messageHash: Option<H256>, error: XcmV2TraitsError, weight: Weight], { messageHash: Option<H256>, error: XcmV2TraitsError, weight: Weight }>;
       /**
        * An XCM exceeded the individual message weight budget.
        **/
-      OverweightEnqueued: AugmentedEvent<ApiType, [sender: u32, sentAt: u32, index: u64, required: u64], { sender: u32, sentAt: u32, index: u64, required: u64 }>;
+      OverweightEnqueued: AugmentedEvent<ApiType, [sender: u32, sentAt: u32, index: u64, required: Weight], { sender: u32, sentAt: u32, index: u64, required: Weight }>;
       /**
        * An XCM from the overweight queue was executed with the given actual weight used.
        **/
-      OverweightServiced: AugmentedEvent<ApiType, [index: u64, used: u64], { index: u64, used: u64 }>;
+      OverweightServiced: AugmentedEvent<ApiType, [index: u64, used: Weight], { index: u64, used: Weight }>;
       /**
        * Some XCM was executed ok.
        **/
-      Success: AugmentedEvent<ApiType, [messageHash: Option<H256>, weight: u64], { messageHash: Option<H256>, weight: u64 }>;
+      Success: AugmentedEvent<ApiType, [messageHash: Option<H256>, weight: Weight], { messageHash: Option<H256>, weight: Weight }>;
       /**
        * An upward message was sent to the relay chain.
        **/
modifiedtests/src/interfaces/augment-api-query.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -8,8 +8,8 @@
 import type { ApiTypes, AugmentedQuery, QueryableStorageEntry } from '@polkadot/api-base/types';
 import type { BTreeMap, Bytes, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { AnyNumber, ITuple } from '@polkadot/types-codec/types';
-import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
-import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensReserveData, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, XcmV1MultiLocation } from '@polkadot/types/lookup';
+import type { AccountId32, H160, H256, Weight } from '@polkadot/types/interfaces/runtime';
+import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassWeight, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensReserveData, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, XcmV1MultiLocation } from '@polkadot/types/lookup';
 import type { Observable } from '@polkadot/types/types';
 
 export type __AugmentedQuery<ApiType extends ApiTypes> = AugmentedQuery<ApiType, () => unknown>;
@@ -555,12 +555,12 @@
        * The weight we reserve at the beginning of the block for processing DMP messages. This
        * overrides the amount set in the Config trait.
        **/
-      reservedDmpWeightOverride: AugmentedQuery<ApiType, () => Observable<Option<u64>>, []> & QueryableStorageEntry<ApiType, []>;
+      reservedDmpWeightOverride: AugmentedQuery<ApiType, () => Observable<Option<Weight>>, []> & QueryableStorageEntry<ApiType, []>;
       /**
        * The weight we reserve at the beginning of the block for processing XCMP messages. This
        * overrides the amount set in the Config trait.
        **/
-      reservedXcmpWeightOverride: AugmentedQuery<ApiType, () => Observable<Option<u64>>, []> & QueryableStorageEntry<ApiType, []>;
+      reservedXcmpWeightOverride: AugmentedQuery<ApiType, () => Observable<Option<Weight>>, []> & QueryableStorageEntry<ApiType, []>;
       /**
        * An option which indicates if the relay-chain restricts signalling a validation code upgrade.
        * In other words, if this is `Some` and [`NewValidationCode`] is `Some` then the produced
@@ -716,7 +716,7 @@
       /**
        * The current weight for the block.
        **/
-      blockWeight: AugmentedQuery<ApiType, () => Observable<FrameSupportWeightsPerDispatchClassU64>, []> & QueryableStorageEntry<ApiType, []>;
+      blockWeight: AugmentedQuery<ApiType, () => Observable<FrameSupportWeightsPerDispatchClassWeight>, []> & QueryableStorageEntry<ApiType, []>;
       /**
        * Digest of the current block, also part of the block header.
        **/
modifiedtests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-rpc.ts
+++ b/tests/src/interfaces/augment-api-rpc.ts
@@ -161,22 +161,27 @@
     };
     contracts: {
       /**
+       * @deprecated Use the runtime interface `api.call.contractsApi.call` instead
        * Executes a call to a contract
        **/
       call: AugmentedRpc<(callRequest: ContractCallRequest | { origin?: any; dest?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; inputData?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ContractExecResult>>;
       /**
+       * @deprecated Use the runtime interface `api.call.contractsApi.getStorage` instead
        * Returns the value under a specified storage key in a contract
        **/
       getStorage: AugmentedRpc<(address: AccountId | string | Uint8Array, key: H256 | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Option<Bytes>>>;
       /**
+       * @deprecated Use the runtime interface `api.call.contractsApi.instantiate` instead
        * Instantiate a new contract
        **/
       instantiate: AugmentedRpc<(request: InstantiateRequest | { origin?: any; value?: any; gasLimit?: any; storageDepositLimit?: any; code?: any; data?: any; salt?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<ContractInstantiateResult>>;
       /**
+       * @deprecated Not available in newer versions of the contracts interfaces
        * Returns the projected time a given contract will be able to sustain paying its rent
        **/
       rentProjection: AugmentedRpc<(address: AccountId | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<Option<BlockNumber>>>;
       /**
+       * @deprecated Use the runtime interface `api.call.contractsApi.uploadCode` instead
        * Upload new code without instantiating a contract from it
        **/
       uploadCode: AugmentedRpc<(uploadRequest: CodeUploadRequest | { origin?: any; code?: any; storageDepositLimit?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<CodeUploadResult>>;
@@ -515,6 +520,7 @@
        **/
       getChildStorageSize: AugmentedRpc<(childStorageKey: StorageKey | string | Uint8Array | any, childDefinition: StorageKey | string | Uint8Array | any, childType: u32 | AnyNumber | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<u64>>;
       /**
+       * @deprecated Use `api.rpc.state.getKeysPaged` to retrieve keys
        * Retrieves the keys with a certain prefix
        **/
       getKeys: AugmentedRpc<(key: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<StorageKey>>>;
@@ -527,6 +533,7 @@
        **/
       getMetadata: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<Metadata>>;
       /**
+       * @deprecated Use `api.rpc.state.getKeysPaged` to retrieve keys
        * Returns the keys with prefix, leave empty to get all the keys (deprecated: Use getKeysPaged)
        **/
       getPairs: AugmentedRpc<(prefix: StorageKey | string | Uint8Array | any, at?: BlockHash | string | Uint8Array) => Observable<Vec<KeyValue>>>;
modifiedtests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -8,7 +8,7 @@
 import type { ApiTypes, AugmentedSubmittable, SubmittableExtrinsic, SubmittableExtrinsicFunction } from '@polkadot/api-base/types';
 import type { Bytes, Compact, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types';
-import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';
+import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime';
 import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, FrameSupportScheduleMaybeHashed, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsPartEquippableList, RmrkTraitsPartPartType, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
 
 export type __AugmentedSubmittable = AugmentedSubmittable<() => unknown>;
@@ -243,7 +243,7 @@
        * Events:
        * - `OverweightServiced`: On success.
        **/
-      serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64, u64]>;
+      serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64, Weight]>;
       /**
        * Generic tx
        **/
@@ -367,7 +367,7 @@
        * NOTE: A successful return to this does *not* imply that the `msg` was executed successfully
        * to completion; only that *some* of it was executed.
        **/
-      execute: AugmentedSubmittable<(message: XcmVersionedXcm | { V0: any } | { V1: any } | { V2: any } | string | Uint8Array, maxWeight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedXcm, u64]>;
+      execute: AugmentedSubmittable<(message: XcmVersionedXcm | { V0: any } | { V1: any } | { V2: any } | string | Uint8Array, maxWeight: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedXcm, Weight]>;
       /**
        * Set a safe XCM version (the version that XCM should be encoded with if the most recent
        * version a destination can accept is unknown).
@@ -902,7 +902,7 @@
        * - The weight of this call is defined by the caller.
        * # </weight>
        **/
-      sudoUncheckedWeight: AugmentedSubmittable<(call: Call | IMethod | string | Uint8Array, weight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Call, u64]>;
+      sudoUncheckedWeight: AugmentedSubmittable<(call: Call | IMethod | string | Uint8Array, weight: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Call, Weight]>;
       /**
        * Generic tx
        **/
@@ -1683,7 +1683,7 @@
        * Events:
        * - `OverweightServiced`: On success.
        **/
-      serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64, u64]>;
+      serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64, Weight]>;
       /**
        * Suspends all XCM executions for the XCMP queue, regardless of the sender's origin.
        * 
@@ -1720,7 +1720,7 @@
        * - `origin`: Must pass `Root`.
        * - `new`: Desired value for `QueueConfigData.threshold_weight`
        **/
-      updateThresholdWeight: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;
+      updateThresholdWeight: AugmentedSubmittable<(updated: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Weight]>;
       /**
        * Overwrites the speed to which the available weight approaches the maximum weight.
        * A lower number results in a faster progression. A value of 1 makes the entire weight available initially.
@@ -1728,7 +1728,7 @@
        * - `origin`: Must pass `Root`.
        * - `new`: Desired value for `QueueConfigData.weight_restrict_decay`.
        **/
-      updateWeightRestrictDecay: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;
+      updateWeightRestrictDecay: AugmentedSubmittable<(updated: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Weight]>;
       /**
        * Overwrite the maximum amount of weight any individual message may consume.
        * Messages above this weight go into the overweight queue and may only be serviced explicitly.
@@ -1736,7 +1736,7 @@
        * - `origin`: Must pass `Root`.
        * - `new`: Desired value for `QueueConfigData.xcmp_max_individual_weight`.
        **/
-      updateXcmpMaxIndividualWeight: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;
+      updateXcmpMaxIndividualWeight: AugmentedSubmittable<(updated: Weight | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Weight]>;
       /**
        * Generic tx
        **/
modifiedtests/src/interfaces/augment-types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-types.ts
+++ b/tests/src/interfaces/augment-types.ts
@@ -5,7 +5,7 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/types/types/registry';
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassWeight, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default';
 import type { Data, StorageKey } from '@polkadot/types';
 import type { BitVec, Bool, Bytes, F32, F64, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, f32, f64, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec';
 import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets';
@@ -25,7 +25,7 @@
 import type { CollectiveOrigin, MemberCount, ProposalIndex, Votes, VotesTo230 } from '@polkadot/types/interfaces/collective';
 import type { AuthorityId, RawVRFOutput } from '@polkadot/types/interfaces/consensus';
 import type { AliveContractInfo, CodeHash, CodeSource, CodeUploadRequest, CodeUploadResult, CodeUploadResultValue, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractInstantiateResultTo299, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateRequestV1, InstantiateRequestV2, InstantiateReturnValue, InstantiateReturnValueOk, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts';
-import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi';
+import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractContractSpecV4, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractMetadataV4, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi';
 import type { FundIndex, FundInfo, LastContribution, TrieIndex } from '@polkadot/types/interfaces/crowdloan';
 import type { CollationInfo, CollationInfoV1, ConfigData, MessageId, OverweightIndex, PageCounter, PageIndexData } from '@polkadot/types/interfaces/cumulus';
 import type { AccountVote, AccountVoteSplit, AccountVoteStandard, Conviction, Delegations, PreimageStatus, PreimageStatusAvailable, PriorLock, PropIndex, Proposal, ProxyState, ReferendumIndex, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, ReferendumStatus, Tally, Voting, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces/democracy';
@@ -53,7 +53,7 @@
 import type { AccountStatus, AccountValidity } from '@polkadot/types/interfaces/purchase';
 import type { ActiveRecovery, RecoveryConfig } from '@polkadot/types/interfaces/recovery';
 import type { RpcMethods } from '@polkadot/types/interfaces/rpc';
-import type { AccountId, AccountId20, AccountId32, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, BlockNumberFor, BlockNumberOf, Call, CallHash, CallHashOf, ChangesTrieConfiguration, ChangesTrieSignal, CodecHash, Consensus, ConsensusEngineId, CrateVersion, Digest, DigestItem, EncodedJustification, ExtrinsicsWeight, Fixed128, Fixed64, FixedI128, FixedI64, FixedU128, FixedU64, H1024, H128, H160, H2048, H256, H32, H512, H64, Hash, Header, HeaderPartial, I32F32, Index, IndicesLookupSource, Justification, Justifications, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, MultiAddress, MultiSigner, OpaqueCall, Origin, OriginCaller, PalletId, PalletVersion, PalletsOrigin, Pays, PerU16, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, SignedBlockWithJustification, SignedBlockWithJustifications, Slot, SlotDuration, StorageData, StorageInfo, StorageProof, TransactionInfo, TransactionLongevity, TransactionPriority, TransactionStorageProof, TransactionTag, U32F32, ValidatorId, ValidatorIdOf, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime';
+import type { AccountId, AccountId20, AccountId32, AccountId33, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, BlockNumberFor, BlockNumberOf, Call, CallHash, CallHashOf, ChangesTrieConfiguration, ChangesTrieSignal, CodecHash, Consensus, ConsensusEngineId, CrateVersion, Digest, DigestItem, EncodedJustification, ExtrinsicsWeight, Fixed128, Fixed64, FixedI128, FixedI64, FixedU128, FixedU64, H1024, H128, H160, H2048, H256, H32, H512, H64, Hash, Header, HeaderPartial, I32F32, Index, IndicesLookupSource, Justification, Justifications, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, MultiAddress, MultiSigner, OpaqueCall, Origin, OriginCaller, PalletId, PalletVersion, PalletsOrigin, Pays, PerU16, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, SignedBlockWithJustification, SignedBlockWithJustifications, Slot, SlotDuration, StorageData, StorageInfo, StorageProof, TransactionInfo, TransactionLongevity, TransactionPriority, TransactionStorageProof, TransactionTag, U32F32, ValidatorId, ValidatorIdOf, Weight, WeightMultiplier, WeightV1, WeightV2 } from '@polkadot/types/interfaces/runtime';
 import type { Si0Field, Si0LookupTypeId, Si0Path, Si0Type, Si0TypeDef, Si0TypeDefArray, Si0TypeDefBitSequence, Si0TypeDefCompact, Si0TypeDefComposite, Si0TypeDefPhantom, Si0TypeDefPrimitive, Si0TypeDefSequence, Si0TypeDefTuple, Si0TypeDefVariant, Si0TypeParameter, Si0Variant, Si1Field, Si1LookupTypeId, Si1Path, Si1Type, Si1TypeDef, Si1TypeDefArray, Si1TypeDefBitSequence, Si1TypeDefCompact, Si1TypeDefComposite, Si1TypeDefPrimitive, Si1TypeDefSequence, Si1TypeDefTuple, Si1TypeDefVariant, Si1TypeParameter, Si1Variant, SiField, SiLookupTypeId, SiPath, SiType, SiTypeDef, SiTypeDefArray, SiTypeDefBitSequence, SiTypeDefCompact, SiTypeDefComposite, SiTypeDefPrimitive, SiTypeDefSequence, SiTypeDefTuple, SiTypeDefVariant, SiTypeParameter, SiVariant } from '@polkadot/types/interfaces/scaleInfo';
 import type { Period, Priority, SchedulePeriod, SchedulePriority, Scheduled, ScheduledTo254, TaskAddress } from '@polkadot/types/interfaces/scheduler';
 import type { BeefyKey, FullIdentification, IdentificationTuple, Keys, MembershipProof, SessionIndex, SessionKeys1, SessionKeys10, SessionKeys10B, SessionKeys2, SessionKeys3, SessionKeys4, SessionKeys5, SessionKeys6, SessionKeys6B, SessionKeys7, SessionKeys7B, SessionKeys8, SessionKeys8B, SessionKeys9, SessionKeys9B, ValidatorCount } from '@polkadot/types/interfaces/session';
@@ -79,6 +79,7 @@
     AccountId: AccountId;
     AccountId20: AccountId20;
     AccountId32: AccountId32;
+    AccountId33: AccountId33;
     AccountIdOf: AccountIdOf;
     AccountIndex: AccountIndex;
     AccountInfo: AccountInfo;
@@ -253,6 +254,7 @@
     ContractContractSpecV1: ContractContractSpecV1;
     ContractContractSpecV2: ContractContractSpecV2;
     ContractContractSpecV3: ContractContractSpecV3;
+    ContractContractSpecV4: ContractContractSpecV4;
     ContractCryptoHasher: ContractCryptoHasher;
     ContractDiscriminant: ContractDiscriminant;
     ContractDisplayName: ContractDisplayName;
@@ -296,6 +298,7 @@
     ContractMetadataV1: ContractMetadataV1;
     ContractMetadataV2: ContractMetadataV2;
     ContractMetadataV3: ContractMetadataV3;
+    ContractMetadataV4: ContractMetadataV4;
     ContractProject: ContractProject;
     ContractProjectContract: ContractProjectContract;
     ContractProjectInfo: ContractProjectInfo;
@@ -524,7 +527,7 @@
     FrameSupportWeightsDispatchInfo: FrameSupportWeightsDispatchInfo;
     FrameSupportWeightsPays: FrameSupportWeightsPays;
     FrameSupportWeightsPerDispatchClassU32: FrameSupportWeightsPerDispatchClassU32;
-    FrameSupportWeightsPerDispatchClassU64: FrameSupportWeightsPerDispatchClassU64;
+    FrameSupportWeightsPerDispatchClassWeight: FrameSupportWeightsPerDispatchClassWeight;
     FrameSupportWeightsPerDispatchClassWeightsPerClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;
     FrameSupportWeightsRuntimeDbWeight: FrameSupportWeightsRuntimeDbWeight;
     FrameSystemAccountInfo: FrameSystemAccountInfo;
@@ -1375,6 +1378,8 @@
     WeightMultiplier: WeightMultiplier;
     WeightPerClass: WeightPerClass;
     WeightToFeeCoefficient: WeightToFeeCoefficient;
+    WeightV1: WeightV1;
+    WeightV2: WeightV2;
     WildFungibility: WildFungibility;
     WildFungibilityV0: WildFungibilityV0;
     WildFungibilityV1: WildFungibilityV1;
modifiedtests/src/interfaces/default/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/default/types.ts
+++ b/tests/src/interfaces/default/types.ts
@@ -3,7 +3,7 @@
 
 import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { ITuple } from '@polkadot/types-codec/types';
-import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';
+import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime';
 import type { Event } from '@polkadot/types/interfaces/system';
 
 /** @name CumulusPalletDmpQueueCall */
@@ -11,14 +11,14 @@
   readonly isServiceOverweight: boolean;
   readonly asServiceOverweight: {
     readonly index: u64;
-    readonly weightLimit: u64;
+    readonly weightLimit: Weight;
   } & Struct;
   readonly type: 'ServiceOverweight';
 }
 
 /** @name CumulusPalletDmpQueueConfigData */
 export interface CumulusPalletDmpQueueConfigData extends Struct {
-  readonly maxIndividual: u64;
+  readonly maxIndividual: Weight;
 }
 
 /** @name CumulusPalletDmpQueueError */
@@ -46,19 +46,19 @@
   readonly isWeightExhausted: boolean;
   readonly asWeightExhausted: {
     readonly messageId: U8aFixed;
-    readonly remainingWeight: u64;
-    readonly requiredWeight: u64;
+    readonly remainingWeight: Weight;
+    readonly requiredWeight: Weight;
   } & Struct;
   readonly isOverweightEnqueued: boolean;
   readonly asOverweightEnqueued: {
     readonly messageId: U8aFixed;
     readonly overweightIndex: u64;
-    readonly requiredWeight: u64;
+    readonly requiredWeight: Weight;
   } & Struct;
   readonly isOverweightServiced: boolean;
   readonly asOverweightServiced: {
     readonly overweightIndex: u64;
-    readonly weightUsed: u64;
+    readonly weightUsed: Weight;
   } & Struct;
   readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';
 }
@@ -122,7 +122,7 @@
   } & Struct;
   readonly isDownwardMessagesProcessed: boolean;
   readonly asDownwardMessagesProcessed: {
-    readonly weightUsed: u64;
+    readonly weightUsed: Weight;
     readonly dmqHead: H256;
   } & Struct;
   readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';
@@ -166,7 +166,7 @@
   readonly isServiceOverweight: boolean;
   readonly asServiceOverweight: {
     readonly index: u64;
-    readonly weightLimit: u64;
+    readonly weightLimit: Weight;
   } & Struct;
   readonly isSuspendXcmExecution: boolean;
   readonly isResumeXcmExecution: boolean;
@@ -184,15 +184,15 @@
   } & Struct;
   readonly isUpdateThresholdWeight: boolean;
   readonly asUpdateThresholdWeight: {
-    readonly new_: u64;
+    readonly new_: Weight;
   } & Struct;
   readonly isUpdateWeightRestrictDecay: boolean;
   readonly asUpdateWeightRestrictDecay: {
-    readonly new_: u64;
+    readonly new_: Weight;
   } & Struct;
   readonly isUpdateXcmpMaxIndividualWeight: boolean;
   readonly asUpdateXcmpMaxIndividualWeight: {
-    readonly new_: u64;
+    readonly new_: Weight;
   } & Struct;
   readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';
 }
@@ -212,13 +212,13 @@
   readonly isSuccess: boolean;
   readonly asSuccess: {
     readonly messageHash: Option<H256>;
-    readonly weight: u64;
+    readonly weight: Weight;
   } & Struct;
   readonly isFail: boolean;
   readonly asFail: {
     readonly messageHash: Option<H256>;
     readonly error: XcmV2TraitsError;
-    readonly weight: u64;
+    readonly weight: Weight;
   } & Struct;
   readonly isBadVersion: boolean;
   readonly asBadVersion: {
@@ -241,12 +241,12 @@
     readonly sender: u32;
     readonly sentAt: u32;
     readonly index: u64;
-    readonly required: u64;
+    readonly required: Weight;
   } & Struct;
   readonly isOverweightServiced: boolean;
   readonly asOverweightServiced: {
     readonly index: u64;
-    readonly used: u64;
+    readonly used: Weight;
   } & Struct;
   readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';
 }
@@ -286,9 +286,9 @@
   readonly suspendThreshold: u32;
   readonly dropThreshold: u32;
   readonly resumeThreshold: u32;
-  readonly thresholdWeight: u64;
-  readonly weightRestrictDecay: u64;
-  readonly xcmpMaxIndividualWeight: u64;
+  readonly thresholdWeight: Weight;
+  readonly weightRestrictDecay: Weight;
+  readonly xcmpMaxIndividualWeight: Weight;
 }
 
 /** @name CumulusPrimitivesParachainInherentParachainInherentData */
@@ -546,7 +546,7 @@
 
 /** @name FrameSupportWeightsDispatchInfo */
 export interface FrameSupportWeightsDispatchInfo extends Struct {
-  readonly weight: u64;
+  readonly weight: Weight;
   readonly class: FrameSupportWeightsDispatchClass;
   readonly paysFee: FrameSupportWeightsPays;
 }
@@ -565,11 +565,11 @@
   readonly mandatory: u32;
 }
 
-/** @name FrameSupportWeightsPerDispatchClassU64 */
-export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {
-  readonly normal: u64;
-  readonly operational: u64;
-  readonly mandatory: u64;
+/** @name FrameSupportWeightsPerDispatchClassWeight */
+export interface FrameSupportWeightsPerDispatchClassWeight extends Struct {
+  readonly normal: Weight;
+  readonly operational: Weight;
+  readonly mandatory: Weight;
 }
 
 /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass */
@@ -710,17 +710,17 @@
 
 /** @name FrameSystemLimitsBlockWeights */
 export interface FrameSystemLimitsBlockWeights extends Struct {
-  readonly baseBlock: u64;
-  readonly maxBlock: u64;
+  readonly baseBlock: Weight;
+  readonly maxBlock: Weight;
   readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;
 }
 
 /** @name FrameSystemLimitsWeightsPerClass */
 export interface FrameSystemLimitsWeightsPerClass extends Struct {
-  readonly baseExtrinsic: u64;
-  readonly maxExtrinsic: Option<u64>;
-  readonly maxTotal: Option<u64>;
-  readonly reserved: Option<u64>;
+  readonly baseExtrinsic: Weight;
+  readonly maxExtrinsic: Option<Weight>;
+  readonly maxTotal: Option<Weight>;
+  readonly reserved: Option<Weight>;
 }
 
 /** @name FrameSystemPhase */
@@ -1929,7 +1929,7 @@
   readonly isSudoUncheckedWeight: boolean;
   readonly asSudoUncheckedWeight: {
     readonly call: Call;
-    readonly weight: u64;
+    readonly weight: Weight;
   } & Struct;
   readonly isSetKey: boolean;
   readonly asSetKey: {
@@ -2372,7 +2372,7 @@
   readonly isExecute: boolean;
   readonly asExecute: {
     readonly message: XcmVersionedXcm;
-    readonly maxWeight: u64;
+    readonly maxWeight: Weight;
   } & Struct;
   readonly isForceXcmVersion: boolean;
   readonly asForceXcmVersion: {
@@ -2441,7 +2441,7 @@
   readonly isNotified: boolean;
   readonly asNotified: ITuple<[u64, u8, u8]>;
   readonly isNotifyOverweight: boolean;
-  readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;
+  readonly asNotifyOverweight: ITuple<[u64, u8, u8, Weight, Weight]>;
   readonly isNotifyDispatchError: boolean;
   readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;
   readonly isNotifyDecodeFailed: boolean;
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -24,21 +24,21 @@
     feeFrozen: 'u128'
   },
   /**
-   * Lookup7: frame_support::weights::PerDispatchClass<T>
+   * Lookup7: frame_support::weights::PerDispatchClass<frame_support::weights::weight_v2::Weight>
    **/
-  FrameSupportWeightsPerDispatchClassU64: {
-    normal: 'u64',
-    operational: 'u64',
-    mandatory: 'u64'
+  FrameSupportWeightsPerDispatchClassWeight: {
+    normal: 'Weight',
+    operational: 'Weight',
+    mandatory: 'Weight'
   },
   /**
-   * Lookup11: sp_runtime::generic::digest::Digest
+   * Lookup12: sp_runtime::generic::digest::Digest
    **/
   SpRuntimeDigest: {
     logs: 'Vec<SpRuntimeDigestDigestItem>'
   },
   /**
-   * Lookup13: sp_runtime::generic::digest::DigestItem
+   * Lookup14: sp_runtime::generic::digest::DigestItem
    **/
   SpRuntimeDigestDigestItem: {
     _enum: {
@@ -54,7 +54,7 @@
     }
   },
   /**
-   * Lookup16: frame_system::EventRecord<opal_runtime::Event, primitive_types::H256>
+   * Lookup17: frame_system::EventRecord<opal_runtime::Event, primitive_types::H256>
    **/
   FrameSystemEventRecord: {
     phase: 'FrameSystemPhase',
@@ -62,7 +62,7 @@
     topics: 'Vec<H256>'
   },
   /**
-   * Lookup18: frame_system::pallet::Event<T>
+   * Lookup19: frame_system::pallet::Event<T>
    **/
   FrameSystemEvent: {
     _enum: {
@@ -90,27 +90,27 @@
     }
   },
   /**
-   * Lookup19: frame_support::weights::DispatchInfo
+   * Lookup20: frame_support::weights::DispatchInfo
    **/
   FrameSupportWeightsDispatchInfo: {
-    weight: 'u64',
+    weight: 'Weight',
     class: 'FrameSupportWeightsDispatchClass',
     paysFee: 'FrameSupportWeightsPays'
   },
   /**
-   * Lookup20: frame_support::weights::DispatchClass
+   * Lookup21: frame_support::weights::DispatchClass
    **/
   FrameSupportWeightsDispatchClass: {
     _enum: ['Normal', 'Operational', 'Mandatory']
   },
   /**
-   * Lookup21: frame_support::weights::Pays
+   * Lookup22: frame_support::weights::Pays
    **/
   FrameSupportWeightsPays: {
     _enum: ['Yes', 'No']
   },
   /**
-   * Lookup22: sp_runtime::DispatchError
+   * Lookup23: sp_runtime::DispatchError
    **/
   SpRuntimeDispatchError: {
     _enum: {
@@ -127,32 +127,32 @@
     }
   },
   /**
-   * Lookup23: sp_runtime::ModuleError
+   * Lookup24: sp_runtime::ModuleError
    **/
   SpRuntimeModuleError: {
     index: 'u8',
     error: '[u8;4]'
   },
   /**
-   * Lookup24: sp_runtime::TokenError
+   * Lookup25: sp_runtime::TokenError
    **/
   SpRuntimeTokenError: {
     _enum: ['NoFunds', 'WouldDie', 'BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen', 'Unsupported']
   },
   /**
-   * Lookup25: sp_runtime::ArithmeticError
+   * Lookup26: sp_runtime::ArithmeticError
    **/
   SpRuntimeArithmeticError: {
     _enum: ['Underflow', 'Overflow', 'DivisionByZero']
   },
   /**
-   * Lookup26: sp_runtime::TransactionalError
+   * Lookup27: sp_runtime::TransactionalError
    **/
   SpRuntimeTransactionalError: {
     _enum: ['LimitReached', 'NoLayer']
   },
   /**
-   * Lookup27: cumulus_pallet_parachain_system::pallet::Event<T>
+   * Lookup28: cumulus_pallet_parachain_system::pallet::Event<T>
    **/
   CumulusPalletParachainSystemEvent: {
     _enum: {
@@ -168,13 +168,13 @@
         count: 'u32',
       },
       DownwardMessagesProcessed: {
-        weightUsed: 'u64',
+        weightUsed: 'Weight',
         dmqHead: 'H256'
       }
     }
   },
   /**
-   * Lookup28: pallet_balances::pallet::Event<T, I>
+   * Lookup29: pallet_balances::pallet::Event<T, I>
    **/
   PalletBalancesEvent: {
     _enum: {
@@ -225,13 +225,13 @@
     }
   },
   /**
-   * Lookup29: frame_support::traits::tokens::misc::BalanceStatus
+   * Lookup30: frame_support::traits::tokens::misc::BalanceStatus
    **/
   FrameSupportTokensMiscBalanceStatus: {
     _enum: ['Free', 'Reserved']
   },
   /**
-   * Lookup30: pallet_transaction_payment::pallet::Event<T>
+   * Lookup31: pallet_transaction_payment::pallet::Event<T>
    **/
   PalletTransactionPaymentEvent: {
     _enum: {
@@ -243,7 +243,7 @@
     }
   },
   /**
-   * Lookup31: pallet_treasury::pallet::Event<T, I>
+   * Lookup32: pallet_treasury::pallet::Event<T, I>
    **/
   PalletTreasuryEvent: {
     _enum: {
@@ -279,7 +279,7 @@
     }
   },
   /**
-   * Lookup32: pallet_sudo::pallet::Event<T>
+   * Lookup33: pallet_sudo::pallet::Event<T>
    **/
   PalletSudoEvent: {
     _enum: {
@@ -295,7 +295,7 @@
     }
   },
   /**
-   * Lookup36: orml_vesting::module::Event<T>
+   * Lookup37: orml_vesting::module::Event<T>
    **/
   OrmlVestingModuleEvent: {
     _enum: {
@@ -314,7 +314,7 @@
     }
   },
   /**
-   * Lookup37: orml_vesting::VestingSchedule<BlockNumber, Balance>
+   * Lookup38: orml_vesting::VestingSchedule<BlockNumber, Balance>
    **/
   OrmlVestingVestingSchedule: {
     start: 'u32',
@@ -323,7 +323,7 @@
     perPeriod: 'Compact<u128>'
   },
   /**
-   * Lookup39: orml_xtokens::module::Event<T>
+   * Lookup40: orml_xtokens::module::Event<T>
    **/
   OrmlXtokensModuleEvent: {
     _enum: {
@@ -336,18 +336,18 @@
     }
   },
   /**
-   * Lookup40: xcm::v1::multiasset::MultiAssets
+   * Lookup41: xcm::v1::multiasset::MultiAssets
    **/
   XcmV1MultiassetMultiAssets: 'Vec<XcmV1MultiAsset>',
   /**
-   * Lookup42: xcm::v1::multiasset::MultiAsset
+   * Lookup43: xcm::v1::multiasset::MultiAsset
    **/
   XcmV1MultiAsset: {
     id: 'XcmV1MultiassetAssetId',
     fun: 'XcmV1MultiassetFungibility'
   },
   /**
-   * Lookup43: xcm::v1::multiasset::AssetId
+   * Lookup44: xcm::v1::multiasset::AssetId
    **/
   XcmV1MultiassetAssetId: {
     _enum: {
@@ -356,14 +356,14 @@
     }
   },
   /**
-   * Lookup44: xcm::v1::multilocation::MultiLocation
+   * Lookup45: xcm::v1::multilocation::MultiLocation
    **/
   XcmV1MultiLocation: {
     parents: 'u8',
     interior: 'XcmV1MultilocationJunctions'
   },
   /**
-   * Lookup45: xcm::v1::multilocation::Junctions
+   * Lookup46: xcm::v1::multilocation::Junctions
    **/
   XcmV1MultilocationJunctions: {
     _enum: {
@@ -379,7 +379,7 @@
     }
   },
   /**
-   * Lookup46: xcm::v1::junction::Junction
+   * Lookup47: xcm::v1::junction::Junction
    **/
   XcmV1Junction: {
     _enum: {
@@ -407,7 +407,7 @@
     }
   },
   /**
-   * Lookup48: xcm::v0::junction::NetworkId
+   * Lookup49: xcm::v0::junction::NetworkId
    **/
   XcmV0JunctionNetworkId: {
     _enum: {
@@ -418,7 +418,7 @@
     }
   },
   /**
-   * Lookup52: xcm::v0::junction::BodyId
+   * Lookup53: xcm::v0::junction::BodyId
    **/
   XcmV0JunctionBodyId: {
     _enum: {
@@ -432,7 +432,7 @@
     }
   },
   /**
-   * Lookup53: xcm::v0::junction::BodyPart
+   * Lookup54: xcm::v0::junction::BodyPart
    **/
   XcmV0JunctionBodyPart: {
     _enum: {
@@ -455,7 +455,7 @@
     }
   },
   /**
-   * Lookup54: xcm::v1::multiasset::Fungibility
+   * Lookup55: xcm::v1::multiasset::Fungibility
    **/
   XcmV1MultiassetFungibility: {
     _enum: {
@@ -464,7 +464,7 @@
     }
   },
   /**
-   * Lookup55: xcm::v1::multiasset::AssetInstance
+   * Lookup56: xcm::v1::multiasset::AssetInstance
    **/
   XcmV1MultiassetAssetInstance: {
     _enum: {
@@ -478,7 +478,7 @@
     }
   },
   /**
-   * Lookup58: orml_tokens::module::Event<T>
+   * Lookup59: orml_tokens::module::Event<T>
    **/
   OrmlTokensModuleEvent: {
     _enum: {
@@ -555,7 +555,7 @@
     }
   },
   /**
-   * Lookup59: pallet_foreign_assets::AssetIds
+   * Lookup60: pallet_foreign_assets::AssetIds
    **/
   PalletForeignAssetsAssetIds: {
     _enum: {
@@ -564,24 +564,24 @@
     }
   },
   /**
-   * Lookup60: pallet_foreign_assets::NativeCurrency
+   * Lookup61: pallet_foreign_assets::NativeCurrency
    **/
   PalletForeignAssetsNativeCurrency: {
     _enum: ['Here', 'Parent']
   },
   /**
-   * Lookup61: cumulus_pallet_xcmp_queue::pallet::Event<T>
+   * Lookup62: cumulus_pallet_xcmp_queue::pallet::Event<T>
    **/
   CumulusPalletXcmpQueueEvent: {
     _enum: {
       Success: {
         messageHash: 'Option<H256>',
-        weight: 'u64',
+        weight: 'Weight',
       },
       Fail: {
         messageHash: 'Option<H256>',
         error: 'XcmV2TraitsError',
-        weight: 'u64',
+        weight: 'Weight',
       },
       BadVersion: {
         messageHash: 'Option<H256>',
@@ -599,16 +599,16 @@
         sender: 'u32',
         sentAt: 'u32',
         index: 'u64',
-        required: 'u64',
+        required: 'Weight',
       },
       OverweightServiced: {
         index: 'u64',
-        used: 'u64'
+        used: 'Weight'
       }
     }
   },
   /**
-   * Lookup63: xcm::v2::traits::Error
+   * Lookup64: xcm::v2::traits::Error
    **/
   XcmV2TraitsError: {
     _enum: {
@@ -641,7 +641,7 @@
     }
   },
   /**
-   * Lookup65: pallet_xcm::pallet::Event<T>
+   * Lookup66: pallet_xcm::pallet::Event<T>
    **/
   PalletXcmEvent: {
     _enum: {
@@ -650,7 +650,7 @@
       UnexpectedResponse: '(XcmV1MultiLocation,u64)',
       ResponseReady: '(u64,XcmV2Response)',
       Notified: '(u64,u8,u8)',
-      NotifyOverweight: '(u64,u8,u8,u64,u64)',
+      NotifyOverweight: '(u64,u8,u8,Weight,Weight)',
       NotifyDispatchError: '(u64,u8,u8)',
       NotifyDecodeFailed: '(u64,u8,u8)',
       InvalidResponder: '(XcmV1MultiLocation,u64,Option<XcmV1MultiLocation>)',
@@ -664,7 +664,7 @@
     }
   },
   /**
-   * Lookup66: xcm::v2::traits::Outcome
+   * Lookup67: xcm::v2::traits::Outcome
    **/
   XcmV2TraitsOutcome: {
     _enum: {
@@ -674,11 +674,11 @@
     }
   },
   /**
-   * Lookup67: xcm::v2::Xcm<Call>
+   * Lookup68: xcm::v2::Xcm<Call>
    **/
   XcmV2Xcm: 'Vec<XcmV2Instruction>',
   /**
-   * Lookup69: xcm::v2::Instruction<Call>
+   * Lookup70: xcm::v2::Instruction<Call>
    **/
   XcmV2Instruction: {
     _enum: {
@@ -776,7 +776,7 @@
     }
   },
   /**
-   * Lookup70: xcm::v2::Response
+   * Lookup71: xcm::v2::Response
    **/
   XcmV2Response: {
     _enum: {
@@ -787,19 +787,19 @@
     }
   },
   /**
-   * Lookup73: xcm::v0::OriginKind
+   * Lookup74: xcm::v0::OriginKind
    **/
   XcmV0OriginKind: {
     _enum: ['Native', 'SovereignAccount', 'Superuser', 'Xcm']
   },
   /**
-   * Lookup74: xcm::double_encoded::DoubleEncoded<T>
+   * Lookup75: xcm::double_encoded::DoubleEncoded<T>
    **/
   XcmDoubleEncoded: {
     encoded: 'Bytes'
   },
   /**
-   * Lookup75: xcm::v1::multiasset::MultiAssetFilter
+   * Lookup76: xcm::v1::multiasset::MultiAssetFilter
    **/
   XcmV1MultiassetMultiAssetFilter: {
     _enum: {
@@ -808,7 +808,7 @@
     }
   },
   /**
-   * Lookup76: xcm::v1::multiasset::WildMultiAsset
+   * Lookup77: xcm::v1::multiasset::WildMultiAsset
    **/
   XcmV1MultiassetWildMultiAsset: {
     _enum: {
@@ -820,13 +820,13 @@
     }
   },
   /**
-   * Lookup77: xcm::v1::multiasset::WildFungibility
+   * Lookup78: xcm::v1::multiasset::WildFungibility
    **/
   XcmV1MultiassetWildFungibility: {
     _enum: ['Fungible', 'NonFungible']
   },
   /**
-   * Lookup78: xcm::v2::WeightLimit
+   * Lookup79: xcm::v2::WeightLimit
    **/
   XcmV2WeightLimit: {
     _enum: {
@@ -835,7 +835,7 @@
     }
   },
   /**
-   * Lookup80: xcm::VersionedMultiAssets
+   * Lookup81: xcm::VersionedMultiAssets
    **/
   XcmVersionedMultiAssets: {
     _enum: {
@@ -844,7 +844,7 @@
     }
   },
   /**
-   * Lookup82: xcm::v0::multi_asset::MultiAsset
+   * Lookup83: xcm::v0::multi_asset::MultiAsset
    **/
   XcmV0MultiAsset: {
     _enum: {
@@ -883,7 +883,7 @@
     }
   },
   /**
-   * Lookup83: xcm::v0::multi_location::MultiLocation
+   * Lookup84: xcm::v0::multi_location::MultiLocation
    **/
   XcmV0MultiLocation: {
     _enum: {
@@ -899,7 +899,7 @@
     }
   },
   /**
-   * Lookup84: xcm::v0::junction::Junction
+   * Lookup85: xcm::v0::junction::Junction
    **/
   XcmV0Junction: {
     _enum: {
@@ -928,7 +928,7 @@
     }
   },
   /**
-   * Lookup85: xcm::VersionedMultiLocation
+   * Lookup86: xcm::VersionedMultiLocation
    **/
   XcmVersionedMultiLocation: {
     _enum: {
@@ -937,7 +937,7 @@
     }
   },
   /**
-   * Lookup86: cumulus_pallet_xcm::pallet::Event<T>
+   * Lookup87: cumulus_pallet_xcm::pallet::Event<T>
    **/
   CumulusPalletXcmEvent: {
     _enum: {
@@ -947,7 +947,7 @@
     }
   },
   /**
-   * Lookup87: cumulus_pallet_dmp_queue::pallet::Event<T>
+   * Lookup88: cumulus_pallet_dmp_queue::pallet::Event<T>
    **/
   CumulusPalletDmpQueueEvent: {
     _enum: {
@@ -963,22 +963,22 @@
       },
       WeightExhausted: {
         messageId: '[u8;32]',
-        remainingWeight: 'u64',
-        requiredWeight: 'u64',
+        remainingWeight: 'Weight',
+        requiredWeight: 'Weight',
       },
       OverweightEnqueued: {
         messageId: '[u8;32]',
         overweightIndex: 'u64',
-        requiredWeight: 'u64',
+        requiredWeight: 'Weight',
       },
       OverweightServiced: {
         overweightIndex: 'u64',
-        weightUsed: 'u64'
+        weightUsed: 'Weight'
       }
     }
   },
   /**
-   * Lookup88: pallet_unique::RawEvent<sp_core::crypto::AccountId32, pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup89: pallet_unique::RawEvent<sp_core::crypto::AccountId32, pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   PalletUniqueRawEvent: {
     _enum: {
@@ -995,7 +995,7 @@
     }
   },
   /**
-   * Lookup89: pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>
+   * Lookup90: pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>
    **/
   PalletEvmAccountBasicCrossAccountIdRepr: {
     _enum: {
@@ -1004,7 +1004,7 @@
     }
   },
   /**
-   * Lookup92: pallet_unique_scheduler::pallet::Event<T>
+   * Lookup93: pallet_unique_scheduler::pallet::Event<T>
    **/
   PalletUniqueSchedulerEvent: {
     _enum: {
@@ -1029,13 +1029,13 @@
     }
   },
   /**
-   * Lookup95: frame_support::traits::schedule::LookupError
+   * Lookup96: frame_support::traits::schedule::LookupError
    **/
   FrameSupportScheduleLookupError: {
     _enum: ['Unknown', 'BadFormat']
   },
   /**
-   * Lookup96: pallet_common::pallet::Event<T>
+   * Lookup97: pallet_common::pallet::Event<T>
    **/
   PalletCommonEvent: {
     _enum: {
@@ -1053,7 +1053,7 @@
     }
   },
   /**
-   * Lookup99: pallet_structure::pallet::Event<T>
+   * Lookup100: pallet_structure::pallet::Event<T>
    **/
   PalletStructureEvent: {
     _enum: {
@@ -1061,7 +1061,7 @@
     }
   },
   /**
-   * Lookup100: pallet_rmrk_core::pallet::Event<T>
+   * Lookup101: pallet_rmrk_core::pallet::Event<T>
    **/
   PalletRmrkCoreEvent: {
     _enum: {
@@ -1138,7 +1138,7 @@
     }
   },
   /**
-   * Lookup101: rmrk_traits::nft::AccountIdOrCollectionNftTuple<sp_core::crypto::AccountId32>
+   * Lookup102: rmrk_traits::nft::AccountIdOrCollectionNftTuple<sp_core::crypto::AccountId32>
    **/
   RmrkTraitsNftAccountIdOrCollectionNftTuple: {
     _enum: {
@@ -1147,7 +1147,7 @@
     }
   },
   /**
-   * Lookup106: pallet_rmrk_equip::pallet::Event<T>
+   * Lookup107: pallet_rmrk_equip::pallet::Event<T>
    **/
   PalletRmrkEquipEvent: {
     _enum: {
@@ -1162,7 +1162,7 @@
     }
   },
   /**
-   * Lookup107: pallet_app_promotion::pallet::Event<T>
+   * Lookup108: pallet_app_promotion::pallet::Event<T>
    **/
   PalletAppPromotionEvent: {
     _enum: {
@@ -1173,7 +1173,7 @@
     }
   },
   /**
-   * Lookup108: pallet_foreign_assets::module::Event<T>
+   * Lookup109: pallet_foreign_assets::module::Event<T>
    **/
   PalletForeignAssetsModuleEvent: {
     _enum: {
@@ -1198,7 +1198,7 @@
     }
   },
   /**
-   * Lookup109: pallet_foreign_assets::module::AssetMetadata<Balance>
+   * Lookup110: pallet_foreign_assets::module::AssetMetadata<Balance>
    **/
   PalletForeignAssetsModuleAssetMetadata: {
     name: 'Bytes',
@@ -1207,7 +1207,7 @@
     minimalBalance: 'u128'
   },
   /**
-   * Lookup110: pallet_evm::pallet::Event<T>
+   * Lookup111: pallet_evm::pallet::Event<T>
    **/
   PalletEvmEvent: {
     _enum: {
@@ -1221,7 +1221,7 @@
     }
   },
   /**
-   * Lookup111: ethereum::log::Log
+   * Lookup112: ethereum::log::Log
    **/
   EthereumLog: {
     address: 'H160',
@@ -1229,7 +1229,7 @@
     data: 'Bytes'
   },
   /**
-   * Lookup115: pallet_ethereum::pallet::Event
+   * Lookup116: pallet_ethereum::pallet::Event
    **/
   PalletEthereumEvent: {
     _enum: {
@@ -1237,7 +1237,7 @@
     }
   },
   /**
-   * Lookup116: evm_core::error::ExitReason
+   * Lookup117: evm_core::error::ExitReason
    **/
   EvmCoreErrorExitReason: {
     _enum: {
@@ -1248,13 +1248,13 @@
     }
   },
   /**
-   * Lookup117: evm_core::error::ExitSucceed
+   * Lookup118: evm_core::error::ExitSucceed
    **/
   EvmCoreErrorExitSucceed: {
     _enum: ['Stopped', 'Returned', 'Suicided']
   },
   /**
-   * Lookup118: evm_core::error::ExitError
+   * Lookup119: evm_core::error::ExitError
    **/
   EvmCoreErrorExitError: {
     _enum: {
@@ -1276,13 +1276,13 @@
     }
   },
   /**
-   * Lookup121: evm_core::error::ExitRevert
+   * Lookup122: evm_core::error::ExitRevert
    **/
   EvmCoreErrorExitRevert: {
     _enum: ['Reverted']
   },
   /**
-   * Lookup122: evm_core::error::ExitFatal
+   * Lookup123: evm_core::error::ExitFatal
    **/
   EvmCoreErrorExitFatal: {
     _enum: {
@@ -1293,7 +1293,7 @@
     }
   },
   /**
-   * Lookup123: pallet_evm_contract_helpers::pallet::Event<T>
+   * Lookup124: pallet_evm_contract_helpers::pallet::Event<T>
    **/
   PalletEvmContractHelpersEvent: {
     _enum: {
@@ -1303,7 +1303,7 @@
     }
   },
   /**
-   * Lookup124: frame_system::Phase
+   * Lookup125: frame_system::Phase
    **/
   FrameSystemPhase: {
     _enum: {
@@ -1313,14 +1313,14 @@
     }
   },
   /**
-   * Lookup126: frame_system::LastRuntimeUpgradeInfo
+   * Lookup127: frame_system::LastRuntimeUpgradeInfo
    **/
   FrameSystemLastRuntimeUpgradeInfo: {
     specVersion: 'Compact<u32>',
     specName: 'Text'
   },
   /**
-   * Lookup127: frame_system::pallet::Call<T>
+   * Lookup128: frame_system::pallet::Call<T>
    **/
   FrameSystemCall: {
     _enum: {
@@ -1358,15 +1358,15 @@
     }
   },
   /**
-   * Lookup132: frame_system::limits::BlockWeights
+   * Lookup133: frame_system::limits::BlockWeights
    **/
   FrameSystemLimitsBlockWeights: {
-    baseBlock: 'u64',
-    maxBlock: 'u64',
+    baseBlock: 'Weight',
+    maxBlock: 'Weight',
     perClass: 'FrameSupportWeightsPerDispatchClassWeightsPerClass'
   },
   /**
-   * Lookup133: frame_support::weights::PerDispatchClass<frame_system::limits::WeightsPerClass>
+   * Lookup134: frame_support::weights::PerDispatchClass<frame_system::limits::WeightsPerClass>
    **/
   FrameSupportWeightsPerDispatchClassWeightsPerClass: {
     normal: 'FrameSystemLimitsWeightsPerClass',
@@ -1374,22 +1374,22 @@
     mandatory: 'FrameSystemLimitsWeightsPerClass'
   },
   /**
-   * Lookup134: frame_system::limits::WeightsPerClass
+   * Lookup135: frame_system::limits::WeightsPerClass
    **/
   FrameSystemLimitsWeightsPerClass: {
-    baseExtrinsic: 'u64',
-    maxExtrinsic: 'Option<u64>',
-    maxTotal: 'Option<u64>',
-    reserved: 'Option<u64>'
+    baseExtrinsic: 'Weight',
+    maxExtrinsic: 'Option<Weight>',
+    maxTotal: 'Option<Weight>',
+    reserved: 'Option<Weight>'
   },
   /**
-   * Lookup136: frame_system::limits::BlockLength
+   * Lookup137: frame_system::limits::BlockLength
    **/
   FrameSystemLimitsBlockLength: {
     max: 'FrameSupportWeightsPerDispatchClassU32'
   },
   /**
-   * Lookup137: frame_support::weights::PerDispatchClass<T>
+   * Lookup138: frame_support::weights::PerDispatchClass<T>
    **/
   FrameSupportWeightsPerDispatchClassU32: {
     normal: 'u32',
@@ -1397,14 +1397,14 @@
     mandatory: 'u32'
   },
   /**
-   * Lookup138: frame_support::weights::RuntimeDbWeight
+   * Lookup139: frame_support::weights::RuntimeDbWeight
    **/
   FrameSupportWeightsRuntimeDbWeight: {
     read: 'u64',
     write: 'u64'
   },
   /**
-   * Lookup139: sp_version::RuntimeVersion
+   * Lookup140: sp_version::RuntimeVersion
    **/
   SpVersionRuntimeVersion: {
     specName: 'Text',
@@ -1417,13 +1417,13 @@
     stateVersion: 'u8'
   },
   /**
-   * Lookup144: frame_system::pallet::Error<T>
+   * Lookup145: frame_system::pallet::Error<T>
    **/
   FrameSystemError: {
     _enum: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered']
   },
   /**
-   * Lookup145: polkadot_primitives::v2::PersistedValidationData<primitive_types::H256, N>
+   * Lookup146: polkadot_primitives::v2::PersistedValidationData<primitive_types::H256, N>
    **/
   PolkadotPrimitivesV2PersistedValidationData: {
     parentHead: 'Bytes',
@@ -1432,19 +1432,19 @@
     maxPovSize: 'u32'
   },
   /**
-   * Lookup148: polkadot_primitives::v2::UpgradeRestriction
+   * Lookup149: polkadot_primitives::v2::UpgradeRestriction
    **/
   PolkadotPrimitivesV2UpgradeRestriction: {
     _enum: ['Present']
   },
   /**
-   * Lookup149: sp_trie::storage_proof::StorageProof
+   * Lookup150: sp_trie::storage_proof::StorageProof
    **/
   SpTrieStorageProof: {
     trieNodes: 'BTreeSet<Bytes>'
   },
   /**
-   * Lookup151: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot
+   * Lookup152: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot
    **/
   CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot: {
     dmqMqcHead: 'H256',
@@ -1453,7 +1453,7 @@
     egressChannels: 'Vec<(u32,PolkadotPrimitivesV2AbridgedHrmpChannel)>'
   },
   /**
-   * Lookup154: polkadot_primitives::v2::AbridgedHrmpChannel
+   * Lookup155: polkadot_primitives::v2::AbridgedHrmpChannel
    **/
   PolkadotPrimitivesV2AbridgedHrmpChannel: {
     maxCapacity: 'u32',
@@ -1464,7 +1464,7 @@
     mqcHead: 'Option<H256>'
   },
   /**
-   * Lookup155: polkadot_primitives::v2::AbridgedHostConfiguration
+   * Lookup156: polkadot_primitives::v2::AbridgedHostConfiguration
    **/
   PolkadotPrimitivesV2AbridgedHostConfiguration: {
     maxCodeSize: 'u32',
@@ -1478,14 +1478,14 @@
     validationUpgradeDelay: 'u32'
   },
   /**
-   * Lookup161: polkadot_core_primitives::OutboundHrmpMessage<polkadot_parachain::primitives::Id>
+   * Lookup162: polkadot_core_primitives::OutboundHrmpMessage<polkadot_parachain::primitives::Id>
    **/
   PolkadotCorePrimitivesOutboundHrmpMessage: {
     recipient: 'u32',
     data: 'Bytes'
   },
   /**
-   * Lookup162: cumulus_pallet_parachain_system::pallet::Call<T>
+   * Lookup163: cumulus_pallet_parachain_system::pallet::Call<T>
    **/
   CumulusPalletParachainSystemCall: {
     _enum: {
@@ -1504,7 +1504,7 @@
     }
   },
   /**
-   * Lookup163: cumulus_primitives_parachain_inherent::ParachainInherentData
+   * Lookup164: cumulus_primitives_parachain_inherent::ParachainInherentData
    **/
   CumulusPrimitivesParachainInherentParachainInherentData: {
     validationData: 'PolkadotPrimitivesV2PersistedValidationData',
@@ -1513,27 +1513,27 @@
     horizontalMessages: 'BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>'
   },
   /**
-   * Lookup165: polkadot_core_primitives::InboundDownwardMessage<BlockNumber>
+   * Lookup166: polkadot_core_primitives::InboundDownwardMessage<BlockNumber>
    **/
   PolkadotCorePrimitivesInboundDownwardMessage: {
     sentAt: 'u32',
     msg: 'Bytes'
   },
   /**
-   * Lookup168: polkadot_core_primitives::InboundHrmpMessage<BlockNumber>
+   * Lookup169: polkadot_core_primitives::InboundHrmpMessage<BlockNumber>
    **/
   PolkadotCorePrimitivesInboundHrmpMessage: {
     sentAt: 'u32',
     data: 'Bytes'
   },
   /**
-   * Lookup171: cumulus_pallet_parachain_system::pallet::Error<T>
+   * Lookup172: cumulus_pallet_parachain_system::pallet::Error<T>
    **/
   CumulusPalletParachainSystemError: {
     _enum: ['OverlappingUpgrades', 'ProhibitedByPolkadot', 'TooBig', 'ValidationDataNotAvailable', 'HostConfigurationNotAvailable', 'NotScheduled', 'NothingAuthorized', 'Unauthorized']
   },
   /**
-   * Lookup173: pallet_balances::BalanceLock<Balance>
+   * Lookup174: pallet_balances::BalanceLock<Balance>
    **/
   PalletBalancesBalanceLock: {
     id: '[u8;8]',
@@ -1541,26 +1541,26 @@
     reasons: 'PalletBalancesReasons'
   },
   /**
-   * Lookup174: pallet_balances::Reasons
+   * Lookup175: pallet_balances::Reasons
    **/
   PalletBalancesReasons: {
     _enum: ['Fee', 'Misc', 'All']
   },
   /**
-   * Lookup177: pallet_balances::ReserveData<ReserveIdentifier, Balance>
+   * Lookup178: pallet_balances::ReserveData<ReserveIdentifier, Balance>
    **/
   PalletBalancesReserveData: {
     id: '[u8;16]',
     amount: 'u128'
   },
   /**
-   * Lookup179: pallet_balances::Releases
+   * Lookup180: pallet_balances::Releases
    **/
   PalletBalancesReleases: {
     _enum: ['V1_0_0', 'V2_0_0']
   },
   /**
-   * Lookup180: pallet_balances::pallet::Call<T, I>
+   * Lookup181: pallet_balances::pallet::Call<T, I>
    **/
   PalletBalancesCall: {
     _enum: {
@@ -1593,13 +1593,13 @@
     }
   },
   /**
-   * Lookup183: pallet_balances::pallet::Error<T, I>
+   * Lookup184: pallet_balances::pallet::Error<T, I>
    **/
   PalletBalancesError: {
     _enum: ['VestingBalance', 'LiquidityRestrictions', 'InsufficientBalance', 'ExistentialDeposit', 'KeepAlive', 'ExistingVestingSchedule', 'DeadAccount', 'TooManyReserves']
   },
   /**
-   * Lookup185: pallet_timestamp::pallet::Call<T>
+   * Lookup186: pallet_timestamp::pallet::Call<T>
    **/
   PalletTimestampCall: {
     _enum: {
@@ -1609,13 +1609,13 @@
     }
   },
   /**
-   * Lookup187: pallet_transaction_payment::Releases
+   * Lookup188: pallet_transaction_payment::Releases
    **/
   PalletTransactionPaymentReleases: {
     _enum: ['V1Ancient', 'V2']
   },
   /**
-   * Lookup188: pallet_treasury::Proposal<sp_core::crypto::AccountId32, Balance>
+   * Lookup189: pallet_treasury::Proposal<sp_core::crypto::AccountId32, Balance>
    **/
   PalletTreasuryProposal: {
     proposer: 'AccountId32',
@@ -1624,7 +1624,7 @@
     bond: 'u128'
   },
   /**
-   * Lookup191: pallet_treasury::pallet::Call<T, I>
+   * Lookup192: pallet_treasury::pallet::Call<T, I>
    **/
   PalletTreasuryCall: {
     _enum: {
@@ -1648,17 +1648,17 @@
     }
   },
   /**
-   * Lookup194: frame_support::PalletId
+   * Lookup195: frame_support::PalletId
    **/
   FrameSupportPalletId: '[u8;8]',
   /**
-   * Lookup195: pallet_treasury::pallet::Error<T, I>
+   * Lookup196: pallet_treasury::pallet::Error<T, I>
    **/
   PalletTreasuryError: {
     _enum: ['InsufficientProposersBalance', 'InvalidIndex', 'TooManyApprovals', 'InsufficientPermission', 'ProposalNotApproved']
   },
   /**
-   * Lookup196: pallet_sudo::pallet::Call<T>
+   * Lookup197: pallet_sudo::pallet::Call<T>
    **/
   PalletSudoCall: {
     _enum: {
@@ -1667,7 +1667,7 @@
       },
       sudo_unchecked_weight: {
         call: 'Call',
-        weight: 'u64',
+        weight: 'Weight',
       },
       set_key: {
         _alias: {
@@ -1682,7 +1682,7 @@
     }
   },
   /**
-   * Lookup198: orml_vesting::module::Call<T>
+   * Lookup199: orml_vesting::module::Call<T>
    **/
   OrmlVestingModuleCall: {
     _enum: {
@@ -1701,7 +1701,7 @@
     }
   },
   /**
-   * Lookup200: orml_xtokens::module::Call<T>
+   * Lookup201: orml_xtokens::module::Call<T>
    **/
   OrmlXtokensModuleCall: {
     _enum: {
@@ -1744,7 +1744,7 @@
     }
   },
   /**
-   * Lookup201: xcm::VersionedMultiAsset
+   * Lookup202: xcm::VersionedMultiAsset
    **/
   XcmVersionedMultiAsset: {
     _enum: {
@@ -1753,7 +1753,7 @@
     }
   },
   /**
-   * Lookup204: orml_tokens::module::Call<T>
+   * Lookup205: orml_tokens::module::Call<T>
    **/
   OrmlTokensModuleCall: {
     _enum: {
@@ -1787,13 +1787,13 @@
     }
   },
   /**
-   * Lookup205: cumulus_pallet_xcmp_queue::pallet::Call<T>
+   * Lookup206: cumulus_pallet_xcmp_queue::pallet::Call<T>
    **/
   CumulusPalletXcmpQueueCall: {
     _enum: {
       service_overweight: {
         index: 'u64',
-        weightLimit: 'u64',
+        weightLimit: 'Weight',
       },
       suspend_xcm_execution: 'Null',
       resume_xcm_execution: 'Null',
@@ -1819,24 +1819,24 @@
         _alias: {
           new_: 'new',
         },
-        new_: 'u64',
+        new_: 'Weight',
       },
       update_weight_restrict_decay: {
         _alias: {
           new_: 'new',
         },
-        new_: 'u64',
+        new_: 'Weight',
       },
       update_xcmp_max_individual_weight: {
         _alias: {
           new_: 'new',
         },
-        new_: 'u64'
+        new_: 'Weight'
       }
     }
   },
   /**
-   * Lookup206: pallet_xcm::pallet::Call<T>
+   * Lookup207: pallet_xcm::pallet::Call<T>
    **/
   PalletXcmCall: {
     _enum: {
@@ -1858,7 +1858,7 @@
       },
       execute: {
         message: 'XcmVersionedXcm',
-        maxWeight: 'u64',
+        maxWeight: 'Weight',
       },
       force_xcm_version: {
         location: 'XcmV1MultiLocation',
@@ -1890,7 +1890,7 @@
     }
   },
   /**
-   * Lookup207: xcm::VersionedXcm<Call>
+   * Lookup208: xcm::VersionedXcm<Call>
    **/
   XcmVersionedXcm: {
     _enum: {
@@ -1900,7 +1900,7 @@
     }
   },
   /**
-   * Lookup208: xcm::v0::Xcm<Call>
+   * Lookup209: xcm::v0::Xcm<Call>
    **/
   XcmV0Xcm: {
     _enum: {
@@ -1954,7 +1954,7 @@
     }
   },
   /**
-   * Lookup210: xcm::v0::order::Order<Call>
+   * Lookup211: xcm::v0::order::Order<Call>
    **/
   XcmV0Order: {
     _enum: {
@@ -1997,7 +1997,7 @@
     }
   },
   /**
-   * Lookup212: xcm::v0::Response
+   * Lookup213: xcm::v0::Response
    **/
   XcmV0Response: {
     _enum: {
@@ -2005,7 +2005,7 @@
     }
   },
   /**
-   * Lookup213: xcm::v1::Xcm<Call>
+   * Lookup214: xcm::v1::Xcm<Call>
    **/
   XcmV1Xcm: {
     _enum: {
@@ -2064,7 +2064,7 @@
     }
   },
   /**
-   * Lookup215: xcm::v1::order::Order<Call>
+   * Lookup216: xcm::v1::order::Order<Call>
    **/
   XcmV1Order: {
     _enum: {
@@ -2109,7 +2109,7 @@
     }
   },
   /**
-   * Lookup217: xcm::v1::Response
+   * Lookup218: xcm::v1::Response
    **/
   XcmV1Response: {
     _enum: {
@@ -2118,22 +2118,22 @@
     }
   },
   /**
-   * Lookup231: cumulus_pallet_xcm::pallet::Call<T>
+   * Lookup232: cumulus_pallet_xcm::pallet::Call<T>
    **/
   CumulusPalletXcmCall: 'Null',
   /**
-   * Lookup232: cumulus_pallet_dmp_queue::pallet::Call<T>
+   * Lookup233: cumulus_pallet_dmp_queue::pallet::Call<T>
    **/
   CumulusPalletDmpQueueCall: {
     _enum: {
       service_overweight: {
         index: 'u64',
-        weightLimit: 'u64'
+        weightLimit: 'Weight'
       }
     }
   },
   /**
-   * Lookup233: pallet_inflation::pallet::Call<T>
+   * Lookup234: pallet_inflation::pallet::Call<T>
    **/
   PalletInflationCall: {
     _enum: {
@@ -2143,7 +2143,7 @@
     }
   },
   /**
-   * Lookup234: pallet_unique::Call<T>
+   * Lookup235: pallet_unique::Call<T>
    **/
   PalletUniqueCall: {
     _enum: {
@@ -2275,7 +2275,7 @@
     }
   },
   /**
-   * Lookup239: up_data_structs::CollectionMode
+   * Lookup240: up_data_structs::CollectionMode
    **/
   UpDataStructsCollectionMode: {
     _enum: {
@@ -2285,7 +2285,7 @@
     }
   },
   /**
-   * Lookup240: up_data_structs::CreateCollectionData<sp_core::crypto::AccountId32>
+   * Lookup241: up_data_structs::CreateCollectionData<sp_core::crypto::AccountId32>
    **/
   UpDataStructsCreateCollectionData: {
     mode: 'UpDataStructsCollectionMode',
@@ -2300,13 +2300,13 @@
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup242: up_data_structs::AccessMode
+   * Lookup243: up_data_structs::AccessMode
    **/
   UpDataStructsAccessMode: {
     _enum: ['Normal', 'AllowList']
   },
   /**
-   * Lookup244: up_data_structs::CollectionLimits
+   * Lookup245: up_data_structs::CollectionLimits
    **/
   UpDataStructsCollectionLimits: {
     accountTokenOwnershipLimit: 'Option<u32>',
@@ -2320,7 +2320,7 @@
     transfersEnabled: 'Option<bool>'
   },
   /**
-   * Lookup246: up_data_structs::SponsoringRateLimit
+   * Lookup247: up_data_structs::SponsoringRateLimit
    **/
   UpDataStructsSponsoringRateLimit: {
     _enum: {
@@ -2329,7 +2329,7 @@
     }
   },
   /**
-   * Lookup249: up_data_structs::CollectionPermissions
+   * Lookup250: up_data_structs::CollectionPermissions
    **/
   UpDataStructsCollectionPermissions: {
     access: 'Option<UpDataStructsAccessMode>',
@@ -2337,7 +2337,7 @@
     nesting: 'Option<UpDataStructsNestingPermissions>'
   },
   /**
-   * Lookup251: up_data_structs::NestingPermissions
+   * Lookup252: up_data_structs::NestingPermissions
    **/
   UpDataStructsNestingPermissions: {
     tokenOwner: 'bool',
@@ -2345,18 +2345,18 @@
     restricted: 'Option<UpDataStructsOwnerRestrictedSet>'
   },
   /**
-   * Lookup253: up_data_structs::OwnerRestrictedSet
+   * Lookup254: up_data_structs::OwnerRestrictedSet
    **/
   UpDataStructsOwnerRestrictedSet: 'BTreeSet<u32>',
   /**
-   * Lookup258: up_data_structs::PropertyKeyPermission
+   * Lookup259: up_data_structs::PropertyKeyPermission
    **/
   UpDataStructsPropertyKeyPermission: {
     key: 'Bytes',
     permission: 'UpDataStructsPropertyPermission'
   },
   /**
-   * Lookup259: up_data_structs::PropertyPermission
+   * Lookup260: up_data_structs::PropertyPermission
    **/
   UpDataStructsPropertyPermission: {
     mutable: 'bool',
@@ -2364,14 +2364,14 @@
     tokenOwner: 'bool'
   },
   /**
-   * Lookup262: up_data_structs::Property
+   * Lookup263: up_data_structs::Property
    **/
   UpDataStructsProperty: {
     key: 'Bytes',
     value: 'Bytes'
   },
   /**
-   * Lookup265: up_data_structs::CreateItemData
+   * Lookup266: up_data_structs::CreateItemData
    **/
   UpDataStructsCreateItemData: {
     _enum: {
@@ -2381,26 +2381,26 @@
     }
   },
   /**
-   * Lookup266: up_data_structs::CreateNftData
+   * Lookup267: up_data_structs::CreateNftData
    **/
   UpDataStructsCreateNftData: {
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup267: up_data_structs::CreateFungibleData
+   * Lookup268: up_data_structs::CreateFungibleData
    **/
   UpDataStructsCreateFungibleData: {
     value: 'u128'
   },
   /**
-   * Lookup268: up_data_structs::CreateReFungibleData
+   * Lookup269: up_data_structs::CreateReFungibleData
    **/
   UpDataStructsCreateReFungibleData: {
     pieces: 'u128',
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup271: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup272: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateItemExData: {
     _enum: {
@@ -2411,14 +2411,14 @@
     }
   },
   /**
-   * Lookup273: up_data_structs::CreateNftExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup274: up_data_structs::CreateNftExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateNftExData: {
     properties: 'Vec<UpDataStructsProperty>',
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup280: up_data_structs::CreateRefungibleExSingleOwner<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup281: up_data_structs::CreateRefungibleExSingleOwner<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateRefungibleExSingleOwner: {
     user: 'PalletEvmAccountBasicCrossAccountIdRepr',
@@ -2426,14 +2426,14 @@
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup282: up_data_structs::CreateRefungibleExMultipleOwners<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup283: up_data_structs::CreateRefungibleExMultipleOwners<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateRefungibleExMultipleOwners: {
     users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>',
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup283: pallet_unique_scheduler::pallet::Call<T>
+   * Lookup284: pallet_unique_scheduler::pallet::Call<T>
    **/
   PalletUniqueSchedulerCall: {
     _enum: {
@@ -2457,7 +2457,7 @@
     }
   },
   /**
-   * Lookup285: frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>
+   * Lookup286: frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>
    **/
   FrameSupportScheduleMaybeHashed: {
     _enum: {
@@ -2466,7 +2466,7 @@
     }
   },
   /**
-   * Lookup286: pallet_configuration::pallet::Call<T>
+   * Lookup287: pallet_configuration::pallet::Call<T>
    **/
   PalletConfigurationCall: {
     _enum: {
@@ -2479,15 +2479,15 @@
     }
   },
   /**
-   * Lookup287: pallet_template_transaction_payment::Call<T>
+   * Lookup289: pallet_template_transaction_payment::Call<T>
    **/
   PalletTemplateTransactionPaymentCall: 'Null',
   /**
-   * Lookup288: pallet_structure::pallet::Call<T>
+   * Lookup290: pallet_structure::pallet::Call<T>
    **/
   PalletStructureCall: 'Null',
   /**
-   * Lookup289: pallet_rmrk_core::pallet::Call<T>
+   * Lookup291: pallet_rmrk_core::pallet::Call<T>
    **/
   PalletRmrkCoreCall: {
     _enum: {
@@ -2578,7 +2578,7 @@
     }
   },
   /**
-   * Lookup295: rmrk_traits::resource::ResourceTypes<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup297: rmrk_traits::resource::ResourceTypes<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceResourceTypes: {
     _enum: {
@@ -2588,7 +2588,7 @@
     }
   },
   /**
-   * Lookup297: rmrk_traits::resource::BasicResource<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup299: rmrk_traits::resource::BasicResource<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceBasicResource: {
     src: 'Option<Bytes>',
@@ -2597,7 +2597,7 @@
     thumb: 'Option<Bytes>'
   },
   /**
-   * Lookup299: rmrk_traits::resource::ComposableResource<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup301: rmrk_traits::resource::ComposableResource<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceComposableResource: {
     parts: 'Vec<u32>',
@@ -2608,7 +2608,7 @@
     thumb: 'Option<Bytes>'
   },
   /**
-   * Lookup300: rmrk_traits::resource::SlotResource<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup302: rmrk_traits::resource::SlotResource<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceSlotResource: {
     base: 'u32',
@@ -2619,7 +2619,7 @@
     thumb: 'Option<Bytes>'
   },
   /**
-   * Lookup303: pallet_rmrk_equip::pallet::Call<T>
+   * Lookup305: pallet_rmrk_equip::pallet::Call<T>
    **/
   PalletRmrkEquipCall: {
     _enum: {
@@ -2640,7 +2640,7 @@
     }
   },
   /**
-   * Lookup306: rmrk_traits::part::PartType<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup308: rmrk_traits::part::PartType<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartPartType: {
     _enum: {
@@ -2649,7 +2649,7 @@
     }
   },
   /**
-   * Lookup308: rmrk_traits::part::FixedPart<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup310: rmrk_traits::part::FixedPart<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartFixedPart: {
     id: 'u32',
@@ -2657,7 +2657,7 @@
     src: 'Bytes'
   },
   /**
-   * Lookup309: rmrk_traits::part::SlotPart<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup311: rmrk_traits::part::SlotPart<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartSlotPart: {
     id: 'u32',
@@ -2666,7 +2666,7 @@
     z: 'u32'
   },
   /**
-   * Lookup310: rmrk_traits::part::EquippableList<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup312: rmrk_traits::part::EquippableList<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartEquippableList: {
     _enum: {
@@ -2676,7 +2676,7 @@
     }
   },
   /**
-   * Lookup312: rmrk_traits::theme::Theme<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<rmrk_traits::theme::ThemeProperty<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>, S>>
+   * Lookup314: rmrk_traits::theme::Theme<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<rmrk_traits::theme::ThemeProperty<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>, S>>
    **/
   RmrkTraitsTheme: {
     name: 'Bytes',
@@ -2684,14 +2684,14 @@
     inherit: 'bool'
   },
   /**
-   * Lookup314: rmrk_traits::theme::ThemeProperty<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup316: rmrk_traits::theme::ThemeProperty<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsThemeThemeProperty: {
     key: 'Bytes',
     value: 'Bytes'
   },
   /**
-   * Lookup316: pallet_app_promotion::pallet::Call<T>
+   * Lookup318: pallet_app_promotion::pallet::Call<T>
    **/
   PalletAppPromotionCall: {
     _enum: {
@@ -2720,7 +2720,7 @@
     }
   },
   /**
-   * Lookup318: pallet_foreign_assets::module::Call<T>
+   * Lookup320: pallet_foreign_assets::module::Call<T>
    **/
   PalletForeignAssetsModuleCall: {
     _enum: {
@@ -2737,7 +2737,7 @@
     }
   },
   /**
-   * Lookup319: pallet_evm::pallet::Call<T>
+   * Lookup321: pallet_evm::pallet::Call<T>
    **/
   PalletEvmCall: {
     _enum: {
@@ -2780,7 +2780,7 @@
     }
   },
   /**
-   * Lookup323: pallet_ethereum::pallet::Call<T>
+   * Lookup325: pallet_ethereum::pallet::Call<T>
    **/
   PalletEthereumCall: {
     _enum: {
@@ -2790,7 +2790,7 @@
     }
   },
   /**
-   * Lookup324: ethereum::transaction::TransactionV2
+   * Lookup326: ethereum::transaction::TransactionV2
    **/
   EthereumTransactionTransactionV2: {
     _enum: {
@@ -2800,7 +2800,7 @@
     }
   },
   /**
-   * Lookup325: ethereum::transaction::LegacyTransaction
+   * Lookup327: ethereum::transaction::LegacyTransaction
    **/
   EthereumTransactionLegacyTransaction: {
     nonce: 'U256',
@@ -2812,7 +2812,7 @@
     signature: 'EthereumTransactionTransactionSignature'
   },
   /**
-   * Lookup326: ethereum::transaction::TransactionAction
+   * Lookup328: ethereum::transaction::TransactionAction
    **/
   EthereumTransactionTransactionAction: {
     _enum: {
@@ -2821,7 +2821,7 @@
     }
   },
   /**
-   * Lookup327: ethereum::transaction::TransactionSignature
+   * Lookup329: ethereum::transaction::TransactionSignature
    **/
   EthereumTransactionTransactionSignature: {
     v: 'u64',
@@ -2829,7 +2829,7 @@
     s: 'H256'
   },
   /**
-   * Lookup329: ethereum::transaction::EIP2930Transaction
+   * Lookup331: ethereum::transaction::EIP2930Transaction
    **/
   EthereumTransactionEip2930Transaction: {
     chainId: 'u64',
@@ -2845,14 +2845,14 @@
     s: 'H256'
   },
   /**
-   * Lookup331: ethereum::transaction::AccessListItem
+   * Lookup333: ethereum::transaction::AccessListItem
    **/
   EthereumTransactionAccessListItem: {
     address: 'H160',
     storageKeys: 'Vec<H256>'
   },
   /**
-   * Lookup332: ethereum::transaction::EIP1559Transaction
+   * Lookup334: ethereum::transaction::EIP1559Transaction
    **/
   EthereumTransactionEip1559Transaction: {
     chainId: 'u64',
@@ -2869,7 +2869,7 @@
     s: 'H256'
   },
   /**
-   * Lookup333: pallet_evm_migration::pallet::Call<T>
+   * Lookup335: pallet_evm_migration::pallet::Call<T>
    **/
   PalletEvmMigrationCall: {
     _enum: {
@@ -2887,32 +2887,32 @@
     }
   },
   /**
-   * Lookup336: pallet_sudo::pallet::Error<T>
+   * Lookup338: pallet_sudo::pallet::Error<T>
    **/
   PalletSudoError: {
     _enum: ['RequireSudo']
   },
   /**
-   * Lookup338: orml_vesting::module::Error<T>
+   * Lookup340: orml_vesting::module::Error<T>
    **/
   OrmlVestingModuleError: {
     _enum: ['ZeroVestingPeriod', 'ZeroVestingPeriodCount', 'InsufficientBalanceToLock', 'TooManyVestingSchedules', 'AmountLow', 'MaxVestingSchedulesExceeded']
   },
   /**
-   * Lookup339: orml_xtokens::module::Error<T>
+   * Lookup341: orml_xtokens::module::Error<T>
    **/
   OrmlXtokensModuleError: {
     _enum: ['AssetHasNoReserve', 'NotCrossChainTransfer', 'InvalidDest', 'NotCrossChainTransferableCurrency', 'UnweighableMessage', 'XcmExecutionFailed', 'CannotReanchor', 'InvalidAncestry', 'InvalidAsset', 'DestinationNotInvertible', 'BadVersion', 'DistinctReserveForAssetAndFee', 'ZeroFee', 'ZeroAmount', 'TooManyAssetsBeingSent', 'AssetIndexNonExistent', 'FeeNotEnough', 'NotSupportedMultiLocation', 'MinXcmFeeNotDefined']
   },
   /**
-   * Lookup342: orml_tokens::BalanceLock<Balance>
+   * Lookup344: orml_tokens::BalanceLock<Balance>
    **/
   OrmlTokensBalanceLock: {
     id: '[u8;8]',
     amount: 'u128'
   },
   /**
-   * Lookup344: orml_tokens::AccountData<Balance>
+   * Lookup346: orml_tokens::AccountData<Balance>
    **/
   OrmlTokensAccountData: {
     free: 'u128',
@@ -2920,20 +2920,20 @@
     frozen: 'u128'
   },
   /**
-   * Lookup346: orml_tokens::ReserveData<ReserveIdentifier, Balance>
+   * Lookup348: orml_tokens::ReserveData<ReserveIdentifier, Balance>
    **/
   OrmlTokensReserveData: {
     id: 'Null',
     amount: 'u128'
   },
   /**
-   * Lookup348: orml_tokens::module::Error<T>
+   * Lookup350: orml_tokens::module::Error<T>
    **/
   OrmlTokensModuleError: {
     _enum: ['BalanceTooLow', 'AmountIntoBalanceFailed', 'LiquidityRestrictions', 'MaxLocksExceeded', 'KeepAlive', 'ExistentialDeposit', 'DeadAccount', 'TooManyReserves']
   },
   /**
-   * Lookup350: cumulus_pallet_xcmp_queue::InboundChannelDetails
+   * Lookup352: cumulus_pallet_xcmp_queue::InboundChannelDetails
    **/
   CumulusPalletXcmpQueueInboundChannelDetails: {
     sender: 'u32',
@@ -2941,19 +2941,19 @@
     messageMetadata: 'Vec<(u32,PolkadotParachainPrimitivesXcmpMessageFormat)>'
   },
   /**
-   * Lookup351: cumulus_pallet_xcmp_queue::InboundState
+   * Lookup353: cumulus_pallet_xcmp_queue::InboundState
    **/
   CumulusPalletXcmpQueueInboundState: {
     _enum: ['Ok', 'Suspended']
   },
   /**
-   * Lookup354: polkadot_parachain::primitives::XcmpMessageFormat
+   * Lookup356: polkadot_parachain::primitives::XcmpMessageFormat
    **/
   PolkadotParachainPrimitivesXcmpMessageFormat: {
     _enum: ['ConcatenatedVersionedXcm', 'ConcatenatedEncodedBlob', 'Signals']
   },
   /**
-   * Lookup357: cumulus_pallet_xcmp_queue::OutboundChannelDetails
+   * Lookup359: cumulus_pallet_xcmp_queue::OutboundChannelDetails
    **/
   CumulusPalletXcmpQueueOutboundChannelDetails: {
     recipient: 'u32',
@@ -2963,46 +2963,46 @@
     lastIndex: 'u16'
   },
   /**
-   * Lookup358: cumulus_pallet_xcmp_queue::OutboundState
+   * Lookup360: cumulus_pallet_xcmp_queue::OutboundState
    **/
   CumulusPalletXcmpQueueOutboundState: {
     _enum: ['Ok', 'Suspended']
   },
   /**
-   * Lookup360: cumulus_pallet_xcmp_queue::QueueConfigData
+   * Lookup362: cumulus_pallet_xcmp_queue::QueueConfigData
    **/
   CumulusPalletXcmpQueueQueueConfigData: {
     suspendThreshold: 'u32',
     dropThreshold: 'u32',
     resumeThreshold: 'u32',
-    thresholdWeight: 'u64',
-    weightRestrictDecay: 'u64',
-    xcmpMaxIndividualWeight: 'u64'
+    thresholdWeight: 'Weight',
+    weightRestrictDecay: 'Weight',
+    xcmpMaxIndividualWeight: 'Weight'
   },
   /**
-   * Lookup362: cumulus_pallet_xcmp_queue::pallet::Error<T>
+   * Lookup364: cumulus_pallet_xcmp_queue::pallet::Error<T>
    **/
   CumulusPalletXcmpQueueError: {
     _enum: ['FailedToSend', 'BadXcmOrigin', 'BadXcm', 'BadOverweightIndex', 'WeightOverLimit']
   },
   /**
-   * Lookup363: pallet_xcm::pallet::Error<T>
+   * Lookup365: pallet_xcm::pallet::Error<T>
    **/
   PalletXcmError: {
     _enum: ['Unreachable', 'SendFailure', 'Filtered', 'UnweighableMessage', 'DestinationNotInvertible', 'Empty', 'CannotReanchor', 'TooManyAssets', 'InvalidOrigin', 'BadVersion', 'BadLocation', 'NoSubscription', 'AlreadySubscribed']
   },
   /**
-   * Lookup364: cumulus_pallet_xcm::pallet::Error<T>
+   * Lookup366: cumulus_pallet_xcm::pallet::Error<T>
    **/
   CumulusPalletXcmError: 'Null',
   /**
-   * Lookup365: cumulus_pallet_dmp_queue::ConfigData
+   * Lookup367: cumulus_pallet_dmp_queue::ConfigData
    **/
   CumulusPalletDmpQueueConfigData: {
-    maxIndividual: 'u64'
+    maxIndividual: 'Weight'
   },
   /**
-   * Lookup366: cumulus_pallet_dmp_queue::PageIndexData
+   * Lookup368: cumulus_pallet_dmp_queue::PageIndexData
    **/
   CumulusPalletDmpQueuePageIndexData: {
     beginUsed: 'u32',
@@ -3010,19 +3010,19 @@
     overweightCount: 'u64'
   },
   /**
-   * Lookup369: cumulus_pallet_dmp_queue::pallet::Error<T>
+   * Lookup371: cumulus_pallet_dmp_queue::pallet::Error<T>
    **/
   CumulusPalletDmpQueueError: {
     _enum: ['Unknown', 'OverLimit']
   },
   /**
-   * Lookup373: pallet_unique::Error<T>
+   * Lookup375: pallet_unique::Error<T>
    **/
   PalletUniqueError: {
     _enum: ['CollectionDecimalPointLimitExceeded', 'ConfirmUnsetSponsorFail', 'EmptyArgument', 'RepartitionCalledOnNonRefungibleCollection']
   },
   /**
-   * Lookup376: pallet_unique_scheduler::ScheduledV3<frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32>
+   * Lookup378: pallet_unique_scheduler::ScheduledV3<frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32>
    **/
   PalletUniqueSchedulerScheduledV3: {
     maybeId: 'Option<[u8;16]>',
@@ -3032,7 +3032,7 @@
     origin: 'OpalRuntimeOriginCaller'
   },
   /**
-   * Lookup377: opal_runtime::OriginCaller
+   * Lookup379: opal_runtime::OriginCaller
    **/
   OpalRuntimeOriginCaller: {
     _enum: {
@@ -3141,7 +3141,7 @@
     }
   },
   /**
-   * Lookup378: frame_support::dispatch::RawOrigin<sp_core::crypto::AccountId32>
+   * Lookup380: frame_support::dispatch::RawOrigin<sp_core::crypto::AccountId32>
    **/
   FrameSupportDispatchRawOrigin: {
     _enum: {
@@ -3151,7 +3151,7 @@
     }
   },
   /**
-   * Lookup379: pallet_xcm::pallet::Origin
+   * Lookup381: pallet_xcm::pallet::Origin
    **/
   PalletXcmOrigin: {
     _enum: {
@@ -3160,7 +3160,7 @@
     }
   },
   /**
-   * Lookup380: cumulus_pallet_xcm::pallet::Origin
+   * Lookup382: cumulus_pallet_xcm::pallet::Origin
    **/
   CumulusPalletXcmOrigin: {
     _enum: {
@@ -3169,7 +3169,7 @@
     }
   },
   /**
-   * Lookup381: pallet_ethereum::RawOrigin
+   * Lookup383: pallet_ethereum::RawOrigin
    **/
   PalletEthereumRawOrigin: {
     _enum: {
@@ -3177,17 +3177,17 @@
     }
   },
   /**
-   * Lookup382: sp_core::Void
+   * Lookup384: sp_core::Void
    **/
   SpCoreVoid: 'Null',
   /**
-   * Lookup383: pallet_unique_scheduler::pallet::Error<T>
+   * Lookup385: pallet_unique_scheduler::pallet::Error<T>
    **/
   PalletUniqueSchedulerError: {
     _enum: ['FailedToSchedule', 'NotFound', 'TargetBlockNumberInPast', 'RescheduleNoChange']
   },
   /**
-   * Lookup384: up_data_structs::Collection<sp_core::crypto::AccountId32>
+   * Lookup386: up_data_structs::Collection<sp_core::crypto::AccountId32>
    **/
   UpDataStructsCollection: {
     owner: 'AccountId32',
@@ -3201,7 +3201,7 @@
     flags: '[u8;1]'
   },
   /**
-   * Lookup385: up_data_structs::SponsorshipState<sp_core::crypto::AccountId32>
+   * Lookup387: up_data_structs::SponsorshipState<sp_core::crypto::AccountId32>
    **/
   UpDataStructsSponsorshipStateAccountId32: {
     _enum: {
@@ -3211,7 +3211,7 @@
     }
   },
   /**
-   * Lookup387: up_data_structs::Properties
+   * Lookup389: up_data_structs::Properties
    **/
   UpDataStructsProperties: {
     map: 'UpDataStructsPropertiesMapBoundedVec',
@@ -3219,15 +3219,15 @@
     spaceLimit: 'u32'
   },
   /**
-   * Lookup388: up_data_structs::PropertiesMap<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup390: up_data_structs::PropertiesMap<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   UpDataStructsPropertiesMapBoundedVec: 'BTreeMap<Bytes, Bytes>',
   /**
-   * Lookup393: up_data_structs::PropertiesMap<up_data_structs::PropertyPermission>
+   * Lookup395: up_data_structs::PropertiesMap<up_data_structs::PropertyPermission>
    **/
   UpDataStructsPropertiesMapPropertyPermission: 'BTreeMap<Bytes, UpDataStructsPropertyPermission>',
   /**
-   * Lookup400: up_data_structs::CollectionStats
+   * Lookup402: up_data_structs::CollectionStats
    **/
   UpDataStructsCollectionStats: {
     created: 'u32',
@@ -3235,18 +3235,18 @@
     alive: 'u32'
   },
   /**
-   * Lookup401: up_data_structs::TokenChild
+   * Lookup403: up_data_structs::TokenChild
    **/
   UpDataStructsTokenChild: {
     token: 'u32',
     collection: 'u32'
   },
   /**
-   * Lookup402: PhantomType::up_data_structs<T>
+   * Lookup404: PhantomType::up_data_structs<T>
    **/
   PhantomTypeUpDataStructs: '[(UpDataStructsTokenData,UpDataStructsRpcCollection,RmrkTraitsCollectionCollectionInfo,RmrkTraitsNftNftInfo,RmrkTraitsResourceResourceInfo,RmrkTraitsPropertyPropertyInfo,RmrkTraitsBaseBaseInfo,RmrkTraitsPartPartType,RmrkTraitsTheme,RmrkTraitsNftNftChild);0]',
   /**
-   * Lookup404: up_data_structs::TokenData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup406: up_data_structs::TokenData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsTokenData: {
     properties: 'Vec<UpDataStructsProperty>',
@@ -3254,7 +3254,7 @@
     pieces: 'u128'
   },
   /**
-   * Lookup406: up_data_structs::RpcCollection<sp_core::crypto::AccountId32>
+   * Lookup408: up_data_structs::RpcCollection<sp_core::crypto::AccountId32>
    **/
   UpDataStructsRpcCollection: {
     owner: 'AccountId32',
@@ -3271,7 +3271,7 @@
     foreign: 'bool'
   },
   /**
-   * Lookup407: rmrk_traits::collection::CollectionInfo<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_core::crypto::AccountId32>
+   * Lookup409: rmrk_traits::collection::CollectionInfo<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_core::crypto::AccountId32>
    **/
   RmrkTraitsCollectionCollectionInfo: {
     issuer: 'AccountId32',
@@ -3281,7 +3281,7 @@
     nftsCount: 'u32'
   },
   /**
-   * Lookup408: rmrk_traits::nft::NftInfo<sp_core::crypto::AccountId32, sp_arithmetic::per_things::Permill, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup410: rmrk_traits::nft::NftInfo<sp_core::crypto::AccountId32, sp_arithmetic::per_things::Permill, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsNftNftInfo: {
     owner: 'RmrkTraitsNftAccountIdOrCollectionNftTuple',
@@ -3291,14 +3291,14 @@
     pending: 'bool'
   },
   /**
-   * Lookup410: rmrk_traits::nft::RoyaltyInfo<sp_core::crypto::AccountId32, sp_arithmetic::per_things::Permill>
+   * Lookup412: rmrk_traits::nft::RoyaltyInfo<sp_core::crypto::AccountId32, sp_arithmetic::per_things::Permill>
    **/
   RmrkTraitsNftRoyaltyInfo: {
     recipient: 'AccountId32',
     amount: 'Permill'
   },
   /**
-   * Lookup411: rmrk_traits::resource::ResourceInfo<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup413: rmrk_traits::resource::ResourceInfo<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceResourceInfo: {
     id: 'u32',
@@ -3307,14 +3307,14 @@
     pendingRemoval: 'bool'
   },
   /**
-   * Lookup412: rmrk_traits::property::PropertyInfo<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup414: rmrk_traits::property::PropertyInfo<sp_runtime::bounded::bounded_vec::BoundedVec<T, S>, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPropertyPropertyInfo: {
     key: 'Bytes',
     value: 'Bytes'
   },
   /**
-   * Lookup413: rmrk_traits::base::BaseInfo<sp_core::crypto::AccountId32, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
+   * Lookup415: rmrk_traits::base::BaseInfo<sp_core::crypto::AccountId32, sp_runtime::bounded::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsBaseBaseInfo: {
     issuer: 'AccountId32',
@@ -3322,92 +3322,92 @@
     symbol: 'Bytes'
   },
   /**
-   * Lookup414: rmrk_traits::nft::NftChild
+   * Lookup416: rmrk_traits::nft::NftChild
    **/
   RmrkTraitsNftNftChild: {
     collectionId: 'u32',
     nftId: 'u32'
   },
   /**
-   * Lookup416: pallet_common::pallet::Error<T>
+   * Lookup418: pallet_common::pallet::Error<T>
    **/
   PalletCommonError: {
     _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'CantDestroyNotEmptyCollection', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'UserIsNotAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached', 'PropertyKeyIsTooLong', 'InvalidCharacterInPropertyKey', 'EmptyPropertyKey', 'CollectionIsExternal', 'CollectionIsInternal']
   },
   /**
-   * Lookup418: pallet_fungible::pallet::Error<T>
+   * Lookup420: pallet_fungible::pallet::Error<T>
    **/
   PalletFungibleError: {
     _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
   },
   /**
-   * Lookup419: pallet_refungible::ItemData
+   * Lookup421: pallet_refungible::ItemData
    **/
   PalletRefungibleItemData: {
     constData: 'Bytes'
   },
   /**
-   * Lookup424: pallet_refungible::pallet::Error<T>
+   * Lookup426: pallet_refungible::pallet::Error<T>
    **/
   PalletRefungibleError: {
     _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RepartitionWhileNotOwningAllPieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
   },
   /**
-   * Lookup425: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup427: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   PalletNonfungibleItemData: {
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup427: up_data_structs::PropertyScope
+   * Lookup429: up_data_structs::PropertyScope
    **/
   UpDataStructsPropertyScope: {
     _enum: ['None', 'Rmrk']
   },
   /**
-   * Lookup429: pallet_nonfungible::pallet::Error<T>
+   * Lookup431: pallet_nonfungible::pallet::Error<T>
    **/
   PalletNonfungibleError: {
     _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount', 'CantBurnNftWithChildren']
   },
   /**
-   * Lookup430: pallet_structure::pallet::Error<T>
+   * Lookup432: pallet_structure::pallet::Error<T>
    **/
   PalletStructureError: {
     _enum: ['OuroborosDetected', 'DepthLimit', 'BreadthLimit', 'TokenNotFound']
   },
   /**
-   * Lookup431: pallet_rmrk_core::pallet::Error<T>
+   * Lookup433: pallet_rmrk_core::pallet::Error<T>
    **/
   PalletRmrkCoreError: {
     _enum: ['CorruptedCollectionType', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'RmrkPropertyIsNotFound', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'CannotRejectNonPendingNft', 'ResourceNotPending', 'NoAvailableResourceId']
   },
   /**
-   * Lookup433: pallet_rmrk_equip::pallet::Error<T>
+   * Lookup435: pallet_rmrk_equip::pallet::Error<T>
    **/
   PalletRmrkEquipError: {
     _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst', 'PartDoesntExist', 'NoEquippableOnFixedPart']
   },
   /**
-   * Lookup439: pallet_app_promotion::pallet::Error<T>
+   * Lookup441: pallet_app_promotion::pallet::Error<T>
    **/
   PalletAppPromotionError: {
     _enum: ['AdminNotSet', 'NoPermission', 'NotSufficientFunds', 'PendingForBlockOverflow', 'SponsorNotSet', 'IncorrectLockedBalanceOperation']
   },
   /**
-   * Lookup440: pallet_foreign_assets::module::Error<T>
+   * Lookup442: pallet_foreign_assets::module::Error<T>
    **/
   PalletForeignAssetsModuleError: {
     _enum: ['BadLocation', 'MultiLocationExisted', 'AssetIdNotExists', 'AssetIdExisted']
   },
   /**
-   * Lookup443: pallet_evm::pallet::Error<T>
+   * Lookup445: pallet_evm::pallet::Error<T>
    **/
   PalletEvmError: {
     _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce']
   },
   /**
-   * Lookup446: fp_rpc::TransactionStatus
+   * Lookup448: fp_rpc::TransactionStatus
    **/
   FpRpcTransactionStatus: {
     transactionHash: 'H256',
@@ -3419,11 +3419,11 @@
     logsBloom: 'EthbloomBloom'
   },
   /**
-   * Lookup448: ethbloom::Bloom
+   * Lookup450: ethbloom::Bloom
    **/
   EthbloomBloom: '[u8;256]',
   /**
-   * Lookup450: ethereum::receipt::ReceiptV3
+   * Lookup452: ethereum::receipt::ReceiptV3
    **/
   EthereumReceiptReceiptV3: {
     _enum: {
@@ -3433,7 +3433,7 @@
     }
   },
   /**
-   * Lookup451: ethereum::receipt::EIP658ReceiptData
+   * Lookup453: ethereum::receipt::EIP658ReceiptData
    **/
   EthereumReceiptEip658ReceiptData: {
     statusCode: 'u8',
@@ -3442,7 +3442,7 @@
     logs: 'Vec<EthereumLog>'
   },
   /**
-   * Lookup452: ethereum::block::Block<ethereum::transaction::TransactionV2>
+   * Lookup454: ethereum::block::Block<ethereum::transaction::TransactionV2>
    **/
   EthereumBlock: {
     header: 'EthereumHeader',
@@ -3450,7 +3450,7 @@
     ommers: 'Vec<EthereumHeader>'
   },
   /**
-   * Lookup453: ethereum::header::Header
+   * Lookup455: ethereum::header::Header
    **/
   EthereumHeader: {
     parentHash: 'H256',
@@ -3470,23 +3470,23 @@
     nonce: 'EthereumTypesHashH64'
   },
   /**
-   * Lookup454: ethereum_types::hash::H64
+   * Lookup456: ethereum_types::hash::H64
    **/
   EthereumTypesHashH64: '[u8;8]',
   /**
-   * Lookup459: pallet_ethereum::pallet::Error<T>
+   * Lookup461: pallet_ethereum::pallet::Error<T>
    **/
   PalletEthereumError: {
     _enum: ['InvalidSignature', 'PreLogExists']
   },
   /**
-   * Lookup460: pallet_evm_coder_substrate::pallet::Error<T>
+   * Lookup462: pallet_evm_coder_substrate::pallet::Error<T>
    **/
   PalletEvmCoderSubstrateError: {
     _enum: ['OutOfGas', 'OutOfFund']
   },
   /**
-   * Lookup461: up_data_structs::SponsorshipState<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup463: up_data_structs::SponsorshipState<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsSponsorshipStateBasicCrossAccountIdRepr: {
     _enum: {
@@ -3496,25 +3496,25 @@
     }
   },
   /**
-   * Lookup462: pallet_evm_contract_helpers::SponsoringModeT
+   * Lookup464: pallet_evm_contract_helpers::SponsoringModeT
    **/
   PalletEvmContractHelpersSponsoringModeT: {
     _enum: ['Disabled', 'Allowlisted', 'Generous']
   },
   /**
-   * Lookup468: pallet_evm_contract_helpers::pallet::Error<T>
+   * Lookup470: pallet_evm_contract_helpers::pallet::Error<T>
    **/
   PalletEvmContractHelpersError: {
     _enum: ['NoPermission', 'NoPendingSponsor', 'TooManyMethodsHaveSponsoredLimit']
   },
   /**
-   * Lookup469: pallet_evm_migration::pallet::Error<T>
+   * Lookup471: pallet_evm_migration::pallet::Error<T>
    **/
   PalletEvmMigrationError: {
     _enum: ['AccountNotEmpty', 'AccountIsNotMigrating']
   },
   /**
-   * Lookup471: sp_runtime::MultiSignature
+   * Lookup473: sp_runtime::MultiSignature
    **/
   SpRuntimeMultiSignature: {
     _enum: {
@@ -3524,47 +3524,47 @@
     }
   },
   /**
-   * Lookup472: sp_core::ed25519::Signature
+   * Lookup474: sp_core::ed25519::Signature
    **/
   SpCoreEd25519Signature: '[u8;64]',
   /**
-   * Lookup474: sp_core::sr25519::Signature
+   * Lookup476: sp_core::sr25519::Signature
    **/
   SpCoreSr25519Signature: '[u8;64]',
   /**
-   * Lookup475: sp_core::ecdsa::Signature
+   * Lookup477: sp_core::ecdsa::Signature
    **/
   SpCoreEcdsaSignature: '[u8;65]',
   /**
-   * Lookup478: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
+   * Lookup480: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
    **/
   FrameSystemExtensionsCheckSpecVersion: 'Null',
   /**
-   * Lookup479: frame_system::extensions::check_tx_version::CheckTxVersion<T>
+   * Lookup481: frame_system::extensions::check_tx_version::CheckTxVersion<T>
    **/
   FrameSystemExtensionsCheckTxVersion: 'Null',
   /**
-   * Lookup480: frame_system::extensions::check_genesis::CheckGenesis<T>
+   * Lookup482: frame_system::extensions::check_genesis::CheckGenesis<T>
    **/
   FrameSystemExtensionsCheckGenesis: 'Null',
   /**
-   * Lookup483: frame_system::extensions::check_nonce::CheckNonce<T>
+   * Lookup485: frame_system::extensions::check_nonce::CheckNonce<T>
    **/
   FrameSystemExtensionsCheckNonce: 'Compact<u32>',
   /**
-   * Lookup484: frame_system::extensions::check_weight::CheckWeight<T>
+   * Lookup486: frame_system::extensions::check_weight::CheckWeight<T>
    **/
   FrameSystemExtensionsCheckWeight: 'Null',
   /**
-   * Lookup485: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
+   * Lookup487: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
    **/
   PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact<u128>',
   /**
-   * Lookup486: opal_runtime::Runtime
+   * Lookup488: opal_runtime::Runtime
    **/
   OpalRuntimeRuntime: 'Null',
   /**
-   * Lookup487: pallet_ethereum::FakeTransactionFinalizer<opal_runtime::Runtime>
+   * Lookup489: pallet_ethereum::FakeTransactionFinalizer<opal_runtime::Runtime>
    **/
   PalletEthereumFakeTransactionFinalizer: 'Null'
 };
modifiedtests/src/interfaces/registry.tsdiffbeforeafterboth
--- a/tests/src/interfaces/registry.ts
+++ b/tests/src/interfaces/registry.ts
@@ -5,7 +5,7 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/types/types/registry';
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassWeight, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationCall, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
 
 declare module '@polkadot/types/types/registry' {
   interface InterfaceTypes {
@@ -60,7 +60,7 @@
     FrameSupportWeightsDispatchInfo: FrameSupportWeightsDispatchInfo;
     FrameSupportWeightsPays: FrameSupportWeightsPays;
     FrameSupportWeightsPerDispatchClassU32: FrameSupportWeightsPerDispatchClassU32;
-    FrameSupportWeightsPerDispatchClassU64: FrameSupportWeightsPerDispatchClassU64;
+    FrameSupportWeightsPerDispatchClassWeight: FrameSupportWeightsPerDispatchClassWeight;
     FrameSupportWeightsPerDispatchClassWeightsPerClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;
     FrameSupportWeightsRuntimeDbWeight: FrameSupportWeightsRuntimeDbWeight;
     FrameSystemAccountInfo: FrameSystemAccountInfo;
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -7,7 +7,7 @@
 
 import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { ITuple } from '@polkadot/types-codec/types';
-import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';
+import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill, Weight } from '@polkadot/types/interfaces/runtime';
 import type { Event } from '@polkadot/types/interfaces/system';
 
 declare module '@polkadot/types/lookup' {
@@ -28,19 +28,19 @@
     readonly feeFrozen: u128;
   }
 
-  /** @name FrameSupportWeightsPerDispatchClassU64 (7) */
-  interface FrameSupportWeightsPerDispatchClassU64 extends Struct {
-    readonly normal: u64;
-    readonly operational: u64;
-    readonly mandatory: u64;
+  /** @name FrameSupportWeightsPerDispatchClassWeight (7) */
+  interface FrameSupportWeightsPerDispatchClassWeight extends Struct {
+    readonly normal: Weight;
+    readonly operational: Weight;
+    readonly mandatory: Weight;
   }
 
-  /** @name SpRuntimeDigest (11) */
+  /** @name SpRuntimeDigest (12) */
   interface SpRuntimeDigest extends Struct {
     readonly logs: Vec<SpRuntimeDigestDigestItem>;
   }
 
-  /** @name SpRuntimeDigestDigestItem (13) */
+  /** @name SpRuntimeDigestDigestItem (14) */
   interface SpRuntimeDigestDigestItem extends Enum {
     readonly isOther: boolean;
     readonly asOther: Bytes;
@@ -54,14 +54,14 @@
     readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';
   }
 
-  /** @name FrameSystemEventRecord (16) */
+  /** @name FrameSystemEventRecord (17) */
   interface FrameSystemEventRecord extends Struct {
     readonly phase: FrameSystemPhase;
     readonly event: Event;
     readonly topics: Vec<H256>;
   }
 
-  /** @name FrameSystemEvent (18) */
+  /** @name FrameSystemEvent (19) */
   interface FrameSystemEvent extends Enum {
     readonly isExtrinsicSuccess: boolean;
     readonly asExtrinsicSuccess: {
@@ -89,14 +89,14 @@
     readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';
   }
 
-  /** @name FrameSupportWeightsDispatchInfo (19) */
+  /** @name FrameSupportWeightsDispatchInfo (20) */
   interface FrameSupportWeightsDispatchInfo extends Struct {
-    readonly weight: u64;
+    readonly weight: Weight;
     readonly class: FrameSupportWeightsDispatchClass;
     readonly paysFee: FrameSupportWeightsPays;
   }
 
-  /** @name FrameSupportWeightsDispatchClass (20) */
+  /** @name FrameSupportWeightsDispatchClass (21) */
   interface FrameSupportWeightsDispatchClass extends Enum {
     readonly isNormal: boolean;
     readonly isOperational: boolean;
@@ -104,14 +104,14 @@
     readonly type: 'Normal' | 'Operational' | 'Mandatory';
   }
 
-  /** @name FrameSupportWeightsPays (21) */
+  /** @name FrameSupportWeightsPays (22) */
   interface FrameSupportWeightsPays extends Enum {
     readonly isYes: boolean;
     readonly isNo: boolean;
     readonly type: 'Yes' | 'No';
   }
 
-  /** @name SpRuntimeDispatchError (22) */
+  /** @name SpRuntimeDispatchError (23) */
   interface SpRuntimeDispatchError extends Enum {
     readonly isOther: boolean;
     readonly isCannotLookup: boolean;
@@ -130,13 +130,13 @@
     readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';
   }
 
-  /** @name SpRuntimeModuleError (23) */
+  /** @name SpRuntimeModuleError (24) */
   interface SpRuntimeModuleError extends Struct {
     readonly index: u8;
     readonly error: U8aFixed;
   }
 
-  /** @name SpRuntimeTokenError (24) */
+  /** @name SpRuntimeTokenError (25) */
   interface SpRuntimeTokenError extends Enum {
     readonly isNoFunds: boolean;
     readonly isWouldDie: boolean;
@@ -148,7 +148,7 @@
     readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';
   }
 
-  /** @name SpRuntimeArithmeticError (25) */
+  /** @name SpRuntimeArithmeticError (26) */
   interface SpRuntimeArithmeticError extends Enum {
     readonly isUnderflow: boolean;
     readonly isOverflow: boolean;
@@ -156,14 +156,14 @@
     readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';
   }
 
-  /** @name SpRuntimeTransactionalError (26) */
+  /** @name SpRuntimeTransactionalError (27) */
   interface SpRuntimeTransactionalError extends Enum {
     readonly isLimitReached: boolean;
     readonly isNoLayer: boolean;
     readonly type: 'LimitReached' | 'NoLayer';
   }
 
-  /** @name CumulusPalletParachainSystemEvent (27) */
+  /** @name CumulusPalletParachainSystemEvent (28) */
   interface CumulusPalletParachainSystemEvent extends Enum {
     readonly isValidationFunctionStored: boolean;
     readonly isValidationFunctionApplied: boolean;
@@ -181,13 +181,13 @@
     } & Struct;
     readonly isDownwardMessagesProcessed: boolean;
     readonly asDownwardMessagesProcessed: {
-      readonly weightUsed: u64;
+      readonly weightUsed: Weight;
       readonly dmqHead: H256;
     } & Struct;
     readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';
   }
 
-  /** @name PalletBalancesEvent (28) */
+  /** @name PalletBalancesEvent (29) */
   interface PalletBalancesEvent extends Enum {
     readonly isEndowed: boolean;
     readonly asEndowed: {
@@ -246,14 +246,14 @@
     readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';
   }
 
-  /** @name FrameSupportTokensMiscBalanceStatus (29) */
+  /** @name FrameSupportTokensMiscBalanceStatus (30) */
   interface FrameSupportTokensMiscBalanceStatus extends Enum {
     readonly isFree: boolean;
     readonly isReserved: boolean;
     readonly type: 'Free' | 'Reserved';
   }
 
-  /** @name PalletTransactionPaymentEvent (30) */
+  /** @name PalletTransactionPaymentEvent (31) */
   interface PalletTransactionPaymentEvent extends Enum {
     readonly isTransactionFeePaid: boolean;
     readonly asTransactionFeePaid: {
@@ -264,7 +264,7 @@
     readonly type: 'TransactionFeePaid';
   }
 
-  /** @name PalletTreasuryEvent (31) */
+  /** @name PalletTreasuryEvent (32) */
   interface PalletTreasuryEvent extends Enum {
     readonly isProposed: boolean;
     readonly asProposed: {
@@ -306,7 +306,7 @@
     readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit' | 'SpendApproved';
   }
 
-  /** @name PalletSudoEvent (32) */
+  /** @name PalletSudoEvent (33) */
   interface PalletSudoEvent extends Enum {
     readonly isSudid: boolean;
     readonly asSudid: {
@@ -323,7 +323,7 @@
     readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';
   }
 
-  /** @name OrmlVestingModuleEvent (36) */
+  /** @name OrmlVestingModuleEvent (37) */
   interface OrmlVestingModuleEvent extends Enum {
     readonly isVestingScheduleAdded: boolean;
     readonly asVestingScheduleAdded: {
@@ -343,7 +343,7 @@
     readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';
   }
 
-  /** @name OrmlVestingVestingSchedule (37) */
+  /** @name OrmlVestingVestingSchedule (38) */
   interface OrmlVestingVestingSchedule extends Struct {
     readonly start: u32;
     readonly period: u32;
@@ -351,7 +351,7 @@
     readonly perPeriod: Compact<u128>;
   }
 
-  /** @name OrmlXtokensModuleEvent (39) */
+  /** @name OrmlXtokensModuleEvent (40) */
   interface OrmlXtokensModuleEvent extends Enum {
     readonly isTransferredMultiAssets: boolean;
     readonly asTransferredMultiAssets: {
@@ -363,16 +363,16 @@
     readonly type: 'TransferredMultiAssets';
   }
 
-  /** @name XcmV1MultiassetMultiAssets (40) */
+  /** @name XcmV1MultiassetMultiAssets (41) */
   interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}
 
-  /** @name XcmV1MultiAsset (42) */
+  /** @name XcmV1MultiAsset (43) */
   interface XcmV1MultiAsset extends Struct {
     readonly id: XcmV1MultiassetAssetId;
     readonly fun: XcmV1MultiassetFungibility;
   }
 
-  /** @name XcmV1MultiassetAssetId (43) */
+  /** @name XcmV1MultiassetAssetId (44) */
   interface XcmV1MultiassetAssetId extends Enum {
     readonly isConcrete: boolean;
     readonly asConcrete: XcmV1MultiLocation;
@@ -381,13 +381,13 @@
     readonly type: 'Concrete' | 'Abstract';
   }
 
-  /** @name XcmV1MultiLocation (44) */
+  /** @name XcmV1MultiLocation (45) */
   interface XcmV1MultiLocation extends Struct {
     readonly parents: u8;
     readonly interior: XcmV1MultilocationJunctions;
   }
 
-  /** @name XcmV1MultilocationJunctions (45) */
+  /** @name XcmV1MultilocationJunctions (46) */
   interface XcmV1MultilocationJunctions extends Enum {
     readonly isHere: boolean;
     readonly isX1: boolean;
@@ -409,7 +409,7 @@
     readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';
   }
 
-  /** @name XcmV1Junction (46) */
+  /** @name XcmV1Junction (47) */
   interface XcmV1Junction extends Enum {
     readonly isParachain: boolean;
     readonly asParachain: Compact<u32>;
@@ -443,7 +443,7 @@
     readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';
   }
 
-  /** @name XcmV0JunctionNetworkId (48) */
+  /** @name XcmV0JunctionNetworkId (49) */
   interface XcmV0JunctionNetworkId extends Enum {
     readonly isAny: boolean;
     readonly isNamed: boolean;
@@ -453,7 +453,7 @@
     readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';
   }
 
-  /** @name XcmV0JunctionBodyId (52) */
+  /** @name XcmV0JunctionBodyId (53) */
   interface XcmV0JunctionBodyId extends Enum {
     readonly isUnit: boolean;
     readonly isNamed: boolean;
@@ -467,7 +467,7 @@
     readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';
   }
 
-  /** @name XcmV0JunctionBodyPart (53) */
+  /** @name XcmV0JunctionBodyPart (54) */
   interface XcmV0JunctionBodyPart extends Enum {
     readonly isVoice: boolean;
     readonly isMembers: boolean;
@@ -492,7 +492,7 @@
     readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';
   }
 
-  /** @name XcmV1MultiassetFungibility (54) */
+  /** @name XcmV1MultiassetFungibility (55) */
   interface XcmV1MultiassetFungibility extends Enum {
     readonly isFungible: boolean;
     readonly asFungible: Compact<u128>;
@@ -501,7 +501,7 @@
     readonly type: 'Fungible' | 'NonFungible';
   }
 
-  /** @name XcmV1MultiassetAssetInstance (55) */
+  /** @name XcmV1MultiassetAssetInstance (56) */
   interface XcmV1MultiassetAssetInstance extends Enum {
     readonly isUndefined: boolean;
     readonly isIndex: boolean;
@@ -519,7 +519,7 @@
     readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';
   }
 
-  /** @name OrmlTokensModuleEvent (58) */
+  /** @name OrmlTokensModuleEvent (59) */
   interface OrmlTokensModuleEvent extends Enum {
     readonly isEndowed: boolean;
     readonly asEndowed: {
@@ -607,7 +607,7 @@
     readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'BalanceSet' | 'TotalIssuanceSet' | 'Withdrawn' | 'Slashed' | 'Deposited' | 'LockSet' | 'LockRemoved';
   }
 
-  /** @name PalletForeignAssetsAssetIds (59) */
+  /** @name PalletForeignAssetsAssetIds (60) */
   interface PalletForeignAssetsAssetIds extends Enum {
     readonly isForeignAssetId: boolean;
     readonly asForeignAssetId: u32;
@@ -616,25 +616,25 @@
     readonly type: 'ForeignAssetId' | 'NativeAssetId';
   }
 
-  /** @name PalletForeignAssetsNativeCurrency (60) */
+  /** @name PalletForeignAssetsNativeCurrency (61) */
   interface PalletForeignAssetsNativeCurrency extends Enum {
     readonly isHere: boolean;
     readonly isParent: boolean;
     readonly type: 'Here' | 'Parent';
   }
 
-  /** @name CumulusPalletXcmpQueueEvent (61) */
+  /** @name CumulusPalletXcmpQueueEvent (62) */
   interface CumulusPalletXcmpQueueEvent extends Enum {
     readonly isSuccess: boolean;
     readonly asSuccess: {
       readonly messageHash: Option<H256>;
-      readonly weight: u64;
+      readonly weight: Weight;
     } & Struct;
     readonly isFail: boolean;
     readonly asFail: {
       readonly messageHash: Option<H256>;
       readonly error: XcmV2TraitsError;
-      readonly weight: u64;
+      readonly weight: Weight;
     } & Struct;
     readonly isBadVersion: boolean;
     readonly asBadVersion: {
@@ -657,17 +657,17 @@
       readonly sender: u32;
       readonly sentAt: u32;
       readonly index: u64;
-      readonly required: u64;
+      readonly required: Weight;
     } & Struct;
     readonly isOverweightServiced: boolean;
     readonly asOverweightServiced: {
       readonly index: u64;
-      readonly used: u64;
+      readonly used: Weight;
     } & Struct;
     readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';
   }
 
-  /** @name XcmV2TraitsError (63) */
+  /** @name XcmV2TraitsError (64) */
   interface XcmV2TraitsError extends Enum {
     readonly isOverflow: boolean;
     readonly isUnimplemented: boolean;
@@ -700,7 +700,7 @@
     readonly type: 'Overflow' | 'Unimplemented' | 'UntrustedReserveLocation' | 'UntrustedTeleportLocation' | 'MultiLocationFull' | 'MultiLocationNotInvertible' | 'BadOrigin' | 'InvalidLocation' | 'AssetNotFound' | 'FailedToTransactAsset' | 'NotWithdrawable' | 'LocationCannotHold' | 'ExceedsMaxMessageSize' | 'DestinationUnsupported' | 'Transport' | 'Unroutable' | 'UnknownClaim' | 'FailedToDecode' | 'MaxWeightInvalid' | 'NotHoldingFees' | 'TooExpensive' | 'Trap' | 'UnhandledXcmVersion' | 'WeightLimitReached' | 'Barrier' | 'WeightNotComputable';
   }
 
-  /** @name PalletXcmEvent (65) */
+  /** @name PalletXcmEvent (66) */
   interface PalletXcmEvent extends Enum {
     readonly isAttempted: boolean;
     readonly asAttempted: XcmV2TraitsOutcome;
@@ -713,7 +713,7 @@
     readonly isNotified: boolean;
     readonly asNotified: ITuple<[u64, u8, u8]>;
     readonly isNotifyOverweight: boolean;
-    readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;
+    readonly asNotifyOverweight: ITuple<[u64, u8, u8, Weight, Weight]>;
     readonly isNotifyDispatchError: boolean;
     readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;
     readonly isNotifyDecodeFailed: boolean;
@@ -737,7 +737,7 @@
     readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';
   }
 
-  /** @name XcmV2TraitsOutcome (66) */
+  /** @name XcmV2TraitsOutcome (67) */
   interface XcmV2TraitsOutcome extends Enum {
     readonly isComplete: boolean;
     readonly asComplete: u64;
@@ -748,10 +748,10 @@
     readonly type: 'Complete' | 'Incomplete' | 'Error';
   }
 
-  /** @name XcmV2Xcm (67) */
+  /** @name XcmV2Xcm (68) */
   interface XcmV2Xcm extends Vec<XcmV2Instruction> {}
 
-  /** @name XcmV2Instruction (69) */
+  /** @name XcmV2Instruction (70) */
   interface XcmV2Instruction extends Enum {
     readonly isWithdrawAsset: boolean;
     readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;
@@ -871,7 +871,7 @@
     readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'ClearOrigin' | 'DescendOrigin' | 'ReportError' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution' | 'RefundSurplus' | 'SetErrorHandler' | 'SetAppendix' | 'ClearError' | 'ClaimAsset' | 'Trap' | 'SubscribeVersion' | 'UnsubscribeVersion';
   }
 
-  /** @name XcmV2Response (70) */
+  /** @name XcmV2Response (71) */
   interface XcmV2Response extends Enum {
     readonly isNull: boolean;
     readonly isAssets: boolean;
@@ -883,7 +883,7 @@
     readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';
   }
 
-  /** @name XcmV0OriginKind (73) */
+  /** @name XcmV0OriginKind (74) */
   interface XcmV0OriginKind extends Enum {
     readonly isNative: boolean;
     readonly isSovereignAccount: boolean;
@@ -892,12 +892,12 @@
     readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';
   }
 
-  /** @name XcmDoubleEncoded (74) */
+  /** @name XcmDoubleEncoded (75) */
   interface XcmDoubleEncoded extends Struct {
     readonly encoded: Bytes;
   }
 
-  /** @name XcmV1MultiassetMultiAssetFilter (75) */
+  /** @name XcmV1MultiassetMultiAssetFilter (76) */
   interface XcmV1MultiassetMultiAssetFilter extends Enum {
     readonly isDefinite: boolean;
     readonly asDefinite: XcmV1MultiassetMultiAssets;
@@ -906,7 +906,7 @@
     readonly type: 'Definite' | 'Wild';
   }
 
-  /** @name XcmV1MultiassetWildMultiAsset (76) */
+  /** @name XcmV1MultiassetWildMultiAsset (77) */
   interface XcmV1MultiassetWildMultiAsset extends Enum {
     readonly isAll: boolean;
     readonly isAllOf: boolean;
@@ -917,14 +917,14 @@
     readonly type: 'All' | 'AllOf';
   }
 
-  /** @name XcmV1MultiassetWildFungibility (77) */
+  /** @name XcmV1MultiassetWildFungibility (78) */
   interface XcmV1MultiassetWildFungibility extends Enum {
     readonly isFungible: boolean;
     readonly isNonFungible: boolean;
     readonly type: 'Fungible' | 'NonFungible';
   }
 
-  /** @name XcmV2WeightLimit (78) */
+  /** @name XcmV2WeightLimit (79) */
   interface XcmV2WeightLimit extends Enum {
     readonly isUnlimited: boolean;
     readonly isLimited: boolean;
@@ -932,7 +932,7 @@
     readonly type: 'Unlimited' | 'Limited';
   }
 
-  /** @name XcmVersionedMultiAssets (80) */
+  /** @name XcmVersionedMultiAssets (81) */
   interface XcmVersionedMultiAssets extends Enum {
     readonly isV0: boolean;
     readonly asV0: Vec<XcmV0MultiAsset>;
@@ -941,7 +941,7 @@
     readonly type: 'V0' | 'V1';
   }
 
-  /** @name XcmV0MultiAsset (82) */
+  /** @name XcmV0MultiAsset (83) */
   interface XcmV0MultiAsset extends Enum {
     readonly isNone: boolean;
     readonly isAll: boolean;
@@ -986,7 +986,7 @@
     readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';
   }
 
-  /** @name XcmV0MultiLocation (83) */
+  /** @name XcmV0MultiLocation (84) */
   interface XcmV0MultiLocation extends Enum {
     readonly isNull: boolean;
     readonly isX1: boolean;
@@ -1008,7 +1008,7 @@
     readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';
   }
 
-  /** @name XcmV0Junction (84) */
+  /** @name XcmV0Junction (85) */
   interface XcmV0Junction extends Enum {
     readonly isParent: boolean;
     readonly isParachain: boolean;
@@ -1043,7 +1043,7 @@
     readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';
   }
 
-  /** @name XcmVersionedMultiLocation (85) */
+  /** @name XcmVersionedMultiLocation (86) */
   interface XcmVersionedMultiLocation extends Enum {
     readonly isV0: boolean;
     readonly asV0: XcmV0MultiLocation;
@@ -1052,7 +1052,7 @@
     readonly type: 'V0' | 'V1';
   }
 
-  /** @name CumulusPalletXcmEvent (86) */
+  /** @name CumulusPalletXcmEvent (87) */
   interface CumulusPalletXcmEvent extends Enum {
     readonly isInvalidFormat: boolean;
     readonly asInvalidFormat: U8aFixed;
@@ -1063,7 +1063,7 @@
     readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';
   }
 
-  /** @name CumulusPalletDmpQueueEvent (87) */
+  /** @name CumulusPalletDmpQueueEvent (88) */
   interface CumulusPalletDmpQueueEvent extends Enum {
     readonly isInvalidFormat: boolean;
     readonly asInvalidFormat: {
@@ -1081,24 +1081,24 @@
     readonly isWeightExhausted: boolean;
     readonly asWeightExhausted: {
       readonly messageId: U8aFixed;
-      readonly remainingWeight: u64;
-      readonly requiredWeight: u64;
+      readonly remainingWeight: Weight;
+      readonly requiredWeight: Weight;
     } & Struct;
     readonly isOverweightEnqueued: boolean;
     readonly asOverweightEnqueued: {
       readonly messageId: U8aFixed;
       readonly overweightIndex: u64;
-      readonly requiredWeight: u64;
+      readonly requiredWeight: Weight;
     } & Struct;
     readonly isOverweightServiced: boolean;
     readonly asOverweightServiced: {
       readonly overweightIndex: u64;
-      readonly weightUsed: u64;
+      readonly weightUsed: Weight;
     } & Struct;
     readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';
   }
 
-  /** @name PalletUniqueRawEvent (88) */
+  /** @name PalletUniqueRawEvent (89) */
   interface PalletUniqueRawEvent extends Enum {
     readonly isCollectionSponsorRemoved: boolean;
     readonly asCollectionSponsorRemoved: u32;
@@ -1123,7 +1123,7 @@
     readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';
   }
 
-  /** @name PalletEvmAccountBasicCrossAccountIdRepr (89) */
+  /** @name PalletEvmAccountBasicCrossAccountIdRepr (90) */
   interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {
     readonly isSubstrate: boolean;
     readonly asSubstrate: AccountId32;
@@ -1132,7 +1132,7 @@
     readonly type: 'Substrate' | 'Ethereum';
   }
 
-  /** @name PalletUniqueSchedulerEvent (92) */
+  /** @name PalletUniqueSchedulerEvent (93) */
   interface PalletUniqueSchedulerEvent extends Enum {
     readonly isScheduled: boolean;
     readonly asScheduled: {
@@ -1159,14 +1159,14 @@
     readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';
   }
 
-  /** @name FrameSupportScheduleLookupError (95) */
+  /** @name FrameSupportScheduleLookupError (96) */
   interface FrameSupportScheduleLookupError extends Enum {
     readonly isUnknown: boolean;
     readonly isBadFormat: boolean;
     readonly type: 'Unknown' | 'BadFormat';
   }
 
-  /** @name PalletCommonEvent (96) */
+  /** @name PalletCommonEvent (97) */
   interface PalletCommonEvent extends Enum {
     readonly isCollectionCreated: boolean;
     readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;
@@ -1193,14 +1193,14 @@
     readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';
   }
 
-  /** @name PalletStructureEvent (99) */
+  /** @name PalletStructureEvent (100) */
   interface PalletStructureEvent extends Enum {
     readonly isExecuted: boolean;
     readonly asExecuted: Result<Null, SpRuntimeDispatchError>;
     readonly type: 'Executed';
   }
 
-  /** @name PalletRmrkCoreEvent (100) */
+  /** @name PalletRmrkCoreEvent (101) */
   interface PalletRmrkCoreEvent extends Enum {
     readonly isCollectionCreated: boolean;
     readonly asCollectionCreated: {
@@ -1290,7 +1290,7 @@
     readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';
   }
 
-  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (101) */
+  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (102) */
   interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {
     readonly isAccountId: boolean;
     readonly asAccountId: AccountId32;
@@ -1299,7 +1299,7 @@
     readonly type: 'AccountId' | 'CollectionAndNftTuple';
   }
 
-  /** @name PalletRmrkEquipEvent (106) */
+  /** @name PalletRmrkEquipEvent (107) */
   interface PalletRmrkEquipEvent extends Enum {
     readonly isBaseCreated: boolean;
     readonly asBaseCreated: {
@@ -1314,7 +1314,7 @@
     readonly type: 'BaseCreated' | 'EquippablesUpdated';
   }
 
-  /** @name PalletAppPromotionEvent (107) */
+  /** @name PalletAppPromotionEvent (108) */
   interface PalletAppPromotionEvent extends Enum {
     readonly isStakingRecalculation: boolean;
     readonly asStakingRecalculation: ITuple<[AccountId32, u128, u128]>;
@@ -1327,7 +1327,7 @@
     readonly type: 'StakingRecalculation' | 'Stake' | 'Unstake' | 'SetAdmin';
   }
 
-  /** @name PalletForeignAssetsModuleEvent (108) */
+  /** @name PalletForeignAssetsModuleEvent (109) */
   interface PalletForeignAssetsModuleEvent extends Enum {
     readonly isForeignAssetRegistered: boolean;
     readonly asForeignAssetRegistered: {
@@ -1354,7 +1354,7 @@
     readonly type: 'ForeignAssetRegistered' | 'ForeignAssetUpdated' | 'AssetRegistered' | 'AssetUpdated';
   }
 
-  /** @name PalletForeignAssetsModuleAssetMetadata (109) */
+  /** @name PalletForeignAssetsModuleAssetMetadata (110) */
   interface PalletForeignAssetsModuleAssetMetadata extends Struct {
     readonly name: Bytes;
     readonly symbol: Bytes;
@@ -1362,7 +1362,7 @@
     readonly minimalBalance: u128;
   }
 
-  /** @name PalletEvmEvent (110) */
+  /** @name PalletEvmEvent (111) */
   interface PalletEvmEvent extends Enum {
     readonly isLog: boolean;
     readonly asLog: EthereumLog;
@@ -1381,21 +1381,21 @@
     readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';
   }
 
-  /** @name EthereumLog (111) */
+  /** @name EthereumLog (112) */
   interface EthereumLog extends Struct {
     readonly address: H160;
     readonly topics: Vec<H256>;
     readonly data: Bytes;
   }
 
-  /** @name PalletEthereumEvent (115) */
+  /** @name PalletEthereumEvent (116) */
   interface PalletEthereumEvent extends Enum {
     readonly isExecuted: boolean;
     readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;
     readonly type: 'Executed';
   }
 
-  /** @name EvmCoreErrorExitReason (116) */
+  /** @name EvmCoreErrorExitReason (117) */
   interface EvmCoreErrorExitReason extends Enum {
     readonly isSucceed: boolean;
     readonly asSucceed: EvmCoreErrorExitSucceed;
@@ -1408,7 +1408,7 @@
     readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';
   }
 
-  /** @name EvmCoreErrorExitSucceed (117) */
+  /** @name EvmCoreErrorExitSucceed (118) */
   interface EvmCoreErrorExitSucceed extends Enum {
     readonly isStopped: boolean;
     readonly isReturned: boolean;
@@ -1416,7 +1416,7 @@
     readonly type: 'Stopped' | 'Returned' | 'Suicided';
   }
 
-  /** @name EvmCoreErrorExitError (118) */
+  /** @name EvmCoreErrorExitError (119) */
   interface EvmCoreErrorExitError extends Enum {
     readonly isStackUnderflow: boolean;
     readonly isStackOverflow: boolean;
@@ -1437,13 +1437,13 @@
     readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';
   }
 
-  /** @name EvmCoreErrorExitRevert (121) */
+  /** @name EvmCoreErrorExitRevert (122) */
   interface EvmCoreErrorExitRevert extends Enum {
     readonly isReverted: boolean;
     readonly type: 'Reverted';
   }
 
-  /** @name EvmCoreErrorExitFatal (122) */
+  /** @name EvmCoreErrorExitFatal (123) */
   interface EvmCoreErrorExitFatal extends Enum {
     readonly isNotSupported: boolean;
     readonly isUnhandledInterrupt: boolean;
@@ -1454,7 +1454,7 @@
     readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';
   }
 
-  /** @name PalletEvmContractHelpersEvent (123) */
+  /** @name PalletEvmContractHelpersEvent (124) */
   interface PalletEvmContractHelpersEvent extends Enum {
     readonly isContractSponsorSet: boolean;
     readonly asContractSponsorSet: ITuple<[H160, AccountId32]>;
@@ -1465,7 +1465,7 @@
     readonly type: 'ContractSponsorSet' | 'ContractSponsorshipConfirmed' | 'ContractSponsorRemoved';
   }
 
-  /** @name FrameSystemPhase (124) */
+  /** @name FrameSystemPhase (125) */
   interface FrameSystemPhase extends Enum {
     readonly isApplyExtrinsic: boolean;
     readonly asApplyExtrinsic: u32;
@@ -1474,13 +1474,13 @@
     readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';
   }
 
-  /** @name FrameSystemLastRuntimeUpgradeInfo (126) */
+  /** @name FrameSystemLastRuntimeUpgradeInfo (127) */
   interface FrameSystemLastRuntimeUpgradeInfo extends Struct {
     readonly specVersion: Compact<u32>;
     readonly specName: Text;
   }
 
-  /** @name FrameSystemCall (127) */
+  /** @name FrameSystemCall (128) */
   interface FrameSystemCall extends Enum {
     readonly isFillBlock: boolean;
     readonly asFillBlock: {
@@ -1522,47 +1522,47 @@
     readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';
   }
 
-  /** @name FrameSystemLimitsBlockWeights (132) */
+  /** @name FrameSystemLimitsBlockWeights (133) */
   interface FrameSystemLimitsBlockWeights extends Struct {
-    readonly baseBlock: u64;
-    readonly maxBlock: u64;
+    readonly baseBlock: Weight;
+    readonly maxBlock: Weight;
     readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;
   }
 
-  /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (133) */
+  /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (134) */
   interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {
     readonly normal: FrameSystemLimitsWeightsPerClass;
     readonly operational: FrameSystemLimitsWeightsPerClass;
     readonly mandatory: FrameSystemLimitsWeightsPerClass;
   }
 
-  /** @name FrameSystemLimitsWeightsPerClass (134) */
+  /** @name FrameSystemLimitsWeightsPerClass (135) */
   interface FrameSystemLimitsWeightsPerClass extends Struct {
-    readonly baseExtrinsic: u64;
-    readonly maxExtrinsic: Option<u64>;
-    readonly maxTotal: Option<u64>;
-    readonly reserved: Option<u64>;
+    readonly baseExtrinsic: Weight;
+    readonly maxExtrinsic: Option<Weight>;
+    readonly maxTotal: Option<Weight>;
+    readonly reserved: Option<Weight>;
   }
 
-  /** @name FrameSystemLimitsBlockLength (136) */
+  /** @name FrameSystemLimitsBlockLength (137) */
   interface FrameSystemLimitsBlockLength extends Struct {
     readonly max: FrameSupportWeightsPerDispatchClassU32;
   }
 
-  /** @name FrameSupportWeightsPerDispatchClassU32 (137) */
+  /** @name FrameSupportWeightsPerDispatchClassU32 (138) */
   interface FrameSupportWeightsPerDispatchClassU32 extends Struct {
     readonly normal: u32;
     readonly operational: u32;
     readonly mandatory: u32;
   }
 
-  /** @name FrameSupportWeightsRuntimeDbWeight (138) */
+  /** @name FrameSupportWeightsRuntimeDbWeight (139) */
   interface FrameSupportWeightsRuntimeDbWeight extends Struct {
     readonly read: u64;
     readonly write: u64;
   }
 
-  /** @name SpVersionRuntimeVersion (139) */
+  /** @name SpVersionRuntimeVersion (140) */
   interface SpVersionRuntimeVersion extends Struct {
     readonly specName: Text;
     readonly implName: Text;
@@ -1574,7 +1574,7 @@
     readonly stateVersion: u8;
   }
 
-  /** @name FrameSystemError (144) */
+  /** @name FrameSystemError (145) */
   interface FrameSystemError extends Enum {
     readonly isInvalidSpecName: boolean;
     readonly isSpecVersionNeedsToIncrease: boolean;
@@ -1585,7 +1585,7 @@
     readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';
   }
 
-  /** @name PolkadotPrimitivesV2PersistedValidationData (145) */
+  /** @name PolkadotPrimitivesV2PersistedValidationData (146) */
   interface PolkadotPrimitivesV2PersistedValidationData extends Struct {
     readonly parentHead: Bytes;
     readonly relayParentNumber: u32;
@@ -1593,18 +1593,18 @@
     readonly maxPovSize: u32;
   }
 
-  /** @name PolkadotPrimitivesV2UpgradeRestriction (148) */
+  /** @name PolkadotPrimitivesV2UpgradeRestriction (149) */
   interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {
     readonly isPresent: boolean;
     readonly type: 'Present';
   }
 
-  /** @name SpTrieStorageProof (149) */
+  /** @name SpTrieStorageProof (150) */
   interface SpTrieStorageProof extends Struct {
     readonly trieNodes: BTreeSet<Bytes>;
   }
 
-  /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (151) */
+  /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (152) */
   interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {
     readonly dmqMqcHead: H256;
     readonly relayDispatchQueueSize: ITuple<[u32, u32]>;
@@ -1612,7 +1612,7 @@
     readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;
   }
 
-  /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (154) */
+  /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (155) */
   interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {
     readonly maxCapacity: u32;
     readonly maxTotalSize: u32;
@@ -1622,7 +1622,7 @@
     readonly mqcHead: Option<H256>;
   }
 
-  /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (155) */
+  /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (156) */
   interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {
     readonly maxCodeSize: u32;
     readonly maxHeadDataSize: u32;
@@ -1635,13 +1635,13 @@
     readonly validationUpgradeDelay: u32;
   }
 
-  /** @name PolkadotCorePrimitivesOutboundHrmpMessage (161) */
+  /** @name PolkadotCorePrimitivesOutboundHrmpMessage (162) */
   interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {
     readonly recipient: u32;
     readonly data: Bytes;
   }
 
-  /** @name CumulusPalletParachainSystemCall (162) */
+  /** @name CumulusPalletParachainSystemCall (163) */
   interface CumulusPalletParachainSystemCall extends Enum {
     readonly isSetValidationData: boolean;
     readonly asSetValidationData: {
@@ -1662,7 +1662,7 @@
     readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';
   }
 
-  /** @name CumulusPrimitivesParachainInherentParachainInherentData (163) */
+  /** @name CumulusPrimitivesParachainInherentParachainInherentData (164) */
   interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {
     readonly validationData: PolkadotPrimitivesV2PersistedValidationData;
     readonly relayChainState: SpTrieStorageProof;
@@ -1670,19 +1670,19 @@
     readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;
   }
 
-  /** @name PolkadotCorePrimitivesInboundDownwardMessage (165) */
+  /** @name PolkadotCorePrimitivesInboundDownwardMessage (166) */
   interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {
     readonly sentAt: u32;
     readonly msg: Bytes;
   }
 
-  /** @name PolkadotCorePrimitivesInboundHrmpMessage (168) */
+  /** @name PolkadotCorePrimitivesInboundHrmpMessage (169) */
   interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {
     readonly sentAt: u32;
     readonly data: Bytes;
   }
 
-  /** @name CumulusPalletParachainSystemError (171) */
+  /** @name CumulusPalletParachainSystemError (172) */
   interface CumulusPalletParachainSystemError extends Enum {
     readonly isOverlappingUpgrades: boolean;
     readonly isProhibitedByPolkadot: boolean;
@@ -1695,14 +1695,14 @@
     readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';
   }
 
-  /** @name PalletBalancesBalanceLock (173) */
+  /** @name PalletBalancesBalanceLock (174) */
   interface PalletBalancesBalanceLock extends Struct {
     readonly id: U8aFixed;
     readonly amount: u128;
     readonly reasons: PalletBalancesReasons;
   }
 
-  /** @name PalletBalancesReasons (174) */
+  /** @name PalletBalancesReasons (175) */
   interface PalletBalancesReasons extends Enum {
     readonly isFee: boolean;
     readonly isMisc: boolean;
@@ -1710,20 +1710,20 @@
     readonly type: 'Fee' | 'Misc' | 'All';
   }
 
-  /** @name PalletBalancesReserveData (177) */
+  /** @name PalletBalancesReserveData (178) */
   interface PalletBalancesReserveData extends Struct {
     readonly id: U8aFixed;
     readonly amount: u128;
   }
 
-  /** @name PalletBalancesReleases (179) */
+  /** @name PalletBalancesReleases (180) */
   interface PalletBalancesReleases extends Enum {
     readonly isV100: boolean;
     readonly isV200: boolean;
     readonly type: 'V100' | 'V200';
   }
 
-  /** @name PalletBalancesCall (180) */
+  /** @name PalletBalancesCall (181) */
   interface PalletBalancesCall extends Enum {
     readonly isTransfer: boolean;
     readonly asTransfer: {
@@ -1760,7 +1760,7 @@
     readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';
   }
 
-  /** @name PalletBalancesError (183) */
+  /** @name PalletBalancesError (184) */
   interface PalletBalancesError extends Enum {
     readonly isVestingBalance: boolean;
     readonly isLiquidityRestrictions: boolean;
@@ -1773,7 +1773,7 @@
     readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';
   }
 
-  /** @name PalletTimestampCall (185) */
+  /** @name PalletTimestampCall (186) */
   interface PalletTimestampCall extends Enum {
     readonly isSet: boolean;
     readonly asSet: {
@@ -1782,14 +1782,14 @@
     readonly type: 'Set';
   }
 
-  /** @name PalletTransactionPaymentReleases (187) */
+  /** @name PalletTransactionPaymentReleases (188) */
   interface PalletTransactionPaymentReleases extends Enum {
     readonly isV1Ancient: boolean;
     readonly isV2: boolean;
     readonly type: 'V1Ancient' | 'V2';
   }
 
-  /** @name PalletTreasuryProposal (188) */
+  /** @name PalletTreasuryProposal (189) */
   interface PalletTreasuryProposal extends Struct {
     readonly proposer: AccountId32;
     readonly value: u128;
@@ -1797,7 +1797,7 @@
     readonly bond: u128;
   }
 
-  /** @name PalletTreasuryCall (191) */
+  /** @name PalletTreasuryCall (192) */
   interface PalletTreasuryCall extends Enum {
     readonly isProposeSpend: boolean;
     readonly asProposeSpend: {
@@ -1824,10 +1824,10 @@
     readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'Spend' | 'RemoveApproval';
   }
 
-  /** @name FrameSupportPalletId (194) */
+  /** @name FrameSupportPalletId (195) */
   interface FrameSupportPalletId extends U8aFixed {}
 
-  /** @name PalletTreasuryError (195) */
+  /** @name PalletTreasuryError (196) */
   interface PalletTreasuryError extends Enum {
     readonly isInsufficientProposersBalance: boolean;
     readonly isInvalidIndex: boolean;
@@ -1837,7 +1837,7 @@
     readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'InsufficientPermission' | 'ProposalNotApproved';
   }
 
-  /** @name PalletSudoCall (196) */
+  /** @name PalletSudoCall (197) */
   interface PalletSudoCall extends Enum {
     readonly isSudo: boolean;
     readonly asSudo: {
@@ -1846,7 +1846,7 @@
     readonly isSudoUncheckedWeight: boolean;
     readonly asSudoUncheckedWeight: {
       readonly call: Call;
-      readonly weight: u64;
+      readonly weight: Weight;
     } & Struct;
     readonly isSetKey: boolean;
     readonly asSetKey: {
@@ -1860,7 +1860,7 @@
     readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';
   }
 
-  /** @name OrmlVestingModuleCall (198) */
+  /** @name OrmlVestingModuleCall (199) */
   interface OrmlVestingModuleCall extends Enum {
     readonly isClaim: boolean;
     readonly isVestedTransfer: boolean;
@@ -1880,7 +1880,7 @@
     readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';
   }
 
-  /** @name OrmlXtokensModuleCall (200) */
+  /** @name OrmlXtokensModuleCall (201) */
   interface OrmlXtokensModuleCall extends Enum {
     readonly isTransfer: boolean;
     readonly asTransfer: {
@@ -1927,7 +1927,7 @@
     readonly type: 'Transfer' | 'TransferMultiasset' | 'TransferWithFee' | 'TransferMultiassetWithFee' | 'TransferMulticurrencies' | 'TransferMultiassets';
   }
 
-  /** @name XcmVersionedMultiAsset (201) */
+  /** @name XcmVersionedMultiAsset (202) */
   interface XcmVersionedMultiAsset extends Enum {
     readonly isV0: boolean;
     readonly asV0: XcmV0MultiAsset;
@@ -1936,7 +1936,7 @@
     readonly type: 'V0' | 'V1';
   }
 
-  /** @name OrmlTokensModuleCall (204) */
+  /** @name OrmlTokensModuleCall (205) */
   interface OrmlTokensModuleCall extends Enum {
     readonly isTransfer: boolean;
     readonly asTransfer: {
@@ -1973,12 +1973,12 @@
     readonly type: 'Transfer' | 'TransferAll' | 'TransferKeepAlive' | 'ForceTransfer' | 'SetBalance';
   }
 
-  /** @name CumulusPalletXcmpQueueCall (205) */
+  /** @name CumulusPalletXcmpQueueCall (206) */
   interface CumulusPalletXcmpQueueCall extends Enum {
     readonly isServiceOverweight: boolean;
     readonly asServiceOverweight: {
       readonly index: u64;
-      readonly weightLimit: u64;
+      readonly weightLimit: Weight;
     } & Struct;
     readonly isSuspendXcmExecution: boolean;
     readonly isResumeXcmExecution: boolean;
@@ -1996,20 +1996,20 @@
     } & Struct;
     readonly isUpdateThresholdWeight: boolean;
     readonly asUpdateThresholdWeight: {
-      readonly new_: u64;
+      readonly new_: Weight;
     } & Struct;
     readonly isUpdateWeightRestrictDecay: boolean;
     readonly asUpdateWeightRestrictDecay: {
-      readonly new_: u64;
+      readonly new_: Weight;
     } & Struct;
     readonly isUpdateXcmpMaxIndividualWeight: boolean;
     readonly asUpdateXcmpMaxIndividualWeight: {
-      readonly new_: u64;
+      readonly new_: Weight;
     } & Struct;
     readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';
   }
 
-  /** @name PalletXcmCall (206) */
+  /** @name PalletXcmCall (207) */
   interface PalletXcmCall extends Enum {
     readonly isSend: boolean;
     readonly asSend: {
@@ -2033,7 +2033,7 @@
     readonly isExecute: boolean;
     readonly asExecute: {
       readonly message: XcmVersionedXcm;
-      readonly maxWeight: u64;
+      readonly maxWeight: Weight;
     } & Struct;
     readonly isForceXcmVersion: boolean;
     readonly asForceXcmVersion: {
@@ -2071,7 +2071,7 @@
     readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';
   }
 
-  /** @name XcmVersionedXcm (207) */
+  /** @name XcmVersionedXcm (208) */
   interface XcmVersionedXcm extends Enum {
     readonly isV0: boolean;
     readonly asV0: XcmV0Xcm;
@@ -2082,7 +2082,7 @@
     readonly type: 'V0' | 'V1' | 'V2';
   }
 
-  /** @name XcmV0Xcm (208) */
+  /** @name XcmV0Xcm (209) */
   interface XcmV0Xcm extends Enum {
     readonly isWithdrawAsset: boolean;
     readonly asWithdrawAsset: {
@@ -2145,7 +2145,7 @@
     readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';
   }
 
-  /** @name XcmV0Order (210) */
+  /** @name XcmV0Order (211) */
   interface XcmV0Order extends Enum {
     readonly isNull: boolean;
     readonly isDepositAsset: boolean;
@@ -2193,14 +2193,14 @@
     readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';
   }
 
-  /** @name XcmV0Response (212) */
+  /** @name XcmV0Response (213) */
   interface XcmV0Response extends Enum {
     readonly isAssets: boolean;
     readonly asAssets: Vec<XcmV0MultiAsset>;
     readonly type: 'Assets';
   }
 
-  /** @name XcmV1Xcm (213) */
+  /** @name XcmV1Xcm (214) */
   interface XcmV1Xcm extends Enum {
     readonly isWithdrawAsset: boolean;
     readonly asWithdrawAsset: {
@@ -2269,7 +2269,7 @@
     readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';
   }
 
-  /** @name XcmV1Order (215) */
+  /** @name XcmV1Order (216) */
   interface XcmV1Order extends Enum {
     readonly isNoop: boolean;
     readonly isDepositAsset: boolean;
@@ -2319,7 +2319,7 @@
     readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';
   }
 
-  /** @name XcmV1Response (217) */
+  /** @name XcmV1Response (218) */
   interface XcmV1Response extends Enum {
     readonly isAssets: boolean;
     readonly asAssets: XcmV1MultiassetMultiAssets;
@@ -2328,20 +2328,20 @@
     readonly type: 'Assets' | 'Version';
   }
 
-  /** @name CumulusPalletXcmCall (231) */
+  /** @name CumulusPalletXcmCall (232) */
   type CumulusPalletXcmCall = Null;
 
-  /** @name CumulusPalletDmpQueueCall (232) */
+  /** @name CumulusPalletDmpQueueCall (233) */
   interface CumulusPalletDmpQueueCall extends Enum {
     readonly isServiceOverweight: boolean;
     readonly asServiceOverweight: {
       readonly index: u64;
-      readonly weightLimit: u64;
+      readonly weightLimit: Weight;
     } & Struct;
     readonly type: 'ServiceOverweight';
   }
 
-  /** @name PalletInflationCall (233) */
+  /** @name PalletInflationCall (234) */
   interface PalletInflationCall extends Enum {
     readonly isStartInflation: boolean;
     readonly asStartInflation: {
@@ -2350,7 +2350,7 @@
     readonly type: 'StartInflation';
   }
 
-  /** @name PalletUniqueCall (234) */
+  /** @name PalletUniqueCall (235) */
   interface PalletUniqueCall extends Enum {
     readonly isCreateCollection: boolean;
     readonly asCreateCollection: {
@@ -2508,7 +2508,7 @@
     readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition';
   }
 
-  /** @name UpDataStructsCollectionMode (239) */
+  /** @name UpDataStructsCollectionMode (240) */
   interface UpDataStructsCollectionMode extends Enum {
     readonly isNft: boolean;
     readonly isFungible: boolean;
@@ -2517,7 +2517,7 @@
     readonly type: 'Nft' | 'Fungible' | 'ReFungible';
   }
 
-  /** @name UpDataStructsCreateCollectionData (240) */
+  /** @name UpDataStructsCreateCollectionData (241) */
   interface UpDataStructsCreateCollectionData extends Struct {
     readonly mode: UpDataStructsCollectionMode;
     readonly access: Option<UpDataStructsAccessMode>;
@@ -2531,14 +2531,14 @@
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name UpDataStructsAccessMode (242) */
+  /** @name UpDataStructsAccessMode (243) */
   interface UpDataStructsAccessMode extends Enum {
     readonly isNormal: boolean;
     readonly isAllowList: boolean;
     readonly type: 'Normal' | 'AllowList';
   }
 
-  /** @name UpDataStructsCollectionLimits (244) */
+  /** @name UpDataStructsCollectionLimits (245) */
   interface UpDataStructsCollectionLimits extends Struct {
     readonly accountTokenOwnershipLimit: Option<u32>;
     readonly sponsoredDataSize: Option<u32>;
@@ -2551,7 +2551,7 @@
     readonly transfersEnabled: Option<bool>;
   }
 
-  /** @name UpDataStructsSponsoringRateLimit (246) */
+  /** @name UpDataStructsSponsoringRateLimit (247) */
   interface UpDataStructsSponsoringRateLimit extends Enum {
     readonly isSponsoringDisabled: boolean;
     readonly isBlocks: boolean;
@@ -2559,43 +2559,43 @@
     readonly type: 'SponsoringDisabled' | 'Blocks';
   }
 
-  /** @name UpDataStructsCollectionPermissions (249) */
+  /** @name UpDataStructsCollectionPermissions (250) */
   interface UpDataStructsCollectionPermissions extends Struct {
     readonly access: Option<UpDataStructsAccessMode>;
     readonly mintMode: Option<bool>;
     readonly nesting: Option<UpDataStructsNestingPermissions>;
   }
 
-  /** @name UpDataStructsNestingPermissions (251) */
+  /** @name UpDataStructsNestingPermissions (252) */
   interface UpDataStructsNestingPermissions extends Struct {
     readonly tokenOwner: bool;
     readonly collectionAdmin: bool;
     readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;
   }
 
-  /** @name UpDataStructsOwnerRestrictedSet (253) */
+  /** @name UpDataStructsOwnerRestrictedSet (254) */
   interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}
 
-  /** @name UpDataStructsPropertyKeyPermission (258) */
+  /** @name UpDataStructsPropertyKeyPermission (259) */
   interface UpDataStructsPropertyKeyPermission extends Struct {
     readonly key: Bytes;
     readonly permission: UpDataStructsPropertyPermission;
   }
 
-  /** @name UpDataStructsPropertyPermission (259) */
+  /** @name UpDataStructsPropertyPermission (260) */
   interface UpDataStructsPropertyPermission extends Struct {
     readonly mutable: bool;
     readonly collectionAdmin: bool;
     readonly tokenOwner: bool;
   }
 
-  /** @name UpDataStructsProperty (262) */
+  /** @name UpDataStructsProperty (263) */
   interface UpDataStructsProperty extends Struct {
     readonly key: Bytes;
     readonly value: Bytes;
   }
 
-  /** @name UpDataStructsCreateItemData (265) */
+  /** @name UpDataStructsCreateItemData (266) */
   interface UpDataStructsCreateItemData extends Enum {
     readonly isNft: boolean;
     readonly asNft: UpDataStructsCreateNftData;
@@ -2606,23 +2606,23 @@
     readonly type: 'Nft' | 'Fungible' | 'ReFungible';
   }
 
-  /** @name UpDataStructsCreateNftData (266) */
+  /** @name UpDataStructsCreateNftData (267) */
   interface UpDataStructsCreateNftData extends Struct {
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name UpDataStructsCreateFungibleData (267) */
+  /** @name UpDataStructsCreateFungibleData (268) */
   interface UpDataStructsCreateFungibleData extends Struct {
     readonly value: u128;
   }
 
-  /** @name UpDataStructsCreateReFungibleData (268) */
+  /** @name UpDataStructsCreateReFungibleData (269) */
   interface UpDataStructsCreateReFungibleData extends Struct {
     readonly pieces: u128;
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name UpDataStructsCreateItemExData (271) */
+  /** @name UpDataStructsCreateItemExData (272) */
   interface UpDataStructsCreateItemExData extends Enum {
     readonly isNft: boolean;
     readonly asNft: Vec<UpDataStructsCreateNftExData>;
@@ -2635,26 +2635,26 @@
     readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';
   }
 
-  /** @name UpDataStructsCreateNftExData (273) */
+  /** @name UpDataStructsCreateNftExData (274) */
   interface UpDataStructsCreateNftExData extends Struct {
     readonly properties: Vec<UpDataStructsProperty>;
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
-  /** @name UpDataStructsCreateRefungibleExSingleOwner (280) */
+  /** @name UpDataStructsCreateRefungibleExSingleOwner (281) */
   interface UpDataStructsCreateRefungibleExSingleOwner extends Struct {
     readonly user: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly pieces: u128;
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name UpDataStructsCreateRefungibleExMultipleOwners (282) */
+  /** @name UpDataStructsCreateRefungibleExMultipleOwners (283) */
   interface UpDataStructsCreateRefungibleExMultipleOwners extends Struct {
     readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name PalletUniqueSchedulerCall (283) */
+  /** @name PalletUniqueSchedulerCall (284) */
   interface PalletUniqueSchedulerCall extends Enum {
     readonly isScheduleNamed: boolean;
     readonly asScheduleNamed: {
@@ -2679,7 +2679,7 @@
     readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';
   }
 
-  /** @name FrameSupportScheduleMaybeHashed (285) */
+  /** @name FrameSupportScheduleMaybeHashed (286) */
   interface FrameSupportScheduleMaybeHashed extends Enum {
     readonly isValue: boolean;
     readonly asValue: Call;
@@ -2688,7 +2688,7 @@
     readonly type: 'Value' | 'Hash';
   }
 
-  /** @name PalletConfigurationCall (286) */
+  /** @name PalletConfigurationCall (287) */
   interface PalletConfigurationCall extends Enum {
     readonly isSetWeightToFeeCoefficientOverride: boolean;
     readonly asSetWeightToFeeCoefficientOverride: {
@@ -2701,13 +2701,13 @@
     readonly type: 'SetWeightToFeeCoefficientOverride' | 'SetMinGasPriceOverride';
   }
 
-  /** @name PalletTemplateTransactionPaymentCall (287) */
+  /** @name PalletTemplateTransactionPaymentCall (289) */
   type PalletTemplateTransactionPaymentCall = Null;
 
-  /** @name PalletStructureCall (288) */
+  /** @name PalletStructureCall (290) */
   type PalletStructureCall = Null;
 
-  /** @name PalletRmrkCoreCall (289) */
+  /** @name PalletRmrkCoreCall (291) */
   interface PalletRmrkCoreCall extends Enum {
     readonly isCreateCollection: boolean;
     readonly asCreateCollection: {
@@ -2813,7 +2813,7 @@
     readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';
   }
 
-  /** @name RmrkTraitsResourceResourceTypes (295) */
+  /** @name RmrkTraitsResourceResourceTypes (297) */
   interface RmrkTraitsResourceResourceTypes extends Enum {
     readonly isBasic: boolean;
     readonly asBasic: RmrkTraitsResourceBasicResource;
@@ -2824,7 +2824,7 @@
     readonly type: 'Basic' | 'Composable' | 'Slot';
   }
 
-  /** @name RmrkTraitsResourceBasicResource (297) */
+  /** @name RmrkTraitsResourceBasicResource (299) */
   interface RmrkTraitsResourceBasicResource extends Struct {
     readonly src: Option<Bytes>;
     readonly metadata: Option<Bytes>;
@@ -2832,7 +2832,7 @@
     readonly thumb: Option<Bytes>;
   }
 
-  /** @name RmrkTraitsResourceComposableResource (299) */
+  /** @name RmrkTraitsResourceComposableResource (301) */
   interface RmrkTraitsResourceComposableResource extends Struct {
     readonly parts: Vec<u32>;
     readonly base: u32;
@@ -2842,7 +2842,7 @@
     readonly thumb: Option<Bytes>;
   }
 
-  /** @name RmrkTraitsResourceSlotResource (300) */
+  /** @name RmrkTraitsResourceSlotResource (302) */
   interface RmrkTraitsResourceSlotResource extends Struct {
     readonly base: u32;
     readonly src: Option<Bytes>;
@@ -2852,7 +2852,7 @@
     readonly thumb: Option<Bytes>;
   }
 
-  /** @name PalletRmrkEquipCall (303) */
+  /** @name PalletRmrkEquipCall (305) */
   interface PalletRmrkEquipCall extends Enum {
     readonly isCreateBase: boolean;
     readonly asCreateBase: {
@@ -2874,7 +2874,7 @@
     readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';
   }
 
-  /** @name RmrkTraitsPartPartType (306) */
+  /** @name RmrkTraitsPartPartType (308) */
   interface RmrkTraitsPartPartType extends Enum {
     readonly isFixedPart: boolean;
     readonly asFixedPart: RmrkTraitsPartFixedPart;
@@ -2883,14 +2883,14 @@
     readonly type: 'FixedPart' | 'SlotPart';
   }
 
-  /** @name RmrkTraitsPartFixedPart (308) */
+  /** @name RmrkTraitsPartFixedPart (310) */
   interface RmrkTraitsPartFixedPart extends Struct {
     readonly id: u32;
     readonly z: u32;
     readonly src: Bytes;
   }
 
-  /** @name RmrkTraitsPartSlotPart (309) */
+  /** @name RmrkTraitsPartSlotPart (311) */
   interface RmrkTraitsPartSlotPart extends Struct {
     readonly id: u32;
     readonly equippable: RmrkTraitsPartEquippableList;
@@ -2898,7 +2898,7 @@
     readonly z: u32;
   }
 
-  /** @name RmrkTraitsPartEquippableList (310) */
+  /** @name RmrkTraitsPartEquippableList (312) */
   interface RmrkTraitsPartEquippableList extends Enum {
     readonly isAll: boolean;
     readonly isEmpty: boolean;
@@ -2907,20 +2907,20 @@
     readonly type: 'All' | 'Empty' | 'Custom';
   }
 
-  /** @name RmrkTraitsTheme (312) */
+  /** @name RmrkTraitsTheme (314) */
   interface RmrkTraitsTheme extends Struct {
     readonly name: Bytes;
     readonly properties: Vec<RmrkTraitsThemeThemeProperty>;
     readonly inherit: bool;
   }
 
-  /** @name RmrkTraitsThemeThemeProperty (314) */
+  /** @name RmrkTraitsThemeThemeProperty (316) */
   interface RmrkTraitsThemeThemeProperty extends Struct {
     readonly key: Bytes;
     readonly value: Bytes;
   }
 
-  /** @name PalletAppPromotionCall (316) */
+  /** @name PalletAppPromotionCall (318) */
   interface PalletAppPromotionCall extends Enum {
     readonly isSetAdminAddress: boolean;
     readonly asSetAdminAddress: {
@@ -2954,7 +2954,7 @@
     readonly type: 'SetAdminAddress' | 'Stake' | 'Unstake' | 'SponsorCollection' | 'StopSponsoringCollection' | 'SponsorContract' | 'StopSponsoringContract' | 'PayoutStakers';
   }
 
-  /** @name PalletForeignAssetsModuleCall (318) */
+  /** @name PalletForeignAssetsModuleCall (320) */
   interface PalletForeignAssetsModuleCall extends Enum {
     readonly isRegisterForeignAsset: boolean;
     readonly asRegisterForeignAsset: {
@@ -2971,7 +2971,7 @@
     readonly type: 'RegisterForeignAsset' | 'UpdateForeignAsset';
   }
 
-  /** @name PalletEvmCall (319) */
+  /** @name PalletEvmCall (321) */
   interface PalletEvmCall extends Enum {
     readonly isWithdraw: boolean;
     readonly asWithdraw: {
@@ -3016,7 +3016,7 @@
     readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';
   }
 
-  /** @name PalletEthereumCall (323) */
+  /** @name PalletEthereumCall (325) */
   interface PalletEthereumCall extends Enum {
     readonly isTransact: boolean;
     readonly asTransact: {
@@ -3025,7 +3025,7 @@
     readonly type: 'Transact';
   }
 
-  /** @name EthereumTransactionTransactionV2 (324) */
+  /** @name EthereumTransactionTransactionV2 (326) */
   interface EthereumTransactionTransactionV2 extends Enum {
     readonly isLegacy: boolean;
     readonly asLegacy: EthereumTransactionLegacyTransaction;
@@ -3036,7 +3036,7 @@
     readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';
   }
 
-  /** @name EthereumTransactionLegacyTransaction (325) */
+  /** @name EthereumTransactionLegacyTransaction (327) */
   interface EthereumTransactionLegacyTransaction extends Struct {
     readonly nonce: U256;
     readonly gasPrice: U256;
@@ -3047,7 +3047,7 @@
     readonly signature: EthereumTransactionTransactionSignature;
   }
 
-  /** @name EthereumTransactionTransactionAction (326) */
+  /** @name EthereumTransactionTransactionAction (328) */
   interface EthereumTransactionTransactionAction extends Enum {
     readonly isCall: boolean;
     readonly asCall: H160;
@@ -3055,14 +3055,14 @@
     readonly type: 'Call' | 'Create';
   }
 
-  /** @name EthereumTransactionTransactionSignature (327) */
+  /** @name EthereumTransactionTransactionSignature (329) */
   interface EthereumTransactionTransactionSignature extends Struct {
     readonly v: u64;
     readonly r: H256;
     readonly s: H256;
   }
 
-  /** @name EthereumTransactionEip2930Transaction (329) */
+  /** @name EthereumTransactionEip2930Transaction (331) */
   interface EthereumTransactionEip2930Transaction extends Struct {
     readonly chainId: u64;
     readonly nonce: U256;
@@ -3077,13 +3077,13 @@
     readonly s: H256;
   }
 
-  /** @name EthereumTransactionAccessListItem (331) */
+  /** @name EthereumTransactionAccessListItem (333) */
   interface EthereumTransactionAccessListItem extends Struct {
     readonly address: H160;
     readonly storageKeys: Vec<H256>;
   }
 
-  /** @name EthereumTransactionEip1559Transaction (332) */
+  /** @name EthereumTransactionEip1559Transaction (334) */
   interface EthereumTransactionEip1559Transaction extends Struct {
     readonly chainId: u64;
     readonly nonce: U256;
@@ -3099,7 +3099,7 @@
     readonly s: H256;
   }
 
-  /** @name PalletEvmMigrationCall (333) */
+  /** @name PalletEvmMigrationCall (335) */
   interface PalletEvmMigrationCall extends Enum {
     readonly isBegin: boolean;
     readonly asBegin: {
@@ -3118,13 +3118,13 @@
     readonly type: 'Begin' | 'SetData' | 'Finish';
   }
 
-  /** @name PalletSudoError (336) */
+  /** @name PalletSudoError (338) */
   interface PalletSudoError extends Enum {
     readonly isRequireSudo: boolean;
     readonly type: 'RequireSudo';
   }
 
-  /** @name OrmlVestingModuleError (338) */
+  /** @name OrmlVestingModuleError (340) */
   interface OrmlVestingModuleError extends Enum {
     readonly isZeroVestingPeriod: boolean;
     readonly isZeroVestingPeriodCount: boolean;
@@ -3135,7 +3135,7 @@
     readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';
   }
 
-  /** @name OrmlXtokensModuleError (339) */
+  /** @name OrmlXtokensModuleError (341) */
   interface OrmlXtokensModuleError extends Enum {
     readonly isAssetHasNoReserve: boolean;
     readonly isNotCrossChainTransfer: boolean;
@@ -3159,26 +3159,26 @@
     readonly type: 'AssetHasNoReserve' | 'NotCrossChainTransfer' | 'InvalidDest' | 'NotCrossChainTransferableCurrency' | 'UnweighableMessage' | 'XcmExecutionFailed' | 'CannotReanchor' | 'InvalidAncestry' | 'InvalidAsset' | 'DestinationNotInvertible' | 'BadVersion' | 'DistinctReserveForAssetAndFee' | 'ZeroFee' | 'ZeroAmount' | 'TooManyAssetsBeingSent' | 'AssetIndexNonExistent' | 'FeeNotEnough' | 'NotSupportedMultiLocation' | 'MinXcmFeeNotDefined';
   }
 
-  /** @name OrmlTokensBalanceLock (342) */
+  /** @name OrmlTokensBalanceLock (344) */
   interface OrmlTokensBalanceLock extends Struct {
     readonly id: U8aFixed;
     readonly amount: u128;
   }
 
-  /** @name OrmlTokensAccountData (344) */
+  /** @name OrmlTokensAccountData (346) */
   interface OrmlTokensAccountData extends Struct {
     readonly free: u128;
     readonly reserved: u128;
     readonly frozen: u128;
   }
 
-  /** @name OrmlTokensReserveData (346) */
+  /** @name OrmlTokensReserveData (348) */
   interface OrmlTokensReserveData extends Struct {
     readonly id: Null;
     readonly amount: u128;
   }
 
-  /** @name OrmlTokensModuleError (348) */
+  /** @name OrmlTokensModuleError (350) */
   interface OrmlTokensModuleError extends Enum {
     readonly isBalanceTooLow: boolean;
     readonly isAmountIntoBalanceFailed: boolean;
@@ -3191,21 +3191,21 @@
     readonly type: 'BalanceTooLow' | 'AmountIntoBalanceFailed' | 'LiquidityRestrictions' | 'MaxLocksExceeded' | 'KeepAlive' | 'ExistentialDeposit' | 'DeadAccount' | 'TooManyReserves';
   }
 
-  /** @name CumulusPalletXcmpQueueInboundChannelDetails (350) */
+  /** @name CumulusPalletXcmpQueueInboundChannelDetails (352) */
   interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {
     readonly sender: u32;
     readonly state: CumulusPalletXcmpQueueInboundState;
     readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;
   }
 
-  /** @name CumulusPalletXcmpQueueInboundState (351) */
+  /** @name CumulusPalletXcmpQueueInboundState (353) */
   interface CumulusPalletXcmpQueueInboundState extends Enum {
     readonly isOk: boolean;
     readonly isSuspended: boolean;
     readonly type: 'Ok' | 'Suspended';
   }
 
-  /** @name PolkadotParachainPrimitivesXcmpMessageFormat (354) */
+  /** @name PolkadotParachainPrimitivesXcmpMessageFormat (356) */
   interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {
     readonly isConcatenatedVersionedXcm: boolean;
     readonly isConcatenatedEncodedBlob: boolean;
@@ -3213,7 +3213,7 @@
     readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';
   }
 
-  /** @name CumulusPalletXcmpQueueOutboundChannelDetails (357) */
+  /** @name CumulusPalletXcmpQueueOutboundChannelDetails (359) */
   interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {
     readonly recipient: u32;
     readonly state: CumulusPalletXcmpQueueOutboundState;
@@ -3222,24 +3222,24 @@
     readonly lastIndex: u16;
   }
 
-  /** @name CumulusPalletXcmpQueueOutboundState (358) */
+  /** @name CumulusPalletXcmpQueueOutboundState (360) */
   interface CumulusPalletXcmpQueueOutboundState extends Enum {
     readonly isOk: boolean;
     readonly isSuspended: boolean;
     readonly type: 'Ok' | 'Suspended';
   }
 
-  /** @name CumulusPalletXcmpQueueQueueConfigData (360) */
+  /** @name CumulusPalletXcmpQueueQueueConfigData (362) */
   interface CumulusPalletXcmpQueueQueueConfigData extends Struct {
     readonly suspendThreshold: u32;
     readonly dropThreshold: u32;
     readonly resumeThreshold: u32;
-    readonly thresholdWeight: u64;
-    readonly weightRestrictDecay: u64;
-    readonly xcmpMaxIndividualWeight: u64;
+    readonly thresholdWeight: Weight;
+    readonly weightRestrictDecay: Weight;
+    readonly xcmpMaxIndividualWeight: Weight;
   }
 
-  /** @name CumulusPalletXcmpQueueError (362) */
+  /** @name CumulusPalletXcmpQueueError (364) */
   interface CumulusPalletXcmpQueueError extends Enum {
     readonly isFailedToSend: boolean;
     readonly isBadXcmOrigin: boolean;
@@ -3249,7 +3249,7 @@
     readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';
   }
 
-  /** @name PalletXcmError (363) */
+  /** @name PalletXcmError (365) */
   interface PalletXcmError extends Enum {
     readonly isUnreachable: boolean;
     readonly isSendFailure: boolean;
@@ -3267,29 +3267,29 @@
     readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';
   }
 
-  /** @name CumulusPalletXcmError (364) */
+  /** @name CumulusPalletXcmError (366) */
   type CumulusPalletXcmError = Null;
 
-  /** @name CumulusPalletDmpQueueConfigData (365) */
+  /** @name CumulusPalletDmpQueueConfigData (367) */
   interface CumulusPalletDmpQueueConfigData extends Struct {
-    readonly maxIndividual: u64;
+    readonly maxIndividual: Weight;
   }
 
-  /** @name CumulusPalletDmpQueuePageIndexData (366) */
+  /** @name CumulusPalletDmpQueuePageIndexData (368) */
   interface CumulusPalletDmpQueuePageIndexData extends Struct {
     readonly beginUsed: u32;
     readonly endUsed: u32;
     readonly overweightCount: u64;
   }
 
-  /** @name CumulusPalletDmpQueueError (369) */
+  /** @name CumulusPalletDmpQueueError (371) */
   interface CumulusPalletDmpQueueError extends Enum {
     readonly isUnknown: boolean;
     readonly isOverLimit: boolean;
     readonly type: 'Unknown' | 'OverLimit';
   }
 
-  /** @name PalletUniqueError (373) */
+  /** @name PalletUniqueError (375) */
   interface PalletUniqueError extends Enum {
     readonly isCollectionDecimalPointLimitExceeded: boolean;
     readonly isConfirmUnsetSponsorFail: boolean;
@@ -3298,7 +3298,7 @@
     readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';
   }
 
-  /** @name PalletUniqueSchedulerScheduledV3 (376) */
+  /** @name PalletUniqueSchedulerScheduledV3 (378) */
   interface PalletUniqueSchedulerScheduledV3 extends Struct {
     readonly maybeId: Option<U8aFixed>;
     readonly priority: u8;
@@ -3307,7 +3307,7 @@
     readonly origin: OpalRuntimeOriginCaller;
   }
 
-  /** @name OpalRuntimeOriginCaller (377) */
+  /** @name OpalRuntimeOriginCaller (379) */
   interface OpalRuntimeOriginCaller extends Enum {
     readonly isSystem: boolean;
     readonly asSystem: FrameSupportDispatchRawOrigin;
@@ -3321,7 +3321,7 @@
     readonly type: 'System' | 'Void' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';
   }
 
-  /** @name FrameSupportDispatchRawOrigin (378) */
+  /** @name FrameSupportDispatchRawOrigin (380) */
   interface FrameSupportDispatchRawOrigin extends Enum {
     readonly isRoot: boolean;
     readonly isSigned: boolean;
@@ -3330,7 +3330,7 @@
     readonly type: 'Root' | 'Signed' | 'None';
   }
 
-  /** @name PalletXcmOrigin (379) */
+  /** @name PalletXcmOrigin (381) */
   interface PalletXcmOrigin extends Enum {
     readonly isXcm: boolean;
     readonly asXcm: XcmV1MultiLocation;
@@ -3339,7 +3339,7 @@
     readonly type: 'Xcm' | 'Response';
   }
 
-  /** @name CumulusPalletXcmOrigin (380) */
+  /** @name CumulusPalletXcmOrigin (382) */
   interface CumulusPalletXcmOrigin extends Enum {
     readonly isRelay: boolean;
     readonly isSiblingParachain: boolean;
@@ -3347,17 +3347,17 @@
     readonly type: 'Relay' | 'SiblingParachain';
   }
 
-  /** @name PalletEthereumRawOrigin (381) */
+  /** @name PalletEthereumRawOrigin (383) */
   interface PalletEthereumRawOrigin extends Enum {
     readonly isEthereumTransaction: boolean;
     readonly asEthereumTransaction: H160;
     readonly type: 'EthereumTransaction';
   }
 
-  /** @name SpCoreVoid (382) */
+  /** @name SpCoreVoid (384) */
   type SpCoreVoid = Null;
 
-  /** @name PalletUniqueSchedulerError (383) */
+  /** @name PalletUniqueSchedulerError (385) */
   interface PalletUniqueSchedulerError extends Enum {
     readonly isFailedToSchedule: boolean;
     readonly isNotFound: boolean;
@@ -3366,7 +3366,7 @@
     readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';
   }
 
-  /** @name UpDataStructsCollection (384) */
+  /** @name UpDataStructsCollection (386) */
   interface UpDataStructsCollection extends Struct {
     readonly owner: AccountId32;
     readonly mode: UpDataStructsCollectionMode;
@@ -3379,7 +3379,7 @@
     readonly flags: U8aFixed;
   }
 
-  /** @name UpDataStructsSponsorshipStateAccountId32 (385) */
+  /** @name UpDataStructsSponsorshipStateAccountId32 (387) */
   interface UpDataStructsSponsorshipStateAccountId32 extends Enum {
     readonly isDisabled: boolean;
     readonly isUnconfirmed: boolean;
@@ -3389,43 +3389,43 @@
     readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';
   }
 
-  /** @name UpDataStructsProperties (387) */
+  /** @name UpDataStructsProperties (389) */
   interface UpDataStructsProperties extends Struct {
     readonly map: UpDataStructsPropertiesMapBoundedVec;
     readonly consumedSpace: u32;
     readonly spaceLimit: u32;
   }
 
-  /** @name UpDataStructsPropertiesMapBoundedVec (388) */
+  /** @name UpDataStructsPropertiesMapBoundedVec (390) */
   interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}
 
-  /** @name UpDataStructsPropertiesMapPropertyPermission (393) */
+  /** @name UpDataStructsPropertiesMapPropertyPermission (395) */
   interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}
 
-  /** @name UpDataStructsCollectionStats (400) */
+  /** @name UpDataStructsCollectionStats (402) */
   interface UpDataStructsCollectionStats extends Struct {
     readonly created: u32;
     readonly destroyed: u32;
     readonly alive: u32;
   }
 
-  /** @name UpDataStructsTokenChild (401) */
+  /** @name UpDataStructsTokenChild (403) */
   interface UpDataStructsTokenChild extends Struct {
     readonly token: u32;
     readonly collection: u32;
   }
 
-  /** @name PhantomTypeUpDataStructs (402) */
+  /** @name PhantomTypeUpDataStructs (404) */
   interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}
 
-  /** @name UpDataStructsTokenData (404) */
+  /** @name UpDataStructsTokenData (406) */
   interface UpDataStructsTokenData extends Struct {
     readonly properties: Vec<UpDataStructsProperty>;
     readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;
     readonly pieces: u128;
   }
 
-  /** @name UpDataStructsRpcCollection (406) */
+  /** @name UpDataStructsRpcCollection (408) */
   interface UpDataStructsRpcCollection extends Struct {
     readonly owner: AccountId32;
     readonly mode: UpDataStructsCollectionMode;
@@ -3441,7 +3441,7 @@
     readonly foreign: bool;
   }
 
-  /** @name RmrkTraitsCollectionCollectionInfo (407) */
+  /** @name RmrkTraitsCollectionCollectionInfo (409) */
   interface RmrkTraitsCollectionCollectionInfo extends Struct {
     readonly issuer: AccountId32;
     readonly metadata: Bytes;
@@ -3450,7 +3450,7 @@
     readonly nftsCount: u32;
   }
 
-  /** @name RmrkTraitsNftNftInfo (408) */
+  /** @name RmrkTraitsNftNftInfo (410) */
   interface RmrkTraitsNftNftInfo extends Struct {
     readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;
     readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;
@@ -3459,13 +3459,13 @@
     readonly pending: bool;
   }
 
-  /** @name RmrkTraitsNftRoyaltyInfo (410) */
+  /** @name RmrkTraitsNftRoyaltyInfo (412) */
   interface RmrkTraitsNftRoyaltyInfo extends Struct {
     readonly recipient: AccountId32;
     readonly amount: Permill;
   }
 
-  /** @name RmrkTraitsResourceResourceInfo (411) */
+  /** @name RmrkTraitsResourceResourceInfo (413) */
   interface RmrkTraitsResourceResourceInfo extends Struct {
     readonly id: u32;
     readonly resource: RmrkTraitsResourceResourceTypes;
@@ -3473,26 +3473,26 @@
     readonly pendingRemoval: bool;
   }
 
-  /** @name RmrkTraitsPropertyPropertyInfo (412) */
+  /** @name RmrkTraitsPropertyPropertyInfo (414) */
   interface RmrkTraitsPropertyPropertyInfo extends Struct {
     readonly key: Bytes;
     readonly value: Bytes;
   }
 
-  /** @name RmrkTraitsBaseBaseInfo (413) */
+  /** @name RmrkTraitsBaseBaseInfo (415) */
   interface RmrkTraitsBaseBaseInfo extends Struct {
     readonly issuer: AccountId32;
     readonly baseType: Bytes;
     readonly symbol: Bytes;
   }
 
-  /** @name RmrkTraitsNftNftChild (414) */
+  /** @name RmrkTraitsNftNftChild (416) */
   interface RmrkTraitsNftNftChild extends Struct {
     readonly collectionId: u32;
     readonly nftId: u32;
   }
 
-  /** @name PalletCommonError (416) */
+  /** @name PalletCommonError (418) */
   interface PalletCommonError extends Enum {
     readonly isCollectionNotFound: boolean;
     readonly isMustBeTokenOwner: boolean;
@@ -3531,7 +3531,7 @@
     readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal';
   }
 
-  /** @name PalletFungibleError (418) */
+  /** @name PalletFungibleError (420) */
   interface PalletFungibleError extends Enum {
     readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isFungibleItemsHaveNoId: boolean;
@@ -3541,12 +3541,12 @@
     readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
   }
 
-  /** @name PalletRefungibleItemData (419) */
+  /** @name PalletRefungibleItemData (421) */
   interface PalletRefungibleItemData extends Struct {
     readonly constData: Bytes;
   }
 
-  /** @name PalletRefungibleError (424) */
+  /** @name PalletRefungibleError (426) */
   interface PalletRefungibleError extends Enum {
     readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isWrongRefungiblePieces: boolean;
@@ -3556,19 +3556,19 @@
     readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
   }
 
-  /** @name PalletNonfungibleItemData (425) */
+  /** @name PalletNonfungibleItemData (427) */
   interface PalletNonfungibleItemData extends Struct {
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
-  /** @name UpDataStructsPropertyScope (427) */
+  /** @name UpDataStructsPropertyScope (429) */
   interface UpDataStructsPropertyScope extends Enum {
     readonly isNone: boolean;
     readonly isRmrk: boolean;
     readonly type: 'None' | 'Rmrk';
   }
 
-  /** @name PalletNonfungibleError (429) */
+  /** @name PalletNonfungibleError (431) */
   interface PalletNonfungibleError extends Enum {
     readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isNonfungibleItemsHaveNoAmount: boolean;
@@ -3576,7 +3576,7 @@
     readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';
   }
 
-  /** @name PalletStructureError (430) */
+  /** @name PalletStructureError (432) */
   interface PalletStructureError extends Enum {
     readonly isOuroborosDetected: boolean;
     readonly isDepthLimit: boolean;
@@ -3585,7 +3585,7 @@
     readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';
   }
 
-  /** @name PalletRmrkCoreError (431) */
+  /** @name PalletRmrkCoreError (433) */
   interface PalletRmrkCoreError extends Enum {
     readonly isCorruptedCollectionType: boolean;
     readonly isRmrkPropertyKeyIsTooLong: boolean;
@@ -3609,7 +3609,7 @@
     readonly type: 'CorruptedCollectionType' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';
   }
 
-  /** @name PalletRmrkEquipError (433) */
+  /** @name PalletRmrkEquipError (435) */
   interface PalletRmrkEquipError extends Enum {
     readonly isPermissionError: boolean;
     readonly isNoAvailableBaseId: boolean;
@@ -3621,7 +3621,7 @@
     readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';
   }
 
-  /** @name PalletAppPromotionError (439) */
+  /** @name PalletAppPromotionError (441) */
   interface PalletAppPromotionError extends Enum {
     readonly isAdminNotSet: boolean;
     readonly isNoPermission: boolean;
@@ -3632,7 +3632,7 @@
     readonly type: 'AdminNotSet' | 'NoPermission' | 'NotSufficientFunds' | 'PendingForBlockOverflow' | 'SponsorNotSet' | 'IncorrectLockedBalanceOperation';
   }
 
-  /** @name PalletForeignAssetsModuleError (440) */
+  /** @name PalletForeignAssetsModuleError (442) */
   interface PalletForeignAssetsModuleError extends Enum {
     readonly isBadLocation: boolean;
     readonly isMultiLocationExisted: boolean;
@@ -3641,7 +3641,7 @@
     readonly type: 'BadLocation' | 'MultiLocationExisted' | 'AssetIdNotExists' | 'AssetIdExisted';
   }
 
-  /** @name PalletEvmError (443) */
+  /** @name PalletEvmError (445) */
   interface PalletEvmError extends Enum {
     readonly isBalanceLow: boolean;
     readonly isFeeOverflow: boolean;
@@ -3652,7 +3652,7 @@
     readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';
   }
 
-  /** @name FpRpcTransactionStatus (446) */
+  /** @name FpRpcTransactionStatus (448) */
   interface FpRpcTransactionStatus extends Struct {
     readonly transactionHash: H256;
     readonly transactionIndex: u32;
@@ -3663,10 +3663,10 @@
     readonly logsBloom: EthbloomBloom;
   }
 
-  /** @name EthbloomBloom (448) */
+  /** @name EthbloomBloom (450) */
   interface EthbloomBloom extends U8aFixed {}
 
-  /** @name EthereumReceiptReceiptV3 (450) */
+  /** @name EthereumReceiptReceiptV3 (452) */
   interface EthereumReceiptReceiptV3 extends Enum {
     readonly isLegacy: boolean;
     readonly asLegacy: EthereumReceiptEip658ReceiptData;
@@ -3677,7 +3677,7 @@
     readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';
   }
 
-  /** @name EthereumReceiptEip658ReceiptData (451) */
+  /** @name EthereumReceiptEip658ReceiptData (453) */
   interface EthereumReceiptEip658ReceiptData extends Struct {
     readonly statusCode: u8;
     readonly usedGas: U256;
@@ -3685,14 +3685,14 @@
     readonly logs: Vec<EthereumLog>;
   }
 
-  /** @name EthereumBlock (452) */
+  /** @name EthereumBlock (454) */
   interface EthereumBlock extends Struct {
     readonly header: EthereumHeader;
     readonly transactions: Vec<EthereumTransactionTransactionV2>;
     readonly ommers: Vec<EthereumHeader>;
   }
 
-  /** @name EthereumHeader (453) */
+  /** @name EthereumHeader (455) */
   interface EthereumHeader extends Struct {
     readonly parentHash: H256;
     readonly ommersHash: H256;
@@ -3711,24 +3711,24 @@
     readonly nonce: EthereumTypesHashH64;
   }
 
-  /** @name EthereumTypesHashH64 (454) */
+  /** @name EthereumTypesHashH64 (456) */
   interface EthereumTypesHashH64 extends U8aFixed {}
 
-  /** @name PalletEthereumError (459) */
+  /** @name PalletEthereumError (461) */
   interface PalletEthereumError extends Enum {
     readonly isInvalidSignature: boolean;
     readonly isPreLogExists: boolean;
     readonly type: 'InvalidSignature' | 'PreLogExists';
   }
 
-  /** @name PalletEvmCoderSubstrateError (460) */
+  /** @name PalletEvmCoderSubstrateError (462) */
   interface PalletEvmCoderSubstrateError extends Enum {
     readonly isOutOfGas: boolean;
     readonly isOutOfFund: boolean;
     readonly type: 'OutOfGas' | 'OutOfFund';
   }
 
-  /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (461) */
+  /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (463) */
   interface UpDataStructsSponsorshipStateBasicCrossAccountIdRepr extends Enum {
     readonly isDisabled: boolean;
     readonly isUnconfirmed: boolean;
@@ -3738,7 +3738,7 @@
     readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';
   }
 
-  /** @name PalletEvmContractHelpersSponsoringModeT (462) */
+  /** @name PalletEvmContractHelpersSponsoringModeT (464) */
   interface PalletEvmContractHelpersSponsoringModeT extends Enum {
     readonly isDisabled: boolean;
     readonly isAllowlisted: boolean;
@@ -3746,7 +3746,7 @@
     readonly type: 'Disabled' | 'Allowlisted' | 'Generous';
   }
 
-  /** @name PalletEvmContractHelpersError (468) */
+  /** @name PalletEvmContractHelpersError (470) */
   interface PalletEvmContractHelpersError extends Enum {
     readonly isNoPermission: boolean;
     readonly isNoPendingSponsor: boolean;
@@ -3754,14 +3754,14 @@
     readonly type: 'NoPermission' | 'NoPendingSponsor' | 'TooManyMethodsHaveSponsoredLimit';
   }
 
-  /** @name PalletEvmMigrationError (469) */
+  /** @name PalletEvmMigrationError (471) */
   interface PalletEvmMigrationError extends Enum {
     readonly isAccountNotEmpty: boolean;
     readonly isAccountIsNotMigrating: boolean;
     readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';
   }
 
-  /** @name SpRuntimeMultiSignature (471) */
+  /** @name SpRuntimeMultiSignature (473) */
   interface SpRuntimeMultiSignature extends Enum {
     readonly isEd25519: boolean;
     readonly asEd25519: SpCoreEd25519Signature;
@@ -3772,37 +3772,37 @@
     readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';
   }
 
-  /** @name SpCoreEd25519Signature (472) */
+  /** @name SpCoreEd25519Signature (474) */
   interface SpCoreEd25519Signature extends U8aFixed {}
 
-  /** @name SpCoreSr25519Signature (474) */
+  /** @name SpCoreSr25519Signature (476) */
   interface SpCoreSr25519Signature extends U8aFixed {}
 
-  /** @name SpCoreEcdsaSignature (475) */
+  /** @name SpCoreEcdsaSignature (477) */
   interface SpCoreEcdsaSignature extends U8aFixed {}
 
-  /** @name FrameSystemExtensionsCheckSpecVersion (478) */
+  /** @name FrameSystemExtensionsCheckSpecVersion (480) */
   type FrameSystemExtensionsCheckSpecVersion = Null;
 
-  /** @name FrameSystemExtensionsCheckTxVersion (479) */
+  /** @name FrameSystemExtensionsCheckTxVersion (481) */
   type FrameSystemExtensionsCheckTxVersion = Null;
 
-  /** @name FrameSystemExtensionsCheckGenesis (480) */
+  /** @name FrameSystemExtensionsCheckGenesis (482) */
   type FrameSystemExtensionsCheckGenesis = Null;
 
-  /** @name FrameSystemExtensionsCheckNonce (483) */
+  /** @name FrameSystemExtensionsCheckNonce (485) */
   interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}
 
-  /** @name FrameSystemExtensionsCheckWeight (484) */
+  /** @name FrameSystemExtensionsCheckWeight (486) */
   type FrameSystemExtensionsCheckWeight = Null;
 
-  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (485) */
+  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (487) */
   interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}
 
-  /** @name OpalRuntimeRuntime (486) */
+  /** @name OpalRuntimeRuntime (488) */
   type OpalRuntimeRuntime = Null;
 
-  /** @name PalletEthereumFakeTransactionFinalizer (487) */
+  /** @name PalletEthereumFakeTransactionFinalizer (489) */
   type PalletEthereumFakeTransactionFinalizer = Null;
 
 } // declare module
modifiedtests/src/limits.test.tsdiffbeforeafterboth
--- a/tests/src/limits.test.ts
+++ b/tests/src/limits.test.ts
@@ -15,14 +15,14 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util/playgrounds';
+import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util';
 
 describe('Number of tokens per address (NFT)', () => {
   let alice: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -60,7 +60,7 @@
     await usingPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
@@ -292,7 +292,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
     });
   });
@@ -333,7 +333,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
     });
   });
@@ -366,7 +366,7 @@
     await usingPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([10n, 10n, 10n], donor);
     });
   });
@@ -404,7 +404,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
addedtests/src/nesting/collectionProperties.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/nesting/collectionProperties.test.ts
@@ -0,0 +1,261 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect} from '../util';
+import {UniqueBaseCollection} from '../util/playgrounds/unique';
+
+describe('Integration Test: Collection Properties', () => {
+  let alice: IKeyringPair;
+  let bob: IKeyringPair;
+  
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
+    });
+  });
+  
+  itSub('Properties are initially empty', async ({helper}) => {
+    const collection = await helper.nft.mintCollection(alice);
+    expect(await collection.getProperties()).to.be.empty;
+  });
+  
+  async function testSetsPropertiesForCollection(collection: UniqueBaseCollection) {
+    // As owner
+    await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}])).to.be.fulfilled;
+  
+    await collection.addAdmin(alice, {Substrate: bob.address});
+  
+    // As administrator
+    await expect(collection.setProperties(bob, [{key: 'black_hole'}])).to.be.fulfilled;
+  
+    const properties = await collection.getProperties();
+    expect(properties).to.include.deep.members([
+      {key: 'electron', value: 'come bond'},
+      {key: 'black_hole', value: ''},
+    ]);
+  }
+  
+  itSub('Sets properties for a NFT collection', async ({helper}) =>  {
+    await testSetsPropertiesForCollection(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Sets properties for a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
+    await testSetsPropertiesForCollection(await helper.rft.mintCollection(alice));
+  });
+  
+  async function testCheckValidNames(collection: UniqueBaseCollection) {
+    // alpha symbols
+    await expect(collection.setProperties(alice, [{key: 'answer'}])).to.be.fulfilled;
+  
+    // numeric symbols
+    await expect(collection.setProperties(alice, [{key: '451'}])).to.be.fulfilled;
+  
+    // underscore symbol
+    await expect(collection.setProperties(alice, [{key: 'black_hole'}])).to.be.fulfilled;
+  
+    // dash symbol
+    await expect(collection.setProperties(alice, [{key: '-'}])).to.be.fulfilled;
+  
+    // dot symbol
+    await expect(collection.setProperties(alice, [{key: 'once.in.a.long.long.while...', value: 'you get a little lost'}])).to.be.fulfilled;
+  
+    const properties = await collection.getProperties();
+    expect(properties).to.include.deep.members([
+      {key: 'answer', value: ''},
+      {key: '451', value: ''},
+      {key: 'black_hole', value: ''},
+      {key: '-', value: ''},
+      {key: 'once.in.a.long.long.while...', value: 'you get a little lost'},
+    ]);
+  }
+  
+  itSub('Check valid names for NFT collection properties keys', async ({helper}) =>  {
+    await testCheckValidNames(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Check valid names for ReFungible collection properties keys', [Pallets.ReFungible], async ({helper}) => {
+    await testCheckValidNames(await helper.rft.mintCollection(alice));
+  });
+  
+  async function testChangesProperties(collection: UniqueBaseCollection) {
+    await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: ''}])).to.be.fulfilled;
+  
+    // Mutate the properties
+    await expect(collection.setProperties(alice, [{key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled;
+  
+    const properties = await collection.getProperties();
+    expect(properties).to.include.deep.members([
+      {key: 'electron', value: 'come bond'},
+      {key: 'black_hole', value: 'LIGO'},
+    ]);
+  }
+  
+  itSub('Changes properties of a NFT collection', async ({helper}) =>  {
+    await testChangesProperties(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Changes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
+    await testChangesProperties(await helper.rft.mintCollection(alice));
+  });
+  
+  async function testDeleteProperties(collection: UniqueBaseCollection) {
+    await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled;
+  
+    await expect(collection.deleteProperties(alice, ['electron'])).to.be.fulfilled;
+  
+    const properties = await collection.getProperties(['black_hole', 'electron']);
+    expect(properties).to.be.deep.equal([
+      {key: 'black_hole', value: 'LIGO'},
+    ]);
+  }
+  
+  itSub('Deletes properties of a NFT collection', async ({helper}) =>  {
+    await testDeleteProperties(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Deletes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
+    await testDeleteProperties(await helper.rft.mintCollection(alice));
+  });
+});
+  
+describe('Negative Integration Test: Collection Properties', () => {
+  let alice: IKeyringPair;
+  let bob: IKeyringPair;
+  
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);
+    });
+  });
+    
+  async function testFailsSetPropertiesIfNotOwnerOrAdmin(collection: UniqueBaseCollection) {  
+    await expect(collection.setProperties(bob, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}]))
+      .to.be.rejectedWith(/common\.NoPermission/);
+  
+    expect(await collection.getProperties()).to.be.empty;
+  }
+  
+  itSub('Fails to set properties in a NFT collection if not its onwer/administrator', async ({helper}) =>  {
+    await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Fails to set properties in a ReFungible collection if not its onwer/administrator', [Pallets.ReFungible], async ({helper}) => {
+    await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.rft.mintCollection(alice));
+  });
+    
+  async function testFailsSetPropertiesThatExeedLimits(collection: UniqueBaseCollection) {
+    const spaceLimit = (await (collection.helper!.api! as any).query.common.collectionProperties(collection.collectionId)).spaceLimit.toNumber();
+    
+    // Mute the general tx parsing error, too many bytes to process
+    {
+      console.error = () => {};
+      await expect(collection.setProperties(alice, [
+        {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))},
+      ])).to.be.rejected;
+    }
+  
+    expect(await collection.getProperties(['electron'])).to.be.empty;
+  
+    await expect(collection.setProperties(alice, [
+      {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 18))}, 
+      {key: 'black_hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))}, 
+    ])).to.be.rejectedWith(/common\.NoSpaceForProperty/);
+  
+    expect(await collection.getProperties(['electron', 'black_hole'])).to.be.empty;
+  }
+  
+  itSub('Fails to set properties that exceed the limits (NFT)', async ({helper}) =>  {
+    await testFailsSetPropertiesThatExeedLimits(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Fails to set properties that exceed the limits (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testFailsSetPropertiesThatExeedLimits(await helper.rft.mintCollection(alice));
+  });
+    
+  async function testFailsSetMorePropertiesThanAllowed(collection: UniqueBaseCollection) {
+    const propertiesToBeSet = [];
+    for (let i = 0; i < 65; i++) {
+      propertiesToBeSet.push({
+        key: 'electron_' + i,
+        value: Math.random() > 0.5 ? 'high' : 'low',
+      });
+    }
+  
+    await expect(collection.setProperties(alice, propertiesToBeSet)).
+      to.be.rejectedWith(/common\.PropertyLimitReached/);
+  
+    expect(await collection.getProperties()).to.be.empty;
+  }
+  
+  itSub('Fails to set more properties than it is allowed (NFT)', async ({helper}) =>  {
+    await testFailsSetMorePropertiesThanAllowed(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Fails to set more properties than it is allowed (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testFailsSetMorePropertiesThanAllowed(await helper.rft.mintCollection(alice));
+  });
+    
+  async function testFailsSetPropertiesWithInvalidNames(collection: UniqueBaseCollection) {
+    const invalidProperties = [
+      [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}],
+      [{key: 'Mr/Sandman', value: 'Bring me a gene'}],
+      [{key: 'déjà vu', value: 'hmm...'}],
+    ];
+  
+    for (let i = 0; i < invalidProperties.length; i++) {
+      await expect(
+        collection.setProperties(alice, invalidProperties[i]), 
+        `on rejecting the new badly-named property #${i}`,
+      ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
+    }
+  
+    await expect(
+      collection.setProperties(alice, [{key: '', value: 'nothing must not exist'}]), 
+      'on rejecting an unnamed property',
+    ).to.be.rejectedWith(/common\.EmptyPropertyKey/);
+  
+    await expect(
+      collection.setProperties(alice, [{key: 'CRISPR-Cas9', value: 'rewriting nature!'}]), 
+      'on setting the correctly-but-still-badly-named property',
+    ).to.be.fulfilled;
+  
+    const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat('CRISPR-Cas9').concat('');
+  
+    const properties = await collection.getProperties(keys);
+    expect(properties).to.be.deep.equal([
+      {key: 'CRISPR-Cas9', value: 'rewriting nature!'},
+    ]);
+  
+    for (let i = 0; i < invalidProperties.length; i++) {
+      await expect(
+        collection.deleteProperties(alice, invalidProperties[i].map(propertySet => propertySet.key)), 
+        `on trying to delete the non-existent badly-named property #${i}`,
+      ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
+    }
+  }
+  
+  itSub('Fails to set properties with invalid names (NFT)', async ({helper}) =>  {
+    await testFailsSetPropertiesWithInvalidNames(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Fails to set properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testFailsSetPropertiesWithInvalidNames(await helper.rft.mintCollection(alice));
+  });
+});
+  
\ No newline at end of file
modifiedtests/src/nesting/graphs.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/graphs.test.ts
+++ b/tests/src/nesting/graphs.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from '../util/playgrounds';
+import {expect, itSub, usingPlaygrounds} from '../util';
 import {UniqueHelper, UniqueNFToken} from '../util/playgrounds/unique';
 
 /**
@@ -45,7 +45,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([10n], donor);
     });
   });
modifiedtests/src/nesting/nest.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/nest.test.ts
+++ b/tests/src/nesting/nest.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from '../util/playgrounds';
+import {expect, itSub, Pallets, usingPlaygrounds} from '../util';
 
 describe('Integration Test: Composite nesting tests', () => {
   let alice: IKeyringPair;
@@ -23,7 +23,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
     });
   });
@@ -137,7 +137,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([50n, 10n, 10n], donor);
     });
   });
@@ -343,7 +343,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 50n], donor);
     });
   });
deletedtests/src/nesting/properties.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/properties.test.ts
+++ /dev/null
@@ -1,1047 +0,0 @@
-// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
-// This file is part of Unique Network.
-
-// Unique Network is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Unique Network is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
-
-import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util/playgrounds';
-import {UniqueHelper, UniqueBaseCollection, UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection, UniqueRFToken} from '../util/playgrounds/unique';
-
-// ---------- COLLECTION PROPERTIES
-
-describe('Integration Test: Collection Properties', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
-    });
-  });
-
-  itSub('Properties are initially empty', async ({helper}) => {
-    const collection = await helper.nft.mintCollection(alice);
-    expect(await collection.getProperties()).to.be.empty;
-  });
-
-  async function testSetsPropertiesForCollection(collection: UniqueBaseCollection) {
-    // As owner
-    await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}])).to.be.fulfilled;
-
-    await collection.addAdmin(alice, {Substrate: bob.address});
-
-    // As administrator
-    await expect(collection.setProperties(bob, [{key: 'black_hole'}])).to.be.fulfilled;
-
-    const properties = await collection.getProperties();
-    expect(properties).to.include.deep.members([
-      {key: 'electron', value: 'come bond'},
-      {key: 'black_hole', value: ''},
-    ]);
-  }
-
-  itSub('Sets properties for a NFT collection', async ({helper}) =>  {
-    await testSetsPropertiesForCollection(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Sets properties for a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
-    await testSetsPropertiesForCollection(await helper.rft.mintCollection(alice));
-  });
-
-  async function testCheckValidNames(collection: UniqueBaseCollection) {
-    // alpha symbols
-    await expect(collection.setProperties(alice, [{key: 'answer'}])).to.be.fulfilled;
-
-    // numeric symbols
-    await expect(collection.setProperties(alice, [{key: '451'}])).to.be.fulfilled;
-
-    // underscore symbol
-    await expect(collection.setProperties(alice, [{key: 'black_hole'}])).to.be.fulfilled;
-
-    // dash symbol
-    await expect(collection.setProperties(alice, [{key: '-'}])).to.be.fulfilled;
-
-    // dot symbol
-    await expect(collection.setProperties(alice, [{key: 'once.in.a.long.long.while...', value: 'you get a little lost'}])).to.be.fulfilled;
-
-    const properties = await collection.getProperties();
-    expect(properties).to.include.deep.members([
-      {key: 'answer', value: ''},
-      {key: '451', value: ''},
-      {key: 'black_hole', value: ''},
-      {key: '-', value: ''},
-      {key: 'once.in.a.long.long.while...', value: 'you get a little lost'},
-    ]);
-  }
-
-  itSub('Check valid names for NFT collection properties keys', async ({helper}) =>  {
-    await testCheckValidNames(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Check valid names for ReFungible collection properties keys', [Pallets.ReFungible], async ({helper}) => {
-    await testCheckValidNames(await helper.rft.mintCollection(alice));
-  });
-
-  async function testChangesProperties(collection: UniqueBaseCollection) {
-    await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: ''}])).to.be.fulfilled;
-
-    // Mutate the properties
-    await expect(collection.setProperties(alice, [{key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled;
-
-    const properties = await collection.getProperties();
-    expect(properties).to.include.deep.members([
-      {key: 'electron', value: 'come bond'},
-      {key: 'black_hole', value: 'LIGO'},
-    ]);
-  }
-
-  itSub('Changes properties of a NFT collection', async ({helper}) =>  {
-    await testChangesProperties(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Changes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
-    await testChangesProperties(await helper.rft.mintCollection(alice));
-  });
-
-  async function testDeleteProperties(collection: UniqueBaseCollection) {
-    await expect(collection.setProperties(alice, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}])).to.be.fulfilled;
-
-    await expect(collection.deleteProperties(alice, ['electron'])).to.be.fulfilled;
-
-    const properties = await collection.getProperties(['black_hole', 'electron']);
-    expect(properties).to.be.deep.equal([
-      {key: 'black_hole', value: 'LIGO'},
-    ]);
-  }
-
-  itSub('Deletes properties of a NFT collection', async ({helper}) =>  {
-    await testDeleteProperties(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Deletes properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
-    await testDeleteProperties(await helper.rft.mintCollection(alice));
-  });
-});
-
-describe('Negative Integration Test: Collection Properties', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);
-    });
-  });
-  
-  async function testFailsSetPropertiesIfNotOwnerOrAdmin(collection: UniqueBaseCollection) {  
-    await expect(collection.setProperties(bob, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}]))
-      .to.be.rejectedWith(/common\.NoPermission/);
-
-    expect(await collection.getProperties()).to.be.empty;
-  }
-
-  itSub('Fails to set properties in a NFT collection if not its onwer/administrator', async ({helper}) =>  {
-    await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Fails to set properties in a ReFungible collection if not its onwer/administrator', [Pallets.ReFungible], async ({helper}) => {
-    await testFailsSetPropertiesIfNotOwnerOrAdmin(await helper.rft.mintCollection(alice));
-  });
-  
-  async function testFailsSetPropertiesThatExeedLimits(collection: UniqueBaseCollection) {
-    const spaceLimit = (await (collection.helper!.api! as any).query.common.collectionProperties(collection.collectionId)).spaceLimit.toNumber();
-  
-    // Mute the general tx parsing error, too many bytes to process
-    {
-      console.error = () => {};
-      await expect(collection.setProperties(alice, [
-        {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))},
-      ])).to.be.rejected;
-    }
-
-    expect(await collection.getProperties(['electron'])).to.be.empty;
-
-    await expect(collection.setProperties(alice, [
-      {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 18))}, 
-      {key: 'black_hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))}, 
-    ])).to.be.rejectedWith(/common\.NoSpaceForProperty/);
-
-    expect(await collection.getProperties(['electron', 'black_hole'])).to.be.empty;
-  }
-
-  itSub('Fails to set properties that exceed the limits (NFT)', async ({helper}) =>  {
-    await testFailsSetPropertiesThatExeedLimits(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Fails to set properties that exceed the limits (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testFailsSetPropertiesThatExeedLimits(await helper.rft.mintCollection(alice));
-  });
-  
-  async function testFailsSetMorePropertiesThanAllowed(collection: UniqueBaseCollection) {
-    const propertiesToBeSet = [];
-    for (let i = 0; i < 65; i++) {
-      propertiesToBeSet.push({
-        key: 'electron_' + i,
-        value: Math.random() > 0.5 ? 'high' : 'low',
-      });
-    }
-
-    await expect(collection.setProperties(alice, propertiesToBeSet)).
-      to.be.rejectedWith(/common\.PropertyLimitReached/);
-
-    expect(await collection.getProperties()).to.be.empty;
-  }
-
-  itSub('Fails to set more properties than it is allowed (NFT)', async ({helper}) =>  {
-    await testFailsSetMorePropertiesThanAllowed(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Fails to set more properties than it is allowed (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testFailsSetMorePropertiesThanAllowed(await helper.rft.mintCollection(alice));
-  });
-  
-  async function testFailsSetPropertiesWithInvalidNames(collection: UniqueBaseCollection) {
-    const invalidProperties = [
-      [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}],
-      [{key: 'Mr/Sandman', value: 'Bring me a gene'}],
-      [{key: 'déjà vu', value: 'hmm...'}],
-    ];
-
-    for (let i = 0; i < invalidProperties.length; i++) {
-      await expect(
-        collection.setProperties(alice, invalidProperties[i]), 
-        `on rejecting the new badly-named property #${i}`,
-      ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
-    }
-
-    await expect(
-      collection.setProperties(alice, [{key: '', value: 'nothing must not exist'}]), 
-      'on rejecting an unnamed property',
-    ).to.be.rejectedWith(/common\.EmptyPropertyKey/);
-
-    await expect(
-      collection.setProperties(alice, [{key: 'CRISPR-Cas9', value: 'rewriting nature!'}]), 
-      'on setting the correctly-but-still-badly-named property',
-    ).to.be.fulfilled;
-
-    const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat('CRISPR-Cas9').concat('');
-
-    const properties = await collection.getProperties(keys);
-    expect(properties).to.be.deep.equal([
-      {key: 'CRISPR-Cas9', value: 'rewriting nature!'},
-    ]);
-
-    for (let i = 0; i < invalidProperties.length; i++) {
-      await expect(
-        collection.deleteProperties(alice, invalidProperties[i].map(propertySet => propertySet.key)), 
-        `on trying to delete the non-existent badly-named property #${i}`,
-      ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
-    }
-  }
-
-  itSub('Fails to set properties with invalid names (NFT)', async ({helper}) =>  {
-    await testFailsSetPropertiesWithInvalidNames(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Fails to set properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testFailsSetPropertiesWithInvalidNames(await helper.rft.mintCollection(alice));
-  });
-});
-
-// ---------- ACCESS RIGHTS
-
-describe('Integration Test: Access Rights to Token Properties', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);
-    });
-  });
-  
-  itSub('Reads access rights to properties of a collection', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const propertyRights = (await helper.callRpc('api.query.common.collectionPropertyPermissions', [collection.collectionId])).toJSON();
-    expect(propertyRights).to.be.empty;
-  });
-  
-  async function testSetsAccessRightsToProperties(collection: UniqueNFTCollection | UniqueRFTCollection) {  
-    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true}}]))
-      .to.be.fulfilled;
-
-    await collection.addAdmin(alice, {Substrate: bob.address});
-
-    await expect(collection.setTokenPropertyPermissions(bob, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]))
-      .to.be.fulfilled;
-
-    const propertyRights = await collection.getPropertyPermissions(['skullduggery', 'mindgame']);
-    expect(propertyRights).to.include.deep.members([
-      {key: 'skullduggery', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}},
-      {key: 'mindgame', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}},
-    ]);
-  }
-
-  itSub('Sets access rights to properties of a collection (NFT)', async ({helper}) =>  {
-    await testSetsAccessRightsToProperties(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Sets access rights to properties of a collection (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testSetsAccessRightsToProperties(await helper.rft.mintCollection(alice));
-  });
-  
-  async function testChangesAccessRightsToProperty(collection: UniqueNFTCollection | UniqueRFTCollection) {
-    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]))
-      .to.be.fulfilled;
-
-    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]))
-      .to.be.fulfilled;
-
-    const propertyRights = await collection.getPropertyPermissions();
-    expect(propertyRights).to.be.deep.equal([
-      {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
-    ]);
-  }
-
-  itSub('Changes access rights to properties of a NFT collection', async ({helper}) =>  {
-    await testChangesAccessRightsToProperty(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Changes access rights to properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
-    await testChangesAccessRightsToProperty(await helper.rft.mintCollection(alice));
-  });
-});
-
-describe('Negative Integration Test: Access Rights to Token Properties', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
-    });
-  });
-
-  async function testPreventsFromSettingAccessRightsNotAdminOrOwner(collection: UniqueNFTCollection | UniqueRFTCollection) {
-    await expect(collection.setTokenPropertyPermissions(bob, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]))
-      .to.be.rejectedWith(/common\.NoPermission/);
-
-    const propertyRights = await collection.getPropertyPermissions(['skullduggery']);
-    expect(propertyRights).to.be.empty;
-  }
-
-  itSub('Prevents from setting access rights to properties of a NFT collection if not an onwer/admin', async ({helper}) =>  {
-    await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Prevents from setting access rights to properties of a ReFungible collection if not an onwer/admin', [Pallets.ReFungible], async ({helper}) => {
-    await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.rft.mintCollection(alice));
-  });
-
-  async function testPreventFromAddingTooManyPossibleProperties(collection: UniqueNFTCollection | UniqueRFTCollection) {  
-    const constitution = [];
-    for (let i = 0; i < 65; i++) {
-      constitution.push({
-        key: 'property_' + i,
-        permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {},
-      });
-    }
-
-    await expect(collection.setTokenPropertyPermissions(alice, constitution))
-      .to.be.rejectedWith(/common\.PropertyLimitReached/);
-
-    const propertyRights = await collection.getPropertyPermissions();
-    expect(propertyRights).to.be.empty;
-  }
-
-  itSub('Prevents from adding too many possible properties (NFT)', async ({helper}) =>  {
-    await testPreventFromAddingTooManyPossibleProperties(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Prevents from adding too many possible properties (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testPreventFromAddingTooManyPossibleProperties(await helper.rft.mintCollection(alice));
-  });
-
-  async function testPreventAccessRightsModifiedIfConstant(collection: UniqueNFTCollection | UniqueRFTCollection) {
-    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]))
-      .to.be.fulfilled;
-
-    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {collectionAdmin: true}}]))
-      .to.be.rejectedWith(/common\.NoPermission/);
-
-    const propertyRights = await collection.getPropertyPermissions(['skullduggery']);
-    expect(propertyRights).to.deep.equal([
-      {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
-    ]);
-  }
-
-  itSub('Prevents access rights to be modified if constant (NFT)', async ({helper}) =>  {
-    await testPreventAccessRightsModifiedIfConstant(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Prevents access rights to be modified if constant (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testPreventAccessRightsModifiedIfConstant(await helper.rft.mintCollection(alice));
-  });
-
-  async function testPreventsAddingPropertiesWithInvalidNames(collection: UniqueNFTCollection | UniqueRFTCollection) {
-    const invalidProperties = [
-      [{key: 'skullduggery', permission: {tokenOwner: true}}, {key: 'im possible', permission: {collectionAdmin: true}}],
-      [{key: 'G#4', permission: {tokenOwner: true}}],
-      [{key: 'HÆMILTON', permission: {mutable: false, collectionAdmin: true, tokenOwner: true}}],
-    ];
-
-    for (let i = 0; i < invalidProperties.length; i++) {
-      await expect(
-        collection.setTokenPropertyPermissions(alice, invalidProperties[i]), 
-        `on setting the new badly-named property #${i}`,
-      ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
-    }
-
-    await expect(
-      collection.setTokenPropertyPermissions(alice, [{key: '', permission: {}}]), 
-      'on rejecting an unnamed property',
-    ).to.be.rejectedWith(/common\.EmptyPropertyKey/);
-
-    const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string
-    await expect(
-      collection.setTokenPropertyPermissions(alice, [
-        {key: correctKey, permission: {collectionAdmin: true}},
-      ]), 
-      'on setting the correctly-but-still-badly-named property',
-    ).to.be.fulfilled;
-
-    const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat(correctKey).concat('');
-
-    const propertyRights = await collection.getPropertyPermissions(keys);
-    expect(propertyRights).to.be.deep.equal([
-      {key: correctKey, permission: {mutable: false, collectionAdmin: true, tokenOwner: false}},
-    ]);
-  }
-
-  itSub('Prevents adding properties with invalid names (NFT)', async ({helper}) =>  {
-    await testPreventsAddingPropertiesWithInvalidNames(await helper.nft.mintCollection(alice));
-  });
-
-  itSub.ifWithPallets('Prevents adding properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    await testPreventsAddingPropertiesWithInvalidNames(await helper.rft.mintCollection(alice));
-  });
-});
-
-// ---------- TOKEN PROPERTIES
-
-describe('Integration Test: Token Properties', () => {
-  let alice: IKeyringPair; // collection owner
-  let bob: IKeyringPair; // collection admin
-  let charlie: IKeyringPair; // token owner
-
-  let permissions: {permission: any, signers: IKeyringPair[]}[];
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
-    });
-
-    // todo:playgrounds probably separate these tests later
-    permissions = [
-      {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]},
-      {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob]},
-      {permission: {mutable: true, tokenOwner: true}, signers: [charlie]},
-      {permission: {mutable: false, tokenOwner: true}, signers: [charlie]},
-      {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]},
-      {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]},
-    ];
-  });
-  
-  async function testReadsYetEmptyProperties(token: UniqueNFToken | UniqueRFToken) {
-    const properties = await token.getProperties();
-    expect(properties).to.be.empty;
-
-    const tokenData = await token.getData();
-    expect(tokenData!.properties).to.be.empty;
-  }
-
-  itSub('Reads yet empty properties of a token (NFT)', async ({helper}) => {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testReadsYetEmptyProperties(token);
-  });
-
-  itSub.ifWithPallets('Reads yet empty properties of a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testReadsYetEmptyProperties(token);
-  });
-
-  async function testAssignPropertiesAccordingToPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    await token.collection.addAdmin(alice, {Substrate: bob.address});
-    await token.transfer(alice, {Substrate: charlie.address}, pieces);
-
-    const propertyKeys: string[] = [];
-    let i = 0;
-    for (const permission of permissions) {
-      i++;
-      let j = 0;
-      for (const signer of permission.signers) {
-        j++;
-        const key = i + '_' + signer.address;
-        propertyKeys.push(key);
-
-        await expect(
-          token.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), 
-          `on setting permission #${i} by alice`,
-        ).to.be.fulfilled;
-
-        await expect(
-          token.setProperties(signer, [{key: key, value: 'Serotonin increase'}]), 
-          `on adding property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-      }
-    }
-
-    const properties = await token.getProperties(propertyKeys);
-    const tokenData = await token.getData();
-    for (let i = 0; i < properties.length; i++) {
-      expect(properties[i].value).to.be.equal('Serotonin increase');
-      expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase');
-    }
-  }
-
-  itSub('Assigns properties to a token according to permissions (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testAssignPropertiesAccordingToPermissions(token, 1n);
-  });
-
-  itSub.ifWithPallets('Assigns properties to a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testAssignPropertiesAccordingToPermissions(token, 100n);
-  });
-
-  async function testChangesPropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    await token.collection.addAdmin(alice, {Substrate: bob.address});
-    await token.transfer(alice, {Substrate: charlie.address}, pieces);
-
-    const propertyKeys: string[] = [];
-    let i = 0;
-    for (const permission of permissions) {
-      i++;
-      if (!permission.permission.mutable) continue;
-      
-      let j = 0;
-      for (const signer of permission.signers) {
-        j++;
-        const key = i + '_' + signer.address;
-        propertyKeys.push(key);
-
-        await expect(
-          token.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), 
-          `on setting permission #${i} by alice`,
-        ).to.be.fulfilled;
-
-        await expect(
-          token.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
-          `on adding property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-
-        await expect(
-          token.setProperties(signer, [{key, value: 'Serotonin stable'}]), 
-          `on changing property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-      }
-    }
-
-    const properties = await token.getProperties(propertyKeys);
-    const tokenData = await token.getData();
-    for (let i = 0; i < properties.length; i++) {
-      expect(properties[i].value).to.be.equal('Serotonin stable');
-      expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable');
-    }
-  }
-
-  itSub('Changes properties of a token according to permissions (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testChangesPropertiesAccordingPermission(token, 1n);
-  });
-
-  itSub.ifWithPallets('Changes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testChangesPropertiesAccordingPermission(token, 100n);
-  });
-
-  async function testDeletePropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    await token.collection.addAdmin(alice, {Substrate: bob.address});
-    await token.transfer(alice, {Substrate: charlie.address}, pieces);
-
-    const propertyKeys: string[] = [];
-    let i = 0;
-
-    for (const permission of permissions) {
-      i++;
-      if (!permission.permission.mutable) continue;
-      
-      let j = 0;
-      for (const signer of permission.signers) {
-        j++;
-        const key = i + '_' + signer.address;
-        propertyKeys.push(key);
-
-        await expect(
-          token.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), 
-          `on setting permission #${i} by alice`,
-        ).to.be.fulfilled;
-
-        await expect(
-          token.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
-          `on adding property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-
-        await expect(
-          token.deleteProperties(signer, [key]), 
-          `on deleting property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-      }
-    }
-
-    expect(await token.getProperties(propertyKeys)).to.be.empty;
-    expect((await token.getData())!.properties).to.be.empty;
-  }
-  
-  itSub('Deletes properties of a token according to permissions (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testDeletePropertiesAccordingPermission(token, 1n);
-  });
-
-  itSub.ifWithPallets('Deletes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testDeletePropertiesAccordingPermission(token, 100n);
-  });
-
-  itSub('Assigns properties to a nested token according to permissions', async ({helper}) =>  {
-    const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});
-    const collectionB = await helper.nft.mintCollection(alice);
-    const targetToken = await collectionA.mintToken(alice);
-    const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount());
-
-    await collectionB.addAdmin(alice, {Substrate: bob.address});
-    await targetToken.transfer(alice, {Substrate: charlie.address});
-
-    const propertyKeys: string[] = [];
-    let i = 0;
-    for (const permission of permissions) {
-      i++;
-      let j = 0;
-      for (const signer of permission.signers) {
-        j++;
-        const key = i + '_' + signer.address;
-        propertyKeys.push(key);
-        
-        await expect(
-          nestedToken.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), 
-          `on setting permission #${i} by alice`,
-        ).to.be.fulfilled;
-
-        await expect(
-          nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
-          `on adding property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-      }
-    }
-
-    const properties = await nestedToken.getProperties(propertyKeys);
-    const tokenData = await nestedToken.getData();
-    for (let i = 0; i < properties.length; i++) {
-      expect(properties[i].value).to.be.equal('Serotonin increase');
-      expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase');
-    }
-    expect(await targetToken.getProperties()).to.be.empty;
-  });
-
-  itSub('Changes properties of a nested token according to permissions', async ({helper}) =>  {
-    const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});
-    const collectionB = await helper.nft.mintCollection(alice);
-    const targetToken = await collectionA.mintToken(alice);
-    const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount());
-
-    await collectionB.addAdmin(alice, {Substrate: bob.address});
-    await targetToken.transfer(alice, {Substrate: charlie.address});
-
-    const propertyKeys: string[] = [];
-    let i = 0;
-    for (const permission of permissions) {
-      i++;
-      if (!permission.permission.mutable) continue;
-      
-      let j = 0;
-      for (const signer of permission.signers) {
-        j++;
-        const key = i + '_' + signer.address;
-        propertyKeys.push(key);
-
-        await expect(
-          nestedToken.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), 
-          `on setting permission #${i} by alice`,
-        ).to.be.fulfilled;
-
-        await expect(
-          nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
-          `on adding property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-
-        await expect(
-          nestedToken.setProperties(signer, [{key, value: 'Serotonin stable'}]), 
-          `on changing property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-      }
-    }
-
-    const properties = await nestedToken.getProperties(propertyKeys);
-    const tokenData = await nestedToken.getData();
-    for (let i = 0; i < properties.length; i++) {
-      expect(properties[i].value).to.be.equal('Serotonin stable');
-      expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable');
-    }
-    expect(await targetToken.getProperties()).to.be.empty;
-  });
-
-  itSub('Deletes properties of a nested token according to permissions', async ({helper}) =>  {
-    const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});
-    const collectionB = await helper.nft.mintCollection(alice);
-    const targetToken = await collectionA.mintToken(alice);
-    const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount());
-
-    await collectionB.addAdmin(alice, {Substrate: bob.address});
-    await targetToken.transfer(alice, {Substrate: charlie.address});
-
-    const propertyKeys: string[] = [];
-    let i = 0;
-    for (const permission of permissions) {
-      i++;
-      if (!permission.permission.mutable) continue;
-      
-      let j = 0;
-      for (const signer of permission.signers) {
-        j++;
-        const key = i + '_' + signer.address;
-        propertyKeys.push(key);
-
-        await expect(
-          nestedToken.collection.setTokenPropertyPermissions(alice, [{key: key, permission: permission.permission}]), 
-          `on setting permission #${i} by alice`,
-        ).to.be.fulfilled;
-
-        await expect(
-          nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
-          `on adding property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-
-        await expect(
-          nestedToken.deleteProperties(signer, [key]), 
-          `on deleting property #${i} by signer #${j}`,
-        ).to.be.fulfilled;
-      }
-    }
-
-    expect(await nestedToken.getProperties(propertyKeys)).to.be.empty;
-    expect((await nestedToken.getData())!.properties).to.be.empty;
-    expect(await targetToken.getProperties()).to.be.empty;
-  });
-});
-
-describe('Negative Integration Test: Token Properties', () => {
-  let alice: IKeyringPair; // collection owner
-  let bob: IKeyringPair; // collection admin
-  let charlie: IKeyringPair; // token owner
-
-  let constitution: {permission: any, signers: IKeyringPair[], sinner: IKeyringPair}[];
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
-      let dave: IKeyringPair;
-      [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
-
-      // todo:playgrounds probably separate these tests later
-      constitution = [
-        {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob], sinner: charlie},
-        {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob], sinner: charlie},
-        {permission: {mutable: true, tokenOwner: true}, signers: [charlie], sinner: alice},
-        {permission: {mutable: false, tokenOwner: true}, signers: [charlie], sinner: alice},
-        {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave},
-        {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave},
-      ];
-    });
-  });
-
-  async function getConsumedSpace(api: any, collectionId: number, tokenId: number, mode: 'NFT' | 'RFT'): Promise<number> {
-    return (await (mode == 'NFT' ? api.query.nonfungible : api.query.refungible).tokenProperties(collectionId, tokenId)).toJSON().consumedSpace;
-  }
-
-  async function prepare(token: UniqueNFToken | UniqueRFToken, pieces: bigint): Promise<number> {
-    await token.collection.addAdmin(alice, {Substrate: bob.address});
-    await token.transfer(alice, {Substrate: charlie.address}, pieces);
-
-    let i = 0;
-    for (const passage of constitution) {
-      i++;
-      const signer = passage.signers[0];
-      
-      await expect(
-        token.collection.setTokenPropertyPermissions(alice, [{key: `${i}`, permission: passage.permission}]), 
-        `on setting permission ${i} by alice`,
-      ).to.be.fulfilled;
-
-      await expect(
-        token.setProperties(signer, [{key: `${i}`, value: 'Serotonin increase'}]), 
-        `on adding property ${i} by ${signer.address}`,
-      ).to.be.fulfilled;
-    }
-
-    const originalSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
-    return originalSpace;
-  }
-
-  async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    const originalSpace = await prepare(token, pieces);
-
-    let i = 0;
-    for (const forbiddance of constitution) {
-      i++;
-      if (!forbiddance.permission.mutable) continue;
-
-      await expect(
-        token.setProperties(forbiddance.sinner, [{key: `${i}`, value: 'Serotonin down'}]), 
-        `on failing to change property ${i} by the malefactor`,
-      ).to.be.rejectedWith(/common\.NoPermission/);
-
-      await expect(
-        token.deleteProperties(forbiddance.sinner, [`${i}`]), 
-        `on failing to delete property ${i} by the malefactor`,
-      ).to.be.rejectedWith(/common\.NoPermission/);
-    }
-
-    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
-    expect(consumedSpace).to.be.equal(originalSpace);
-  }
-
-  itSub('Forbids changing/deleting properties of a token if the user is outside of permissions (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, 1n);
-  });
-
-  itSub.ifWithPallets('Forbids changing/deleting properties of a token if the user is outside of permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, 100n);
-  });
-
-  async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    const originalSpace = await prepare(token, pieces);
-
-    let i = 0;
-    for (const permission of constitution) {
-      i++;
-      if (permission.permission.mutable) continue;
-
-      await expect(
-        token.setProperties(permission.signers[0], [{key: `${i}`, value: 'Serotonin down'}]), 
-        `on failing to change property ${i} by signer #0`,
-      ).to.be.rejectedWith(/common\.NoPermission/);
-
-      await expect(
-        token.deleteProperties(permission.signers[0], [i.toString()]), 
-        `on failing to delete property ${i} by signer #0`,
-      ).to.be.rejectedWith(/common\.NoPermission/);
-    }
-  
-    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
-    expect(consumedSpace).to.be.equal(originalSpace);
-  }
-
-  itSub('Forbids changing/deleting properties of a token if the property is permanent (immutable) (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, 1n);
-  });
-
-  itSub.ifWithPallets('Forbids changing/deleting properties of a token if the property is permanent (immutable) (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, 100n);
-  });
-
-  async function testForbidsAddingPropertiesIfPropertyNotDeclared(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    const originalSpace = await prepare(token, pieces);
-
-    await expect(
-      token.setProperties(alice, [{key: 'non-existent', value: 'I exist!'}]), 
-      'on failing to add a previously non-existent property',
-    ).to.be.rejectedWith(/common\.NoPermission/);
-      
-    await expect(
-      token.collection.setTokenPropertyPermissions(alice, [{key: 'now-existent', permission: {}}]), 
-      'on setting a new non-permitted property',
-    ).to.be.fulfilled;
-
-    await expect(
-      token.setProperties(alice, [{key: 'now-existent', value: 'I exist!'}]), 
-      'on failing to add a property forbidden by the \'None\' permission',
-    ).to.be.rejectedWith(/common\.NoPermission/);
-
-    expect(await token.getProperties(['non-existent', 'now-existent'])).to.be.empty;
-      
-    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
-    expect(consumedSpace).to.be.equal(originalSpace);
-  }
-
-  itSub('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testForbidsAddingPropertiesIfPropertyNotDeclared(token, 1n);
-  });
-
-  itSub.ifWithPallets('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testForbidsAddingPropertiesIfPropertyNotDeclared(token, 100n);
-  });
-
-  async function testForbidsAddingTooManyProperties(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
-    const originalSpace = await prepare(token, pieces);
-
-    await expect(
-      token.collection.setTokenPropertyPermissions(alice, [
-        {key: 'a_holy_book', permission: {collectionAdmin: true, tokenOwner: true}}, 
-        {key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}},
-      ]), 
-      'on setting new permissions for properties',
-    ).to.be.fulfilled;
-
-    // Mute the general tx parsing error
-    {
-      console.error = () => {};
-      await expect(token.setProperties(alice, [{key: 'a_holy_book', value: 'word '.repeat(6554)}]))
-        .to.be.rejected;
-    }
-
-    await expect(token.setProperties(alice, [
-      {key: 'a_holy_book', value: 'word '.repeat(3277)}, 
-      {key: 'young_years', value: 'neverending'.repeat(1490)},
-    ])).to.be.rejectedWith(/common\.NoSpaceForProperty/);
-  
-    expect(await token.getProperties(['a_holy_book', 'young_years'])).to.be.empty;
-    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
-    expect(consumedSpace).to.be.equal(originalSpace);
-  }
-
-  itSub('Forbids adding too many properties to a token (NFT)', async ({helper}) =>  {
-    const collection = await helper.nft.mintCollection(alice);
-    const token = await collection.mintToken(alice);
-    await testForbidsAddingTooManyProperties(token, 1n);
-  });
-
-  itSub.ifWithPallets('Forbids adding too many properties to a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    await testForbidsAddingTooManyProperties(token, 100n);
-  });
-});
-
-describe('ReFungible token properties permissions tests', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
-
-  before(async function() {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
-
-      const donor = privateKey('//Alice');
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
-    });
-  });
-
-  async function prepare(helper: UniqueHelper): Promise<UniqueRFToken> {
-    const collection = await helper.rft.mintCollection(alice);
-    const token = await collection.mintToken(alice, 100n);
-    
-    await collection.addAdmin(alice, {Substrate: bob.address});
-    await collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable: true, tokenOwner: true}}]);
-    
-    return token;
-  }
-
-  itSub('Forbids adding token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) =>  {
-    const token = await prepare(helper);
-
-    await token.transfer(alice, {Substrate: charlie.address}, 33n);
-
-    await expect(token.setProperties(alice, [
-      {key: 'fractals', value: 'multiverse'}, 
-    ])).to.be.rejectedWith(/common\.NoPermission/);
-  });
-
-  itSub('Forbids mutating token property with tokenOwher==true when signer doesn\'t have all pieces', async ({helper}) =>  {
-    const token = await prepare(helper);
-
-    await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, tokenOwner: true}}]))
-      .to.be.fulfilled;
-
-    await expect(token.setProperties(alice, [
-      {key: 'fractals', value: 'multiverse'}, 
-    ])).to.be.fulfilled;
-
-    await token.transfer(alice, {Substrate: charlie.address}, 33n);
-
-    await expect(token.setProperties(alice, [
-      {key: 'fractals', value: 'want to rule the world'}, 
-    ])).to.be.rejectedWith(/common\.NoPermission/);
-  });
-
-  itSub('Forbids deleting token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) =>  {
-    const token = await prepare(helper);
-
-    await expect(token.setProperties(alice, [
-      {key: 'fractals', value: 'one headline - why believe it'}, 
-    ])).to.be.fulfilled;
-
-    await token.transfer(alice, {Substrate: charlie.address}, 33n);
-
-    await expect(token.deleteProperties(alice, ['fractals'])).
-      to.be.rejectedWith(/common\.NoPermission/);
-  });
-
-  itSub('Allows token property mutation with collectionOwner==true when admin doesn\'t have all pieces', async ({helper}) =>  {
-    const token = await prepare(helper);
-
-    await token.transfer(alice, {Substrate: charlie.address}, 33n);
-
-    await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, collectionAdmin: true}}]))
-      .to.be.fulfilled;
-
-    await expect(token.setProperties(alice, [
-      {key: 'fractals', value: 'multiverse'}, 
-    ])).to.be.fulfilled;
-  });
-});
addedtests/src/nesting/propertyPermissions.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/nesting/propertyPermissions.test.ts
@@ -0,0 +1,198 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect} from '../util';
+import {UniqueNFTCollection, UniqueRFTCollection} from '../util/playgrounds/unique';
+
+describe('Integration Test: Access Rights to Token Properties', () => {
+  let alice: IKeyringPair;
+  let bob: IKeyringPair;
+  
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);
+    });
+  });
+    
+  itSub('Reads access rights to properties of a collection', async ({helper}) =>  {
+    const collection = await helper.nft.mintCollection(alice);
+    const propertyRights = (await helper.callRpc('api.query.common.collectionPropertyPermissions', [collection.collectionId])).toJSON();
+    expect(propertyRights).to.be.empty;
+  });
+    
+  async function testSetsAccessRightsToProperties(collection: UniqueNFTCollection | UniqueRFTCollection) {  
+    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true}}]))
+      .to.be.fulfilled;
+  
+    await collection.addAdmin(alice, {Substrate: bob.address});
+  
+    await expect(collection.setTokenPropertyPermissions(bob, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]))
+      .to.be.fulfilled;
+  
+    const propertyRights = await collection.getPropertyPermissions(['skullduggery', 'mindgame']);
+    expect(propertyRights).to.include.deep.members([
+      {key: 'skullduggery', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}},
+      {key: 'mindgame', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}},
+    ]);
+  }
+  
+  itSub('Sets access rights to properties of a collection (NFT)', async ({helper}) =>  {
+    await testSetsAccessRightsToProperties(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Sets access rights to properties of a collection (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testSetsAccessRightsToProperties(await helper.rft.mintCollection(alice));
+  });
+    
+  async function testChangesAccessRightsToProperty(collection: UniqueNFTCollection | UniqueRFTCollection) {
+    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]))
+      .to.be.fulfilled;
+  
+    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]))
+      .to.be.fulfilled;
+  
+    const propertyRights = await collection.getPropertyPermissions();
+    expect(propertyRights).to.be.deep.equal([
+      {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
+    ]);
+  }
+  
+  itSub('Changes access rights to properties of a NFT collection', async ({helper}) =>  {
+    await testChangesAccessRightsToProperty(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Changes access rights to properties of a ReFungible collection', [Pallets.ReFungible], async ({helper}) => {
+    await testChangesAccessRightsToProperty(await helper.rft.mintCollection(alice));
+  });
+});
+  
+describe('Negative Integration Test: Access Rights to Token Properties', () => {
+  let alice: IKeyringPair;
+  let bob: IKeyringPair;
+  
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
+    });
+  });
+  
+  async function testPreventsFromSettingAccessRightsNotAdminOrOwner(collection: UniqueNFTCollection | UniqueRFTCollection) {
+    await expect(collection.setTokenPropertyPermissions(bob, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]))
+      .to.be.rejectedWith(/common\.NoPermission/);
+  
+    const propertyRights = await collection.getPropertyPermissions(['skullduggery']);
+    expect(propertyRights).to.be.empty;
+  }
+  
+  itSub('Prevents from setting access rights to properties of a NFT collection if not an onwer/admin', async ({helper}) =>  {
+    await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Prevents from setting access rights to properties of a ReFungible collection if not an onwer/admin', [Pallets.ReFungible], async ({helper}) => {
+    await testPreventsFromSettingAccessRightsNotAdminOrOwner(await helper.rft.mintCollection(alice));
+  });
+  
+  async function testPreventFromAddingTooManyPossibleProperties(collection: UniqueNFTCollection | UniqueRFTCollection) {  
+    const constitution = [];
+    for (let i = 0; i < 65; i++) {
+      constitution.push({
+        key: 'property_' + i,
+        permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {},
+      });
+    }
+  
+    await expect(collection.setTokenPropertyPermissions(alice, constitution))
+      .to.be.rejectedWith(/common\.PropertyLimitReached/);
+  
+    const propertyRights = await collection.getPropertyPermissions();
+    expect(propertyRights).to.be.empty;
+  }
+  
+  itSub('Prevents from adding too many possible properties (NFT)', async ({helper}) =>  {
+    await testPreventFromAddingTooManyPossibleProperties(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Prevents from adding too many possible properties (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testPreventFromAddingTooManyPossibleProperties(await helper.rft.mintCollection(alice));
+  });
+  
+  async function testPreventAccessRightsModifiedIfConstant(collection: UniqueNFTCollection | UniqueRFTCollection) {
+    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]))
+      .to.be.fulfilled;
+  
+    await expect(collection.setTokenPropertyPermissions(alice, [{key: 'skullduggery', permission: {collectionAdmin: true}}]))
+      .to.be.rejectedWith(/common\.NoPermission/);
+  
+    const propertyRights = await collection.getPropertyPermissions(['skullduggery']);
+    expect(propertyRights).to.deep.equal([
+      {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
+    ]);
+  }
+  
+  itSub('Prevents access rights to be modified if constant (NFT)', async ({helper}) =>  {
+    await testPreventAccessRightsModifiedIfConstant(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Prevents access rights to be modified if constant (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testPreventAccessRightsModifiedIfConstant(await helper.rft.mintCollection(alice));
+  });
+  
+  async function testPreventsAddingPropertiesWithInvalidNames(collection: UniqueNFTCollection | UniqueRFTCollection) {
+    const invalidProperties = [
+      [{key: 'skullduggery', permission: {tokenOwner: true}}, {key: 'im possible', permission: {collectionAdmin: true}}],
+      [{key: 'G#4', permission: {tokenOwner: true}}],
+      [{key: 'HÆMILTON', permission: {mutable: false, collectionAdmin: true, tokenOwner: true}}],
+    ];
+  
+    for (let i = 0; i < invalidProperties.length; i++) {
+      await expect(
+        collection.setTokenPropertyPermissions(alice, invalidProperties[i]), 
+        `on setting the new badly-named property #${i}`,
+      ).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
+    }
+  
+    await expect(
+      collection.setTokenPropertyPermissions(alice, [{key: '', permission: {}}]), 
+      'on rejecting an unnamed property',
+    ).to.be.rejectedWith(/common\.EmptyPropertyKey/);
+  
+    const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string
+    await expect(
+      collection.setTokenPropertyPermissions(alice, [
+        {key: correctKey, permission: {collectionAdmin: true}},
+      ]), 
+      'on setting the correctly-but-still-badly-named property',
+    ).to.be.fulfilled;
+  
+    const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat(correctKey).concat('');
+  
+    const propertyRights = await collection.getPropertyPermissions(keys);
+    expect(propertyRights).to.be.deep.equal([
+      {key: correctKey, permission: {mutable: false, collectionAdmin: true, tokenOwner: false}},
+    ]);
+  }
+  
+  itSub('Prevents adding properties with invalid names (NFT)', async ({helper}) =>  {
+    await testPreventsAddingPropertiesWithInvalidNames(await helper.nft.mintCollection(alice));
+  });
+  
+  itSub.ifWithPallets('Prevents adding properties with invalid names (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    await testPreventsAddingPropertiesWithInvalidNames(await helper.rft.mintCollection(alice));
+  });
+});
\ No newline at end of file
addedtests/src/nesting/tokenProperties.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/nesting/tokenProperties.test.ts
@@ -0,0 +1,594 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util';
+import {UniqueHelper, UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique';
+
+describe('Integration Test: Token Properties', () => {
+  let alice: IKeyringPair; // collection owner
+  let bob: IKeyringPair; // collection admin
+  let charlie: IKeyringPair; // token owner
+
+  let permissions: {permission: any, signers: IKeyringPair[]}[];
+
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    });
+
+    permissions = [
+      {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]},
+      {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob]},
+      {permission: {mutable: true, tokenOwner: true}, signers: [charlie]},
+      {permission: {mutable: false, tokenOwner: true}, signers: [charlie]},
+      {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]},
+      {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]},
+    ];
+  });
+
+  async function mintCollectionWithAllPermissionsAndToken(helper: UniqueHelper, mode: 'NFT' | 'RFT'): Promise<[UniqueNFToken | UniqueRFToken, bigint]> {
+    const collection = await (mode == 'NFT' ? helper.nft : helper.rft).mintCollection(alice, {
+      tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => 
+        signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})),
+    });
+    return mode == 'NFT' ? [await collection.mintToken(alice), 1n] : [await collection.mintToken(alice, 100n), 100n];
+  }
+  
+  async function testReadsYetEmptyProperties(token: UniqueNFToken | UniqueRFToken) {
+    const properties = await token.getProperties();
+    expect(properties).to.be.empty;
+
+    const tokenData = await token.getData();
+    expect(tokenData!.properties).to.be.empty;
+  }
+
+  itSub('Reads yet empty properties of a token (NFT)', async ({helper}) => {
+    const collection = await helper.nft.mintCollection(alice);
+    const token = await collection.mintToken(alice);
+    await testReadsYetEmptyProperties(token);
+  });
+
+  itSub.ifWithPallets('Reads yet empty properties of a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const collection = await helper.rft.mintCollection(alice);
+    const token = await collection.mintToken(alice);
+    await testReadsYetEmptyProperties(token);
+  });
+
+  async function testAssignPropertiesAccordingToPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    await token.collection.addAdmin(alice, {Substrate: bob.address});
+    await token.transfer(alice, {Substrate: charlie.address}, pieces);
+
+    const propertyKeys: string[] = [];
+    let i = 0;
+    for (const permission of permissions) {
+      i++;
+      let j = 0;
+      for (const signer of permission.signers) {
+        j++;
+        const key = i + '_' + signer.address;
+        propertyKeys.push(key);
+
+        await expect(
+          token.setProperties(signer, [{key: key, value: 'Serotonin increase'}]), 
+          `on adding property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+      }
+    }
+
+    const properties = await token.getProperties(propertyKeys);
+    const tokenData = await token.getData();
+    for (let i = 0; i < properties.length; i++) {
+      expect(properties[i].value).to.be.equal('Serotonin increase');
+      expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase');
+    }
+  }
+
+  itSub('Assigns properties to a token according to permissions (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testAssignPropertiesAccordingToPermissions(token, amount);
+  });
+
+  itSub.ifWithPallets('Assigns properties to a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testAssignPropertiesAccordingToPermissions(token, amount);
+  });
+
+  async function testChangesPropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    await token.collection.addAdmin(alice, {Substrate: bob.address});
+    await token.transfer(alice, {Substrate: charlie.address}, pieces);
+
+    const propertyKeys: string[] = [];
+    let i = 0;
+    for (const permission of permissions) {
+      i++;
+      if (!permission.permission.mutable) continue;
+      
+      let j = 0;
+      for (const signer of permission.signers) {
+        j++;
+        const key = i + '_' + signer.address;
+        propertyKeys.push(key);
+
+        await expect(
+          token.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
+          `on adding property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+
+        await expect(
+          token.setProperties(signer, [{key, value: 'Serotonin stable'}]), 
+          `on changing property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+      }
+    }
+
+    const properties = await token.getProperties(propertyKeys);
+    const tokenData = await token.getData();
+    for (let i = 0; i < properties.length; i++) {
+      expect(properties[i].value).to.be.equal('Serotonin stable');
+      expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable');
+    }
+  }
+
+  itSub('Changes properties of a token according to permissions (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testChangesPropertiesAccordingPermission(token, amount);
+  });
+
+  itSub.ifWithPallets('Changes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testChangesPropertiesAccordingPermission(token, amount);
+  });
+
+  async function testDeletePropertiesAccordingPermission(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    await token.collection.addAdmin(alice, {Substrate: bob.address});
+    await token.transfer(alice, {Substrate: charlie.address}, pieces);
+
+    const propertyKeys: string[] = [];
+    let i = 0;
+
+    for (const permission of permissions) {
+      i++;
+      if (!permission.permission.mutable) continue;
+      
+      let j = 0;
+      for (const signer of permission.signers) {
+        j++;
+        const key = i + '_' + signer.address;
+        propertyKeys.push(key);
+
+        await expect(
+          token.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
+          `on adding property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+
+        await expect(
+          token.deleteProperties(signer, [key]), 
+          `on deleting property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+      }
+    }
+
+    expect(await token.getProperties(propertyKeys)).to.be.empty;
+    expect((await token.getData())!.properties).to.be.empty;
+  }
+  
+  itSub('Deletes properties of a token according to permissions (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testDeletePropertiesAccordingPermission(token, amount);
+  });
+
+  itSub.ifWithPallets('Deletes properties of a token according to permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testDeletePropertiesAccordingPermission(token, amount);
+  });
+
+  itSub('Assigns properties to a nested token according to permissions', async ({helper}) =>  {
+    const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});
+    const collectionB = await helper.nft.mintCollection(alice, {
+      tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => 
+        signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})),
+    });
+    const targetToken = await collectionA.mintToken(alice);
+    const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount());
+
+    await collectionB.addAdmin(alice, {Substrate: bob.address});
+    await targetToken.transfer(alice, {Substrate: charlie.address});
+
+    const propertyKeys: string[] = [];
+    let i = 0;
+    for (const permission of permissions) {
+      i++;
+      let j = 0;
+      for (const signer of permission.signers) {
+        j++;
+        const key = i + '_' + signer.address;
+        propertyKeys.push(key);
+
+        await expect(
+          nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
+          `on adding property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+      }
+    }
+
+    const properties = await nestedToken.getProperties(propertyKeys);
+    const tokenData = await nestedToken.getData();
+    for (let i = 0; i < properties.length; i++) {
+      expect(properties[i].value).to.be.equal('Serotonin increase');
+      expect(tokenData!.properties[i].value).to.be.equal('Serotonin increase');
+    }
+    expect(await targetToken.getProperties()).to.be.empty;
+  });
+
+  itSub('Changes properties of a nested token according to permissions', async ({helper}) =>  {
+    const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});
+    const collectionB = await helper.nft.mintCollection(alice, {
+      tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => 
+        signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})),
+    });
+    const targetToken = await collectionA.mintToken(alice);
+    const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount());
+
+    await collectionB.addAdmin(alice, {Substrate: bob.address});
+    await targetToken.transfer(alice, {Substrate: charlie.address});
+
+    const propertyKeys: string[] = [];
+    let i = 0;
+    for (const permission of permissions) {
+      i++;
+      if (!permission.permission.mutable) continue;
+      
+      let j = 0;
+      for (const signer of permission.signers) {
+        j++;
+        const key = i + '_' + signer.address;
+        propertyKeys.push(key);
+
+        await expect(
+          nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
+          `on adding property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+
+        await expect(
+          nestedToken.setProperties(signer, [{key, value: 'Serotonin stable'}]), 
+          `on changing property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+      }
+    }
+
+    const properties = await nestedToken.getProperties(propertyKeys);
+    const tokenData = await nestedToken.getData();
+    for (let i = 0; i < properties.length; i++) {
+      expect(properties[i].value).to.be.equal('Serotonin stable');
+      expect(tokenData!.properties[i].value).to.be.equal('Serotonin stable');
+    }
+    expect(await targetToken.getProperties()).to.be.empty;
+  });
+
+  itSub('Deletes properties of a nested token according to permissions', async ({helper}) =>  {
+    const collectionA = await helper.nft.mintCollection(alice, {permissions: {nesting: {tokenOwner: true}}});
+    const collectionB = await helper.nft.mintCollection(alice, {
+      tokenPropertyPermissions: permissions.flatMap(({permission, signers}, i) => 
+        signers.map(signer => {return {key: `${i+1}_${signer.address}`, permission};})),
+    });
+    const targetToken = await collectionA.mintToken(alice);
+    const nestedToken = await collectionB.mintToken(alice, targetToken.nestingAccount());
+
+    await collectionB.addAdmin(alice, {Substrate: bob.address});
+    await targetToken.transfer(alice, {Substrate: charlie.address});
+
+    const propertyKeys: string[] = [];
+    let i = 0;
+    for (const permission of permissions) {
+      i++;
+      if (!permission.permission.mutable) continue;
+      
+      let j = 0;
+      for (const signer of permission.signers) {
+        j++;
+        const key = i + '_' + signer.address;
+        propertyKeys.push(key);
+
+        await expect(
+          nestedToken.setProperties(signer, [{key, value: 'Serotonin increase'}]), 
+          `on adding property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+
+        await expect(
+          nestedToken.deleteProperties(signer, [key]), 
+          `on deleting property #${i} by signer #${j}`,
+        ).to.be.fulfilled;
+      }
+    }
+
+    expect(await nestedToken.getProperties(propertyKeys)).to.be.empty;
+    expect((await nestedToken.getData())!.properties).to.be.empty;
+    expect(await targetToken.getProperties()).to.be.empty;
+  });
+});
+
+describe('Negative Integration Test: Token Properties', () => {
+  let alice: IKeyringPair; // collection owner
+  let bob: IKeyringPair; // collection admin
+  let charlie: IKeyringPair; // token owner
+
+  let constitution: {permission: any, signers: IKeyringPair[], sinner: IKeyringPair}[];
+
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      const donor = await privateKey({filename: __filename});
+      let dave: IKeyringPair;
+      [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
+
+      // todo:playgrounds probably separate these tests later
+      constitution = [
+        {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob], sinner: charlie},
+        {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob], sinner: charlie},
+        {permission: {mutable: true, tokenOwner: true}, signers: [charlie], sinner: alice},
+        {permission: {mutable: false, tokenOwner: true}, signers: [charlie], sinner: alice},
+        {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave},
+        {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave},
+      ];
+    });
+  });
+
+  async function mintCollectionWithAllPermissionsAndToken(helper: UniqueHelper, mode: 'NFT' | 'RFT'): Promise<[UniqueNFToken | UniqueRFToken, bigint]> {
+    const collection = await (mode == 'NFT' ? helper.nft : helper.rft).mintCollection(alice, {
+      tokenPropertyPermissions: constitution.map(({permission}, i) => {return {key: `${i+1}`, permission};}),
+    });
+    return mode == 'NFT' ? [await collection.mintToken(alice), 1n] : [await collection.mintToken(alice, 100n), 100n];
+  }
+
+  async function getConsumedSpace(api: any, collectionId: number, tokenId: number, mode: 'NFT' | 'RFT'): Promise<number> {
+    return (await (mode == 'NFT' ? api.query.nonfungible : api.query.refungible).tokenProperties(collectionId, tokenId)).toJSON().consumedSpace;
+  }
+
+  async function prepare(token: UniqueNFToken | UniqueRFToken, pieces: bigint): Promise<number> {
+    await token.collection.addAdmin(alice, {Substrate: bob.address});
+    await token.transfer(alice, {Substrate: charlie.address}, pieces);
+
+    let i = 0;
+    for (const passage of constitution) {
+      i++;
+      const signer = passage.signers[0];
+      await expect(
+        token.setProperties(signer, [{key: `${i}`, value: 'Serotonin increase'}]), 
+        `on adding property ${i} by ${signer.address}`,
+      ).to.be.fulfilled;
+    }
+
+    const originalSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
+    return originalSpace;
+  }
+
+  async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    const originalSpace = await prepare(token, pieces);
+
+    let i = 0;
+    for (const forbiddance of constitution) {
+      i++;
+      if (!forbiddance.permission.mutable) continue;
+
+      await expect(
+        token.setProperties(forbiddance.sinner, [{key: `${i}`, value: 'Serotonin down'}]), 
+        `on failing to change property ${i} by the malefactor`,
+      ).to.be.rejectedWith(/common\.NoPermission/);
+
+      await expect(
+        token.deleteProperties(forbiddance.sinner, [`${i}`]), 
+        `on failing to delete property ${i} by the malefactor`,
+      ).to.be.rejectedWith(/common\.NoPermission/);
+    }
+
+    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
+    expect(consumedSpace).to.be.equal(originalSpace);
+  }
+
+  itSub('Forbids changing/deleting properties of a token if the user is outside of permissions (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, amount);
+  });
+
+  itSub.ifWithPallets('Forbids changing/deleting properties of a token if the user is outside of permissions (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(token, amount);
+  });
+
+  async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    const originalSpace = await prepare(token, pieces);
+
+    let i = 0;
+    for (const permission of constitution) {
+      i++;
+      if (permission.permission.mutable) continue;
+
+      await expect(
+        token.setProperties(permission.signers[0], [{key: `${i}`, value: 'Serotonin down'}]), 
+        `on failing to change property ${i} by signer #0`,
+      ).to.be.rejectedWith(/common\.NoPermission/);
+
+      await expect(
+        token.deleteProperties(permission.signers[0], [i.toString()]), 
+        `on failing to delete property ${i} by signer #0`,
+      ).to.be.rejectedWith(/common\.NoPermission/);
+    }
+  
+    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
+    expect(consumedSpace).to.be.equal(originalSpace);
+  }
+
+  itSub('Forbids changing/deleting properties of a token if the property is permanent (immutable) (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, amount);
+  });
+
+  itSub.ifWithPallets('Forbids changing/deleting properties of a token if the property is permanent (immutable) (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testForbidsChangingDeletingPropertiesIfPropertyImmutable(token, amount);
+  });
+
+  async function testForbidsAddingPropertiesIfPropertyNotDeclared(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    const originalSpace = await prepare(token, pieces);
+
+    await expect(
+      token.setProperties(alice, [{key: 'non-existent', value: 'I exist!'}]), 
+      'on failing to add a previously non-existent property',
+    ).to.be.rejectedWith(/common\.NoPermission/);
+      
+    await expect(
+      token.collection.setTokenPropertyPermissions(alice, [{key: 'now-existent', permission: {}}]), 
+      'on setting a new non-permitted property',
+    ).to.be.fulfilled;
+
+    await expect(
+      token.setProperties(alice, [{key: 'now-existent', value: 'I exist!'}]), 
+      'on failing to add a property forbidden by the \'None\' permission',
+    ).to.be.rejectedWith(/common\.NoPermission/);
+
+    expect(await token.getProperties(['non-existent', 'now-existent'])).to.be.empty;
+      
+    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
+    expect(consumedSpace).to.be.equal(originalSpace);
+  }
+
+  itSub('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testForbidsAddingPropertiesIfPropertyNotDeclared(token, amount);
+  });
+
+  itSub.ifWithPallets('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testForbidsAddingPropertiesIfPropertyNotDeclared(token, amount);
+  });
+
+  async function testForbidsAddingTooManyProperties(token: UniqueNFToken | UniqueRFToken, pieces: bigint) {
+    const originalSpace = await prepare(token, pieces);
+
+    await expect(
+      token.collection.setTokenPropertyPermissions(alice, [
+        {key: 'a_holy_book', permission: {collectionAdmin: true, tokenOwner: true}}, 
+        {key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}},
+      ]), 
+      'on setting new permissions for properties',
+    ).to.be.fulfilled;
+
+    // Mute the general tx parsing error
+    {
+      console.error = () => {};
+      await expect(token.setProperties(alice, [{key: 'a_holy_book', value: 'word '.repeat(6554)}]))
+        .to.be.rejected;
+    }
+
+    await expect(token.setProperties(alice, [
+      {key: 'a_holy_book', value: 'word '.repeat(3277)}, 
+      {key: 'young_years', value: 'neverending'.repeat(1490)},
+    ])).to.be.rejectedWith(/common\.NoSpaceForProperty/);
+  
+    expect(await token.getProperties(['a_holy_book', 'young_years'])).to.be.empty;
+    const consumedSpace = await getConsumedSpace(token.collection.helper.getApi(), token.collectionId, token.tokenId, pieces == 1n ? 'NFT' : 'RFT'); 
+    expect(consumedSpace).to.be.equal(originalSpace);
+  }
+
+  itSub('Forbids adding too many properties to a token (NFT)', async ({helper}) =>  {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'NFT');
+    await testForbidsAddingTooManyProperties(token, amount);
+  });
+
+  itSub.ifWithPallets('Forbids adding too many properties to a token (ReFungible)', [Pallets.ReFungible], async ({helper}) => {
+    const [token, amount] = await mintCollectionWithAllPermissionsAndToken(helper, 'RFT');
+    await testForbidsAddingTooManyProperties(token, amount);
+  });
+});
+
+describe('ReFungible token properties permissions tests', () => {
+  let alice: IKeyringPair;
+  let bob: IKeyringPair;
+  let charlie: IKeyringPair;
+
+  before(async function() {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
+
+      const donor = await privateKey({filename: __filename});
+      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    });
+  });
+
+  async function prepare(helper: UniqueHelper): Promise<UniqueRFToken> {
+    const collection = await helper.rft.mintCollection(alice);
+    const token = await collection.mintToken(alice, 100n);
+    
+    await collection.addAdmin(alice, {Substrate: bob.address});
+    await collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable: true, tokenOwner: true}}]);
+    
+    return token;
+  }
+
+  itSub('Forbids adding token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) =>  {
+    const token = await prepare(helper);
+
+    await token.transfer(alice, {Substrate: charlie.address}, 33n);
+
+    await expect(token.setProperties(alice, [
+      {key: 'fractals', value: 'multiverse'}, 
+    ])).to.be.rejectedWith(/common\.NoPermission/);
+  });
+
+  itSub('Forbids mutating token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) =>  {
+    const token = await prepare(helper);
+
+    await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, tokenOwner: true}}]))
+      .to.be.fulfilled;
+
+    await expect(token.setProperties(alice, [
+      {key: 'fractals', value: 'multiverse'}, 
+    ])).to.be.fulfilled;
+
+    await token.transfer(alice, {Substrate: charlie.address}, 33n);
+
+    await expect(token.setProperties(alice, [
+      {key: 'fractals', value: 'want to rule the world'}, 
+    ])).to.be.rejectedWith(/common\.NoPermission/);
+  });
+
+  itSub('Forbids deleting token property with tokenOwner==true when signer doesn\'t have all pieces', async ({helper}) =>  {
+    const token = await prepare(helper);
+
+    await expect(token.setProperties(alice, [
+      {key: 'fractals', value: 'one headline - why believe it'}, 
+    ])).to.be.fulfilled;
+
+    await token.transfer(alice, {Substrate: charlie.address}, 33n);
+
+    await expect(token.deleteProperties(alice, ['fractals'])).
+      to.be.rejectedWith(/common\.NoPermission/);
+  });
+
+  itSub('Allows token property mutation with collectionOwner==true when admin doesn\'t have all pieces', async ({helper}) =>  {
+    const token = await prepare(helper);
+
+    await token.transfer(alice, {Substrate: charlie.address}, 33n);
+
+    await expect(token.collection.setTokenPropertyPermissions(alice, [{key: 'fractals', permission: {mutable:true, collectionAdmin: true}}]))
+      .to.be.fulfilled;
+
+    await expect(token.setProperties(alice, [
+      {key: 'fractals', value: 'multiverse'}, 
+    ])).to.be.fulfilled;
+  });
+});
modifiedtests/src/nesting/unnest.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/unnest.test.ts
+++ b/tests/src/nesting/unnest.test.ts
@@ -15,14 +15,14 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from '../util/playgrounds';
+import {expect, itSub, Pallets, usingPlaygrounds} from '../util';
 
 describe('Integration Test: Unnesting', () => {
   let alice: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice] = await helper.arrange.createAccounts([50n], donor);
     });
   });
@@ -91,7 +91,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
     });
   });
modifiedtests/src/nextSponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/nextSponsoring.test.ts
+++ b/tests/src/nextSponsoring.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from './util/playgrounds';
+import {expect, itSub, Pallets, usingPlaygrounds} from './util';
 
 const SPONSORING_TIMEOUT = 5;
 
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor);
     });
   });
modifiedtests/src/pallet-presence.test.tsdiffbeforeafterboth
--- a/tests/src/pallet-presence.test.ts
+++ b/tests/src/pallet-presence.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 // Pallets that must always be present
 const requiredPallets = [
modifiedtests/src/refungible.test.tsdiffbeforeafterboth
--- a/tests/src/refungible.test.ts
+++ b/tests/src/refungible.test.ts
@@ -15,11 +15,12 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util';
 
 const MAX_REFUNGIBLE_PIECES = 1_000_000_000_000_000_000_000n;
 
 describe('integration test: Refungible functionality:', async () => {
+  let donor: IKeyringPair;
   let alice: IKeyringPair;
   let bob: IKeyringPair;
 
@@ -27,7 +28,7 @@
     await usingPlaygrounds(async (helper, privateKey) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
 
-      const donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);
     });
   });
@@ -61,9 +62,9 @@
       .to.eventually.be.rejectedWith(/refungible\.WrongRefungiblePieces/);
   });
   
-  itSub('RPC method tokenOnewrs for refungible collection and token', async ({helper, privateKey}) => {
+  itSub('RPC method tokenOwners for refungible collection and token', async ({helper}) => {
     const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
-    const facelessCrowd = Array(7).fill(0).map((_, i) => ({Substrate: privateKey(`//Alice+${i}`).address}));
+    const facelessCrowd = (await helper.arrange.createAccounts(Array(7).fill(0n), donor)).map(keyring => {return {Substrate: keyring.address};});
 
     const collection = await helper.rft.mintCollection(alice, {name: 'test', description: 'test', tokenPrefix: 'test'});
 
@@ -82,7 +83,7 @@
     expect(owners).to.deep.include.members([{Substrate: alice.address}, ethAcc, {Substrate: bob.address}, ...facelessCrowd]);
     expect(owners.length).to.be.equal(10);
     
-    const eleven = privateKey('//ALice+11');
+    const [eleven] = await helper.arrange.createAccounts([0n], donor);
     expect(await token.transfer(alice, {Substrate: eleven.address}, 10n)).to.be.true;
     expect((await token.getTop10Owners()).length).to.be.equal(10);
   });
@@ -211,7 +212,8 @@
     const token = await collection.mintToken(alice, 100n);
     await token.repartition(alice, 200n);
     const chainEvents = helper.chainLog.slice(-1)[0].events;
-    expect(chainEvents).to.deep.include({
+    const event = chainEvents.find((event: any) => event.section === 'common' && event.method === 'ItemCreated');
+    expect(event).to.deep.include({
       section: 'common',
       method: 'ItemCreated',
       index: [66, 2],
@@ -221,7 +223,6 @@
         {substrate: alice.address}, 
         100n,
       ],
-      phase: {applyExtrinsic: 2},
     });
   });
 
@@ -230,9 +231,10 @@
     const token = await collection.mintToken(alice, 100n);
     await token.repartition(alice, 50n);
     const chainEvents = helper.chainLog.slice(-1)[0].events;
-    expect(chainEvents).to.deep.include({
-      method: 'ItemDestroyed',
+    const event = chainEvents.find((event: any) => event.section === 'common' && event.method === 'ItemDestroyed');
+    expect(event).to.deep.include({
       section: 'common',
+      method: 'ItemDestroyed',
       index: [66, 3],
       data: [
         collection.collectionId,
@@ -240,7 +242,6 @@
         {substrate: alice.address}, 
         50n,
       ],
-      phase: {applyExtrinsic: 2},
     });
   });
   
modifiedtests/src/removeCollectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/removeCollectionAdmin.test.ts
+++ b/tests/src/removeCollectionAdmin.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 describe('Integration Test removeCollectionAdmin(collection_id, account_id):', () => {
   let alice: IKeyringPair;
@@ -23,7 +23,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor);
     });
   });
@@ -62,7 +62,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor);
     });
   });
modifiedtests/src/removeCollectionSponsor.test.tsdiffbeforeafterboth
--- a/tests/src/removeCollectionSponsor.test.ts
+++ b/tests/src/removeCollectionSponsor.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 describe('integration test: ext. removeCollectionSponsor():', () => {
   let donor: IKeyringPair;
@@ -24,7 +24,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor);
     });
   });
@@ -78,7 +78,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor);
     });
   });
addedtests/src/rmrk/acceptNft.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/acceptNft.seqtest.ts
@@ -0,0 +1,107 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {
+  createCollection,
+  mintNft,
+  sendNft,
+  acceptNft,
+} from './util/tx';
+import {NftIdTuple} from './util/fetch';
+import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
+
+describe('integration test: accept NFT', () => {
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+  
+  
+  const alice = '//Alice';
+  const bob = '//Bob';
+  
+  const createTestCollection = async (issuerUri: string) => {
+    return await createCollection(
+      api,
+      issuerUri,
+      'accept-metadata',
+      null,
+      'acpt',
+    );
+  };
+
+  it('accept NFT', async () => {
+    const ownerAlice = alice;
+    const ownerBob = bob;
+
+    const aliceCollectionId = await createTestCollection(alice);
+    const bobCollectionId = await createTestCollection(bob);
+
+    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
+    await acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT);
+
+    const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.true;
+  });
+
+  it('[negative] unable to accept NFT by a not-an-owner', async () => {
+    const ownerAlice = alice;
+    const ownerBob = bob;
+
+    const aliceCollectionId = await createTestCollection(alice);
+    const bobCollectionId = await createTestCollection(bob);
+
+    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
+    const tx = acceptNft(api, bob, bobCollectionId, childNftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('[negative] unable to accept non-existing NFT', async () => {
+    const collectionId = 0;
+    const maxNftId = 0xFFFFFFFF;
+
+    const owner = alice;
+    const aliceCollectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, owner, aliceCollectionId, 'parent-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    const tx = acceptNft(api, alice, collectionId, maxNftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative] unable to accept NFT which is not sent', async () => {
+    const ownerAlice = alice;
+    const ownerBob = bob;
+
+    const aliceCollectionId = await createTestCollection(alice);
+    const bobCollectionId = await createTestCollection(bob);
+
+    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    const tx = acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+
+    const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.false;
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/acceptNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/acceptNft.test.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {
-  createCollection,
-  mintNft,
-  sendNft,
-  acceptNft,
-} from './util/tx';
-import {NftIdTuple} from './util/fetch';
-import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
-
-describe('integration test: accept NFT', () => {
-  let api: any;
-  before(async function() {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-  
-  
-  const alice = '//Alice';
-  const bob = '//Bob';
-  
-  const createTestCollection = async (issuerUri: string) => {
-    return await createCollection(
-      api,
-      issuerUri,
-      'accept-metadata',
-      null,
-      'acpt',
-    );
-  };
-
-  it('accept NFT', async () => {
-    const ownerAlice = alice;
-    const ownerBob = bob;
-
-    const aliceCollectionId = await createTestCollection(alice);
-    const bobCollectionId = await createTestCollection(bob);
-
-    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
-    await acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT);
-
-    const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.true;
-  });
-
-  it('[negative] unable to accept NFT by a not-an-owner', async () => {
-    const ownerAlice = alice;
-    const ownerBob = bob;
-
-    const aliceCollectionId = await createTestCollection(alice);
-    const bobCollectionId = await createTestCollection(bob);
-
-    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
-    const tx = acceptNft(api, bob, bobCollectionId, childNftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('[negative] unable to accept non-existing NFT', async () => {
-    const collectionId = 0;
-    const maxNftId = 0xFFFFFFFF;
-
-    const owner = alice;
-    const aliceCollectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, owner, aliceCollectionId, 'parent-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    const tx = acceptNft(api, alice, collectionId, maxNftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative] unable to accept NFT which is not sent', async () => {
-    const ownerAlice = alice;
-    const ownerBob = bob;
-
-    const aliceCollectionId = await createTestCollection(alice);
-    const bobCollectionId = await createTestCollection(bob);
-
-    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    const tx = acceptNft(api, alice, bobCollectionId, childNftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-
-    const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.false;
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/addResource.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/addResource.seqtest.ts
@@ -0,0 +1,437 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {NftIdTuple} from './util/fetch';
+import {expectTxFailure, getResourceById, requirePallets, Pallets} from './util/helpers';
+import {
+  addNftBasicResource,
+  acceptNftResource,
+  createCollection,
+  mintNft,
+  sendNft,
+  addNftSlotResource,
+  addNftComposableResource,
+} from './util/tx';
+import {RmrkTraitsResourceResourceInfo as ResourceInfo} from '@polkadot/types/lookup';
+
+describe('integration test: add NFT resource', () => {
+  const alice = '//Alice';
+  const bob = '//Bob';
+  const src = 'test-res-src';
+  const metadata = 'test-res-metadata';
+  const license = 'test-res-license';
+  const thumb = 'test-res-thumb';
+
+  const nonexistentId = 99999;
+
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  it('add resource', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+  });
+
+  it('add a resource to the nested NFT', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const parentNftId = await mintNft(api, alice, alice, collectionIdAlice, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, alice, collectionIdAlice, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionIdAlice, childNftId, newOwnerNFT);
+
+    await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      childNftId,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+  });
+
+  it('add multiple resources', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const baseId = 42;
+    const slotId = 10;
+    const parts = [0, 5, 2];
+
+    const resourcesInfo = [];
+    const resourceNum = 4;
+
+    const checkResource = async (resource: ResourceInfo, resType: string, expectedId: number, expected: {
+      src: string,
+      metadata: string,
+      license: string,
+      thumb: string
+    }) => {
+
+      // FIXME A workaround. It seems it is a PolkadotJS bug.
+      // All of the following are `false`.
+      //
+      // console.log('>>> basic:', resource.resource.isBasic);
+      // console.log('>>> composable:', resource.resource.isComposable);
+      // console.log('>>> slot:', resource.resource.isSlot);
+      const resourceJson = (resource.resource.toHuman() as any)[resType];
+
+      expect(resource.id.toNumber(), 'Error: Invalid resource Id')
+        .to.be.eq(expectedId);
+
+      expect(resourceJson.src, 'Error: Invalid resource src')
+        .to.be.eq(expected.src);
+      expect(resourceJson.metadata, 'Error: Invalid resource metadata')
+        .to.be.eq(expected.metadata);
+      expect(resourceJson.license, 'Error: Invalid resource license')
+        .to.be.eq(expected.license);
+      expect(resourceJson.thumb, 'Error: Invalid resource thumb')
+        .to.be.eq(expected.thumb);
+    };
+
+    for (let i = 0; i < resourceNum; i++) {
+      resourcesInfo.push({
+        src: src + 'r-' + i,
+        metadata: metadata + 'r-' + i,
+        license: license + 'r-' + i,
+        thumb: thumb + 'r-' + i,
+      });
+    }
+
+    const firstBasicResourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      resourcesInfo[0].src,
+      resourcesInfo[0].metadata,
+      resourcesInfo[0].license,
+      resourcesInfo[0].thumb,
+    );
+
+    const secondBasicResourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      resourcesInfo[1].src,
+      resourcesInfo[1].metadata,
+      resourcesInfo[1].license,
+      resourcesInfo[1].thumb,
+    );
+
+    const composableResourceId = await addNftComposableResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      parts,
+      baseId,
+      resourcesInfo[2].src,
+      resourcesInfo[2].metadata,
+      resourcesInfo[2].license,
+      resourcesInfo[2].thumb,
+    );
+
+    const slotResourceId = await addNftSlotResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      baseId,
+      slotId,
+      resourcesInfo[3].src,
+      resourcesInfo[3].metadata,
+      resourcesInfo[3].license,
+      resourcesInfo[3].thumb,
+    );
+
+    const firstResource = await getResourceById(api, collectionIdAlice, nftAlice, firstBasicResourceId);
+    await checkResource(firstResource, 'Basic', firstBasicResourceId, resourcesInfo[0]);
+
+    const secondResource = await getResourceById(api, collectionIdAlice, nftAlice, secondBasicResourceId);
+    await checkResource(secondResource, 'Basic', secondBasicResourceId, resourcesInfo[1]);
+
+    const composableResource = await getResourceById(api, collectionIdAlice, nftAlice, composableResourceId);
+    await checkResource(composableResource, 'Composable', composableResourceId, resourcesInfo[2]);
+
+    const slotResource = await getResourceById(api, collectionIdAlice, nftAlice, slotResourceId);
+    await checkResource(slotResource, 'Slot', slotResourceId, resourcesInfo[3]);
+  });
+
+  it('[negative]: unable to add a resource to the non-existing NFT', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const tx = addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nonexistentId,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+  
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative]: unable to add a resource by a not-an-owner user', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const tx = addNftBasicResource(
+      api,
+      bob,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+  
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('[negative]: unable to add a resource to the nested NFT if it isnt root owned by the caller', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const parentNftId = await mintNft(api, alice, alice, collectionIdAlice, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, alice, collectionIdAlice, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionIdAlice, childNftId, newOwnerNFT);
+
+    const tx = addNftBasicResource(
+      api,
+      bob,
+      'added',
+      collectionIdAlice,
+      childNftId,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+    
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('accept resource', async () => {
+    const collectionIdBob = await createCollection(
+      api,
+      bob,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      bob,
+      alice,
+      collectionIdBob,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      bob,
+      'pending',
+      collectionIdBob,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    await acceptNftResource(api, alice, collectionIdBob, nftAlice, resourceId);
+  });
+
+  it('[negative]: unable to accept a non-existing resource', async () => {
+    const collectionIdBob = await createCollection(
+      api,
+      bob,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      bob,
+      alice,
+      collectionIdBob,
+      'nft-metadata',
+    );
+
+    const tx = acceptNftResource(api, alice, collectionIdBob, nftAlice, nonexistentId);
+    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
+  });
+
+  it('[negative]: unable to accept a resource by a not-an-NFT-owner user', async () => {
+    const collectionIdBob = await createCollection(
+      api,
+      bob,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      bob,
+      alice,
+      collectionIdBob,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      bob,
+      'pending',
+      collectionIdBob,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const tx = acceptNftResource(api, bob, collectionIdBob, nftAlice, resourceId);
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('[negative]: unable to accept a resource to a non-target NFT', async () => {
+    const collectionIdBob = await createCollection(
+      api,
+      bob,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      bob,
+      alice,
+      collectionIdBob,
+      'nft-metadata',
+    );
+
+    const wrongNft = await mintNft(
+      api,
+      bob,
+      alice,
+      collectionIdBob,
+      'nft-metadata',
+    );
+    
+    const resourceId = await addNftBasicResource(
+      api,
+      bob,
+      'pending',
+      collectionIdBob,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const tx = acceptNftResource(api, bob, collectionIdBob, wrongNft, resourceId);
+
+    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
+  });
+
+
+  after(() => {
+    after(async() => { await api.disconnect(); });
+  });
+});
deletedtests/src/rmrk/addResource.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/addResource.test.ts
+++ /dev/null
@@ -1,437 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {NftIdTuple} from './util/fetch';
-import {expectTxFailure, getResourceById, requirePallets, Pallets} from './util/helpers';
-import {
-  addNftBasicResource,
-  acceptNftResource,
-  createCollection,
-  mintNft,
-  sendNft,
-  addNftSlotResource,
-  addNftComposableResource,
-} from './util/tx';
-import {RmrkTraitsResourceResourceInfo as ResourceInfo} from '@polkadot/types/lookup';
-
-describe('integration test: add NFT resource', () => {
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-  const src = 'test-res-src';
-  const metadata = 'test-res-metadata';
-  const license = 'test-res-license';
-  const thumb = 'test-res-thumb';
-
-  const nonexistentId = 99999;
-
-  let api: any;
-  before(async function() {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  it('add resource', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-  });
-
-  it('add a resource to the nested NFT', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const parentNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
-
-    await sendNft(api, 'sent', Alice, collectionIdAlice, childNftId, newOwnerNFT);
-
-    await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      childNftId,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-  });
-
-  it('add multiple resources', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const baseId = 42;
-    const slotId = 10;
-    const parts = [0, 5, 2];
-
-    const resourcesInfo = [];
-    const resourceNum = 4;
-
-    const checkResource = async (resource: ResourceInfo, resType: string, expectedId: number, expected: {
-      src: string,
-      metadata: string,
-      license: string,
-      thumb: string
-    }) => {
-
-      // FIXME A workaround. It seems it is a PolkadotJS bug.
-      // All of the following are `false`.
-      //
-      // console.log('>>> basic:', resource.resource.isBasic);
-      // console.log('>>> composable:', resource.resource.isComposable);
-      // console.log('>>> slot:', resource.resource.isSlot);
-      const resourceJson = (resource.resource.toHuman() as any)[resType];
-
-      expect(resource.id.toNumber(), 'Error: Invalid resource Id')
-        .to.be.eq(expectedId);
-
-      expect(resourceJson.src, 'Error: Invalid resource src')
-        .to.be.eq(expected.src);
-      expect(resourceJson.metadata, 'Error: Invalid resource metadata')
-        .to.be.eq(expected.metadata);
-      expect(resourceJson.license, 'Error: Invalid resource license')
-        .to.be.eq(expected.license);
-      expect(resourceJson.thumb, 'Error: Invalid resource thumb')
-        .to.be.eq(expected.thumb);
-    };
-
-    for (let i = 0; i < resourceNum; i++) {
-      resourcesInfo.push({
-        src: src + 'r-' + i,
-        metadata: metadata + 'r-' + i,
-        license: license + 'r-' + i,
-        thumb: thumb + 'r-' + i,
-      });
-    }
-
-    const firstBasicResourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      resourcesInfo[0].src,
-      resourcesInfo[0].metadata,
-      resourcesInfo[0].license,
-      resourcesInfo[0].thumb,
-    );
-
-    const secondBasicResourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      resourcesInfo[1].src,
-      resourcesInfo[1].metadata,
-      resourcesInfo[1].license,
-      resourcesInfo[1].thumb,
-    );
-
-    const composableResourceId = await addNftComposableResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      parts,
-      baseId,
-      resourcesInfo[2].src,
-      resourcesInfo[2].metadata,
-      resourcesInfo[2].license,
-      resourcesInfo[2].thumb,
-    );
-
-    const slotResourceId = await addNftSlotResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      baseId,
-      slotId,
-      resourcesInfo[3].src,
-      resourcesInfo[3].metadata,
-      resourcesInfo[3].license,
-      resourcesInfo[3].thumb,
-    );
-
-    const firstResource = await getResourceById(api, collectionIdAlice, nftAlice, firstBasicResourceId);
-    await checkResource(firstResource, 'Basic', firstBasicResourceId, resourcesInfo[0]);
-
-    const secondResource = await getResourceById(api, collectionIdAlice, nftAlice, secondBasicResourceId);
-    await checkResource(secondResource, 'Basic', secondBasicResourceId, resourcesInfo[1]);
-
-    const composableResource = await getResourceById(api, collectionIdAlice, nftAlice, composableResourceId);
-    await checkResource(composableResource, 'Composable', composableResourceId, resourcesInfo[2]);
-
-    const slotResource = await getResourceById(api, collectionIdAlice, nftAlice, slotResourceId);
-    await checkResource(slotResource, 'Slot', slotResourceId, resourcesInfo[3]);
-  });
-
-  it('[negative]: unable to add a resource to the non-existing NFT', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const tx = addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nonexistentId,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-  
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative]: unable to add a resource by a not-an-owner user', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const tx = addNftBasicResource(
-      api,
-      Bob,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-  
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('[negative]: unable to add a resource to the nested NFT if it isnt root owned by the caller', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const parentNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
-
-    await sendNft(api, 'sent', Alice, collectionIdAlice, childNftId, newOwnerNFT);
-
-    const tx = addNftBasicResource(
-      api,
-      Bob,
-      'added',
-      collectionIdAlice,
-      childNftId,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-    
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('accept resource', async () => {
-    const collectionIdBob = await createCollection(
-      api,
-      Bob,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Bob,
-      Alice,
-      collectionIdBob,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Bob,
-      'pending',
-      collectionIdBob,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    await acceptNftResource(api, Alice, collectionIdBob, nftAlice, resourceId);
-  });
-
-  it('[negative]: unable to accept a non-existing resource', async () => {
-    const collectionIdBob = await createCollection(
-      api,
-      Bob,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Bob,
-      Alice,
-      collectionIdBob,
-      'nft-metadata',
-    );
-
-    const tx = acceptNftResource(api, Alice, collectionIdBob, nftAlice, nonexistentId);
-    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
-  });
-
-  it('[negative]: unable to accept a resource by a not-an-NFT-owner user', async () => {
-    const collectionIdBob = await createCollection(
-      api,
-      Bob,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Bob,
-      Alice,
-      collectionIdBob,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Bob,
-      'pending',
-      collectionIdBob,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const tx = acceptNftResource(api, Bob, collectionIdBob, nftAlice, resourceId);
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('[negative]: unable to accept a resource to a non-target NFT', async () => {
-    const collectionIdBob = await createCollection(
-      api,
-      Bob,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Bob,
-      Alice,
-      collectionIdBob,
-      'nft-metadata',
-    );
-
-    const wrongNft = await mintNft(
-      api,
-      Bob,
-      Alice,
-      collectionIdBob,
-      'nft-metadata',
-    );
-    
-    const resourceId = await addNftBasicResource(
-      api,
-      Bob,
-      'pending',
-      collectionIdBob,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const tx = acceptNftResource(api, Bob, collectionIdBob, wrongNft, resourceId);
-
-    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
-  });
-
-
-  after(() => {
-    after(async() => { await api.disconnect(); });
-  });
-});
addedtests/src/rmrk/addTheme.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/addTheme.seqtest.ts
@@ -0,0 +1,129 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {createBase, addTheme} from './util/tx';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {getThemeNames} from './util/fetch';
+
+describe('integration test: add Theme to Base', () => {
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkEquip]);
+  });
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  it('add default theme', async () => {
+    const baseId = await createBase(api, alice, 'default-themed-base', 'DTBase', []);
+    await addTheme(api, alice, baseId, {
+      name: 'default',
+      properties: [
+        {
+          key: 'some-key',
+          value: 'some-key-value',
+        },
+        {
+          key: 'another-key',
+          value: 'another-key-value',
+        },
+      ],
+    });
+  });
+
+  it('add default theme and a custom one', async () => {
+    const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []);
+    await addTheme(api, alice, baseId, {
+      name: 'default',
+      properties: [
+        {
+          key: 'default-key',
+          value: 'default-key-value',
+        },
+      ],
+    });
+    await addTheme(api, alice, baseId, {
+      name: 'custom-theme',
+      properties: [
+        {
+          key: 'custom-key-0',
+          value: 'custom-key-value-0',
+        },
+        {
+          key: 'custom-key-1',
+          value: 'custom-key-value-1',
+        },
+      ],
+    });
+  });
+
+  it('fetch filtered theme keys', async () => {
+    const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []);
+    await addTheme(api, alice, baseId, {
+      name: 'default',
+      properties: [
+        {
+          key: 'first-key',
+          value: 'first-key-value',
+        },
+        {
+          key: 'second-key',
+          value: 'second-key-value',
+        },
+      ],
+    }, ['second-key']);
+  });
+
+  it('fetch theme names', async() => {
+    const baseId = await createBase(api, alice, '3-themed-base', '3TBase', []);
+    const names = [
+      'default',
+      'first-theme',
+      'second-theme',
+    ];
+
+    for (let i = 0; i < names.length; i++) {
+      await addTheme(api, alice, baseId, {name: names[i], properties: [{key: 'dummy', value: 'dummy'}]});
+    }
+
+    const fetchedNames = await getThemeNames(api, baseId);
+
+    for (let i = 0; i < names.length; i++) {
+      const isFound = fetchedNames.find((name) => name === names[i]) !== undefined;
+
+      expect(isFound, 'Error: invalid theme names').to.be.true;
+    }
+  });
+
+  it('[negative] unable to add theme to non-existing base', async () => {
+    const maxBaseId = 0xFFFFFFFF;
+    const tx = addTheme(api, alice, maxBaseId, {
+      name: 'default',
+      properties: [],
+    });
+
+    await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx);
+  });
+
+  it('[negative] unable to add custom theme if no default theme', async () => {
+    const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []);
+    const tx = addTheme(api, alice, baseId, {
+      name: 'custom-theme',
+      properties: [],
+    });
+
+    await expectTxFailure(/rmrkEquip\.NeedsDefaultThemeFirst/, tx);
+  });
+
+  it('[negative] unable to add theme by a not-an-owner', async () => {
+    const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []);
+    const tx = addTheme(api, bob, baseId, {
+      name: 'default',
+      properties: [],
+    });
+
+    await expectTxFailure(/rmrkEquip\.PermissionError/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/addTheme.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/addTheme.test.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {createBase, addTheme} from './util/tx';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {getThemeNames} from './util/fetch';
-
-describe('integration test: add Theme to Base', () => {
-  let api: any;
-  before(async function() {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkEquip]);
-  });
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-
-  it('add default theme', async () => {
-    const baseId = await createBase(api, alice, 'default-themed-base', 'DTBase', []);
-    await addTheme(api, alice, baseId, {
-      name: 'default',
-      properties: [
-        {
-          key: 'some-key',
-          value: 'some-key-value',
-        },
-        {
-          key: 'another-key',
-          value: 'another-key-value',
-        },
-      ],
-    });
-  });
-
-  it('add default theme and a custom one', async () => {
-    const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []);
-    await addTheme(api, alice, baseId, {
-      name: 'default',
-      properties: [
-        {
-          key: 'default-key',
-          value: 'default-key-value',
-        },
-      ],
-    });
-    await addTheme(api, alice, baseId, {
-      name: 'custom-theme',
-      properties: [
-        {
-          key: 'custom-key-0',
-          value: 'custom-key-value-0',
-        },
-        {
-          key: 'custom-key-1',
-          value: 'custom-key-value-1',
-        },
-      ],
-    });
-  });
-
-  it('fetch filtered theme keys', async () => {
-    const baseId = await createBase(api, alice, '2-themed-base', '2TBase', []);
-    await addTheme(api, alice, baseId, {
-      name: 'default',
-      properties: [
-        {
-          key: 'first-key',
-          value: 'first-key-value',
-        },
-        {
-          key: 'second-key',
-          value: 'second-key-value',
-        },
-      ],
-    }, ['second-key']);
-  });
-
-  it('fetch theme names', async() => {
-    const baseId = await createBase(api, alice, '3-themed-base', '3TBase', []);
-    const names = [
-      'default',
-      'first-theme',
-      'second-theme',
-    ];
-
-    for (let i = 0; i < names.length; i++) {
-      await addTheme(api, alice, baseId, {name: names[i], properties: [{key: 'dummy', value: 'dummy'}]});
-    }
-
-    const fetchedNames = await getThemeNames(api, baseId);
-
-    for (let i = 0; i < names.length; i++) {
-      const isFound = fetchedNames.find((name) => name === names[i]) !== undefined;
-
-      expect(isFound, 'Error: invalid theme names').to.be.true;
-    }
-  });
-
-  it('[negative] unable to add theme to non-existing base', async () => {
-    const maxBaseId = 0xFFFFFFFF;
-    const tx = addTheme(api, alice, maxBaseId, {
-      name: 'default',
-      properties: [],
-    });
-
-    await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx);
-  });
-
-  it('[negative] unable to add custom theme if no default theme', async () => {
-    const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []);
-    const tx = addTheme(api, alice, baseId, {
-      name: 'custom-theme',
-      properties: [],
-    });
-
-    await expectTxFailure(/rmrkEquip\.NeedsDefaultThemeFirst/, tx);
-  });
-
-  it('[negative] unable to add theme by a not-an-owner', async () => {
-    const baseId = await createBase(api, alice, 'no-default-themed-base', 'NDTBase', []);
-    const tx = addTheme(api, bob, baseId, {
-      name: 'default',
-      properties: [],
-    });
-
-    await expectTxFailure(/rmrkEquip\.PermissionError/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/burnNft.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/burnNft.seqtest.ts
@@ -0,0 +1,170 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {NftIdTuple, getChildren} from './util/fetch';
+import {burnNft, createCollection, sendNft, mintNft} from './util/tx';
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+
+chai.use(chaiAsPromised);
+const expect = chai.expect;
+
+describe('integration test: burn nft', () => {
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+
+  it('burn nft', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      const nftId = await mintNft(
+        api,
+        alice,
+        alice,
+        collectionId,
+        'nft-metadata',
+      );
+      await burnNft(api, alice, collectionId, nftId);
+    });
+  });
+
+  it('burn nft with children', async () => {
+    const collectionId = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const parentNftId = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionId,
+      'nft-metadata',
+    );
+
+    const childNftId = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionId,
+      'nft-metadata',
+    );
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
+
+    const childrenBefore = await getChildren(api, collectionId, parentNftId);
+    expect(childrenBefore.length === 1, 'Error: parent NFT should have children')
+      .to.be.true;
+
+    const child = childrenBefore[0];
+    expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id')
+      .to.be.true;
+
+    expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id')
+      .to.be.true;
+
+    await burnNft(api, alice, collectionId, parentNftId);
+
+    const childrenAfter = await getChildren(api, collectionId, parentNftId);
+
+    expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true;
+  });
+
+  it('burn child nft', async () => {
+    const collectionId = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const parentNftId = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionId,
+      'nft-metadata',
+    );
+
+    const childNftId = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionId,
+      'nft-metadata',
+    );
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
+
+    const childrenBefore = await getChildren(api, collectionId, parentNftId);
+    expect(childrenBefore.length === 1, 'Error: parent NFT should have children')
+      .to.be.true;
+
+    const child = childrenBefore[0];
+    expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id')
+      .to.be.true;
+
+    expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id')
+      .to.be.true;
+
+    await burnNft(api, alice, collectionId, childNftId);
+
+    const childrenAfter = await getChildren(api, collectionId, parentNftId);
+
+    expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true;
+  });
+
+  it('[negative] burn non-existing NFT', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      const tx = burnNft(api, alice, collectionId, 99999);
+      await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+    });
+  });
+
+  it('[negative] burn not an owner NFT user', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      const nftId = await mintNft(
+        api,
+        alice,
+        alice,
+        collectionId,
+        'nft-metadata',
+      );
+      const tx = burnNft(api, bob, collectionId, nftId);
+      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+    });
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/burnNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/burnNft.test.ts
+++ /dev/null
@@ -1,170 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {NftIdTuple, getChildren} from './util/fetch';
-import {burnNft, createCollection, sendNft, mintNft} from './util/tx';
-
-import chai from 'chai';
-import chaiAsPromised from 'chai-as-promised';
-
-chai.use(chaiAsPromised);
-const expect = chai.expect;
-
-describe('integration test: burn nft', () => {
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-
-  let api: any;
-  before(async function() {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-
-  it('burn nft', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      const nftId = await mintNft(
-        api,
-        Alice,
-        Alice,
-        collectionId,
-        'nft-metadata',
-      );
-      await burnNft(api, Alice, collectionId, nftId);
-    });
-  });
-
-  it('burn nft with children', async () => {
-    const collectionId = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const parentNftId = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionId,
-      'nft-metadata',
-    );
-
-    const childNftId = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionId,
-      'nft-metadata',
-    );
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', Alice, collectionId, childNftId, newOwnerNFT);
-
-    const childrenBefore = await getChildren(api, collectionId, parentNftId);
-    expect(childrenBefore.length === 1, 'Error: parent NFT should have children')
-      .to.be.true;
-
-    const child = childrenBefore[0];
-    expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id')
-      .to.be.true;
-
-    expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id')
-      .to.be.true;
-
-    await burnNft(api, Alice, collectionId, parentNftId);
-
-    const childrenAfter = await getChildren(api, collectionId, parentNftId);
-
-    expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true;
-  });
-
-  it('burn child nft', async () => {
-    const collectionId = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const parentNftId = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionId,
-      'nft-metadata',
-    );
-
-    const childNftId = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionId,
-      'nft-metadata',
-    );
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', Alice, collectionId, childNftId, newOwnerNFT);
-
-    const childrenBefore = await getChildren(api, collectionId, parentNftId);
-    expect(childrenBefore.length === 1, 'Error: parent NFT should have children')
-      .to.be.true;
-
-    const child = childrenBefore[0];
-    expect(child.collectionId.eq(collectionId), 'Error: invalid child collection Id')
-      .to.be.true;
-
-    expect(child.nftId.eq(childNftId), 'Error: invalid child NFT Id')
-      .to.be.true;
-
-    await burnNft(api, Alice, collectionId, childNftId);
-
-    const childrenAfter = await getChildren(api, collectionId, parentNftId);
-
-    expect(childrenAfter.length === 0, 'Error: children should be burned').to.be.true;
-  });
-
-  it('[negative] burn non-existing NFT', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      const tx = burnNft(api, Alice, collectionId, 99999);
-      await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-    });
-  });
-
-  it('[negative] burn not an owner NFT user', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      const nftId = await mintNft(
-        api,
-        Alice,
-        Alice,
-        collectionId,
-        'nft-metadata',
-      );
-      const tx = burnNft(api, Bob, collectionId, nftId);
-      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-    });
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/changeCollectionIssuer.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/changeCollectionIssuer.seqtest.ts
@@ -0,0 +1,53 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {
+  changeIssuer,
+  createCollection,
+} from './util/tx';
+
+describe('integration test: collection issuer', () => {
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+
+
+  it('change collection issuer', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      await changeIssuer(api, alice, collectionId, bob);
+    });
+  });
+
+  it('[negative] change not an owner NFT collection issuer', async () => {
+    await createCollection(api, bob, 'test-metadata', null, 'test-symbol').then(async (collectionId) => {
+      const tx = changeIssuer(api, alice, collectionId, bob);
+      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+    });
+  });
+
+  it('[negative] change non-existigit NFT collection issuer', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async () => {
+      const tx = changeIssuer(api, alice, 99999, bob);
+      await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
+    });
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/changeCollectionIssuer.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/changeCollectionIssuer.test.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {
-  changeIssuer,
-  createCollection,
-} from './util/tx';
-
-describe('integration test: collection issuer', () => {
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-
-  let api: any;
-  before(async function() {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-
-
-  it('change collection issuer', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      await changeIssuer(api, Alice, collectionId, Bob);
-    });
-  });
-
-  it('[negative] change not an owner NFT collection issuer', async () => {
-    await createCollection(api, Bob, 'test-metadata', null, 'test-symbol').then(async (collectionId) => {
-      const tx = changeIssuer(api, Alice, collectionId, Bob);
-      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-    });
-  });
-
-  it('[negative] change non-existigit NFT collection issuer', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async () => {
-      const tx = changeIssuer(api, Alice, 99999, Bob);
-      await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
-    });
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/createBase.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/createBase.seqtest.ts
@@ -0,0 +1,88 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {requirePallets, Pallets} from './util/helpers';
+import {createCollection, createBase} from './util/tx';
+
+describe('integration test: create new Base', () => {
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]);
+  });
+
+  const alice = '//Alice';
+
+  it('create empty Base', async () => {
+    await createBase(api, alice, 'empty-base-type', 'EBase', []);
+  });
+
+  it('create Base with fixed part', async () => {
+    await createBase(api, alice, 'fixedpart-base-type', 'FPBase', [
+      {
+        'FixedPart': {
+          id: 42,
+          z: 0,
+          src: 'some-fixed-url',
+        },
+      },
+    ]);
+  });
+
+  it('create Base with slot part (no collection)', async () => {
+    await createBase(api, alice, 'slotpart-base-type', 'SPBase', [
+      {
+        'SlotPart': {
+          id: 112,
+          equippable: 'Empty',
+          z: 0,
+          src: 'some-fallback-slot-url',
+        },
+      },
+    ]);
+  });
+
+  it('create Base with slot part (any collection)', async () => {
+    await createBase(api, alice, 'slotpartany-base-type', 'SPABase', [
+      {
+        'SlotPart': {
+          id: 222,
+          equippable: 'All',
+          z: 1,
+          src: 'some-fallback-slot-url',
+        },
+      },
+    ]);
+  });
+
+  it('create Base with slot part (custom collections)', async () => {
+    const firstCollectionId = await createCollection(
+      api,
+      alice,
+      'first-collection-meta',
+      null,
+      'first-collection',
+    );
+
+    const secondCollectionId = await createCollection(
+      api,
+      alice,
+      'first-collection-meta',
+      null,
+      'first-collection',
+    );
+
+    await createBase(api, alice, 'slotpartcustom-base-type', 'SPCBase', [
+      {
+        'SlotPart': {
+          id: 1024,
+          equippable: {
+            'Custom': [firstCollectionId, secondCollectionId],
+          },
+          z: 2,
+          src: 'some-fallback-slot-url',
+        },
+      },
+    ]);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/createBase.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/createBase.test.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from './util/helpers';
-import {createCollection, createBase} from './util/tx';
-
-describe('integration test: create new Base', () => {
-  let api: any;
-  before(async function() {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]);
-  });
-
-  const alice = '//Alice';
-
-  it('create empty Base', async () => {
-    await createBase(api, alice, 'empty-base-type', 'EBase', []);
-  });
-
-  it('create Base with fixed part', async () => {
-    await createBase(api, alice, 'fixedpart-base-type', 'FPBase', [
-      {
-        'FixedPart': {
-          id: 42,
-          z: 0,
-          src: 'some-fixed-url',
-        },
-      },
-    ]);
-  });
-
-  it('create Base with slot part (no collection)', async () => {
-    await createBase(api, alice, 'slotpart-base-type', 'SPBase', [
-      {
-        'SlotPart': {
-          id: 112,
-          equippable: 'Empty',
-          z: 0,
-          src: 'some-fallback-slot-url',
-        },
-      },
-    ]);
-  });
-
-  it('create Base with slot part (any collection)', async () => {
-    await createBase(api, alice, 'slotpartany-base-type', 'SPABase', [
-      {
-        'SlotPart': {
-          id: 222,
-          equippable: 'All',
-          z: 1,
-          src: 'some-fallback-slot-url',
-        },
-      },
-    ]);
-  });
-
-  it('create Base with slot part (custom collections)', async () => {
-    const firstCollectionId = await createCollection(
-      api,
-      alice,
-      'first-collection-meta',
-      null,
-      'first-collection',
-    );
-
-    const secondCollectionId = await createCollection(
-      api,
-      alice,
-      'first-collection-meta',
-      null,
-      'first-collection',
-    );
-
-    await createBase(api, alice, 'slotpartcustom-base-type', 'SPCBase', [
-      {
-        'SlotPart': {
-          id: 1024,
-          equippable: {
-            'Custom': [firstCollectionId, secondCollectionId],
-          },
-          z: 2,
-          src: 'some-fallback-slot-url',
-        },
-      },
-    ]);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/createCollection.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/createCollection.seqtest.ts
@@ -0,0 +1,25 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {requirePallets, Pallets} from './util/helpers';
+import {createCollection} from './util/tx';
+
+describe('Integration test: create new collection', () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+
+
+  const alice = '//Alice';
+
+  it('create NFT collection', async () => {
+    await createCollection(api, alice, 'test-metadata', 42, 'test-symbol');
+  });
+
+  it('create NFT collection without token limit', async () => {
+    await createCollection(api, alice, 'no-limit-metadata', null, 'no-limit-symbol');
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/createCollection.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/createCollection.test.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from './util/helpers';
-import {createCollection} from './util/tx';
-
-describe('Integration test: create new collection', () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-
-
-  const alice = '//Alice';
-
-  it('create NFT collection', async () => {
-    await createCollection(api, alice, 'test-metadata', 42, 'test-symbol');
-  });
-
-  it('create NFT collection without token limit', async () => {
-    await createCollection(api, alice, 'no-limit-metadata', null, 'no-limit-symbol');
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/deleteCollection.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/deleteCollection.seqtest.ts
@@ -0,0 +1,46 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {createCollection, deleteCollection} from './util/tx';
+
+describe('integration test: delete collection', () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  it('delete NFT collection', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      await deleteCollection(api, alice, collectionId.toString());
+    });
+  });
+
+  it('[negative] delete non-existing NFT collection', async () => {
+    const tx = deleteCollection(api, alice, '99999');
+    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
+  });
+
+  it('[negative] delete not an owner NFT collection', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      const tx = deleteCollection(api, bob, collectionId.toString());
+      await expectTxFailure(/rmrkCore.NoPermission/, tx);
+    });
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/deleteCollection.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/deleteCollection.test.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {createCollection, deleteCollection} from './util/tx';
-
-describe('integration test: delete collection', () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-
-  it('delete NFT collection', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      await deleteCollection(api, Alice, collectionId.toString());
-    });
-  });
-
-  it('[negative] delete non-existing NFT collection', async () => {
-    const tx = deleteCollection(api, Alice, '99999');
-    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
-  });
-
-  it('[negative] delete not an owner NFT collection', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      const tx = deleteCollection(api, Bob, collectionId.toString());
-      await expectTxFailure(/rmrkCore.NoPermission/, tx);
-    });
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/equipNft.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/equipNft.seqtest.ts
@@ -0,0 +1,340 @@
+import {ApiPromise} from '@polkadot/api';
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {getNft, NftIdTuple} from './util/fetch';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {
+  addNftComposableResource,
+  addNftSlotResource,
+  createBase,
+  createCollection,
+  equipNft,
+  mintNft,
+  sendNft,
+  unequipNft,
+} from './util/tx';
+
+const alice = '//Alice';
+const bob = '//Bob';
+
+const composableParts: number[] = [5, 2, 7];
+const composableSrc = 'test-cmp-src';
+const composableMetadata = 'test-cmp-metadata';
+const composableLicense = 'test-comp-license';
+const composableThumb = 'test-comp-thumb';
+
+const slotSrc = 'test-slot-src';
+const slotLicense = 'test-slot-license';
+const slotMetadata = 'test-slot-metadata';
+const slotThumb = 'test-slot-thumb';
+
+const slotId = 1;
+
+async function createTestCollection(api: ApiPromise): Promise<number> {
+  return createCollection(
+    api,
+    alice,
+    'test-metadata',
+    null,
+    'test-symbol',
+  );
+}
+
+async function mintTestNft(api: ApiPromise, collectionId: number): Promise<number> {
+  return await mintNft(
+    api,
+    alice,
+    alice,
+    collectionId,
+    'nft-metadata',
+  );
+}
+
+async function mintChildNft(api: ApiPromise, collectionId: number, parentNftId: number): Promise<number> {
+  const nftChildId = await mintTestNft(api, collectionId);
+
+  const parentNFT: NftIdTuple = [collectionId, parentNftId];
+
+  await sendNft(api, 'sent', alice, collectionId, nftChildId, parentNFT);
+
+  return nftChildId;
+}
+
+async function createTestBase(api: ApiPromise): Promise<number> {
+  return createBase(api, alice, 'test-base', 'DTBase', [
+    {
+      SlotPart: {
+        id: slotId,
+        equippable: 'All',
+        z: 1,
+        src: slotSrc,
+      },
+    },
+  ]);
+}
+
+async function addTestComposable(api: ApiPromise, collectionId: number, nftId: number, baseId: number) {
+  await addNftComposableResource(
+    api,
+    alice,
+    'added',
+    collectionId,
+    nftId,
+    composableParts,
+    baseId,
+    composableSrc,
+    composableMetadata,
+    composableLicense,
+    composableThumb,
+  );
+}
+
+async function addTestSlot(api: ApiPromise, collectionId: number, nftId: number, baseId: number, slotId: number): Promise<number> {
+  return await addNftSlotResource(
+    api,
+    alice,
+    'added',
+    collectionId,
+    nftId,
+    baseId,
+    slotId,
+    slotSrc,
+    slotMetadata,
+    slotLicense,
+    slotThumb,
+  );
+}
+
+async function checkEquipStatus(
+  api: ApiPromise,
+  expectedStatus: 'equipped' | 'unequipped',
+  collectionId: number,
+  nftId: number,
+) {
+  const itemNftDataOpt = await getNft(api, collectionId, nftId);
+  expect(itemNftDataOpt.isSome, 'Error: unable to fetch item NFT data');
+
+  const itemNftData = itemNftDataOpt.unwrap();
+  expect(itemNftData.equipped.isTrue, `Error: item NFT should be ${expectedStatus}`)
+    .to.be.equal(expectedStatus === 'equipped');
+}
+
+describe.skip('integration test: Equip NFT', () => {
+
+  let api: any;
+  
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]);
+  });
+
+  it('equip nft', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    await equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
+
+    await checkEquipStatus(api, 'equipped', collectionId, nftChildId);
+  });
+
+  it('unequip nft', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    await equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
+
+    await checkEquipStatus(api, 'equipped', collectionId, nftChildId);
+
+    await unequipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
+    await checkEquipStatus(api, 'unequipped', collectionId, nftChildId);
+  });
+
+  it('[negative] equip NFT onto non-existing NFT', async () => {
+    const collectionId = await createTestCollection(api);
+
+    const nftChildId = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionId,
+      'nft-metadata',
+    );
+
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+    const invalidEquipperNFT: NftIdTuple = [collectionId, 9999999];
+
+    const baseId = 0;
+    const resourceId = 0;
+
+    const tx = equipNft(api, alice, itemNFT, invalidEquipperNFT, resourceId, baseId, slotId);
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative] equip non-existing NFT', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionId,
+      'nft-metadata',
+    );
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const invalidItemNFT: NftIdTuple = [collectionId, 99999999];
+
+    const resourceId = 0;
+
+    const tx = equipNft(api, alice, invalidItemNFT, equipperNFT, resourceId, baseId, slotId);
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative] equip NFT by a not-an-owner user', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const tx = equipNft(api, bob, itemNFT, equipperNFT, resourceId, baseId, slotId);
+    await expectTxFailure(/rmrkEquip\.PermissionError/, tx);
+  });
+
+  it('[negative] unable to equip NFT onto indirect parent NFT', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+    const nftGrandchildId = await mintChildNft(api, collectionId, nftChildId);
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftGrandchildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftGrandchildId];
+
+    const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
+    await expectTxFailure(/rmrkEquip\.MustBeDirectParent/, tx);
+  });
+
+  it('[negative] unable to equip NFT onto parent NFT with another base', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    const invalidBaseId = 99999;
+
+    const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, invalidBaseId, slotId);
+    await expectTxFailure(/rmrkEquip\.NoResourceForThisBaseFoundOnNft/, tx);
+  });
+
+  it('[negative] unable to equip NFT into slot with another id', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createTestBase(api);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    const incorrectSlotId = slotId + 1;
+    const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, incorrectSlotId);
+    await expectTxFailure(/rmrkEquip\.ItemHasNoResourceToEquipThere/, tx);
+  });
+
+  it('[negative] unable to equip NFT with incorrect slot (fixed part)', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createBase(api, alice, 'test-base', 'DTBase', [
+      {
+        FixedPart: {
+          id: slotId,
+          equippable: 'All',
+          z: 1,
+          src: slotSrc,
+        },
+      },
+    ]);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
+    await expectTxFailure(/rmrkEquip\.CantEquipFixedPart/, tx);
+  });
+
+  it('[negative] unable to equip NFT from a collection that is not allowed by the slot', async () => {
+    const collectionId = await createTestCollection(api);
+    const nftParentId = await mintTestNft(api, collectionId);
+    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
+
+    const baseId = await createBase(api, alice, 'test-base', 'DTBase', [
+      {
+        SlotPart: {
+          id: 1,
+          z: 1,
+          equippable: 'Empty',
+          src: slotSrc,
+        },
+      },
+    ]);
+
+    await addTestComposable(api, collectionId, nftParentId, baseId);
+    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
+
+    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
+    const itemNFT: NftIdTuple = [collectionId, nftChildId];
+
+    const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
+    await expectTxFailure(/rmrkEquip\.CollectionNotEquippable/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/equipNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/equipNft.test.ts
+++ /dev/null
@@ -1,340 +0,0 @@
-import {ApiPromise} from '@polkadot/api';
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {getNft, getParts, NftIdTuple} from './util/fetch';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {
-  addNftComposableResource,
-  addNftSlotResource,
-  createBase,
-  createCollection,
-  equipNft,
-  mintNft,
-  sendNft,
-  unequipNft,
-} from './util/tx';
-
-const Alice = '//Alice';
-const Bob = '//Bob';
-
-const composableParts: number[] = [5, 2, 7];
-const composableSrc = 'test-cmp-src';
-const composableMetadata = 'test-cmp-metadata';
-const composableLicense = 'test-comp-license';
-const composableThumb = 'test-comp-thumb';
-
-const slotSrc = 'test-slot-src';
-const slotLicense = 'test-slot-license';
-const slotMetadata = 'test-slot-metadata';
-const slotThumb = 'test-slot-thumb';
-
-const slotId = 1;
-
-async function createTestCollection(api: ApiPromise): Promise<number> {
-  return createCollection(
-    api,
-    Alice,
-    'test-metadata',
-    null,
-    'test-symbol',
-  );
-}
-
-async function mintTestNft(api: ApiPromise, collectionId: number): Promise<number> {
-  return await mintNft(
-    api,
-    Alice,
-    Alice,
-    collectionId,
-    'nft-metadata',
-  );
-}
-
-async function mintChildNft(api: ApiPromise, collectionId: number, parentNftId: number): Promise<number> {
-  const nftChildId = await mintTestNft(api, collectionId);
-
-  const parentNFT: NftIdTuple = [collectionId, parentNftId];
-
-  await sendNft(api, 'sent', Alice, collectionId, nftChildId, parentNFT);
-
-  return nftChildId;
-}
-
-async function createTestBase(api: ApiPromise): Promise<number> {
-  return createBase(api, Alice, 'test-base', 'DTBase', [
-    {
-      SlotPart: {
-        id: slotId,
-        equippable: 'All',
-        z: 1,
-        src: slotSrc,
-      },
-    },
-  ]);
-}
-
-async function addTestComposable(api: ApiPromise, collectionId: number, nftId: number, baseId: number) {
-  await addNftComposableResource(
-    api,
-    Alice,
-    'added',
-    collectionId,
-    nftId,
-    composableParts,
-    baseId,
-    composableSrc,
-    composableMetadata,
-    composableLicense,
-    composableThumb,
-  );
-}
-
-async function addTestSlot(api: ApiPromise, collectionId: number, nftId: number, baseId: number, slotId: number): Promise<number> {
-  return await addNftSlotResource(
-    api,
-    Alice,
-    'added',
-    collectionId,
-    nftId,
-    baseId,
-    slotId,
-    slotSrc,
-    slotMetadata,
-    slotLicense,
-    slotThumb,
-  );
-}
-
-async function checkEquipStatus(
-  api: ApiPromise,
-  expectedStatus: 'equipped' | 'unequipped',
-  collectionId: number,
-  nftId: number,
-) {
-  const itemNftDataOpt = await getNft(api, collectionId, nftId);
-  expect(itemNftDataOpt.isSome, 'Error: unable to fetch item NFT data');
-
-  const itemNftData = itemNftDataOpt.unwrap();
-  expect(itemNftData.equipped.isTrue, `Error: item NFT should be ${expectedStatus}`)
-    .to.be.equal(expectedStatus === 'equipped');
-}
-
-describe.skip('integration test: Equip NFT', () => {
-
-  let api: any;
-  
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]);
-  });
-
-  it('equip nft', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    await equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
-
-    await checkEquipStatus(api, 'equipped', collectionId, nftChildId);
-  });
-
-  it('unequip nft', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    await equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
-
-    await checkEquipStatus(api, 'equipped', collectionId, nftChildId);
-
-    await unequipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
-    await checkEquipStatus(api, 'unequipped', collectionId, nftChildId);
-  });
-
-  it('[negative] equip NFT onto non-existing NFT', async () => {
-    const collectionId = await createTestCollection(api);
-
-    const nftChildId = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionId,
-      'nft-metadata',
-    );
-
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-    const invalidEquipperNFT: NftIdTuple = [collectionId, 9999999];
-
-    const baseId = 0;
-    const resourceId = 0;
-
-    const tx = equipNft(api, Alice, itemNFT, invalidEquipperNFT, resourceId, baseId, slotId);
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative] equip non-existing NFT', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionId,
-      'nft-metadata',
-    );
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const invalidItemNFT: NftIdTuple = [collectionId, 99999999];
-
-    const resourceId = 0;
-
-    const tx = equipNft(api, Alice, invalidItemNFT, equipperNFT, resourceId, baseId, slotId);
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative] equip NFT by a not-an-owner user', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const tx = equipNft(api, Bob, itemNFT, equipperNFT, resourceId, baseId, slotId);
-    await expectTxFailure(/rmrkEquip\.PermissionError/, tx);
-  });
-
-  it('[negative] unable to equip NFT onto indirect parent NFT', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-    const nftGrandchildId = await mintChildNft(api, collectionId, nftChildId);
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftGrandchildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftGrandchildId];
-
-    const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
-    await expectTxFailure(/rmrkEquip\.MustBeDirectParent/, tx);
-  });
-
-  it('[negative] unable to equip NFT onto parent NFT with another base', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    const invalidBaseId = 99999;
-
-    const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, invalidBaseId, slotId);
-    await expectTxFailure(/rmrkEquip\.NoResourceForThisBaseFoundOnNft/, tx);
-  });
-
-  it('[negative] unable to equip NFT into slot with another id', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createTestBase(api);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    const incorrectSlotId = slotId + 1;
-    const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, incorrectSlotId);
-    await expectTxFailure(/rmrkEquip\.ItemHasNoResourceToEquipThere/, tx);
-  });
-
-  it('[negative] unable to equip NFT with incorrect slot (fixed part)', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createBase(api, Alice, 'test-base', 'DTBase', [
-      {
-        FixedPart: {
-          id: slotId,
-          equippable: 'All',
-          z: 1,
-          src: slotSrc,
-        },
-      },
-    ]);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
-    await expectTxFailure(/rmrkEquip\.CantEquipFixedPart/, tx);
-  });
-
-  it('[negative] unable to equip NFT from a collection that is not allowed by the slot', async () => {
-    const collectionId = await createTestCollection(api);
-    const nftParentId = await mintTestNft(api, collectionId);
-    const nftChildId = await mintChildNft(api, collectionId, nftParentId);
-
-    const baseId = await createBase(api, Alice, 'test-base', 'DTBase', [
-      {
-        SlotPart: {
-          id: 1,
-          z: 1,
-          equippable: 'Empty',
-          src: slotSrc,
-        },
-      },
-    ]);
-
-    await addTestComposable(api, collectionId, nftParentId, baseId);
-    const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);
-
-    const equipperNFT: NftIdTuple = [collectionId, nftParentId];
-    const itemNFT: NftIdTuple = [collectionId, nftChildId];
-
-    const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);
-    await expectTxFailure(/rmrkEquip\.CollectionNotEquippable/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/getOwnedNfts.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/getOwnedNfts.seqtest.ts
@@ -0,0 +1,80 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {requirePallets, Pallets} from './util/helpers';
+import {getOwnedNfts} from './util/fetch';
+import {mintNft, createCollection} from './util/tx';
+
+describe('integration test: get owned NFTs', () => {
+  let api: any;
+  
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+
+  const alice = '//Alice';
+
+  it('fetch all NFTs owned by a user', async () => {
+    const owner = alice;
+    const collectionMetadata = 'aliceCollectionMetadata';
+    const collectionMax = null;
+    const collectionSymbol = 'AliceSym';
+    const recipientUri = null;
+    const royalty = null;
+    const nftMetadata = 'alice-NFT-metadata';
+
+    const collectionId = await createCollection(
+      api,
+      alice,
+      collectionMetadata,
+      collectionMax,
+      collectionSymbol,
+    );
+
+    const nftIds = [
+      await mintNft(
+        api,
+        alice,
+        owner,
+        collectionId,
+        nftMetadata + '-0',
+        recipientUri,
+        royalty,
+      ),
+      await mintNft(
+        api,
+        alice,
+        owner,
+        collectionId,
+        nftMetadata + '-1',
+        recipientUri,
+        royalty,
+      ),
+      await mintNft(
+        api,
+        alice,
+        owner,
+        collectionId,
+        nftMetadata + '-2',
+        recipientUri,
+        royalty,
+      ),
+    ];
+
+    const ownedNfts = await getOwnedNfts(api, alice, collectionId);
+
+    const isFound = (nftId: number) => {
+      return ownedNfts.find((ownedNftId) => {
+        return ownedNftId === nftId;
+      }) !== undefined;
+    };
+
+    nftIds.forEach((nftId) => {
+      expect(isFound(nftId), `NFT ${nftId} should be owned by ${alice}`)
+        .to.be.true;
+    });
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/getOwnedNfts.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/getOwnedNfts.test.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {requirePallets, Pallets} from './util/helpers';
-import {getOwnedNfts} from './util/fetch';
-import {mintNft, createCollection} from './util/tx';
-
-describe('integration test: get owned NFTs', () => {
-  let api: any;
-  
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-
-  const alice = '//Alice';
-
-  it('fetch all NFTs owned by a user', async () => {
-    const owner = alice;
-    const collectionMetadata = 'aliceCollectionMetadata';
-    const collectionMax = null;
-    const collectionSymbol = 'AliceSym';
-    const recipientUri = null;
-    const royalty = null;
-    const nftMetadata = 'alice-NFT-metadata';
-
-    const collectionId = await createCollection(
-      api,
-      alice,
-      collectionMetadata,
-      collectionMax,
-      collectionSymbol,
-    );
-
-    const nftIds = [
-      await mintNft(
-        api,
-        alice,
-        owner,
-        collectionId,
-        nftMetadata + '-0',
-        recipientUri,
-        royalty,
-      ),
-      await mintNft(
-        api,
-        alice,
-        owner,
-        collectionId,
-        nftMetadata + '-1',
-        recipientUri,
-        royalty,
-      ),
-      await mintNft(
-        api,
-        alice,
-        owner,
-        collectionId,
-        nftMetadata + '-2',
-        recipientUri,
-        royalty,
-      ),
-    ];
-
-    const ownedNfts = await getOwnedNfts(api, alice, collectionId);
-
-    const isFound = (nftId: number) => {
-      return ownedNfts.find((ownedNftId) => {
-        return ownedNftId === nftId;
-      }) !== undefined;
-    };
-
-    nftIds.forEach((nftId) => {
-      expect(isFound(nftId), `NFT ${nftId} should be owned by ${alice}`)
-        .to.be.true;
-    });
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/lockCollection.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/lockCollection.seqtest.ts
@@ -0,0 +1,116 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {createCollection, lockCollection, mintNft} from './util/tx';
+
+describe('integration test: lock collection', () => {
+  const alice = '//Alice';
+  const bob = '//Bob';
+  const max = 5;
+
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  it('lock collection', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      await lockCollection(api, alice, collectionId);
+    });
+  });
+
+  it('[negative] lock non-existing NFT collection', async () => {
+    const tx = lockCollection(api, alice, 99999);
+    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
+  });
+
+  it('[negative] lock not an owner NFT collection issuer', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      const tx = lockCollection(api, bob, collectionId);
+      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+    });
+  });
+
+  it('lock collection with minting', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      max,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      for (let i = 0; i < 5; i++) {
+        await mintNft(
+          api,
+          alice,
+          alice,
+          collectionId,
+          'test-metadata',
+          null,
+          null,
+        );
+      }
+      await lockCollection(api, alice, collectionId, max);
+    });
+  });
+
+  it('[negative] unable to mint NFT inside a locked collection', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      max,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      await lockCollection(api, alice, collectionId);
+      const tx = mintNft(
+        api,
+        alice,
+        alice,
+        collectionId,
+        'test-metadata',
+        null,
+        null,
+      );
+      await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx);
+    });
+  });
+
+  it('[negative] unable to mint NFT inside a full collection', async () => {
+    await createCollection(api, alice, 'test-metadata', 1, 'test-symbol').then(async (collectionId) => {
+      await mintNft(
+        api,
+        alice,
+        alice,
+        collectionId,
+        'test-metadata',
+        null,
+        null,
+      );
+      const tx = mintNft(
+        api,
+        alice,
+        alice,
+        collectionId,
+        'test-metadata',
+        null,
+        null,
+      );
+      await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx);
+    });
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/lockCollection.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/lockCollection.test.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {createCollection, lockCollection, mintNft} from './util/tx';
-
-describe('integration test: lock collection', () => {
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-  const Max = 5;
-
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  it('lock collection', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      await lockCollection(api, Alice, collectionId);
-    });
-  });
-
-  it('[negative] lock non-existing NFT collection', async () => {
-    const tx = lockCollection(api, Alice, 99999);
-    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
-  });
-
-  it('[negative] lock not an owner NFT collection issuer', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      const tx = lockCollection(api, Bob, collectionId);
-      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-    });
-  });
-
-  it('lock collection with minting', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      Max,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      for (let i = 0; i < 5; i++) {
-        await mintNft(
-          api,
-          Alice,
-          Alice,
-          collectionId,
-          'test-metadata',
-          null,
-          null,
-        );
-      }
-      await lockCollection(api, Alice, collectionId, Max);
-    });
-  });
-
-  it('[negative] unable to mint NFT inside a locked collection', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      Max,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      await lockCollection(api, Alice, collectionId);
-      const tx = mintNft(
-        api,
-        Alice,
-        Alice,
-        collectionId,
-        'test-metadata',
-        null,
-        null,
-      );
-      await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx);
-    });
-  });
-
-  it('[negative] unable to mint NFT inside a full collection', async () => {
-    await createCollection(api, Alice, 'test-metadata', 1, 'test-symbol').then(async (collectionId) => {
-      await mintNft(
-        api,
-        Alice,
-        Alice,
-        collectionId,
-        'test-metadata',
-        null,
-        null,
-      );
-      const tx = mintNft(
-        api,
-        Alice,
-        Alice,
-        collectionId,
-        'test-metadata',
-        null,
-        null,
-      );
-      await expectTxFailure(/rmrkCore\.CollectionFullOrLocked/, tx);
-    });
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/mintNft.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/mintNft.seqtest.ts
@@ -0,0 +1,211 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {getNft} from './util/fetch';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {createCollection, mintNft} from './util/tx';
+
+describe('integration test: mint new NFT', () => {
+  let api: any;
+ 
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+  const maxCollectionId = 0xFFFFFFFF;
+  const maxNftId = 0xFFFFFFFF;
+
+  it('mint NFT', async () => {
+    const owner = null;
+    const collectionMetadata = 'mintingCollectionMetadata';
+    const collectionMax = null;
+    const collectionSymbol = 'MCS';
+    const recipientUri = null;
+    const royalty = null;
+    const nftMetadata = 'NFT-test-metadata';
+
+    const collectionId = await createCollection(
+      api,
+      alice,
+      collectionMetadata,
+      collectionMax,
+      collectionSymbol,
+    );
+
+    await mintNft(
+      api,
+      alice,
+      owner,
+      collectionId,
+      nftMetadata,
+      recipientUri,
+      royalty,
+    );
+  });
+
+  it('mint NFT and set another owner', async () => {
+    const owner = bob;
+    const collectionMetadata = 'setOwnerCollectionMetadata';
+    const collectionMax = null;
+    const collectionSymbol = 'SOCS';
+    const recipientUri = null;
+    const royalty = null;
+    const nftMetadata = 'setOwner-NFT-metadata';
+
+    const collectionId = await createCollection(
+      api,
+      alice,
+      collectionMetadata,
+      collectionMax,
+      collectionSymbol,
+    );
+
+    await mintNft(
+      api,
+      alice,
+      owner,
+      collectionId,
+      nftMetadata,
+      recipientUri,
+      royalty,
+    );
+  });
+
+  it('mint NFT with recipient and roalty', async () => {
+    const owner = alice;
+    const collectionMetadata = 'mintingCollectionMetadata';
+    const collectionMax = null;
+    const collectionSymbol = 'MCS';
+    const recipientUri = bob;
+    const royalty = 70000;
+    const nftMetadata = 'recipient-royalty-NFT-test-metadata';
+
+    const collectionId = await createCollection(
+      api,
+      alice,
+      collectionMetadata,
+      collectionMax,
+      collectionSymbol,
+    );
+
+    await mintNft(
+      api,
+      alice,
+      owner,
+      collectionId,
+      nftMetadata,
+      recipientUri,
+      royalty,
+    );
+  });
+
+  it('mint NFT with resources', async () => {
+    const owner = alice;
+    const collectionMetadata = 'mintingCollectionMetadata';
+    const collectionMax = null;
+    const collectionSymbol = 'MCS';
+    const nftMetadata = 'NFT-with-resources-test-metadata';
+    const resources = [
+      {
+        basic: {
+          metadata: 'basic-resource-nft-minting',
+        },
+      }, {
+        slot: {
+          metadata: 'slot-resource-nft-minting',
+          slot: 9,
+        },
+      }, {
+        composable: {
+          metadata: 'composable-resource-nft-minting',
+          parts: [0, 5, 2],
+        },
+      }, {
+        slot: {
+          metadata: 'slot-resource-nft-minting-2',
+          thumb: 'srnm2',
+          base: 5,
+        },
+      },
+    ];
+
+    const collectionId = await createCollection(
+      api,
+      alice,
+      collectionMetadata,
+      collectionMax,
+      collectionSymbol,
+    );
+
+    await mintNft(
+      api,
+      alice,
+      owner,
+      collectionId,
+      nftMetadata,
+      null,
+      null,
+      true,
+      resources,
+    );
+  });
+
+  it('[negative] unable to mint NFT within non-existing collection', async () => {
+    const owner = alice;
+    const recipientUri = null;
+    const royalty = null;
+    const nftMetadata = 'NFT-test-metadata';
+
+    const tx = mintNft(
+      api,
+      alice,
+      owner,
+      maxCollectionId,
+      nftMetadata,
+      recipientUri,
+      royalty,
+    );
+
+    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
+  });
+
+  it("[negative] unable to mint NFT by a user that isn't the owner of the collection", async () => {
+    const owner = alice;
+    const collectionMetadata = 'mintingCollectionMetadata';
+    const collectionMax = null;
+    const collectionSymbol = 'MCS';
+    const recipientUri = null;
+    const royalty = null;
+    const nftMetadata = 'NFT-test-metadata';
+
+    const collectionId = await createCollection(
+      api,
+      alice,
+      collectionMetadata,
+      collectionMax,
+      collectionSymbol,
+    );
+
+    const tx = mintNft(
+      api,
+      bob,
+      owner,
+      collectionId,
+      nftMetadata,
+      recipientUri,
+      royalty,
+    );
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('[negative] unable to fetch non-existing NFT', async () => {
+    const nft = await getNft(api, maxCollectionId, maxNftId);
+    expect(nft.isSome).to.be.false;
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/mintNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/mintNft.test.ts
+++ /dev/null
@@ -1,211 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {getNft} from './util/fetch';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {createCollection, mintNft} from './util/tx';
-
-describe('integration test: mint new NFT', () => {
-  let api: any;
- 
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-  const maxCollectionId = 0xFFFFFFFF;
-  const maxNftId = 0xFFFFFFFF;
-
-  it('mint NFT', async () => {
-    const owner = null;
-    const collectionMetadata = 'mintingCollectionMetadata';
-    const collectionMax = null;
-    const collectionSymbol = 'MCS';
-    const recipientUri = null;
-    const royalty = null;
-    const nftMetadata = 'NFT-test-metadata';
-
-    const collectionId = await createCollection(
-      api,
-      alice,
-      collectionMetadata,
-      collectionMax,
-      collectionSymbol,
-    );
-
-    await mintNft(
-      api,
-      alice,
-      owner,
-      collectionId,
-      nftMetadata,
-      recipientUri,
-      royalty,
-    );
-  });
-
-  it('mint NFT and set another owner', async () => {
-    const owner = bob;
-    const collectionMetadata = 'setOwnerCollectionMetadata';
-    const collectionMax = null;
-    const collectionSymbol = 'SOCS';
-    const recipientUri = null;
-    const royalty = null;
-    const nftMetadata = 'setOwner-NFT-metadata';
-
-    const collectionId = await createCollection(
-      api,
-      alice,
-      collectionMetadata,
-      collectionMax,
-      collectionSymbol,
-    );
-
-    await mintNft(
-      api,
-      alice,
-      owner,
-      collectionId,
-      nftMetadata,
-      recipientUri,
-      royalty,
-    );
-  });
-
-  it('mint NFT with recipient and roalty', async () => {
-    const owner = alice;
-    const collectionMetadata = 'mintingCollectionMetadata';
-    const collectionMax = null;
-    const collectionSymbol = 'MCS';
-    const recipientUri = bob;
-    const royalty = 70000;
-    const nftMetadata = 'recipient-royalty-NFT-test-metadata';
-
-    const collectionId = await createCollection(
-      api,
-      alice,
-      collectionMetadata,
-      collectionMax,
-      collectionSymbol,
-    );
-
-    await mintNft(
-      api,
-      alice,
-      owner,
-      collectionId,
-      nftMetadata,
-      recipientUri,
-      royalty,
-    );
-  });
-
-  it('mint NFT with resources', async () => {
-    const owner = alice;
-    const collectionMetadata = 'mintingCollectionMetadata';
-    const collectionMax = null;
-    const collectionSymbol = 'MCS';
-    const nftMetadata = 'NFT-with-resources-test-metadata';
-    const resources = [
-      {
-        basic: {
-          metadata: 'basic-resource-nft-minting',
-        },
-      }, {
-        slot: {
-          metadata: 'slot-resource-nft-minting',
-          slot: 9,
-        },
-      }, {
-        composable: {
-          metadata: 'composable-resource-nft-minting',
-          parts: [0, 5, 2],
-        },
-      }, {
-        slot: {
-          metadata: 'slot-resource-nft-minting-2',
-          thumb: 'srnm2',
-          base: 5,
-        },
-      },
-    ];
-
-    const collectionId = await createCollection(
-      api,
-      alice,
-      collectionMetadata,
-      collectionMax,
-      collectionSymbol,
-    );
-
-    await mintNft(
-      api,
-      alice,
-      owner,
-      collectionId,
-      nftMetadata,
-      null,
-      null,
-      true,
-      resources,
-    );
-  });
-
-  it('[negative] unable to mint NFT within non-existing collection', async () => {
-    const owner = alice;
-    const recipientUri = null;
-    const royalty = null;
-    const nftMetadata = 'NFT-test-metadata';
-
-    const tx = mintNft(
-      api,
-      alice,
-      owner,
-      maxCollectionId,
-      nftMetadata,
-      recipientUri,
-      royalty,
-    );
-
-    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
-  });
-
-  it("[negative] unable to mint NFT by a user that isn't the owner of the collection", async () => {
-    const owner = alice;
-    const collectionMetadata = 'mintingCollectionMetadata';
-    const collectionMax = null;
-    const collectionSymbol = 'MCS';
-    const recipientUri = null;
-    const royalty = null;
-    const nftMetadata = 'NFT-test-metadata';
-
-    const collectionId = await createCollection(
-      api,
-      alice,
-      collectionMetadata,
-      collectionMax,
-      collectionSymbol,
-    );
-
-    const tx = mintNft(
-      api,
-      bob,
-      owner,
-      collectionId,
-      nftMetadata,
-      recipientUri,
-      royalty,
-    );
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('[negative] unable to fetch non-existing NFT', async () => {
-    const nft = await getNft(api, maxCollectionId, maxNftId);
-    expect(nft.isSome).to.be.false;
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/rejectNft.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/rejectNft.seqtest.ts
@@ -0,0 +1,94 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {
+  createCollection,
+  mintNft,
+  sendNft,
+  rejectNft,
+} from './util/tx';
+import {NftIdTuple} from './util/fetch';
+import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
+
+describe('integration test: reject NFT', () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  const createTestCollection = async (issuerUri: string) => {
+    return await createCollection(
+      api,
+      issuerUri,
+      'reject-metadata',
+      null,
+      'rjct',
+    );
+  };
+
+  it('reject NFT', async () => {
+    const ownerAlice = alice;
+    const ownerBob = bob;
+
+    const aliceCollectionId = await createTestCollection(alice);
+    const bobCollectionId = await createTestCollection(bob);
+
+    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
+    await rejectNft(api, alice, bobCollectionId, childNftId);
+
+    const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT);
+    expect(isChild, 'Error: rejected NFT is still a child of the target NFT').to.be.false;
+  });
+
+  it('[negative] unable to reject NFT by a not-an-owner', async () => {
+    const ownerAlice = alice;
+    const ownerBob = bob;
+
+    const aliceCollectionId = await createTestCollection(alice);
+    const bobCollectionId = await createTestCollection(bob);
+
+    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
+    const tx = rejectNft(api, bob, bobCollectionId, childNftId);
+
+    await expectTxFailure(/rmrkCore\.CannotRejectNonOwnedNft/, tx);
+  });
+
+  it('[negative] unable to reject non-existing NFT', async () => {
+    const maxNftId = 0xFFFFFFFF;
+
+    const collectionId = await createTestCollection(alice);
+
+    const tx = rejectNft(api, alice, collectionId, maxNftId);
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative] unable to reject NFT which is not sent', async () => {
+    const ownerAlice = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'parent-nft-metadata');
+
+    const tx = rejectNft(api, alice, collectionId, nftId);
+
+    await expectTxFailure(/rmrkCore\.CannotRejectNonPendingNft/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/rejectNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/rejectNft.test.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {
-  createCollection,
-  mintNft,
-  sendNft,
-  rejectNft,
-} from './util/tx';
-import {getChildren, NftIdTuple} from './util/fetch';
-import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
-
-describe('integration test: reject NFT', () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-
-  const createTestCollection = async (issuerUri: string) => {
-    return await createCollection(
-      api,
-      issuerUri,
-      'reject-metadata',
-      null,
-      'rjct',
-    );
-  };
-
-  it('reject NFT', async () => {
-    const ownerAlice = alice;
-    const ownerBob = bob;
-
-    const aliceCollectionId = await createTestCollection(alice);
-    const bobCollectionId = await createTestCollection(bob);
-
-    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
-    await rejectNft(api, alice, bobCollectionId, childNftId);
-
-    const isChild = await isNftChildOfAnother(api, bobCollectionId, childNftId, newOwnerNFT);
-    expect(isChild, 'Error: rejected NFT is still a child of the target NFT').to.be.false;
-  });
-
-  it('[negative] unable to reject NFT by a not-an-owner', async () => {
-    const ownerAlice = alice;
-    const ownerBob = bob;
-
-    const aliceCollectionId = await createTestCollection(alice);
-    const bobCollectionId = await createTestCollection(bob);
-
-    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    await sendNft(api, 'pending', ownerBob, bobCollectionId, childNftId, newOwnerNFT);
-    const tx = rejectNft(api, bob, bobCollectionId, childNftId);
-
-    await expectTxFailure(/rmrkCore\.CannotRejectNonOwnedNft/, tx);
-  });
-
-  it('[negative] unable to reject non-existing NFT', async () => {
-    const maxNftId = 0xFFFFFFFF;
-
-    const collectionId = await createTestCollection(alice);
-
-    const tx = rejectNft(api, alice, collectionId, maxNftId);
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative] unable to reject NFT which is not sent', async () => {
-    const ownerAlice = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'parent-nft-metadata');
-
-    const tx = rejectNft(api, alice, collectionId, nftId);
-
-    await expectTxFailure(/rmrkCore\.CannotRejectNonPendingNft/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/removeResource.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/removeResource.seqtest.ts
@@ -0,0 +1,340 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {NftIdTuple} from './util/fetch';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {
+  acceptResourceRemoval, addNftBasicResource, createCollection, mintNft, removeNftResource, sendNft,
+} from './util/tx';
+
+
+
+
+describe('Integration test: remove nft resource', () => {
+  let api: any;
+  before(async function() {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+  const src = 'test-basic-src';
+  const metadata = 'test-basic-metadata';
+  const license = 'test-basic-license';
+  const thumb = 'test-basic-thumb';
+
+  it('deleting a resource directly by the NFT owner', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    await removeNftResource(api, 'removed', alice, collectionIdAlice, nftAlice, resourceId);
+  });
+
+  it('deleting resources indirectly by the NFT owner', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const parentNftId = await mintNft(api, alice, alice, collectionIdAlice, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, alice, collectionIdAlice, 'child-nft-metadata');
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      childNftId,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionIdAlice, childNftId, newOwnerNFT);
+
+    await removeNftResource(api, 'removed', alice, collectionIdAlice, childNftId, resourceId);
+  });
+
+  it('deleting a resource by the collection owner', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftBob = await mintNft(
+      api,
+      alice,
+      bob,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'pending',
+      collectionIdAlice,
+      nftBob,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    await removeNftResource(api, 'pending', alice, collectionIdAlice, nftBob, resourceId);
+    await acceptResourceRemoval(api, bob, collectionIdAlice, nftBob, resourceId);
+  });
+
+  it('deleting a resource in a nested NFT by the collection owner', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const parentNftId = await mintNft(
+      api,
+      alice,
+      bob,
+      collectionIdAlice,
+      'parent-nft-metadata',
+    );
+    const childNftId = await mintNft(
+      api,
+      alice,
+      bob,
+      collectionIdAlice,
+      'child-nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'pending',
+      collectionIdAlice,
+      childNftId,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
+
+    await sendNft(api, 'sent', bob, collectionIdAlice, childNftId, newOwnerNFT);
+
+    await removeNftResource(api, 'pending', alice, collectionIdAlice, childNftId, resourceId);
+    await acceptResourceRemoval(api, bob, collectionIdAlice, childNftId, resourceId);
+  });
+
+  it('[negative]: can\'t delete a resource in a non-existing collection', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const tx = removeNftResource(api, 'removed', alice, 0xFFFFFFFF, nftAlice, resourceId);
+    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); // FIXME: inappropriate error message (NoAvailableNftId)
+  });
+
+  it('[negative]: only collection owner can delete a resource', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const tx = removeNftResource(api, 'removed', bob, collectionIdAlice, nftAlice, resourceId);
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('[negative]: cannot delete a resource that does not exist', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const tx = removeNftResource(api, 'removed', alice, collectionIdAlice, nftAlice, 127);
+    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
+  });
+
+  it('[negative]: Cannot accept deleting resource without owner attempt do delete it', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftBob = await mintNft(
+      api,
+      alice,
+      bob,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'pending',
+      collectionIdAlice,
+      nftBob,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const tx = acceptResourceRemoval(api, bob, collectionIdAlice, nftBob, resourceId);
+    await expectTxFailure(/rmrkCore\.ResourceNotPending/, tx);
+  });
+
+  it('[negative]: cannot confirm the deletion of a non-existing resource', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftBob = await mintNft(
+      api,
+      alice,
+      bob,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const tx = acceptResourceRemoval(api, bob, collectionIdAlice, nftBob, 127);
+    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
+  });
+
+  it('[negative]: Non-owner user cannot confirm the deletion of resource', async () => {
+    const collectionIdAlice = await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    );
+
+    const nftAlice = await mintNft(
+      api,
+      alice,
+      alice,
+      collectionIdAlice,
+      'nft-metadata',
+    );
+
+    const resourceId = await addNftBasicResource(
+      api,
+      alice,
+      'added',
+      collectionIdAlice,
+      nftAlice,
+      src,
+      metadata,
+      license,
+      thumb,
+    );
+
+    const tx = acceptResourceRemoval(api, bob, collectionIdAlice, nftAlice, resourceId);
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/removeResource.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/removeResource.test.ts
+++ /dev/null
@@ -1,347 +0,0 @@
-import {expect} from 'chai';
-import privateKey from '../substrate/privateKey';
-import {executeTransaction, getApiConnection} from '../substrate/substrate-api';
-import {getNft, NftIdTuple} from './util/fetch';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {
-  acceptNft, acceptResourceRemoval, addNftBasicResource,
-  createBase,
-  createCollection,
-  mintNft, removeNftResource, sendNft,
-} from './util/tx';
-
-
-
-
-describe('Integration test: remove nft resource', () => {
-  let api: any;
-  let ss58Format: string;
-  before(async function() {
-    api = await getApiConnection();
-    ss58Format = api.registry.getChainProperties()!.toJSON().ss58Format;
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-  const src = 'test-basic-src';
-  const metadata = 'test-basic-metadata';
-  const license = 'test-basic-license';
-  const thumb = 'test-basic-thumb';
-
-  it('deleting a resource directly by the NFT owner', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    await removeNftResource(api, 'removed', Alice, collectionIdAlice, nftAlice, resourceId);
-  });
-
-  it('deleting resources indirectly by the NFT owner', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const parentNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, Alice, Alice, collectionIdAlice, 'child-nft-metadata');
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      childNftId,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
-
-    await sendNft(api, 'sent', Alice, collectionIdAlice, childNftId, newOwnerNFT);
-
-    await removeNftResource(api, 'removed', Alice, collectionIdAlice, childNftId, resourceId);
-  });
-
-  it('deleting a resource by the collection owner', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftBob = await mintNft(
-      api,
-      Alice,
-      Bob,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'pending',
-      collectionIdAlice,
-      nftBob,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    await removeNftResource(api, 'pending', Alice, collectionIdAlice, nftBob, resourceId);
-    await acceptResourceRemoval(api, Bob, collectionIdAlice, nftBob, resourceId);
-  });
-
-  it('deleting a resource in a nested NFT by the collection owner', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const parentNftId = await mintNft(
-      api,
-      Alice,
-      Bob,
-      collectionIdAlice,
-      'parent-nft-metadata',
-    );
-    const childNftId = await mintNft(
-      api,
-      Alice,
-      Bob,
-      collectionIdAlice,
-      'child-nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'pending',
-      collectionIdAlice,
-      childNftId,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const newOwnerNFT: NftIdTuple = [collectionIdAlice, parentNftId];
-
-    await sendNft(api, 'sent', Bob, collectionIdAlice, childNftId, newOwnerNFT);
-
-    await removeNftResource(api, 'pending', Alice, collectionIdAlice, childNftId, resourceId);
-    await acceptResourceRemoval(api, Bob, collectionIdAlice, childNftId, resourceId);
-  });
-
-  it('[negative]: can\'t delete a resource in a non-existing collection', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const tx = removeNftResource(api, 'removed', Alice, 0xFFFFFFFF, nftAlice, resourceId);
-    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx); // FIXME: inappropriate error message (NoAvailableNftId)
-  });
-
-  it('[negative]: only collection owner can delete a resource', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const tx = removeNftResource(api, 'removed', Bob, collectionIdAlice, nftAlice, resourceId);
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('[negative]: cannot delete a resource that does not exist', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const tx = removeNftResource(api, 'removed', Alice, collectionIdAlice, nftAlice, 127);
-    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
-  });
-
-  it('[negative]: Cannot accept deleting resource without owner attempt do delete it', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftBob = await mintNft(
-      api,
-      Alice,
-      Bob,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'pending',
-      collectionIdAlice,
-      nftBob,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const tx = acceptResourceRemoval(api, Bob, collectionIdAlice, nftBob, resourceId);
-    await expectTxFailure(/rmrkCore\.ResourceNotPending/, tx);
-  });
-
-  it('[negative]: cannot confirm the deletion of a non-existing resource', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftBob = await mintNft(
-      api,
-      Alice,
-      Bob,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const tx = acceptResourceRemoval(api, Bob, collectionIdAlice, nftBob, 127);
-    await expectTxFailure(/rmrkCore\.ResourceDoesntExist/, tx);
-  });
-
-  it('[negative]: Non-owner user cannot confirm the deletion of resource', async () => {
-    const collectionIdAlice = await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    );
-
-    const nftAlice = await mintNft(
-      api,
-      Alice,
-      Alice,
-      collectionIdAlice,
-      'nft-metadata',
-    );
-
-    const resourceId = await addNftBasicResource(
-      api,
-      Alice,
-      'added',
-      collectionIdAlice,
-      nftAlice,
-      src,
-      metadata,
-      license,
-      thumb,
-    );
-
-    const tx = acceptResourceRemoval(api, Bob, collectionIdAlice, nftAlice, resourceId);
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/rmrkIsolation.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/rmrkIsolation.seqtest.ts
@@ -0,0 +1,225 @@
+import {executeTransaction} from '../substrate/substrate-api';
+import {IKeyringPair} from '@polkadot/types/types';
+import {itSub, expect, usingPlaygrounds, Pallets, requirePalletsOrSkip} from '../util';
+import {UniqueHelper} from '../util/playgrounds/unique';
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
+
+async function createRmrkCollection(helper: UniqueHelper, sender: IKeyringPair): Promise<{uniqueId: number, rmrkId: number}> {
+  const result = await helper.executeExtrinsic(sender, 'api.tx.rmrkCore.createCollection', ['metadata', null, 'symbol'], true);
+
+  const uniqueId = helper.util.extractCollectionIdFromCreationResult(result);
+
+  let rmrkId = null;
+  result.result.events.forEach(({event: {data, method, section}}) => {
+    if ((section === 'rmrkCore') && (method === 'CollectionCreated')) {
+      rmrkId = parseInt(data[1].toString(), 10);
+    }
+  });
+
+  if (rmrkId === null) {
+    throw Error('No rmrkCore.CollectionCreated event was found!');
+  }
+
+  return {
+    uniqueId,
+    rmrkId,
+  };
+}
+
+async function createRmrkNft(helper: UniqueHelper, sender: IKeyringPair, collectionId: number): Promise<number> {
+  const result = await helper.executeExtrinsic(
+    sender,
+    'api.tx.rmrkCore.mintNft',
+    [
+      sender.address,
+      collectionId,
+      sender.address,
+      null,
+      'nft-metadata',
+      true,
+      null,
+    ],
+    true,
+  );
+
+  let rmrkNftId = null;
+  result.result.events.forEach(({event: {data, method, section}}) => {
+    if ((section === 'rmrkCore') && (method === 'NftMinted')) {
+      rmrkNftId = parseInt(data[2].toString(), 10);
+    }
+  });
+
+  if (rmrkNftId === null) {
+    throw Error('No rmrkCore.NftMinted event was found!');
+  }
+
+  return rmrkNftId;
+}
+
+describe('RMRK External Integration Test', async () => {
+  before(async function() {
+    await usingPlaygrounds(async (_helper, privateKey) => {
+      alice = await privateKey('//Alice');
+    });
+  });
+
+  itSub.ifWithPallets('Creates a new RMRK collection that is mapped to a different ID and is tagged as external', [Pallets.RmrkCore], async ({helper}) => {
+    // throw away collection to bump last Unique collection ID to test ID mapping
+    await helper.nft.mintCollection(alice, {tokenPrefix: 'unqt'});
+
+    const collectionIds = await createRmrkCollection(helper, alice);
+
+    expect(collectionIds.rmrkId).to.be.lessThan(collectionIds.uniqueId, 'collection ID mapping');
+
+    const collection = (await helper.nft.getCollectionObject(collectionIds.uniqueId).getData())!; // (await getDetailedCollectionInfo(api, collectionIds.uniqueId))!;
+    expect(collection.raw.readOnly, 'tagged external').to.be.true;
+  });
+});
+
+describe('Negative Integration Test: External Collections, Internal Ops', async () => {
+  let uniqueCollectionId: number;
+  let rmrkCollectionId: number;
+  let rmrkNftId: number;
+  let normalizedAlice: {Substrate: string};
+
+  before(async function() {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      alice = await privateKey('//Alice');
+      bob = await privateKey('//Bob');
+      normalizedAlice = {Substrate: helper.address.normalizeSubstrateToChainFormat(alice.address)};
+
+      requirePalletsOrSkip(this, helper, [Pallets.RmrkCore]);
+
+      const collectionIds = await createRmrkCollection(helper, alice);
+      uniqueCollectionId = collectionIds.uniqueId;
+      rmrkCollectionId = collectionIds.rmrkId;
+
+      rmrkNftId = await createRmrkNft(helper, alice, rmrkCollectionId);
+    });
+  });
+
+  itSub.ifWithPallets('[Negative] Forbids Unique operations with an external collection, handled by dispatch_call', [Pallets.RmrkCore], async ({helper}) => {
+    // Collection item creation
+
+    await expect(helper.nft.mintToken(alice, {collectionId: uniqueCollectionId, owner: {Substrate: alice.address}}), 'creating item')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    const txCreateMultipleItems = helper.getApi().tx.unique.createMultipleItems(uniqueCollectionId, normalizedAlice, [{NFT: {}}, {NFT: {}}]);
+    await expect(executeTransaction(helper.getApi(), alice, txCreateMultipleItems), 'creating multiple')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+  
+    await expect(helper.nft.mintMultipleTokens(alice, uniqueCollectionId, [{owner: {Substrate: alice.address}}]), 'creating multiple ex')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    // Collection properties
+
+    await expect(helper.nft.setProperties(alice, uniqueCollectionId, [{key: 'a', value: '1'}, {key: 'b'}]), 'setting collection properties')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.deleteProperties(alice, uniqueCollectionId, ['a']), 'deleting collection properties')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.setTokenPropertyPermissions(alice, uniqueCollectionId, [{key: 'a', permission: {mutable: true}}]), 'setting property permissions')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    // NFT
+
+    await expect(helper.nft.burnToken(alice, uniqueCollectionId, rmrkNftId, 1n), 'burning')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.burnTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, 1n), 'burning-from')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.transferToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'transferring')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.approveToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'approving')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.transferTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, {Substrate: bob.address}), 'transferring-from')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    // NFT properties
+
+    await expect(helper.nft.setTokenProperties(alice, uniqueCollectionId, rmrkNftId, [{key: 'a', value: '2'}]), 'setting token properties')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.deleteTokenProperties(alice, uniqueCollectionId, rmrkNftId, ['a']))
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+  });
+
+  itSub.ifWithPallets('[Negative] Forbids Unique collection operations with an external collection', [Pallets.RmrkCore], async ({helper}) => {
+    await expect(helper.nft.burn(alice, uniqueCollectionId), 'destroying collection')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    // Allow list
+
+    await expect(helper.nft.addToAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding to allow list')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.removeFromAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing from allowlist')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    // Owner / Admin / Sponsor
+
+    await expect(helper.nft.changeOwner(alice, uniqueCollectionId, bob.address), 'changing owner')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.addAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding admin')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.removeAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing admin')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.setSponsor(alice, uniqueCollectionId, bob.address), 'setting sponsor')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.confirmSponsorship(alice, uniqueCollectionId), 'confirming sponsor')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.removeSponsor(alice, uniqueCollectionId), 'removing sponsor')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+    
+    // Limits / permissions / transfers
+
+    const txSetTransfers = helper.getApi().tx.unique.setTransfersEnabledFlag(uniqueCollectionId, true);
+    await expect(executeTransaction(helper.getApi(), alice, txSetTransfers), 'setting transfers enabled flag')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.setLimits(alice, uniqueCollectionId, {transfersEnabled: false}), 'setting collection limits')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+
+    await expect(helper.nft.setPermissions(alice, uniqueCollectionId, {access: 'AllowList'}), 'setting collection permissions')
+      .to.be.rejectedWith(/common\.CollectionIsExternal/);
+  });
+});
+
+describe('Negative Integration Test: Internal Collections, External Ops', async () => {
+  let collectionId: number;
+  let nftId: number;
+
+  before(async () => {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      alice = await privateKey('//Alice');
+      bob = await privateKey('//Bob');
+
+      const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'iceo'});
+      collectionId = collection.collectionId;
+      nftId = (await collection.mintToken(alice)).tokenId;
+    });
+  });
+
+  itSub.ifWithPallets('[Negative] Forbids RMRK operations with the internal collection and NFT (due to the lack of mapping)', [Pallets.RmrkCore], async ({helper}) => {
+    const api = helper.getApi();
+
+    const txChangeOwner = api.tx.rmrkCore.changeCollectionIssuer(collectionId, bob.address);
+    await expect(executeTransaction(api, alice, txChangeOwner), 'changing collection issuer')
+      .to.be.rejectedWith(/rmrkCore\.CollectionUnknown/);
+
+    const maxBurns = 10;
+    const txBurnItem = api.tx.rmrkCore.burnNft(collectionId, nftId, maxBurns);
+    await expect(executeTransaction(api, alice, txBurnItem), 'burning NFT').to.be.rejectedWith(/rmrkCore\.CollectionUnknown/);
+  });
+});
deletedtests/src/rmrk/rmrkIsolation.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/rmrkIsolation.test.ts
+++ /dev/null
@@ -1,225 +0,0 @@
-import {executeTransaction} from '../substrate/substrate-api';
-import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, expect, usingPlaygrounds, Pallets, requirePalletsOrSkip} from '../util/playgrounds';
-import {UniqueHelper} from '../util/playgrounds/unique';
-
-let alice: IKeyringPair;
-let bob: IKeyringPair;
-
-async function createRmrkCollection(helper: UniqueHelper, sender: IKeyringPair): Promise<{uniqueId: number, rmrkId: number}> {
-  const result = await helper.executeExtrinsic(sender, 'api.tx.rmrkCore.createCollection', ['metadata', null, 'symbol'], true);
-
-  const uniqueId = helper.util.extractCollectionIdFromCreationResult(result);
-
-  let rmrkId = null;
-  result.result.events.forEach(({event: {data, method, section}}) => {
-    if ((section === 'rmrkCore') && (method === 'CollectionCreated')) {
-      rmrkId = parseInt(data[1].toString(), 10);
-    }
-  });
-
-  if (rmrkId === null) {
-    throw Error('No rmrkCore.CollectionCreated event was found!');
-  }
-
-  return {
-    uniqueId,
-    rmrkId,
-  };
-}
-
-async function createRmrkNft(helper: UniqueHelper, sender: IKeyringPair, collectionId: number): Promise<number> {
-  const result = await helper.executeExtrinsic(
-    sender,
-    'api.tx.rmrkCore.mintNft',
-    [
-      sender.address,
-      collectionId,
-      sender.address,
-      null,
-      'nft-metadata',
-      true,
-      null,
-    ],
-    true,
-  );
-
-  let rmrkNftId = null;
-  result.result.events.forEach(({event: {data, method, section}}) => {
-    if ((section === 'rmrkCore') && (method === 'NftMinted')) {
-      rmrkNftId = parseInt(data[2].toString(), 10);
-    }
-  });
-
-  if (rmrkNftId === null) {
-    throw Error('No rmrkCore.NftMinted event was found!');
-  }
-
-  return rmrkNftId;
-}
-
-describe('RMRK External Integration Test', async () => {
-  before(async function() {
-    await usingPlaygrounds(async (_helper, privateKey) => {
-      alice = privateKey('//Alice');
-    });
-  });
-
-  itSub.ifWithPallets('Creates a new RMRK collection that is mapped to a different ID and is tagged as external', [Pallets.RmrkCore], async ({helper}) => {
-    // throw away collection to bump last Unique collection ID to test ID mapping
-    await helper.nft.mintCollection(alice, {tokenPrefix: 'unqt'});
-
-    const collectionIds = await createRmrkCollection(helper, alice);
-
-    expect(collectionIds.rmrkId).to.be.lessThan(collectionIds.uniqueId, 'collection ID mapping');
-
-    const collection = (await helper.nft.getCollectionObject(collectionIds.uniqueId).getData())!; // (await getDetailedCollectionInfo(api, collectionIds.uniqueId))!;
-    expect(collection.raw.readOnly, 'tagged external').to.be.true;
-  });
-});
-
-describe('Negative Integration Test: External Collections, Internal Ops', async () => {
-  let uniqueCollectionId: number;
-  let rmrkCollectionId: number;
-  let rmrkNftId: number;
-  let normalizedAlice: {Substrate: string};
-
-  before(async function() {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      alice = privateKey('//Alice');
-      bob = privateKey('//Bob');
-      normalizedAlice = {Substrate: helper.address.normalizeSubstrateToChainFormat(alice.address)};
-
-      await requirePalletsOrSkip(this, helper, [Pallets.RmrkCore]);
-
-      const collectionIds = await createRmrkCollection(helper, alice);
-      uniqueCollectionId = collectionIds.uniqueId;
-      rmrkCollectionId = collectionIds.rmrkId;
-
-      rmrkNftId = await createRmrkNft(helper, alice, rmrkCollectionId);
-    });
-  });
-
-  itSub.ifWithPallets('[Negative] Forbids Unique operations with an external collection, handled by dispatch_call', [Pallets.RmrkCore], async ({helper}) => {
-    // Collection item creation
-
-    await expect(helper.nft.mintToken(alice, {collectionId: uniqueCollectionId, owner: {Substrate: alice.address}}), 'creating item')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    const txCreateMultipleItems = helper.getApi().tx.unique.createMultipleItems(uniqueCollectionId, normalizedAlice, [{NFT: {}}, {NFT: {}}]);
-    await expect(executeTransaction(helper.getApi(), alice, txCreateMultipleItems), 'creating multiple')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-  
-    await expect(helper.nft.mintMultipleTokens(alice, uniqueCollectionId, [{owner: {Substrate: alice.address}}]), 'creating multiple ex')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    // Collection properties
-
-    await expect(helper.nft.setProperties(alice, uniqueCollectionId, [{key: 'a', value: '1'}, {key: 'b'}]), 'setting collection properties')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.deleteProperties(alice, uniqueCollectionId, ['a']), 'deleting collection properties')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.setTokenPropertyPermissions(alice, uniqueCollectionId, [{key: 'a', permission: {mutable: true}}]), 'setting property permissions')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    // NFT
-
-    await expect(helper.nft.burnToken(alice, uniqueCollectionId, rmrkNftId, 1n), 'burning')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.burnTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, 1n), 'burning-from')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.transferToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'transferring')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.approveToken(alice, uniqueCollectionId, rmrkNftId, {Substrate: bob.address}), 'approving')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.transferTokenFrom(alice, uniqueCollectionId, rmrkNftId, {Substrate: alice.address}, {Substrate: bob.address}), 'transferring-from')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    // NFT properties
-
-    await expect(helper.nft.setTokenProperties(alice, uniqueCollectionId, rmrkNftId, [{key: 'a', value: '2'}]), 'setting token properties')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.deleteTokenProperties(alice, uniqueCollectionId, rmrkNftId, ['a']))
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-  });
-
-  itSub.ifWithPallets('[Negative] Forbids Unique collection operations with an external collection', [Pallets.RmrkCore], async ({helper}) => {
-    await expect(helper.nft.burn(alice, uniqueCollectionId), 'destroying collection')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    // Allow list
-
-    await expect(helper.nft.addToAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding to allow list')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.removeFromAllowList(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing from allowlist')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    // Owner / Admin / Sponsor
-
-    await expect(helper.nft.changeOwner(alice, uniqueCollectionId, bob.address), 'changing owner')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.addAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'adding admin')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.removeAdmin(alice, uniqueCollectionId, {Substrate: bob.address}), 'removing admin')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.setSponsor(alice, uniqueCollectionId, bob.address), 'setting sponsor')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.confirmSponsorship(alice, uniqueCollectionId), 'confirming sponsor')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.removeSponsor(alice, uniqueCollectionId), 'removing sponsor')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-    
-    // Limits / permissions / transfers
-
-    const txSetTransfers = helper.getApi().tx.unique.setTransfersEnabledFlag(uniqueCollectionId, true);
-    await expect(executeTransaction(helper.getApi(), alice, txSetTransfers), 'setting transfers enabled flag')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.setLimits(alice, uniqueCollectionId, {transfersEnabled: false}), 'setting collection limits')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-
-    await expect(helper.nft.setPermissions(alice, uniqueCollectionId, {access: 'AllowList'}), 'setting collection permissions')
-      .to.be.rejectedWith(/common\.CollectionIsExternal/);
-  });
-});
-
-describe('Negative Integration Test: Internal Collections, External Ops', async () => {
-  let collectionId: number;
-  let nftId: number;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      alice = privateKey('//Alice');
-      bob = privateKey('//Bob');
-
-      const collection = await helper.nft.mintCollection(alice, {tokenPrefix: 'iceo'});
-      collectionId = collection.collectionId;
-      nftId = (await collection.mintToken(alice)).tokenId;
-    });
-  });
-
-  itSub.ifWithPallets('[Negative] Forbids RMRK operations with the internal collection and NFT (due to the lack of mapping)', [Pallets.RmrkCore], async ({helper}) => {
-    const api = helper.getApi();
-
-    const txChangeOwner = api.tx.rmrkCore.changeCollectionIssuer(collectionId, bob.address);
-    await expect(executeTransaction(api, alice, txChangeOwner), 'changing collection issuer')
-      .to.be.rejectedWith(/rmrkCore\.CollectionUnknown/);
-
-    const maxBurns = 10;
-    const txBurnItem = api.tx.rmrkCore.burnNft(collectionId, nftId, maxBurns);
-    await expect(executeTransaction(api, alice, txBurnItem), 'burning NFT').to.be.rejectedWith(/rmrkCore\.CollectionUnknown/);
-  });
-});
addedtests/src/rmrk/sendNft.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/sendNft.seqtest.ts
@@ -0,0 +1,255 @@
+import {expect} from 'chai';
+import {getApiConnection} from '../substrate/substrate-api';
+import {createCollection, mintNft, sendNft} from './util/tx';
+import {NftIdTuple} from './util/fetch';
+import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
+
+describe('integration test: send NFT', () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  const maxNftId = 0xFFFFFFFF;
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  const createTestCollection = async (issuerUri: string) => {
+    return await createCollection(
+      api,
+      issuerUri,
+      'nft-collection-metadata',
+      null,
+      'nft-collection',
+    );
+  };
+
+
+  it('send NFT to another user', async () => {
+    const originalOwnerUri = alice;
+    const newOwnerUri = bob;
+
+    const collectionId = await createTestCollection(alice);
+
+    const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata');
+
+    await sendNft(api, 'sent', originalOwnerUri, collectionId, nftId, newOwnerUri);
+  });
+
+  it('[negative] unable to send non-existing NFT', async () => {
+    const originalOwnerUri = alice;
+    const newOwnerUri = bob;
+
+    const collectionId = 0;
+    const tx = sendNft(api, 'sent', originalOwnerUri, collectionId, maxNftId, newOwnerUri);
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative] unable to send NFT by a not-an-owner', async () => {
+    const originalOwnerUri = alice;
+    const newOwnerUri = bob;
+
+    const collectionId = await createTestCollection(alice);
+
+    const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata');
+
+    const tx = sendNft(api, 'sent', newOwnerUri, collectionId, nftId, newOwnerUri);
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('send NFT to another NFT (same owner)', async () => {
+    const originalOwnerUri = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.true;
+  });
+
+  it('[negative] send non-existing NFT to another NFT', async () => {
+    const originalOwnerUri = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
+    const childNftId = maxNftId;
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.false;
+  });
+
+  it('send NFT to another NFT (by not-an-owner)', async () => {
+    const originalOwnerUri = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const author = alice;
+    const attacker = bob;
+
+    const parentNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    const tx = sendNft(api, 'sent', attacker, collectionId, childNftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.false;
+  });
+
+  it('[negative] send NFT to non-existing NFT', async () => {
+    const originalOwnerUri = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = maxNftId;
+    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.false;
+  });
+
+  it('send NFT to another NFT owned by another user', async () => {
+    const ownerAlice = alice;
+    const ownerBob = bob;
+
+    const aliceCollectionId = await createTestCollection(alice);
+    const bobCollectionId = await createTestCollection(bob);
+
+    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
+
+    await sendNft(api, 'pending', bob, bobCollectionId, childNftId, newOwnerNFT);
+  });
+
+  it('[negative] unable to send NFT to itself', async () => {
+    const nftOwner = alice;
+    const collectionId = await createTestCollection(alice);
+
+    const nftId = await mintNft(api, alice, nftOwner, collectionId, 'ouroboros-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionId, nftId];
+
+    const tx = sendNft(api, 'sent', alice, collectionId, nftId, newOwnerNFT);
+
+    await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, nftId, newOwnerNFT);
+    expect(isChild).to.be.false;
+  });
+
+  it('[negative] unable to send NFT to child NFT', async () => {
+    const originalOwnerUri = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
+
+    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
+    expect(isChild).to.be.true;
+
+    const descendentOwner: NftIdTuple = [collectionId, childNftId];
+    const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, descendentOwner);
+
+    await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);
+    const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, descendentOwner);
+    expect(isOuroboros).to.be.false;
+  });
+
+  it('[negative] unable to send NFT to descendent NFT', async () => {
+    const originalOwnerUri = alice;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
+    const grandsonNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'grandson-nft-metadata');
+
+    const ownerParentNFT: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', alice, collectionId, childNftId, ownerParentNFT);
+
+    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, ownerParentNFT);
+    expect(isChild).to.be.true;
+
+    const ownerChildNFT: NftIdTuple = [collectionId, childNftId];
+    await sendNft(api, 'sent', alice, collectionId, grandsonNftId, ownerChildNFT);
+
+    const isGrandson = await isNftChildOfAnother(api, collectionId, grandsonNftId, ownerChildNFT);
+    expect(isGrandson).to.be.true;
+
+    const ownerGrandsonNFT: NftIdTuple = [collectionId, grandsonNftId];
+    const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, ownerGrandsonNFT);
+
+    await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);
+    const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, ownerGrandsonNFT);
+    expect(isOuroboros).to.be.false;
+  });
+
+  it('send nested NFT to another user', async () => {
+    const originalOwner = alice;
+    const newOwner = bob;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata');
+
+    const parentNftTuple: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple);
+
+    await sendNft(api, 'sent', originalOwner, collectionId, childNftId, newOwner);
+  });
+
+  it('[negative] send nested NFT to another user (by a not-root-owner)', async () => {
+    const originalOwner = alice;
+    const newOwner = bob;
+
+    const collectionId = await createTestCollection(alice);
+
+    const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata');
+    const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata');
+
+    const parentNftTuple: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple);
+
+    const tx = sendNft(api, 'sent', newOwner, collectionId, childNftId, newOwner);
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/sendNft.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/sendNft.test.ts
+++ /dev/null
@@ -1,255 +0,0 @@
-import {expect} from 'chai';
-import {getApiConnection} from '../substrate/substrate-api';
-import {createCollection, mintNft, sendNft} from './util/tx';
-import {NftIdTuple} from './util/fetch';
-import {isNftChildOfAnother, expectTxFailure, requirePallets, Pallets} from './util/helpers';
-
-describe('integration test: send NFT', () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  const maxNftId = 0xFFFFFFFF;
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-
-  const createTestCollection = async (issuerUri: string) => {
-    return await createCollection(
-      api,
-      issuerUri,
-      'nft-collection-metadata',
-      null,
-      'nft-collection',
-    );
-  };
-
-
-  it('send NFT to another user', async () => {
-    const originalOwnerUri = alice;
-    const newOwnerUri = bob;
-
-    const collectionId = await createTestCollection(alice);
-
-    const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata');
-
-    await sendNft(api, 'sent', originalOwnerUri, collectionId, nftId, newOwnerUri);
-  });
-
-  it('[negative] unable to send non-existing NFT', async () => {
-    const originalOwnerUri = alice;
-    const newOwnerUri = bob;
-
-    const collectionId = 0;
-    const tx = sendNft(api, 'sent', originalOwnerUri, collectionId, maxNftId, newOwnerUri);
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative] unable to send NFT by a not-an-owner', async () => {
-    const originalOwnerUri = alice;
-    const newOwnerUri = bob;
-
-    const collectionId = await createTestCollection(alice);
-
-    const nftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'nft-metadata');
-
-    const tx = sendNft(api, 'sent', newOwnerUri, collectionId, nftId, newOwnerUri);
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('send NFT to another NFT (same owner)', async () => {
-    const originalOwnerUri = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.true;
-  });
-
-  it('[negative] send non-existing NFT to another NFT', async () => {
-    const originalOwnerUri = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
-    const childNftId = maxNftId;
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.false;
-  });
-
-  it('send NFT to another NFT (by not-an-owner)', async () => {
-    const originalOwnerUri = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const author = alice;
-    const attacker = bob;
-
-    const parentNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, author, originalOwnerUri, collectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    const tx = sendNft(api, 'sent', attacker, collectionId, childNftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.false;
-  });
-
-  it('[negative] send NFT to non-existing NFT', async () => {
-    const originalOwnerUri = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = maxNftId;
-    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    const tx = sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.false;
-  });
-
-  it('send NFT to another NFT owned by another user', async () => {
-    const ownerAlice = alice;
-    const ownerBob = bob;
-
-    const aliceCollectionId = await createTestCollection(alice);
-    const bobCollectionId = await createTestCollection(bob);
-
-    const parentNftId = await mintNft(api, alice, ownerAlice, aliceCollectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, bob, ownerBob, bobCollectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [aliceCollectionId, parentNftId];
-
-    await sendNft(api, 'pending', bob, bobCollectionId, childNftId, newOwnerNFT);
-  });
-
-  it('[negative] unable to send NFT to itself', async () => {
-    const nftOwner = alice;
-    const collectionId = await createTestCollection(alice);
-
-    const nftId = await mintNft(api, alice, nftOwner, collectionId, 'ouroboros-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionId, nftId];
-
-    const tx = sendNft(api, 'sent', alice, collectionId, nftId, newOwnerNFT);
-
-    await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, nftId, newOwnerNFT);
-    expect(isChild).to.be.false;
-  });
-
-  it('[negative] unable to send NFT to child NFT', async () => {
-    const originalOwnerUri = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
-
-    const newOwnerNFT: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', alice, collectionId, childNftId, newOwnerNFT);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, newOwnerNFT);
-    expect(isChild).to.be.true;
-
-    const descendentOwner: NftIdTuple = [collectionId, childNftId];
-    const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, descendentOwner);
-
-    await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);
-    const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, descendentOwner);
-    expect(isOuroboros).to.be.false;
-  });
-
-  it('[negative] unable to send NFT to descendent NFT', async () => {
-    const originalOwnerUri = alice;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'child-nft-metadata');
-    const grandsonNftId = await mintNft(api, alice, originalOwnerUri, collectionId, 'grandson-nft-metadata');
-
-    const ownerParentNFT: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', alice, collectionId, childNftId, ownerParentNFT);
-
-    const isChild = await isNftChildOfAnother(api, collectionId, childNftId, ownerParentNFT);
-    expect(isChild).to.be.true;
-
-    const ownerChildNFT: NftIdTuple = [collectionId, childNftId];
-    await sendNft(api, 'sent', alice, collectionId, grandsonNftId, ownerChildNFT);
-
-    const isGrandson = await isNftChildOfAnother(api, collectionId, grandsonNftId, ownerChildNFT);
-    expect(isGrandson).to.be.true;
-
-    const ownerGrandsonNFT: NftIdTuple = [collectionId, grandsonNftId];
-    const tx = sendNft(api, 'sent', alice, collectionId, parentNftId, ownerGrandsonNFT);
-
-    await expectTxFailure(/rmrkCore\.CannotSendToDescendentOrSelf/, tx);
-    const isOuroboros = await isNftChildOfAnother(api, collectionId, parentNftId, ownerGrandsonNFT);
-    expect(isOuroboros).to.be.false;
-  });
-
-  it('send nested NFT to another user', async () => {
-    const originalOwner = alice;
-    const newOwner = bob;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata');
-
-    const parentNftTuple: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple);
-
-    await sendNft(api, 'sent', originalOwner, collectionId, childNftId, newOwner);
-  });
-
-  it('[negative] send nested NFT to another user (by a not-root-owner)', async () => {
-    const originalOwner = alice;
-    const newOwner = bob;
-
-    const collectionId = await createTestCollection(alice);
-
-    const parentNftId = await mintNft(api, alice, originalOwner, collectionId, 'parent-nft-metadata');
-    const childNftId = await mintNft(api, alice, originalOwner, collectionId, 'child-nft-metadata');
-
-    const parentNftTuple: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', originalOwner, collectionId, childNftId, parentNftTuple);
-
-    const tx = sendNft(api, 'sent', newOwner, collectionId, childNftId, newOwner);
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/setCollectionProperty.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/setCollectionProperty.seqtest.ts
@@ -0,0 +1,66 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {createCollection, setPropertyCollection} from './util/tx';
+
+describe('integration test: set collection property', () => {
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  it('set collection property', async () => {
+    await createCollection(
+      api,
+      alice,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      await setPropertyCollection(api, alice, collectionId, 'test_key', '42');
+      await setPropertyCollection(api, alice, collectionId, 'test_key', '10');
+      await setPropertyCollection(
+        api,
+        alice,
+        collectionId,
+        'second_test_key',
+        '111',
+      );
+    });
+  });
+
+  it('[negative] set non-existing collection property', async () => {
+    const tx = setPropertyCollection(
+      api,
+      alice,
+      9999,
+      'test_key',
+      '42',
+    );
+    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
+  });
+
+  it('[negative] set property not an owner NFT collection issuer', async () => {
+    await createCollection(
+      api,
+      bob,
+      'test-metadata',
+      null,
+      'test-symbol',
+    ).then(async (collectionId) => {
+      const tx = setPropertyCollection(
+        api,
+        alice,
+        collectionId,
+        'test_key',
+        '42',
+      );
+      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+    });
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/setCollectionProperty.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setCollectionProperty.test.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {createCollection, setPropertyCollection} from './util/tx';
-
-describe('integration test: set collection property', () => {
-  const Alice = '//Alice';
-  const Bob = '//Bob';
-
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  it('set collection property', async () => {
-    await createCollection(
-      api,
-      Alice,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      await setPropertyCollection(api, Alice, collectionId, 'test_key', '42');
-      await setPropertyCollection(api, Alice, collectionId, 'test_key', '10');
-      await setPropertyCollection(
-        api,
-        Alice,
-        collectionId,
-        'second_test_key',
-        '111',
-      );
-    });
-  });
-
-  it('[negative] set non-existing collection property', async () => {
-    const tx = setPropertyCollection(
-      api,
-      Alice,
-      9999,
-      'test_key',
-      '42',
-    );
-    await expectTxFailure(/rmrkCore\.CollectionUnknown/, tx);
-  });
-
-  it('[negative] set property not an owner NFT collection issuer', async () => {
-    await createCollection(
-      api,
-      Bob,
-      'test-metadata',
-      null,
-      'test-symbol',
-    ).then(async (collectionId) => {
-      const tx = setPropertyCollection(
-        api,
-        Alice,
-        collectionId,
-        'test_key',
-        '42',
-      );
-      await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-    });
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/setEquippableList.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/setEquippableList.seqtest.ts
@@ -0,0 +1,114 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {createCollection, createBase, setEquippableList} from './util/tx';
+
+describe("integration test: set slot's Equippable List", () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  it("set Base's slot Equippable List", async () => {
+    const collectionIds = [
+      await createCollection(
+        api,
+        alice,
+        'equiplist-collection-metadata',
+        null,
+        'equiplist-0',
+      ),
+      await createCollection(
+        api,
+        alice,
+        'equiplist-collection-metadata',
+        null,
+        'equiplist-1',
+      ),
+    ];
+
+    const slotId = 202;
+
+    const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [
+      {
+        'SlotPart': {
+          id: slotId,
+          equippable: 'All',
+          z: 1,
+          src: 'some-fallback-slot-url',
+        },
+      },
+    ]);
+
+    await setEquippableList(api, alice, baseId, slotId, 'All');
+    await setEquippableList(api, alice, baseId, slotId, 'Empty');
+    await setEquippableList(api, alice, baseId, slotId, {'Custom': collectionIds});
+  });
+
+  it('[negative] unable to set equippable list of a slot of non-existing base', async () => {
+    const maxBaseId = 0xFFFFFFFF;
+    const slotId = 0;
+
+    const tx = setEquippableList(api, alice, maxBaseId, slotId, 'All');
+    await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx);
+  });
+
+  it('[negative] unable to set equippable list by a not-an-owner', async () => {
+    const slotId = 42;
+
+    const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [
+      {
+        'SlotPart': {
+          id: slotId,
+          equippable: 'All',
+          z: 1,
+          src: 'some-fallback-slot-url',
+        },
+      },
+    ]);
+
+    const tx = setEquippableList(api, bob, baseId, slotId, 'All');
+    await expectTxFailure(/rmrkEquip\.PermissionError/, tx);
+  });
+
+  it('[negative] unable to set equippable list to a fixed part', async () => {
+    const fixedPartId = 42;
+
+    const baseId = await createBase(api, alice, 'fixedpart-base-type', 'fixedpart', [
+      {
+        'FixedPart': {
+          id: fixedPartId,
+          z: 0,
+          src: 'fixed-part-url',
+        },
+      },
+    ]);
+
+    const tx = setEquippableList(api, alice, baseId, fixedPartId, 'All');
+    await expectTxFailure(/rmrkEquip\.NoEquippableOnFixedPart/, tx);
+  });
+
+  it('[negative] unable to set equippable list to non-existing slot', async () => {
+    const slotId = 777;
+    const maxSlotId = 0xFFFFFFFF;
+
+    const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [
+      {
+        'SlotPart': {
+          id: slotId,
+          equippable: 'All',
+          z: 1,
+          src: 'some-fallback-slot-url',
+        },
+      },
+    ]);
+
+    const tx = setEquippableList(api, alice, baseId, maxSlotId, 'All');
+    await expectTxFailure(/rmrkEquip\.PartDoesntExist/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/setEquippableList.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setEquippableList.test.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {createCollection, createBase, setEquippableList} from './util/tx';
-
-describe("integration test: set slot's Equippable List", () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-
-  it("set Base's slot Equippable List", async () => {
-    const collectionIds = [
-      await createCollection(
-        api,
-        alice,
-        'equiplist-collection-metadata',
-        null,
-        'equiplist-0',
-      ),
-      await createCollection(
-        api,
-        alice,
-        'equiplist-collection-metadata',
-        null,
-        'equiplist-1',
-      ),
-    ];
-
-    const slotId = 202;
-
-    const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [
-      {
-        'SlotPart': {
-          id: slotId,
-          equippable: 'All',
-          z: 1,
-          src: 'some-fallback-slot-url',
-        },
-      },
-    ]);
-
-    await setEquippableList(api, alice, baseId, slotId, 'All');
-    await setEquippableList(api, alice, baseId, slotId, 'Empty');
-    await setEquippableList(api, alice, baseId, slotId, {'Custom': collectionIds});
-  });
-
-  it('[negative] unable to set equippable list of a slot of non-existing base', async () => {
-    const maxBaseId = 0xFFFFFFFF;
-    const slotId = 0;
-
-    const tx = setEquippableList(api, alice, maxBaseId, slotId, 'All');
-    await expectTxFailure(/rmrkEquip\.BaseDoesntExist/, tx);
-  });
-
-  it('[negative] unable to set equippable list by a not-an-owner', async () => {
-    const slotId = 42;
-
-    const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [
-      {
-        'SlotPart': {
-          id: slotId,
-          equippable: 'All',
-          z: 1,
-          src: 'some-fallback-slot-url',
-        },
-      },
-    ]);
-
-    const tx = setEquippableList(api, bob, baseId, slotId, 'All');
-    await expectTxFailure(/rmrkEquip\.PermissionError/, tx);
-  });
-
-  it('[negative] unable to set equippable list to a fixed part', async () => {
-    const fixedPartId = 42;
-
-    const baseId = await createBase(api, alice, 'fixedpart-base-type', 'fixedpart', [
-      {
-        'FixedPart': {
-          id: fixedPartId,
-          z: 0,
-          src: 'fixed-part-url',
-        },
-      },
-    ]);
-
-    const tx = setEquippableList(api, alice, baseId, fixedPartId, 'All');
-    await expectTxFailure(/rmrkEquip\.NoEquippableOnFixedPart/, tx);
-  });
-
-  it('[negative] unable to set equippable list to non-existing slot', async () => {
-    const slotId = 777;
-    const maxSlotId = 0xFFFFFFFF;
-
-    const baseId = await createBase(api, alice, 'slotpartany-base-type', 'slotpartany', [
-      {
-        'SlotPart': {
-          id: slotId,
-          equippable: 'All',
-          z: 1,
-          src: 'some-fallback-slot-url',
-        },
-      },
-    ]);
-
-    const tx = setEquippableList(api, alice, baseId, maxSlotId, 'All');
-    await expectTxFailure(/rmrkEquip\.PartDoesntExist/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/setNftProperty.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/setNftProperty.seqtest.ts
@@ -0,0 +1,88 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {NftIdTuple} from './util/fetch';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {createCollection, mintNft, sendNft, setNftProperty} from './util/tx';
+
+describe('integration test: set NFT property', () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  const createTestCollection = async (issuerUri: string) => {
+    return await createCollection(
+      api,
+      issuerUri,
+      'setprop-nft-collection-metadata',
+      null,
+      'setprop',
+    );
+  };
+
+  it('set NFT property', async () => {
+    const ownerAlice = alice;
+
+    const collectionId = await createTestCollection(alice);
+    const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft');
+
+    await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'test-key-value');
+    await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'updated-key-value');
+    await setNftProperty(api, alice, collectionId, nftId, 'second-test-key', 'second-test-key-value');
+  });
+
+  it('[negative] unable to set a property of non-existing NFT', async () => {
+    const collectionId = 0;
+    const maxNftId = 0xFFFFFFFF;
+
+    const tx = setNftProperty(api, alice, collectionId, maxNftId, 'test-key', 'test-value');
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  it('[negative] unable to set a property by not-an-owner', async () => {
+    const ownerAlice = alice;
+
+    const collectionId = await createTestCollection(alice);
+    const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft');
+
+    const tx = setNftProperty(api, bob, collectionId, nftId, 'test-key', 'test-key-value');
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('set a property to nested NFT', async () => {
+    const ownerAlice = alice;
+
+    const collectionId = await createTestCollection(alice);
+    const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft');
+    const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft');
+
+    const ownerNft: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft);
+
+    await setNftProperty(api, alice, collectionId, childNftId, 'test-key', 'test-key-value');
+  });
+
+  it('[negative] set a property to nested NFT (by not-root-owner)', async () => {
+    const ownerAlice = alice;
+
+    const collectionId = await createTestCollection(alice);
+    const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft');
+    const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft');
+
+    const ownerNft: NftIdTuple = [collectionId, parentNftId];
+
+    await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft);
+
+    const tx = setNftProperty(api, bob, collectionId, childNftId, 'test-key', 'test-key-value');
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/setNftProperty.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setNftProperty.test.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {NftIdTuple} from './util/fetch';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {createCollection, mintNft, sendNft, setNftProperty} from './util/tx';
-
-describe('integration test: set NFT property', () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-
-  const createTestCollection = async (issuerUri: string) => {
-    return await createCollection(
-      api,
-      issuerUri,
-      'setprop-nft-collection-metadata',
-      null,
-      'setprop',
-    );
-  };
-
-  it('set NFT property', async () => {
-    const ownerAlice = alice;
-
-    const collectionId = await createTestCollection(alice);
-    const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft');
-
-    await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'test-key-value');
-    await setNftProperty(api, alice, collectionId, nftId, 'test-key', 'updated-key-value');
-    await setNftProperty(api, alice, collectionId, nftId, 'second-test-key', 'second-test-key-value');
-  });
-
-  it('[negative] unable to set a property of non-existing NFT', async () => {
-    const collectionId = 0;
-    const maxNftId = 0xFFFFFFFF;
-
-    const tx = setNftProperty(api, alice, collectionId, maxNftId, 'test-key', 'test-value');
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  it('[negative] unable to set a property by not-an-owner', async () => {
-    const ownerAlice = alice;
-
-    const collectionId = await createTestCollection(alice);
-    const nftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-nft');
-
-    const tx = setNftProperty(api, bob, collectionId, nftId, 'test-key', 'test-key-value');
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('set a property to nested NFT', async () => {
-    const ownerAlice = alice;
-
-    const collectionId = await createTestCollection(alice);
-    const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft');
-    const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft');
-
-    const ownerNft: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft);
-
-    await setNftProperty(api, alice, collectionId, childNftId, 'test-key', 'test-key-value');
-  });
-
-  it('[negative] set a property to nested NFT (by not-root-owner)', async () => {
-    const ownerAlice = alice;
-
-    const collectionId = await createTestCollection(alice);
-    const parentNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-parent-nft');
-    const childNftId = await mintNft(api, alice, ownerAlice, collectionId, 'prop-child-nft');
-
-    const ownerNft: NftIdTuple = [collectionId, parentNftId];
-
-    await sendNft(api, 'sent', ownerAlice, collectionId, childNftId, ownerNft);
-
-    const tx = setNftProperty(api, bob, collectionId, childNftId, 'test-key', 'test-key-value');
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
addedtests/src/rmrk/setResourcePriorities.seqtest.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/rmrk/setResourcePriorities.seqtest.ts
@@ -0,0 +1,56 @@
+import {getApiConnection} from '../substrate/substrate-api';
+import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
+import {mintNft, createCollection, setResourcePriorities} from './util/tx';
+
+describe('integration test: set NFT resource priorities', () => {
+  let api: any;
+  before(async function () {
+    api = await getApiConnection();
+    await requirePallets(this, [Pallets.RmrkCore]);
+  });
+
+  const alice = '//Alice';
+  const bob = '//Bob';
+
+  const createTestCollection = (issuerUri: string) => {
+    return createCollection(
+      api,
+      issuerUri,
+      'resprio-collection-metadata',
+      null,
+      'resprio',
+    );
+  };
+
+  it('set NFT resource priorities', async () => {
+    const owner = alice;
+
+    const collectionId = await createTestCollection(alice);
+    const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata');
+
+    await setResourcePriorities(api, alice, collectionId, nftId, [10, 42]);
+  });
+
+  it('[negative] set NFT resource priorities by a not-an-owner', async () => {
+    const owner = alice;
+    const attacker = bob;
+
+    const collectionId = await createTestCollection(alice);
+    const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata');
+
+    const tx = setResourcePriorities(api, attacker, collectionId, nftId, [10, 42]);
+
+    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
+  });
+
+  it('[negative] set NFT resource priorities to non-existing NFT', async () => {
+    const collectionId = 0;
+    const maxNftId = 0xFFFFFFFF;
+
+    const tx = setResourcePriorities(api, alice, collectionId, maxNftId, [10, 42]);
+
+    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
+  });
+
+  after(async() => { await api.disconnect(); });
+});
deletedtests/src/rmrk/setResourcePriorities.test.tsdiffbeforeafterboth
--- a/tests/src/rmrk/setResourcePriorities.test.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import {getApiConnection} from '../substrate/substrate-api';
-import {expectTxFailure, requirePallets, Pallets} from './util/helpers';
-import {mintNft, createCollection, setResourcePriorities} from './util/tx';
-
-describe('integration test: set NFT resource priorities', () => {
-  let api: any;
-  before(async function () {
-    api = await getApiConnection();
-    await requirePallets(this, [Pallets.RmrkCore]);
-  });
-
-  const alice = '//Alice';
-  const bob = '//Bob';
-
-  const createTestCollection = (issuerUri: string) => {
-    return createCollection(
-      api,
-      issuerUri,
-      'resprio-collection-metadata',
-      null,
-      'resprio',
-    );
-  };
-
-  it('set NFT resource priorities', async () => {
-    const owner = alice;
-
-    const collectionId = await createTestCollection(alice);
-    const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata');
-
-    await setResourcePriorities(api, alice, collectionId, nftId, [10, 42]);
-  });
-
-  it('[negative] set NFT resource priorities by a not-an-owner', async () => {
-    const owner = alice;
-    const attacker = bob;
-
-    const collectionId = await createTestCollection(alice);
-    const nftId = await mintNft(api, alice, owner, collectionId, 'resprio-nft-metadata');
-
-    const tx = setResourcePriorities(api, attacker, collectionId, nftId, [10, 42]);
-
-    await expectTxFailure(/rmrkCore\.NoPermission/, tx);
-  });
-
-  it('[negative] set NFT resource priorities to non-existing NFT', async () => {
-    const owner = alice;
-
-    const collectionId = 0;
-    const maxNftId = 0xFFFFFFFF;
-
-    const tx = setResourcePriorities(api, alice, collectionId, maxNftId, [10, 42]);
-
-    await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);
-  });
-
-  after(async() => { await api.disconnect(); });
-});
modifiedtests/src/rmrk/util/fetch.tsdiffbeforeafterboth
--- a/tests/src/rmrk/util/fetch.ts
+++ b/tests/src/rmrk/util/fetch.ts
@@ -1,5 +1,5 @@
 import {ApiPromise} from '@polkadot/api';
-import type {Option, Bytes} from '@polkadot/types-codec';
+import type {Option} from '@polkadot/types-codec';
 import type {
   RmrkTraitsCollectionCollectionInfo as Collection,
   RmrkTraitsNftNftInfo as Nft,
modifiedtests/src/rmrk/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/rmrk/util/helpers.ts
+++ b/tests/src/rmrk/util/helpers.ts
@@ -149,7 +149,7 @@
 export function isTxResultSuccess(events: EventRecord[]): boolean {
   let success = false;
 
-  events.forEach(({event: {data, method, section}}) => {
+  events.forEach(({event: {method}}) => {
     if (method == 'ExtrinsicSuccess') {
       success = true;
     }
modifiedtests/src/rpc.test.tsdiffbeforeafterboth
--- a/tests/src/rpc.test.ts
+++ b/tests/src/rpc.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect} from './util/playgrounds';
+import {usingPlaygrounds, itSub, expect} from './util';
 import {CrossAccountId} from './util/playgrounds/unique';
 
 describe('integration test: RPC methods', () => {
@@ -25,7 +25,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor);
     });
   });
modifiedtests/src/setCollectionLimits.test.tsdiffbeforeafterboth
--- a/tests/src/setCollectionLimits.test.ts
+++ b/tests/src/setCollectionLimits.test.ts
@@ -16,7 +16,7 @@
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 const accountTokenOwnershipLimit = 0;
 const sponsoredDataSize = 0;
@@ -29,7 +29,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor);
     });
   });
@@ -104,7 +104,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([20n, 10n], donor);
     });
   });
modifiedtests/src/setCollectionSponsor.test.tsdiffbeforeafterboth
--- a/tests/src/setCollectionSponsor.test.ts
+++ b/tests/src/setCollectionSponsor.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect, Pallets} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect, Pallets} from './util';
 
 describe('integration test: ext. setCollectionSponsor():', () => {
   let alice: IKeyringPair;
@@ -24,7 +24,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor);
     });
   });
@@ -93,7 +93,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([10n, 5n], donor);
     });
   });
modifiedtests/src/setPermissions.test.tsdiffbeforeafterboth
--- a/tests/src/setPermissions.test.ts
+++ b/tests/src/setPermissions.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 describe('Integration Test: Set Permissions', () => {
   let alice: IKeyringPair;
@@ -23,7 +23,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor);
     });
   });
@@ -79,7 +79,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([10n, 10n], donor);
     });
   });
modifiedtests/src/transfer.test.tsdiffbeforeafterboth
--- a/tests/src/transfer.test.ts
+++ b/tests/src/transfer.test.ts
@@ -15,16 +15,17 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itEth, usingEthPlaygrounds} from './eth/util/playgrounds';
-import {itSub, Pallets, usingPlaygrounds, expect} from './util/playgrounds';
+import {itEth, usingEthPlaygrounds} from './eth/util';
+import {itSub, Pallets, usingPlaygrounds, expect} from './util';
 
 describe('Integration Test Transfer(recipient, collection_id, item_id, value)', () => {
+  let donor: IKeyringPair;
   let alice: IKeyringPair;
   let bob: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
     });
   });
@@ -42,8 +43,7 @@
     expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;
   });
 
-  itSub('Inability to pay fees error message is correct', async ({helper, privateKey}) => {
-    const donor = privateKey('//Alice');
+  itSub('Inability to pay fees error message is correct', async ({helper}) => {
     const [zero] = await helper.arrange.createAccounts([0n], donor);
 
     // console.error = () => {};
@@ -117,7 +117,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob] = await helper.arrange.createAccounts([50n, 10n], donor);
     });
   });
@@ -256,7 +256,7 @@
 
   before(async function() {
     await usingEthPlaygrounds(async (_, privateKey) => {
-      donor = privateKey('//Alice');
+      donor = await privateKey({filename: __filename});
     });
   });
   
modifiedtests/src/transferFrom.test.tsdiffbeforeafterboth
--- a/tests/src/transferFrom.test.ts
+++ b/tests/src/transferFrom.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, Pallets, usingPlaygrounds, expect} from './util';
 
 describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {
   let alice: IKeyringPair;
@@ -24,7 +24,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([20n, 10n, 10n], donor);
     });
   });
@@ -91,7 +91,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = privateKey('//Alice');
+      const donor = await privateKey({filename: __filename});
       [alice, bob, charlie] = await helper.arrange.createAccounts([50n, 10n, 10n], donor);
     });
   });
modifiedtests/src/tx-version-presence.test.tsdiffbeforeafterboth
--- a/tests/src/tx-version-presence.test.ts
+++ b/tests/src/tx-version-presence.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {Metadata} from '@polkadot/types';
-import {itSub, usingPlaygrounds, expect} from './util/playgrounds';
+import {itSub, usingPlaygrounds, expect} from './util';
 
 let metadata: Metadata;
 
addedtests/src/util/globalSetup.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/util/globalSetup.ts
@@ -0,0 +1,104 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+import {usingPlaygrounds, Pallets, DONOR_FUNDING, MINIMUM_DONOR_FUND} from './index';
+import * as path from 'path';
+import {promises as fs} from 'fs';
+
+// This function should be called before running test suites.
+const globalSetup = async (): Promise<void> => {
+  await usingPlaygrounds(async (helper, privateKey) => {
+    try {
+      // 1. Create donors for test files
+      await fundFilenamesWithRetries(3)
+        .then((result) => {
+          if (!result) Promise.reject();
+        });
+
+      // 2. Set up App Promotion admin 
+      const missingPallets = helper.fetchMissingPalletNames([Pallets.AppPromotion]);
+      if (missingPallets.length === 0) {
+        const superuser = await privateKey('//Alice');
+        const palletAddress = helper.arrange.calculatePalletAddress('appstake');
+        const palletAdmin = await privateKey('//PromotionAdmin');
+        const api = helper.getApi();
+        await helper.signTransaction(superuser, api.tx.sudo.sudo(api.tx.appPromotion.setAdminAddress({Substrate: palletAdmin.address})));
+        const nominal = helper.balance.getOneTokenNominal();
+        await helper.balance.transferToSubstrate(superuser, palletAdmin.address, 1000n * nominal);
+        await helper.balance.transferToSubstrate(superuser, palletAddress, 1000n * nominal);
+      }
+    } catch (error) {
+      console.error(error);
+      Promise.reject();
+    }
+  });
+};
+
+async function getFiles(rootPath: string): Promise<string[]> {
+  const files = await fs.readdir(rootPath, {withFileTypes: true});
+  const filenames: string[] = [];
+  for (const entry of files) {
+    const res = path.resolve(rootPath, entry.name);
+    if (entry.isDirectory()) {
+      filenames.push(...await getFiles(res));
+    } else {
+      filenames.push(res);
+    }
+  }
+  return filenames;
+}
+
+const fundFilenames = async () => {
+  await usingPlaygrounds(async (helper, privateKey) => {
+    const oneToken = helper.balance.getOneTokenNominal();
+    const alice = await privateKey('//Alice');
+    const nonce = await helper.chain.getNonce(alice.address);
+    const filenames = await getFiles(path.resolve(__dirname, '..'));
+
+    // batching is actually undesireable, it takes away the time while all the transactions actually succeed
+    const batchSize = 300;
+    let balanceGrantedCounter = 0;
+    for (let b = 0; b < filenames.length; b += batchSize) {
+      const tx = [];
+      let batchBalanceGrantedCounter = 0;
+      for (let i = 0; batchBalanceGrantedCounter < batchSize && b + i < filenames.length; i++) {
+        const f = filenames[b + i];
+        if (!f.endsWith('.test.ts') && !f.endsWith('seqtest.ts') || f.includes('.outdated')) continue;
+        const account = await privateKey({filename: f, ignoreFundsPresence: true});
+        const aliceBalance = await helper.balance.getSubstrate(account.address);
+
+        if (aliceBalance < MINIMUM_DONOR_FUND * oneToken) {
+          tx.push(helper.executeExtrinsic(
+            alice, 
+            'api.tx.balances.transfer',
+            [account.address, DONOR_FUNDING * oneToken],
+            true,
+            {nonce: nonce + balanceGrantedCounter++},
+          ).then(() => true).catch(() => {console.error(`Transaction to ${path.basename(f)} registered as failed. Strange.`); return false;}));
+          batchBalanceGrantedCounter++;
+        }
+      }
+
+      if(tx.length > 0) {
+        console.log(`Granting funds to ${batchBalanceGrantedCounter} filename accounts.`);
+        const result = await Promise.all(tx);
+        if (result && result.lastIndexOf(false) > -1) throw new Error('The transactions actually probably succeeded, should check the balances.');
+      }
+    }
+
+    if (balanceGrantedCounter == 0) console.log('No account needs additional funding.');
+  });
+};
+
+const fundFilenamesWithRetries = async (retriesLeft: number): Promise<boolean> => {
+  if (retriesLeft <= 0) return Promise.resolve(false);
+  return fundFilenames()
+    .then(() => Promise.resolve(true))
+    .catch(e => {
+      console.error(e);
+      console.error(`Some transactions might have failed. ${retriesLeft > 1 ? 'Retrying...' : 'Something is wrong.'}\n`);
+      return fundFilenamesWithRetries(--retriesLeft);
+    });
+};
+
+globalSetup().catch(() => process.exit(1));
addedtests/src/util/index.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/util/index.ts
@@ -0,0 +1,138 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+import * as path from 'path';
+import * as crypto from 'crypto';
+import {IKeyringPair} from '@polkadot/types/types';
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+import {Context} from 'mocha';
+import config from '../config';
+import {ChainHelperBase} from './playgrounds/unique';
+import {ILogger} from './playgrounds/types';
+import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper} from './playgrounds/unique.dev';
+
+chai.use(chaiAsPromised);
+export const expect = chai.expect;
+
+const getTestHash = (filename: string) => {
+  return crypto.createHash('md5').update(filename).digest('hex');
+};
+
+export const getTestSeed = (filename: string) => {
+  return `//Alice+${getTestHash(filename)}`;
+};
+
+async function usingPlaygroundsGeneral<T extends ChainHelperBase>(helperType: new(logger: ILogger) => T, url: string, code: (helper: T, privateKey: (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => Promise<IKeyringPair>) => Promise<void>) {
+  const silentConsole = new SilentConsole();
+  silentConsole.enable();
+
+  const helper = new helperType(new SilentLogger());
+
+  try {
+    await helper.connect(url);
+    const ss58Format = helper.chain.getChainProperties().ss58Format;
+    const privateKey = async (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => {
+      if (typeof seed === 'string') {
+        return helper.util.fromSeed(seed, ss58Format);
+      }
+      else {
+        const actualSeed = getTestSeed(seed.filename);
+        let account = helper.util.fromSeed(actualSeed, ss58Format);
+        // here's to hoping that no 
+        if (!seed.ignoreFundsPresence && ((helper as any)['balance'] == undefined || await (helper as any).balance.getSubstrate(account.address) < MINIMUM_DONOR_FUND)) {
+          console.warn(`${path.basename(seed.filename)}: Not enough funds present on the filename account. Using the default one as the donor instead.`);
+          account = helper.util.fromSeed('//Alice', ss58Format);
+        }
+        return account;
+      }
+    };
+    await code(helper, privateKey);
+  }
+  finally {
+    await helper.disconnect();
+    silentConsole.disable();
+  }
+}
+
+export const usingPlaygrounds = (code: (helper: DevUniqueHelper, privateKey: (seed: string | {filename: string, ignoreFundsPresence?: boolean}) => Promise<IKeyringPair>) => Promise<void>, url: string = config.substrateUrl) => {
+  return usingPlaygroundsGeneral<DevUniqueHelper>(DevUniqueHelper, url, code);
+};
+
+export const usingWestmintPlaygrounds = async (url: string, code: (helper: DevWestmintHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => {
+  return usingPlaygroundsGeneral<DevWestmintHelper>(DevWestmintHelper, url, code);
+};
+
+export const usingRelayPlaygrounds = async (url: string, code: (helper: DevRelayHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => {
+  return usingPlaygroundsGeneral<DevRelayHelper>(DevRelayHelper, url, code);
+};
+
+export const usingAcalaPlaygrounds = async (url: string, code: (helper: DevAcalaHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => {
+  return usingPlaygroundsGeneral<DevAcalaHelper>(DevAcalaHelper, url, code);
+};
+
+export const usingKaruraPlaygrounds = async (url: string, code: (helper: DevKaruraHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => {
+  return usingPlaygroundsGeneral<DevKaruraHelper>(DevAcalaHelper, url, code);
+};
+
+export const usingMoonbeamPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => {
+  return usingPlaygroundsGeneral<DevMoonbeamHelper>(DevMoonbeamHelper, url, code);
+};
+
+export const usingMoonriverPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => Promise<IKeyringPair>) => Promise<void>) => {
+  return usingPlaygroundsGeneral<DevMoonriverHelper>(DevMoonriverHelper, url, code);
+};
+
+export const MINIMUM_DONOR_FUND = 100_000n;
+export const DONOR_FUNDING = 1_000_000n;
+
+export enum Pallets {
+  Inflation = 'inflation',
+  RmrkCore = 'rmrkcore',
+  RmrkEquip = 'rmrkequip',
+  ReFungible = 'refungible',
+  Fungible = 'fungible',
+  NFT = 'nonfungible',
+  Scheduler = 'scheduler',
+  AppPromotion = 'apppromotion',
+}
+
+export function requirePalletsOrSkip(test: Context, helper: DevUniqueHelper, requiredPallets: string[]) {
+  const missingPallets = helper.fetchMissingPalletNames(requiredPallets);
+    
+  if (missingPallets.length > 0) {
+    const skipMsg = `\tSkipping test '${test.test?.title}'.\n\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`;
+    console.warn('\x1b[38:5:208m%s\x1b[0m', skipMsg);
+    test.skip();
+  }
+}
+
+export async function itSub(name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise<IKeyringPair> }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
+  (opts.only ? it.only : 
+    opts.skip ? it.skip : it)(name, async function () {
+    await usingPlaygrounds(async (helper, privateKey) => {
+      if (opts.requiredPallets) {
+        requirePalletsOrSkip(this, helper, opts.requiredPallets);
+      }
+      
+      await cb({helper, privateKey});
+    });
+  });
+}
+export async function itSubIfWithPallet(name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise<IKeyringPair> }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
+  return itSub(name, cb, {requiredPallets: required, ...opts});
+}
+itSub.only = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise<IKeyringPair> }) => any) => itSub(name, cb, {only: true});
+itSub.skip = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise<IKeyringPair> }) => any) => itSub(name, cb, {skip: true});
+
+itSubIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise<IKeyringPair> }) => any) => itSubIfWithPallet(name, required, cb, {only: true});
+itSubIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => Promise<IKeyringPair> }) => any) => itSubIfWithPallet(name, required, cb, {skip: true});
+itSub.ifWithPallets = itSubIfWithPallet;
+
+export async function describeXCM(title: string, fn: (this: Mocha.Suite) => void, opts: {skip?: boolean} = {}) {
+  (process.env.RUN_XCM_TESTS && !opts.skip
+    ? describe
+    : describe.skip)(title, fn);
+}
+
+describeXCM.skip = (name: string, fn: (this: Mocha.Suite) => void) => describeXCM(name, fn, {skip: true});
deletedtests/src/util/playgrounds/index.tsdiffbeforeafterboth
--- a/tests/src/util/playgrounds/index.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-import {IKeyringPair} from '@polkadot/types/types';
-import chai from 'chai';
-import chaiAsPromised from 'chai-as-promised';
-import {Context} from 'mocha';
-import config from '../../config';
-import '../../interfaces/augment-api-events';
-import {ChainHelperBase} from './unique';
-import {ILogger} from './types';
-import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper} from './unique.dev';
-
-chai.use(chaiAsPromised);
-export const expect = chai.expect;
-
-async function usingPlaygroundsGeneral<T extends ChainHelperBase>(helperType: new(logger: ILogger) => T, url: string, code: (helper: T, privateKey: (seed: string) => IKeyringPair) => Promise<void>) {
-  const silentConsole = new SilentConsole();
-  silentConsole.enable();
-
-  const helper = new helperType(new SilentLogger());
-
-  try {
-    await helper.connect(url);
-    const ss58Format = helper.chain.getChainProperties().ss58Format;
-    const privateKey = (seed: string) => helper.util.fromSeed(seed, ss58Format);
-    await code(helper, privateKey);
-  }
-  finally {
-    await helper.disconnect();
-    silentConsole.disable();
-  }
-}
-
-export const usingPlaygrounds = (code: (helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>, url: string = config.substrateUrl) => {
-  return usingPlaygroundsGeneral<DevUniqueHelper>(DevUniqueHelper, url, code);
-};
-
-export const usingWestmintPlaygrounds = async (url: string, code: (helper: DevWestmintHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  return usingPlaygroundsGeneral<DevWestmintHelper>(DevWestmintHelper, url, code);
-};
-
-export const usingRelayPlaygrounds = async (url: string, code: (helper: DevRelayHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  return usingPlaygroundsGeneral<DevRelayHelper>(DevRelayHelper, url, code);
-};
-
-export const usingAcalaPlaygrounds = async (url: string, code: (helper: DevAcalaHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  return usingPlaygroundsGeneral<DevAcalaHelper>(DevAcalaHelper, url, code);
-};
-
-export const usingKaruraPlaygrounds = async (url: string, code: (helper: DevKaruraHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  return usingPlaygroundsGeneral<DevKaruraHelper>(DevAcalaHelper, url, code);
-};
-
-export const usingMoonbeamPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  return usingPlaygroundsGeneral<DevMoonbeamHelper>(DevMoonbeamHelper, url, code);
-};
-
-export const usingMoonriverPlaygrounds = async (url: string, code: (helper: DevMoonbeamHelper, privateKey: (seed: string) => IKeyringPair) => Promise<void>) => {
-  return usingPlaygroundsGeneral<DevMoonriverHelper>(DevMoonriverHelper, url, code);
-};
-
-export enum Pallets {
-  Inflation = 'inflation',
-  RmrkCore = 'rmrkcore',
-  RmrkEquip = 'rmrkequip',
-  ReFungible = 'refungible',
-  Fungible = 'fungible',
-  NFT = 'nonfungible',
-  Scheduler = 'scheduler',
-  AppPromotion = 'apppromotion',
-}
-
-export function requirePalletsOrSkip(test: Context, helper: DevUniqueHelper, requiredPallets: string[]) {
-  const missingPallets = helper.fetchMissingPalletNames(requiredPallets);
-    
-  if (missingPallets.length > 0) {
-    const skipMsg = `\tSkipping test '${test.test?.title}'.\n\tThe following pallets are missing:\n\t- ${missingPallets.join('\n\t- ')}`;
-    console.warn('\x1b[38:5:208m%s\x1b[0m', skipMsg);
-    test.skip();
-  }
-}
-
-export async function itSub(name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
-  (opts.only ? it.only : 
-    opts.skip ? it.skip : it)(name, async function () {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      if (opts.requiredPallets) {
-        requirePalletsOrSkip(this, helper, opts.requiredPallets);
-      }
-      
-      await cb({helper, privateKey});
-    });
-  });
-}
-export async function itSubIfWithPallet(name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any, opts: { only?: boolean, skip?: boolean, requiredPallets?: string[] } = {}) {
-  return itSub(name, cb, {requiredPallets: required, ...opts});
-}
-itSub.only = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSub(name, cb, {only: true});
-itSub.skip = (name: string, cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSub(name, cb, {skip: true});
-
-itSubIfWithPallet.only = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSubIfWithPallet(name, required, cb, {only: true});
-itSubIfWithPallet.skip = (name: string, required: string[], cb: (apis: { helper: DevUniqueHelper, privateKey: (seed: string) => IKeyringPair }) => any) => itSubIfWithPallet(name, required, cb, {skip: true});
-itSub.ifWithPallets = itSubIfWithPallet;
-
-export async function describeXcm(name: string, cb: () => any) {
-  (
-    process.env.RUN_XCM_TESTS ? describe : describe.skip
-  )(name, cb);
-}
modifiedtests/src/util/playgrounds/unique.dev.tsdiffbeforeafterboth
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
2// SPDX-License-Identifier: Apache-2.02// SPDX-License-Identifier: Apache-2.0
33
4import {stringToU8a} from '@polkadot/util';
4import {mnemonicGenerate} from '@polkadot/util-crypto';5import {encodeAddress, mnemonicGenerate} from '@polkadot/util-crypto';
5import {UniqueHelper, MoonbeamHelper, ChainHelperBase, AcalaHelper, RelayHelper, WestmintHelper} from './unique';6import {UniqueHelper, MoonbeamHelper, ChainHelperBase, AcalaHelper, RelayHelper, WestmintHelper} from './unique';
6import {ApiPromise, Keyring, WsProvider} from '@polkadot/api';7import {ApiPromise, Keyring, WsProvider} from '@polkadot/api';
7import * as defs from '../../interfaces/definitions';8import * as defs from '../../interfaces/definitions';
197 };198 };
198199
199 let accountsCreated = false;200 let accountsCreated = false;
201 const maxBlocksChecked = await this.helper.arrange.isDevNode() ? 50 : 5;
200 // checkBalances retry up to 5 blocks202 // checkBalances retry up to 5-50 blocks
201 for (let index = 0; index < 5; index++) {203 for (let index = 0; index < maxBlocksChecked; index++) {
202 accountsCreated = await checkBalances();204 accountsCreated = await checkBalances();
203 if(accountsCreated) break;205 if(accountsCreated) break;
204 await wait.newBlocks(1);206 await wait.newBlocks(1);
258 };260 };
259261
260 isDevNode = async () => {262 isDevNode = async () => {
263 let blockNumber = (await this.helper.callRpc('api.query.system.number')).toJSON();
264 if (blockNumber == 0) {
265 await this.helper.wait.newBlocks(1);
266 blockNumber = (await this.helper.callRpc('api.query.system.number')).toJSON();
267 }
261 const block1 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [1])]);268 const block2 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [blockNumber])]);
262 const block2 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [2])]);269 const block1 = await this.helper.callRpc('api.rpc.chain.getBlock', [await this.helper.callRpc('api.rpc.chain.getBlockHash', [blockNumber - 1])]);
263 const findCreationDate = async (block: any) => {270 const findCreationDate = async (block: any) => {
264 const humanBlock = block.toHuman();271 const humanBlock = block.toHuman();
265 let date;272 let date;
286 return balance;293 return balance;
287 }294 }
295
296 calculatePalletAddress(palletId: any) {
297 const address = stringToU8a(('modl' + palletId).padEnd(32, '\0'));
298 return encodeAddress(address);
299 }
288}300}
289301
290class MoonbeamAccountGroup {302class MoonbeamAccountGroup {
modifiedtests/src/util/playgrounds/unique.tsdiffbeforeafterboth
--- a/tests/src/util/playgrounds/unique.ts
+++ b/tests/src/util/playgrounds/unique.ts
@@ -295,12 +295,12 @@
     return data.toHuman();
   }
 
-  public static extractEvents(records: ITransactionResult): IEvent[] {
+  public static extractEvents(events: {event: any, phase: any}[]): IEvent[] {
     const parsedEvents: IEvent[] = [];
 
-    records.result.events.forEach((record) => {
+    events.forEach((record) => {
       const {event, phase} = record;
-      const types = (event as any).typeDef;
+      const types = event.typeDef;
 
       const eventData: IEvent = {
         section: event.section.toString(),
@@ -550,7 +550,7 @@
     let events: IEvent[] = [];
     try {
       result = await this.signTransaction(sender, this.constructApiCall(extrinsic, params), options, extrinsic) as ITransactionResult;
-      events = this.eventHelper.extractEvents(result);
+      events = this.eventHelper.extractEvents(result.result.events);
     }
     catch(e) {
       if(!(e as object).hasOwnProperty('status')) throw e;
modifiedtests/src/xcm/xcmOpal.test.tsdiffbeforeafterboth
--- a/tests/src/xcm/xcmOpal.test.ts
+++ b/tests/src/xcm/xcmOpal.test.ts
@@ -16,7 +16,7 @@
 
 import {IKeyringPair} from '@polkadot/types/types';
 import config from '../config';
-import {itSub, expect, describeXcm, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util/playgrounds';
+import {itSub, expect, describeXCM, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util';
 
 const STATEMINE_CHAIN = 1000;
 const UNIQUE_CHAIN = 2095;
@@ -38,7 +38,7 @@
 // 10,000.00 (ten thousands) USDT
 const ASSET_AMOUNT = 1_000_000_000_000_000_000_000n; 
 
-describeXcm('[XCM] Integration test: Exchanging USDT with Westmint', () => {
+describeXCM('[XCM] Integration test: Exchanging USDT with Westmint', () => {
   let alice: IKeyringPair;
   let bob: IKeyringPair;
   
@@ -59,8 +59,8 @@
 
   before(async () => {
     await usingPlaygrounds(async (_helper, privateKey) => {
-      alice = privateKey('//Alice');
-      bob = privateKey('//Bob'); // funds donor
+      alice = await privateKey('//Alice');
+      bob = await privateKey('//Bob'); // funds donor
     });
 
     await usingWestmintPlaygrounds(westmintUrl, async (helper) => {
modifiedtests/src/xcm/xcmQuartz.test.tsdiffbeforeafterboth
--- a/tests/src/xcm/xcmQuartz.test.ts
+++ b/tests/src/xcm/xcmQuartz.test.ts
@@ -18,7 +18,7 @@
 import {blake2AsHex} from '@polkadot/util-crypto';
 import config from '../config';
 import {XcmV2TraitsOutcome, XcmV2TraitsError} from '../interfaces';
-import {itSub, expect, describeXcm, usingPlaygrounds, usingKaruraPlaygrounds, usingRelayPlaygrounds, usingMoonriverPlaygrounds} from '../util/playgrounds';
+import {itSub, expect, describeXCM, usingPlaygrounds, usingKaruraPlaygrounds, usingRelayPlaygrounds, usingMoonriverPlaygrounds} from '../util';
 
 const QUARTZ_CHAIN = 2095;
 const KARURA_CHAIN = 2000;
@@ -32,7 +32,7 @@
 
 const TRANSFER_AMOUNT = 2000000000000000000000000n;
 
-describeXcm('[XCM] Integration test: Exchanging tokens with Karura', () => {
+describeXCM('[XCM] Integration test: Exchanging tokens with Karura', () => {
   let alice: IKeyringPair;
   let randomAccount: IKeyringPair;
 
@@ -48,7 +48,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      alice = privateKey('//Alice');
+      alice = await privateKey('//Alice');
       [randomAccount] = await helper.arrange.createAccounts([0n], alice);
     });
 
@@ -207,12 +207,12 @@
 });
 
 // These tests are relevant only when the foreign asset pallet is disabled
-describeXcm('[XCM] Integration test: Quartz rejects non-native tokens', () => {
+describeXCM('[XCM] Integration test: Quartz rejects non-native tokens', () => {
   let alice: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (_helper, privateKey) => {
-      alice = privateKey('//Alice');
+      alice = await privateKey('//Alice');
     });
   });
 
@@ -331,9 +331,8 @@
     ).to.be.true;
   });
 });
-
-describeXcm('[XCM] Integration test: Exchanging QTZ with Moonriver', () => {
 
+describeXCM('[XCM] Integration test: Exchanging QTZ with Moonriver', () => {
   // Quartz constants
   let quartzDonor: IKeyringPair;
   let quartzAssetLocation;
@@ -369,7 +368,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      quartzDonor = privateKey('//Alice');
+      quartzDonor = await privateKey('//Alice');
       [randomAccountQuartz] = await helper.arrange.createAccounts([0n], quartzDonor);
 
       balanceForeignQtzTokenInit = 0n;
modifiedtests/src/xcm/xcmUnique.test.tsdiffbeforeafterboth
--- a/tests/src/xcm/xcmUnique.test.ts
+++ b/tests/src/xcm/xcmUnique.test.ts
@@ -18,7 +18,7 @@
 import {blake2AsHex} from '@polkadot/util-crypto';
 import config from '../config';
 import {XcmV2TraitsError, XcmV2TraitsOutcome} from '../interfaces';
-import {itSub, expect, describeXcm, usingPlaygrounds, usingAcalaPlaygrounds, usingRelayPlaygrounds, usingMoonbeamPlaygrounds} from '../util/playgrounds';
+import {itSub, expect, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingRelayPlaygrounds, usingMoonbeamPlaygrounds} from '../util';
 
 const UNIQUE_CHAIN = 2037;
 const ACALA_CHAIN = 2000;
@@ -32,7 +32,7 @@
 
 const TRANSFER_AMOUNT = 2000000000000000000000000n;
 
-describeXcm('[XCM] Integration test: Exchanging tokens with Acala', () => {
+describeXCM('[XCM] Integration test: Exchanging tokens with Acala', () => {
   let alice: IKeyringPair;
   let randomAccount: IKeyringPair;
 
@@ -48,7 +48,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      alice = privateKey('//Alice');
+      alice = await privateKey('//Alice');
       [randomAccount] = await helper.arrange.createAccounts([0n], alice);
     });
 
@@ -211,12 +211,12 @@
 });
 
 // These tests are relevant only when the foreign asset pallet is disabled
-describeXcm('[XCM] Integration test: Unique rejects non-native tokens', () => {
+describeXCM('[XCM] Integration test: Unique rejects non-native tokens', () => {
   let alice: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (_helper, privateKey) => {
-      alice = privateKey('//Alice');
+      alice = await privateKey('//Alice');
     });
   });
 
@@ -335,9 +335,8 @@
     ).to.be.true;
   });
 });
-
-describeXcm('[XCM] Integration test: Exchanging UNQ with Moonbeam', () => {
 
+describeXCM('[XCM] Integration test: Exchanging UNQ with Moonbeam', () => {
   // Unique constants
   let uniqueDonor: IKeyringPair;
   let uniqueAssetLocation;
@@ -373,7 +372,7 @@
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
-      uniqueDonor = privateKey('//Alice');
+      uniqueDonor = await privateKey('//Alice');
       [randomAccountUnique] = await helper.arrange.createAccounts([0n], uniqueDonor);
 
       balanceForeignUnqTokenInit = 0n;
modifiedtests/yarn.lockdiffbeforeafterboth
--- a/tests/yarn.lock
+++ b/tests/yarn.lock
@@ -17,49 +17,49 @@
   dependencies:
     "@babel/highlight" "^7.18.6"
 
-"@babel/compat-data@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.0.tgz#2a592fd89bacb1fcde68de31bee4f2f2dacb0e86"
-  integrity sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==
+"@babel/compat-data@^7.19.3":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747"
+  integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==
 
-"@babel/core@^7.18.10":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.0.tgz#d2f5f4f2033c00de8096be3c9f45772563e150c3"
-  integrity sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==
+"@babel/core@^7.19.3":
+  version "7.19.3"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c"
+  integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==
   dependencies:
     "@ampproject/remapping" "^2.1.0"
     "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.19.0"
-    "@babel/helper-compilation-targets" "^7.19.0"
+    "@babel/generator" "^7.19.3"
+    "@babel/helper-compilation-targets" "^7.19.3"
     "@babel/helper-module-transforms" "^7.19.0"
     "@babel/helpers" "^7.19.0"
-    "@babel/parser" "^7.19.0"
+    "@babel/parser" "^7.19.3"
     "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.19.0"
-    "@babel/types" "^7.19.0"
+    "@babel/traverse" "^7.19.3"
+    "@babel/types" "^7.19.3"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
     json5 "^2.2.1"
     semver "^6.3.0"
 
-"@babel/generator@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a"
-  integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==
+"@babel/generator@^7.19.3", "@babel/generator@^7.19.4":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.4.tgz#60050cf3f0a593d7b2471b4be4f62a56b949237f"
+  integrity sha512-5T2lY5vXqS+5UEit/5TwcIUeCnwgCljcF8IQRT6XRQPBrvLeq5V8W+URv+GvwoF3FP8tkhp++evVyDzkDGzNmA==
   dependencies:
-    "@babel/types" "^7.19.0"
+    "@babel/types" "^7.19.4"
     "@jridgewell/gen-mapping" "^0.3.2"
     jsesc "^2.5.1"
 
-"@babel/helper-compilation-targets@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz#537ec8339d53e806ed422f1e06c8f17d55b96bb0"
-  integrity sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==
+"@babel/helper-compilation-targets@^7.19.3":
+  version "7.19.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca"
+  integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==
   dependencies:
-    "@babel/compat-data" "^7.19.0"
+    "@babel/compat-data" "^7.19.3"
     "@babel/helper-validator-option" "^7.18.6"
-    browserslist "^4.20.2"
+    browserslist "^4.21.3"
     semver "^6.3.0"
 
 "@babel/helper-environment-visitor@^7.18.9":
@@ -104,11 +104,11 @@
     "@babel/types" "^7.19.0"
 
 "@babel/helper-simple-access@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
-  integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7"
+  integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==
   dependencies:
-    "@babel/types" "^7.18.6"
+    "@babel/types" "^7.19.4"
 
 "@babel/helper-split-export-declaration@^7.18.6":
   version "7.18.6"
@@ -117,15 +117,15 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
-"@babel/helper-string-parser@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
-  integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
+"@babel/helper-string-parser@^7.19.4":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
+  integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
 
-"@babel/helper-validator-identifier@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
-  integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
+"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
+  version "7.19.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
+  integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
 
 "@babel/helper-validator-option@^7.18.6":
   version "7.18.6"
@@ -133,13 +133,13 @@
   integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
 
 "@babel/helpers@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18"
-  integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5"
+  integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==
   dependencies:
     "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.19.0"
-    "@babel/types" "^7.19.0"
+    "@babel/traverse" "^7.19.4"
+    "@babel/types" "^7.19.4"
 
 "@babel/highlight@^7.18.6":
   version "7.18.6"
@@ -150,10 +150,10 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.18.10", "@babel/parser@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.0.tgz#497fcafb1d5b61376959c1c338745ef0577aa02c"
-  integrity sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==
+"@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.19.4":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.4.tgz#03c4339d2b8971eb3beca5252bafd9b9f79db3dc"
+  integrity sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==
 
 "@babel/register@^7.18.9":
   version "7.18.9"
@@ -166,10 +166,10 @@
     pirates "^4.0.5"
     source-map-support "^0.5.16"
 
-"@babel/runtime@^7.18.9":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259"
-  integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==
+"@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78"
+  integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==
   dependencies:
     regenerator-runtime "^0.13.4"
 
@@ -182,29 +182,29 @@
     "@babel/parser" "^7.18.10"
     "@babel/types" "^7.18.10"
 
-"@babel/traverse@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.0.tgz#eb9c561c7360005c592cc645abafe0c3c4548eed"
-  integrity sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==
+"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.4.tgz#f117820e18b1e59448a6c1fa9d0ff08f7ac459a8"
+  integrity sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==
   dependencies:
     "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.19.0"
+    "@babel/generator" "^7.19.4"
     "@babel/helper-environment-visitor" "^7.18.9"
     "@babel/helper-function-name" "^7.19.0"
     "@babel/helper-hoist-variables" "^7.18.6"
     "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/parser" "^7.19.0"
-    "@babel/types" "^7.19.0"
+    "@babel/parser" "^7.19.4"
+    "@babel/types" "^7.19.4"
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0":
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600"
-  integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==
+"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4":
+  version "7.19.4"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7"
+  integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==
   dependencies:
-    "@babel/helper-string-parser" "^7.18.10"
-    "@babel/helper-validator-identifier" "^7.18.6"
+    "@babel/helper-string-parser" "^7.19.4"
+    "@babel/helper-validator-identifier" "^7.19.1"
     to-fast-properties "^2.0.0"
 
 "@cspotcode/source-map-support@^0.8.0":
@@ -214,10 +214,10 @@
   dependencies:
     "@jridgewell/trace-mapping" "0.3.9"
 
-"@eslint/eslintrc@^1.3.1":
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.1.tgz#de0807bfeffc37b964a7d0400e0c348ce5a2543d"
-  integrity sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==
+"@eslint/eslintrc@^1.3.3":
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95"
+  integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
@@ -354,9 +354,9 @@
   integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
 
 "@ethersproject/networks@^5.7.0":
-  version "5.7.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad"
-  integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
+  integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
   dependencies:
     "@ethersproject/logger" "^5.7.0"
 
@@ -412,9 +412,9 @@
     "@ethersproject/signing-key" "^5.7.0"
 
 "@ethersproject/web@^5.7.0":
-  version "5.7.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc"
-  integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
+  integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
   dependencies:
     "@ethersproject/base64" "^5.7.0"
     "@ethersproject/bytes" "^5.7.0"
@@ -422,19 +422,14 @@
     "@ethersproject/properties" "^5.7.0"
     "@ethersproject/strings" "^5.7.0"
 
-"@humanwhocodes/config-array@^0.10.4":
-  version "0.10.4"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c"
-  integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==
+"@humanwhocodes/config-array@^0.10.5":
+  version "0.10.7"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc"
+  integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==
   dependencies:
     "@humanwhocodes/object-schema" "^1.2.1"
     debug "^4.1.1"
     minimatch "^3.0.4"
-
-"@humanwhocodes/gitignore-to-minimatch@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
-  integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
 
 "@humanwhocodes/module-importer@^1.0.1":
   version "1.0.1"
@@ -463,7 +458,7 @@
     "@jridgewell/sourcemap-codec" "^1.4.10"
     "@jridgewell/trace-mapping" "^0.3.9"
 
-"@jridgewell/resolve-uri@^3.0.3":
+"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3":
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
   integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
@@ -473,7 +468,7 @@
   resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
   integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
 
-"@jridgewell/sourcemap-codec@^1.4.10":
+"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
   version "1.4.14"
   resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
   integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
@@ -487,22 +482,22 @@
     "@jridgewell/sourcemap-codec" "^1.4.10"
 
 "@jridgewell/trace-mapping@^0.3.9":
-  version "0.3.15"
-  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774"
-  integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==
+  version "0.3.16"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz#a7982f16c18cae02be36274365433e5b49d7b23f"
+  integrity sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==
   dependencies:
-    "@jridgewell/resolve-uri" "^3.0.3"
-    "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/resolve-uri" "3.1.0"
+    "@jridgewell/sourcemap-codec" "1.4.14"
 
-"@noble/hashes@1.1.2":
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183"
-  integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==
+"@noble/hashes@1.1.3":
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111"
+  integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==
 
-"@noble/secp256k1@1.6.3":
-  version "1.6.3"
-  resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94"
-  integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==
+"@noble/secp256k1@1.7.0":
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1"
+  integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw==
 
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
@@ -525,139 +520,139 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
-"@polkadot/api-augment@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-9.2.2.tgz#fab9dd96f9322ae658245cd8711fd2d8db5c2412"
-  integrity sha512-yDtp1ecRWMCFXTjmKOvqXI6VHTYvHormRwJwE85VGQbMsZFDWFVbQXZOxsqkfx2rJye/25seVRWxQS+7oKzqkA==
+"@polkadot/api-augment@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-9.5.1.tgz#f4ae75837782dd09c2f7468f78c17626c359797d"
+  integrity sha512-9NQ2miIKVJvyhR2Zhk0XcHA+pgnWhQ0815lqcq0kz9ny5JHUFeGlNtxECw7AEnxoiC81EqpfWkOHpJpfiIcOmw==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/api-base" "9.2.2"
-    "@polkadot/rpc-augment" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-augment" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/util" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/api-base" "9.5.1"
+    "@polkadot/rpc-augment" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-augment" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/util" "^10.1.10"
 
-"@polkadot/api-base@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-9.2.2.tgz#f84cbf1eb1893e9c8eb538369c8b349f3d64d5fd"
-  integrity sha512-Dqbh0MQo/ByAqOC56ga1VkVCpEjfWtxPHz3ni8oXJp0YvjA/4qKkZRM2ejoN07XKOMFNBZC4hnmNplyaCnVHfw==
+"@polkadot/api-base@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-9.5.1.tgz#f6084ebd21c4c43e3c11a7d638621d27162c5fcc"
+  integrity sha512-3qsMsIhYbU3zp+YnP5h6Hg98y3B+FrxgPW7r2Uk6Kp1uSPmIzhMCyGuxur/BAcDVbd3KME+zWLHJDYOdyhuUwQ==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/rpc-core" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    rxjs "^7.5.6"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/rpc-core" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    rxjs "^7.5.7"
 
-"@polkadot/api-contract@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-9.2.2.tgz#1b8c1c6a4fb2f5e21d0c9549062c8242453a15b5"
-  integrity sha512-NE2QbBtX7e/lXdOG5wFqArjnbujcVWppoksvX1SrG2GKdhM2Y/shHLNV7uCYMq3tqmmCKOcp0RKE85Owu/7LQA==
+"@polkadot/api-contract@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-9.5.1.tgz#ba45c9150610477f5d05509414f7330b6175ecdd"
+  integrity sha512-BfI1Yi2R0eZ076F4v4UZklQ+8WS0g8QZ9g2716FoNTGGYogUeMQ/8gZWIJaAyylCypN/ucNLdpSmSTnhR59jCw==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/api" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/types-create" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/util-crypto" "^10.1.4"
-    rxjs "^7.5.6"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/api" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/types-create" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/util-crypto" "^10.1.10"
+    rxjs "^7.5.7"
 
-"@polkadot/api-derive@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-9.2.2.tgz#70b510d8140f081ef145b9bdf4f8a03108183192"
-  integrity sha512-8Du6Wxro5yhAgwJ7R8xWCrDFnAWGv6aDWVnpckUZWs9LRw5wGNN4GJD4WB/715H9ZZXzQ/sDW5lXo3ux19SE7w==
+"@polkadot/api-derive@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-9.5.1.tgz#8542b989c34249df5ec3b836ec10b910897620df"
+  integrity sha512-fKlKQe8WZ3jrm44w/zptMofljW5qj+jZxnryK08CAH/MINlZArPfCtn+EJla2ND9aTnRMUWlEBtytyCPImI/Hg==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/api" "9.2.2"
-    "@polkadot/api-augment" "9.2.2"
-    "@polkadot/api-base" "9.2.2"
-    "@polkadot/rpc-core" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/util-crypto" "^10.1.4"
-    rxjs "^7.5.6"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/api" "9.5.1"
+    "@polkadot/api-augment" "9.5.1"
+    "@polkadot/api-base" "9.5.1"
+    "@polkadot/rpc-core" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/util-crypto" "^10.1.10"
+    rxjs "^7.5.7"
 
-"@polkadot/api@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-9.2.2.tgz#3ecd80110acf5e479ce510d301e3a7ce2c1b8f17"
-  integrity sha512-dRXfdGhV3XWRtsYt+OskAwSAimTRC1k/oh3yO1vYc7C9cmqssw0LMEib9mlVh7qHprD30db7NleTOSFU6Bt2ag==
+"@polkadot/api@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-9.5.1.tgz#3501dac23bf82986dfe0a8c22857eb86610eca61"
+  integrity sha512-A2i/+mCl6cbFJ84ExMcWosUDfq0gVvzyKftkbRMs0oDzvHVVucTm0nCCzBgi/ltvSsFq8oJQ4pVqNTfT/IXgeQ==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/api-augment" "9.2.2"
-    "@polkadot/api-base" "9.2.2"
-    "@polkadot/api-derive" "9.2.2"
-    "@polkadot/keyring" "^10.1.4"
-    "@polkadot/rpc-augment" "9.2.2"
-    "@polkadot/rpc-core" "9.2.2"
-    "@polkadot/rpc-provider" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-augment" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/types-create" "9.2.2"
-    "@polkadot/types-known" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/util-crypto" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/api-augment" "9.5.1"
+    "@polkadot/api-base" "9.5.1"
+    "@polkadot/api-derive" "9.5.1"
+    "@polkadot/keyring" "^10.1.10"
+    "@polkadot/rpc-augment" "9.5.1"
+    "@polkadot/rpc-core" "9.5.1"
+    "@polkadot/rpc-provider" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-augment" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/types-create" "9.5.1"
+    "@polkadot/types-known" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/util-crypto" "^10.1.10"
     eventemitter3 "^4.0.7"
-    rxjs "^7.5.6"
+    rxjs "^7.5.7"
 
-"@polkadot/keyring@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-10.1.7.tgz#d51be1dc5807c961889847d8f0e10e4bbdd19d3f"
-  integrity sha512-lArwaAS3hDs+HHupDIC4r2mFaAfmNQV2YzwL2wM5zhOqB2RugN03BFrgwNll0y9/Bg8rYDqM3Y5BvVMzgMZ6XA==
+"@polkadot/keyring@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-10.1.10.tgz#f9d97ab528e612df4820e0df1837faae51c15904"
+  integrity sha512-crKYBbwmPcFoTP6mby2+o1QWsjAyi5QlKzU8tXuXOApP6SBuqmDujIuLOKNG2vZoftNdVldsVL0WmKVYtBeuQg==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/util" "10.1.7"
-    "@polkadot/util-crypto" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/util" "10.1.10"
+    "@polkadot/util-crypto" "10.1.10"
 
-"@polkadot/networks@10.1.7", "@polkadot/networks@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-10.1.7.tgz#33b38d70409e2daf0990ef18ff150c6718ffb700"
-  integrity sha512-ol864SZ/GwAF72GQOPRy+Y9r6NtgJJjMBlDLESvV5VK64eEB0MRSSyiOdd7y/4SumR9crrrNimx3ynACFgxZ8A==
+"@polkadot/networks@10.1.10", "@polkadot/networks@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-10.1.10.tgz#421ce200f8b26759edd1d9d9408d934527f5b455"
+  integrity sha512-Db78t2XnFIZbdSdu1aFuj3/1cNwcSzG/+wNrpCQ9dPhnGPy5S1GVbmU8pyxTftPKdTFc+8RdBr+5bc0d5ijGiA==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/util" "10.1.7"
-    "@substrate/ss58-registry" "^1.28.0"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/util" "10.1.10"
+    "@substrate/ss58-registry" "^1.31.0"
 
-"@polkadot/rpc-augment@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-9.2.2.tgz#7246e6a43536296ad19be8460a81e434d718ff4c"
-  integrity sha512-LbluIgoFtFtN/PTLk0kPErPgMPwj1+ySLn1bNlWjshoE00NeYAIltin9j11iT9g4Zpb+ppSWpsrhO/5crGqERQ==
+"@polkadot/rpc-augment@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-9.5.1.tgz#a4d8d7c6132375c9f4d50c7cb4c6813ff700937f"
+  integrity sha512-7Qm6oIoVIqv6VOaIqDal45hUTb3TVZ58S3zkSr60p/dPMlGCaFMcojtfcQErHtCW0hgvzFNsDl9ShpXRcPWu7g==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/rpc-core" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/util" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/rpc-core" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/util" "^10.1.10"
 
-"@polkadot/rpc-core@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-9.2.2.tgz#96b9fd033ecf0d4edf5f2f48c958a1991776b332"
-  integrity sha512-D+rmC7etJVvlDb7debjF1HDvjqvRnx/b3j7zKpJ3IjjVKWiYyCgQvcyyLyX4lH1f3PHOfEJZP6Q8FNA8B2U7XA==
+"@polkadot/rpc-core@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-9.5.1.tgz#7c327d735b742aaaee856bce6288331d0b2b042f"
+  integrity sha512-8CXgBVTEUjeuN5VOwS6MjTeqpN+9qrNJAAwNEba36/72g6Wgg3flza11kx0luQ6OLPVgCM7OcAjZ17p16phXDA==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/rpc-augment" "9.2.2"
-    "@polkadot/rpc-provider" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    rxjs "^7.5.6"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/rpc-augment" "9.5.1"
+    "@polkadot/rpc-provider" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    rxjs "^7.5.7"
 
-"@polkadot/rpc-provider@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-9.2.2.tgz#14453b8e80d4f0826dbcbf4e749d5a9397cb6905"
-  integrity sha512-QnUql17q9ByP+7IyouXJDUPjkvOB1ciCGTwzf98WlOQxr/OEwcaWx0axHSVtMQyhX06ciVIbyI9hIjV5cfT78A==
+"@polkadot/rpc-provider@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-9.5.1.tgz#1857b655a461820025b85cf3a7e7a58066ede137"
+  integrity sha512-CxyEo1SzwbcByUsrW5RUm5GTLNK7yjmVlTMseex8zQLO4+4erqUoQzr6TTIPSt4LWyk+TjbZdtGtlt7p6i2nJg==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/keyring" "^10.1.4"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-support" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/util-crypto" "^10.1.4"
-    "@polkadot/x-fetch" "^10.1.4"
-    "@polkadot/x-global" "^10.1.4"
-    "@polkadot/x-ws" "^10.1.4"
-    "@substrate/connect" "0.7.10"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/keyring" "^10.1.10"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-support" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/util-crypto" "^10.1.10"
+    "@polkadot/x-fetch" "^10.1.10"
+    "@polkadot/x-global" "^10.1.10"
+    "@polkadot/x-ws" "^10.1.10"
+    "@substrate/connect" "0.7.14"
     eventemitter3 "^4.0.7"
     mock-socket "^9.1.5"
     nock "^13.2.9"
@@ -669,119 +664,119 @@
   dependencies:
     "@types/chrome" "^0.0.171"
 
-"@polkadot/typegen@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-9.2.2.tgz#e99ec0c8b6a73e302ab6015008c16a969908a794"
-  integrity sha512-Bh7cvvT45Vw0A5yJDb4Pp+gIsMaqDg1x/p7QpBFf/RbPL6bORC3hBOxwa36m+RyWhYggNycoxfnKz5eAsdjCFQ==
+"@polkadot/typegen@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-9.5.1.tgz#deb74a4bbabd205d68f2b3d59793b3234cfc8c00"
+  integrity sha512-SKLiXHUpSCBop8dd1P/LCN2R5GpM41QSOmRyNVnhgOKPtmB/vxS2pVNvMDl7dOhQkANCO6E2CWZiIPeWlu/G7Q==
   dependencies:
-    "@babel/core" "^7.18.10"
+    "@babel/core" "^7.19.3"
     "@babel/register" "^7.18.9"
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/api" "9.2.2"
-    "@polkadot/api-augment" "9.2.2"
-    "@polkadot/rpc-augment" "9.2.2"
-    "@polkadot/rpc-provider" "9.2.2"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-augment" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/types-create" "9.2.2"
-    "@polkadot/types-support" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/util-crypto" "^10.1.4"
-    "@polkadot/x-ws" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/api" "9.5.1"
+    "@polkadot/api-augment" "9.5.1"
+    "@polkadot/rpc-augment" "9.5.1"
+    "@polkadot/rpc-provider" "9.5.1"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-augment" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/types-create" "9.5.1"
+    "@polkadot/types-support" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/util-crypto" "^10.1.10"
+    "@polkadot/x-ws" "^10.1.10"
     handlebars "^4.7.7"
     websocket "^1.0.34"
-    yargs "^17.5.1"
+    yargs "^17.6.0"
 
-"@polkadot/types-augment@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-9.2.2.tgz#3ec2aff0a86287f9f9f4ddb0aa5430450d4a684f"
-  integrity sha512-OyAC/WxNYrJjVp8NXklAeg/380BnFCBo4YgEOT4EhXK8fWzKzanvFAFROKAg78JQBI4LRJKkRyAEWIEzMNGR1Q==
+"@polkadot/types-augment@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-9.5.1.tgz#907d05da7cf0891cdf6d59e2387a3394a978a5c9"
+  integrity sha512-1AzQpGe5bGttYbbjR1UhV19htsFjgqJ651eyT3YdRqo1hotZ2GwTCkGXuTJtcmQQH9G09xUUwS3nx8WsSyQ70A==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/util" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/util" "^10.1.10"
 
-"@polkadot/types-codec@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-9.2.2.tgz#8ab24d6208cce7e6abf3c352742045062b7ff588"
-  integrity sha512-p6E31UQ9Hq0KwKXz5wBXvzrus3v7fY3yHR9EkR8eZvG7rBIHST42JPlfXIxKmnkkXkMxIX1LNSHQy0A8EikVxQ==
+"@polkadot/types-codec@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-9.5.1.tgz#d0c04a9f7dd8337dce4fe806e634c4ef99f954cc"
+  integrity sha512-7Dy8TeApu4lN8DqdMZLuh34ocdHQh9jzAob6cQl1fl1ypOiCO/SwPjFkj0Xnhh7QQz9X9w63jZzbaFR3PPT+0g==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/x-bigint" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/x-bigint" "^10.1.10"
 
-"@polkadot/types-create@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-9.2.2.tgz#d1e3cf945a0c95b31999673add738c4d585543d8"
-  integrity sha512-byGoFbkwpMHuqRwZXoD3lrTRkgIB89GlZlXJIfBuNeGE84nWktPCuZw3hBm5LO/qIgp5RFjdfeOCmBvxQ0fzQg==
+"@polkadot/types-create@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-9.5.1.tgz#06f71f08b3c68fb3bbdabe838325c955384d59bd"
+  integrity sha512-pUQ1U0mho5aKRdi4iR9DP9ldIoj9U+ApHIeYyxkBY8RexMQOpkt8PZfpFhg4z2H5vZj/sgNIBXq65HjXuyu+9w==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/util" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/util" "^10.1.10"
 
-"@polkadot/types-known@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-9.2.2.tgz#0d3d70eb37796aac06c874cd2b2bc97464f00e6a"
-  integrity sha512-WHkgoMJg0ZzxOainMjvGhaIa8/m/zwmhH1P+0UqLoZf+oE9EUkjPJaG5oETz4YUa3Nb8uuHfdMl6c5xN3DMIaQ==
+"@polkadot/types-known@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-9.5.1.tgz#0eb596078733a96f2cff3d5b4258966f4a6e4a5a"
+  integrity sha512-SedfPDxJREYPATa7X2Fv26z6UVPYv6v9Z9P4nulnC6Yl8C2+Q4A/VIqTtgsJc0DU1YT3gM8ofVxircfHqqRVNA==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/networks" "^10.1.4"
-    "@polkadot/types" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/types-create" "9.2.2"
-    "@polkadot/util" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/networks" "^10.1.10"
+    "@polkadot/types" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/types-create" "9.5.1"
+    "@polkadot/util" "^10.1.10"
 
-"@polkadot/types-support@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-9.2.2.tgz#d695b54b466bb47c0b376d07e9853d1ae3b17d5e"
-  integrity sha512-JNcdTyMKGETV7pjE4eZ8eBs82c4ZSY7n1R1/xT/tNZNA6uNdukBxOOkyRHdu5ugEehwCMSpOgruMCNH9e77zLg==
+"@polkadot/types-support@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-9.5.1.tgz#5383cd84375aedd67bf0ccd2fa230d811f4b9dc9"
+  integrity sha512-mjenEGNT/ReY1xFexb37NDgV7QHHBBfWt31ZQMZKDkQL+R2P0rXFpmitcE3eOCV3oY4mf+GaU2N/ZfnsFl3tPQ==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/util" "^10.1.4"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/util" "^10.1.10"
 
-"@polkadot/types@9.2.2":
-  version "9.2.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-9.2.2.tgz#b74d098ed8c725f961c3d95b610c49bde1cf5334"
-  integrity sha512-sDpS/m9oeihkYAYljZzp7xfMkJDLP5nLHSKkLdrh6H9XDVQnKgzJ19/kuAHsU8FCa9E37Al3aSQf/+NR+kCfZw==
+"@polkadot/types@9.5.1":
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-9.5.1.tgz#5f3891ce45d8d78aa0b5bc65d7517d98342699b0"
+  integrity sha512-xuhYq+O4JRl2iqLVEwKVHnfOA9AfwoNlHzrFx2DChDcIWdmgmUDASq9TkZhBP+jx81SieMH7iTf4zY6UwPKYQw==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/keyring" "^10.1.4"
-    "@polkadot/types-augment" "9.2.2"
-    "@polkadot/types-codec" "9.2.2"
-    "@polkadot/types-create" "9.2.2"
-    "@polkadot/util" "^10.1.4"
-    "@polkadot/util-crypto" "^10.1.4"
-    rxjs "^7.5.6"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/keyring" "^10.1.10"
+    "@polkadot/types-augment" "9.5.1"
+    "@polkadot/types-codec" "9.5.1"
+    "@polkadot/types-create" "9.5.1"
+    "@polkadot/util" "^10.1.10"
+    "@polkadot/util-crypto" "^10.1.10"
+    rxjs "^7.5.7"
 
-"@polkadot/util-crypto@10.1.7", "@polkadot/util-crypto@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-10.1.7.tgz#fe5ea006bf23ae19319f3ac9236905a984a65e2f"
-  integrity sha512-zGmSU7a0wdWfpDtfc+Q7fUuW+extu9o1Uh4JpkuwwZ/dxmyW5xlfqVsIScM1pdPyjJsyamX8KwsKiVsW4slasg==
+"@polkadot/util-crypto@10.1.10", "@polkadot/util-crypto@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-10.1.10.tgz#ae00c794dda6a2f5e40cdaaa87987312461dc59f"
+  integrity sha512-w9h/wf4wZXeUkRnihhnfqlaKuoQtrjkjK3C5liCQkr9vx5zOsmg/nMSDP8UUFJX0msPPYpFeNvzn7oDIs6qSZA==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@noble/hashes" "1.1.2"
-    "@noble/secp256k1" "1.6.3"
-    "@polkadot/networks" "10.1.7"
-    "@polkadot/util" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@noble/hashes" "1.1.3"
+    "@noble/secp256k1" "1.7.0"
+    "@polkadot/networks" "10.1.10"
+    "@polkadot/util" "10.1.10"
     "@polkadot/wasm-crypto" "^6.3.1"
-    "@polkadot/x-bigint" "10.1.7"
-    "@polkadot/x-randomvalues" "10.1.7"
+    "@polkadot/x-bigint" "10.1.10"
+    "@polkadot/x-randomvalues" "10.1.10"
     "@scure/base" "1.1.1"
     ed2curve "^0.3.0"
     tweetnacl "^1.0.3"
 
-"@polkadot/util@10.1.7", "@polkadot/util@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-10.1.7.tgz#c54ca2a5b29cb834b40d8a876baefa3a0efb93af"
-  integrity sha512-s7gDLdNb4HUpoe3faXwoO6HwiUp8pi66voYKiUYRh1kEtW1o9vGBgyZPHPGC/FBgILzTJKii/9XxnSex60zBTA==
+"@polkadot/util@10.1.10", "@polkadot/util@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-10.1.10.tgz#dc79c93d70e699e8cc1b09e636af7e4a64c5f0f0"
+  integrity sha512-BQoTfSxZ3BWAgWDjgKBVdyw1AJGaoOeAidCA+LZcHV6wlMu5643AZPUnoMrW413MbbpxsIhJXtNttqOwjo8MjA==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-bigint" "10.1.7"
-    "@polkadot/x-global" "10.1.7"
-    "@polkadot/x-textdecoder" "10.1.7"
-    "@polkadot/x-textencoder" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-bigint" "10.1.10"
+    "@polkadot/x-global" "10.1.10"
+    "@polkadot/x-textdecoder" "10.1.10"
+    "@polkadot/x-textencoder" "10.1.10"
     "@types/bn.js" "^5.1.1"
     bn.js "^5.2.1"
 
@@ -836,62 +831,62 @@
   dependencies:
     "@babel/runtime" "^7.18.9"
 
-"@polkadot/x-bigint@10.1.7", "@polkadot/x-bigint@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-10.1.7.tgz#1338689476ffdbb9f9cb243df1954ae8186134b9"
-  integrity sha512-uaClHpI6cnDumIfejUKvNTkB43JleEb0V6OIufDKJ/e1aCLE3f/Ws9ggwL8ea05lQP5k5xqOzbPdizi/UvrgKQ==
+"@polkadot/x-bigint@10.1.10", "@polkadot/x-bigint@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-10.1.10.tgz#97dcccda2e24776aad3ae49f3268c03332138246"
+  integrity sha512-4Jt0BO0WTby6r9A2DgkDxf/LFaICQHvSl1VSFtBf0Z0GV2n4OxkBX5x/1bdEdGEvYT5rM7RbR3xI7EL+W1ixHA==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-global" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-global" "10.1.10"
 
-"@polkadot/x-fetch@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-10.1.7.tgz#1b76051a495563403a20ef235a8558c6d91b11a6"
-  integrity sha512-NL+xrlqUoCLwCIAvQLwOA189gSUgeSGOFjCmZ9uMkBqf35KXeZoHWse6YaoseTSlnAal3dQOGbXnYWZ4Ck2OSA==
+"@polkadot/x-fetch@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-10.1.10.tgz#6551e44211cf21a1ca076eedc4676754345e1504"
+  integrity sha512-LvTxAN6GaJzfgZ74WFYPZrIkMEThpX5u7O4ILiExcJt87E19cSWlYSHDa5n+OLjUpq0lBV2ueF90iUblt6aHpg==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-global" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-global" "10.1.10"
     "@types/node-fetch" "^2.6.2"
     node-fetch "^3.2.10"
 
-"@polkadot/x-global@10.1.7", "@polkadot/x-global@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-10.1.7.tgz#91a472ac2f83fd0858dcd0df528844a5b650790e"
-  integrity sha512-k2ZUZyBVgDnP/Ysxapa0mthn63j6gsN2V0kZejEQPyOfCHtQQkse3jFvAWdslpWoR8j2k8SN5O6reHc0F4f7mA==
+"@polkadot/x-global@10.1.10", "@polkadot/x-global@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-10.1.10.tgz#eedf63f1f3918c7f2bd8ef0907e051783f1a626e"
+  integrity sha512-WFfgaZSrzPlKLdnOus2mIFGzUbSDIQK6RMCfFfM9SmF3DkoxN40z5Nkni4PztfKr22stlkhmhnX/Lp/NxpuT6Q==
   dependencies:
-    "@babel/runtime" "^7.18.9"
+    "@babel/runtime" "^7.19.0"
 
-"@polkadot/x-randomvalues@10.1.7":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-10.1.7.tgz#d537f1f7bf3fb03e6c08ae6e6ac36e069c1f9844"
-  integrity sha512-3er4UYOlozLGgFYWwcbmcFslmO8m82u4cAGR4AaEag0VdV7jLO/M5lTmivT/3rtLSww6sjkEfr522GM2Q5lmFg==
+"@polkadot/x-randomvalues@10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-10.1.10.tgz#a10f98f2c4d744612b68ee697e43f1e4d6e1f89a"
+  integrity sha512-KM4sCI/DNLIXlmnkeJIuYvh3pPuWvnkbR1a6TUB12J1izUJ+uGV+cAFRR4/EZk3oEsG/Tgivbs56meEOo3ws5A==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-global" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-global" "10.1.10"
 
-"@polkadot/x-textdecoder@10.1.7":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-10.1.7.tgz#1dd4e6141b1669acdd321a4da1fc6fdc271b7908"
-  integrity sha512-iAFOHludmZFOyVL8sQFv4TDqbcqQU5gwwYv74duTA+WQBgbSITJrBahSCV/rXOjUqds9pzQO3qBFzziznNnkiQ==
+"@polkadot/x-textdecoder@10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-10.1.10.tgz#a6d0010b092bdefc69c70dcb34d76ec8993980b2"
+  integrity sha512-cAk37faYXx8IICeaq/tdl+aiIXwo3SLrx9XNoQqhX02g+SEs3ARM7zJcohj/p8ynWAI+ezNcsKn1wh174nquHw==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-global" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-global" "10.1.10"
 
-"@polkadot/x-textencoder@10.1.7":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-10.1.7.tgz#b208601f33b936c7a059f126dbb6b26a87f45864"
-  integrity sha512-GzjaWZDbgzZ0IQT60xuZ7cZ0wnlNVYMqpfI9KvBc58X9dPI3TIMwzbXDVzZzpjY1SAqJGs4hJse9HMWZazfhew==
+"@polkadot/x-textencoder@10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-10.1.10.tgz#35b2e778b3dbb6816bb37f1848b772c4cd3c43d1"
+  integrity sha512-Auaql6BL5UHtWakZUQyj4y/BrM0tm4bYG5vXCMQCA1Gg0ky+46DhgpRrAQ9F7NNgWg1A6dA2I9KuAA4BTbNx0w==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-global" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-global" "10.1.10"
 
-"@polkadot/x-ws@^10.1.4":
-  version "10.1.7"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-10.1.7.tgz#b1fbfe3e16fa809f35f24ef47fde145b018d8cdc"
-  integrity sha512-aNkotxHx3qPVjiItD9lbNONs4GNzqeeZ98wHtCjd9JWl/g+xNkOVF3xQ8++1qSHPBEYSwKh9URjQH2+CD2XlvQ==
+"@polkadot/x-ws@^10.1.10":
+  version "10.1.10"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-10.1.10.tgz#27b55a988a0f60db7f79fed8268802406f522813"
+  integrity sha512-JxDgfm0ox2XPAtdTeJXYl6qq7LY/KOPi69wRpFMczWaYUsZubO6EiRzgzjuFlHY4/oxfjS/D+YbzcjefTxHz6g==
   dependencies:
-    "@babel/runtime" "^7.18.9"
-    "@polkadot/x-global" "10.1.7"
+    "@babel/runtime" "^7.19.0"
+    "@polkadot/x-global" "10.1.10"
     "@types/websocket" "^1.0.5"
     websocket "^1.0.34"
 
@@ -910,27 +905,27 @@
   resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz#fa5738039586c648013caa6a0c95c43265dbe77d"
   integrity sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==
 
-"@substrate/connect@0.7.10":
-  version "0.7.10"
-  resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.7.10.tgz#db49a62188cd830a8dc8848240e635da21f333ff"
-  integrity sha512-WNdW18e0I696/AQjrAXdMD9W8YaKLTcPr2Cu8scSwiUT40in84KEzi+g+P367cE2etAc+Dvu8vNDEQTbUPNqEg==
+"@substrate/connect@0.7.14":
+  version "0.7.14"
+  resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.7.14.tgz#c090e952e9cdd93185a94d24fbc424ea20fe7bbe"
+  integrity sha512-uW5uBmihpivshmmmw+rsg7qOV0KqVSep4rWOXFMP8aFQinvmqw4JqxP21og4H/7JZxttYUBFQVsdtXHGKJ0aVQ==
   dependencies:
     "@substrate/connect-extension-protocol" "^1.0.1"
-    "@substrate/smoldot-light" "0.6.27"
+    "@substrate/smoldot-light" "0.6.34"
     eventemitter3 "^4.0.7"
 
-"@substrate/smoldot-light@0.6.27":
-  version "0.6.27"
-  resolved "https://registry.yarnpkg.com/@substrate/smoldot-light/-/smoldot-light-0.6.27.tgz#7e66ad4bfddce4168a6008f6be8c771c881ae585"
-  integrity sha512-Wy3fbyfZqR3HLynuxeBkUunZsrbqpsmFN+D0/8cVIHZbO7WDwJsmCUc32yO5r+v6s/T97L7FOJHEyMWmRfnKAQ==
+"@substrate/smoldot-light@0.6.34":
+  version "0.6.34"
+  resolved "https://registry.yarnpkg.com/@substrate/smoldot-light/-/smoldot-light-0.6.34.tgz#273dba622102281fd0fdb0e375198bff2ec584c3"
+  integrity sha512-+HK9MaJ0HelJmpf4YYR+salJ7dhVBltmhGlyz5l8OXS9DW18fe0Z2wxEo8P5kX9CUxlCXEb8J9JBRQAYBPHbwQ==
   dependencies:
     pako "^2.0.4"
-    websocket "^1.0.32"
+    ws "^8.8.1"
 
-"@substrate/ss58-registry@^1.28.0":
-  version "1.29.0"
-  resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.29.0.tgz#0dea078271b5318c5eff7176e1df1f9b2c27e43f"
-  integrity sha512-KTqwZgTjtWPhCAUJJx9qswP/p9cRKUU9GOHYUDKNdISFDiFafWmpI54JHfYLkgjvkSKEUgRZnvLpe0LMF1fXvw==
+"@substrate/ss58-registry@^1.31.0":
+  version "1.31.0"
+  resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.31.0.tgz#489e3a496081dc3ee7ef5ef2eb513962d5d29351"
+  integrity sha512-OSOmdjaq9foXfHBy9aLVMwGheygvsiZlv4dggnLOYOuhSmNCsSB/PaW4DBz+/tSdK1Fo9+ZiFW6cF24RA+m0sw==
 
 "@szmarczak/http-timer@^4.0.5":
   version "4.0.6"
@@ -1023,9 +1018,9 @@
   integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==
 
 "@types/har-format@*":
-  version "1.2.8"
-  resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.8.tgz#e6908b76d4c88be3db642846bb8b455f0bfb1c4e"
-  integrity sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.9.tgz#b9b3a9bfc33a078e7d898a00b09662910577f4a4"
+  integrity sha512-rffW6MhQ9yoa75bdNi+rjZBAvu2HhehWJXlhuWXnWdENeuKe82wUgAwxYOb7KRKKmxYN+D/iRKd2NDQMLqlUmg==
 
 "@types/http-cache-semantics@*":
   version "4.0.1"
@@ -1044,10 +1039,10 @@
   dependencies:
     "@types/node" "*"
 
-"@types/mocha@^9.1.1":
-  version "9.1.1"
-  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
-  integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
+"@types/mocha@^10.0.0":
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.0.tgz#3d9018c575f0e3f7386c1de80ee66cc21fbb7a52"
+  integrity sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==
 
 "@types/node-fetch@^2.6.2":
   version "2.6.2"
@@ -1058,9 +1053,9 @@
     form-data "^3.0.0"
 
 "@types/node@*":
-  version "18.7.16"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.16.tgz#0eb3cce1e37c79619943d2fd903919fc30850601"
-  integrity sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==
+  version "18.8.3"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.3.tgz#ce750ab4017effa51aed6a7230651778d54e327c"
+  integrity sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==
 
 "@types/node@^12.12.6":
   version "12.20.55"
@@ -1101,84 +1096,83 @@
     "@types/node" "*"
 
 "@typescript-eslint/eslint-plugin@^5.26.0":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.2.tgz#6df092a20e0f9ec748b27f293a12cb39d0c1fe4d"
-  integrity sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw==
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz#778b2d9e7f293502c7feeea6c74dca8eb3e67511"
+  integrity sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==
   dependencies:
-    "@typescript-eslint/scope-manager" "5.36.2"
-    "@typescript-eslint/type-utils" "5.36.2"
-    "@typescript-eslint/utils" "5.36.2"
+    "@typescript-eslint/scope-manager" "5.39.0"
+    "@typescript-eslint/type-utils" "5.39.0"
+    "@typescript-eslint/utils" "5.39.0"
     debug "^4.3.4"
-    functional-red-black-tree "^1.0.1"
     ignore "^5.2.0"
     regexpp "^3.2.0"
     semver "^7.3.7"
     tsutils "^3.21.0"
 
 "@typescript-eslint/parser@^5.26.0":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.2.tgz#3ddf323d3ac85a25295a55fcb9c7a49ab4680ddd"
-  integrity sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.39.0.tgz#93fa0bc980a3a501e081824f6097f7ca30aaa22b"
+  integrity sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==
   dependencies:
-    "@typescript-eslint/scope-manager" "5.36.2"
-    "@typescript-eslint/types" "5.36.2"
-    "@typescript-eslint/typescript-estree" "5.36.2"
+    "@typescript-eslint/scope-manager" "5.39.0"
+    "@typescript-eslint/types" "5.39.0"
+    "@typescript-eslint/typescript-estree" "5.39.0"
     debug "^4.3.4"
 
-"@typescript-eslint/scope-manager@5.36.2":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz#a75eb588a3879ae659514780831370642505d1cd"
-  integrity sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==
+"@typescript-eslint/scope-manager@5.39.0":
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz#873e1465afa3d6c78d8ed2da68aed266a08008d0"
+  integrity sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==
   dependencies:
-    "@typescript-eslint/types" "5.36.2"
-    "@typescript-eslint/visitor-keys" "5.36.2"
+    "@typescript-eslint/types" "5.39.0"
+    "@typescript-eslint/visitor-keys" "5.39.0"
 
-"@typescript-eslint/type-utils@5.36.2":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz#752373f4babf05e993adf2cd543a763632826391"
-  integrity sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==
+"@typescript-eslint/type-utils@5.39.0":
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6"
+  integrity sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==
   dependencies:
-    "@typescript-eslint/typescript-estree" "5.36.2"
-    "@typescript-eslint/utils" "5.36.2"
+    "@typescript-eslint/typescript-estree" "5.39.0"
+    "@typescript-eslint/utils" "5.39.0"
     debug "^4.3.4"
     tsutils "^3.21.0"
 
-"@typescript-eslint/types@5.36.2":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.2.tgz#a5066e500ebcfcee36694186ccc57b955c05faf9"
-  integrity sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==
+"@typescript-eslint/types@5.39.0":
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d"
+  integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==
 
-"@typescript-eslint/typescript-estree@5.36.2":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz#0c93418b36c53ba0bc34c61fe9405c4d1d8fe560"
-  integrity sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==
+"@typescript-eslint/typescript-estree@5.39.0":
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b"
+  integrity sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==
   dependencies:
-    "@typescript-eslint/types" "5.36.2"
-    "@typescript-eslint/visitor-keys" "5.36.2"
+    "@typescript-eslint/types" "5.39.0"
+    "@typescript-eslint/visitor-keys" "5.39.0"
     debug "^4.3.4"
     globby "^11.1.0"
     is-glob "^4.0.3"
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/utils@5.36.2":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.2.tgz#b01a76f0ab244404c7aefc340c5015d5ce6da74c"
-  integrity sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==
+"@typescript-eslint/utils@5.39.0":
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110"
+  integrity sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==
   dependencies:
     "@types/json-schema" "^7.0.9"
-    "@typescript-eslint/scope-manager" "5.36.2"
-    "@typescript-eslint/types" "5.36.2"
-    "@typescript-eslint/typescript-estree" "5.36.2"
+    "@typescript-eslint/scope-manager" "5.39.0"
+    "@typescript-eslint/types" "5.39.0"
+    "@typescript-eslint/typescript-estree" "5.39.0"
     eslint-scope "^5.1.1"
     eslint-utils "^3.0.0"
 
-"@typescript-eslint/visitor-keys@5.36.2":
-  version "5.36.2"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz#2f8f78da0a3bad3320d2ac24965791ac39dace5a"
-  integrity sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==
+"@typescript-eslint/visitor-keys@5.39.0":
+  version "5.39.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz#8f41f7d241b47257b081ddba5d3ce80deaae61e2"
+  integrity sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==
   dependencies:
-    "@typescript-eslint/types" "5.36.2"
+    "@typescript-eslint/types" "5.39.0"
     eslint-visitor-keys "^3.3.0"
 
 "@ungap/promise-all-settled@1.1.2":
@@ -1187,9 +1181,9 @@
   integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
 
 abortcontroller-polyfill@^1.7.3:
-  version "1.7.3"
-  resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5"
-  integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==
+  version "1.7.5"
+  resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed"
+  integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==
 
 accepts@~1.3.8:
   version "1.3.8"
@@ -1352,7 +1346,7 @@
   dependencies:
     tweetnacl "^0.14.3"
 
-bignumber.js@^9.0.0, bignumber.js@^9.0.2:
+bignumber.js@^9.0.0, bignumber.js@^9.1.0:
   version "9.1.0"
   resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62"
   integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==
@@ -1387,10 +1381,10 @@
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
   integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
 
-body-parser@1.20.0, body-parser@^1.16.0:
-  version "1.20.0"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
-  integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+body-parser@1.20.1, body-parser@^1.16.0:
+  version "1.20.1"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
+  integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
   dependencies:
     bytes "3.1.2"
     content-type "~1.0.4"
@@ -1400,7 +1394,7 @@
     http-errors "2.0.0"
     iconv-lite "0.4.24"
     on-finished "2.4.1"
-    qs "6.10.3"
+    qs "6.11.0"
     raw-body "2.5.1"
     type-is "~1.6.18"
     unpipe "1.0.0"
@@ -1491,15 +1485,15 @@
     readable-stream "^3.6.0"
     safe-buffer "^5.2.0"
 
-browserslist@^4.20.2:
-  version "4.21.3"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a"
-  integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==
+browserslist@^4.21.3:
+  version "4.21.4"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987"
+  integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
   dependencies:
-    caniuse-lite "^1.0.30001370"
-    electron-to-chromium "^1.4.202"
+    caniuse-lite "^1.0.30001400"
+    electron-to-chromium "^1.4.251"
     node-releases "^2.0.6"
-    update-browserslist-db "^1.0.5"
+    update-browserslist-db "^1.0.9"
 
 bs58@^4.0.0:
   version "4.0.1"
@@ -1593,10 +1587,10 @@
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
   integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
 
-caniuse-lite@^1.0.30001370:
-  version "1.0.30001393"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz#1aa161e24fe6af2e2ccda000fc2b94be0b0db356"
-  integrity sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA==
+caniuse-lite@^1.0.30001400:
+  version "1.0.30001418"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6"
+  integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==
 
 caseless@~0.12.0:
   version "0.12.0"
@@ -1703,6 +1697,15 @@
     strip-ansi "^6.0.0"
     wrap-ansi "^7.0.0"
 
+cliui@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+  integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.1"
+    wrap-ansi "^7.0.0"
+
 clone-deep@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
@@ -2057,10 +2060,10 @@
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
   integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
 
-electron-to-chromium@^1.4.202:
-  version "1.4.246"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz#802132d1bbd3ff32ce82fcd6a6ed6ab59b4366dc"
-  integrity sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA==
+electron-to-chromium@^1.4.251:
+  version "1.4.276"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz#17837b19dafcc43aba885c4689358b298c19b520"
+  integrity sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==
 
 elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.3, elliptic@^6.5.4:
   version "6.5.4"
@@ -2093,21 +2096,21 @@
     once "^1.4.0"
 
 es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0:
-  version "1.20.2"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.2.tgz#8495a07bc56d342a3b8ea3ab01bd986700c2ccb3"
-  integrity sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==
+  version "1.20.4"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861"
+  integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==
   dependencies:
     call-bind "^1.0.2"
     es-to-primitive "^1.2.1"
     function-bind "^1.1.1"
     function.prototype.name "^1.1.5"
-    get-intrinsic "^1.1.2"
+    get-intrinsic "^1.1.3"
     get-symbol-description "^1.0.0"
     has "^1.0.3"
     has-property-descriptors "^1.0.0"
     has-symbols "^1.0.3"
     internal-slot "^1.0.3"
-    is-callable "^1.2.4"
+    is-callable "^1.2.7"
     is-negative-zero "^2.0.2"
     is-regex "^1.1.4"
     is-shared-array-buffer "^1.0.2"
@@ -2117,6 +2120,7 @@
     object-keys "^1.1.1"
     object.assign "^4.1.4"
     regexp.prototype.flags "^1.4.3"
+    safe-regex-test "^1.0.0"
     string.prototype.trimend "^1.0.5"
     string.prototype.trimstart "^1.0.5"
     unbox-primitive "^1.0.2"
@@ -2215,13 +2219,12 @@
   integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
 eslint@^8.16.0:
-  version "8.23.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040"
-  integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==
+  version "8.25.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b"
+  integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==
   dependencies:
-    "@eslint/eslintrc" "^1.3.1"
-    "@humanwhocodes/config-array" "^0.10.4"
-    "@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
+    "@eslint/eslintrc" "^1.3.3"
+    "@humanwhocodes/config-array" "^0.10.5"
     "@humanwhocodes/module-importer" "^1.0.1"
     ajv "^6.10.0"
     chalk "^4.0.0"
@@ -2238,7 +2241,6 @@
     fast-deep-equal "^3.1.3"
     file-entry-cache "^6.0.1"
     find-up "^5.0.0"
-    functional-red-black-tree "^1.0.1"
     glob-parent "^6.0.1"
     globals "^13.15.0"
     globby "^11.1.0"
@@ -2247,6 +2249,7 @@
     import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
     is-glob "^4.0.0"
+    js-sdsl "^4.1.4"
     js-yaml "^4.1.0"
     json-stable-stringify-without-jsonify "^1.0.1"
     levn "^0.4.1"
@@ -2397,13 +2400,13 @@
     safe-buffer "^5.1.1"
 
 express@^4.14.0:
-  version "4.18.1"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
-  integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
+  version "4.18.2"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
+  integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
   dependencies:
     accepts "~1.3.8"
     array-flatten "1.1.1"
-    body-parser "1.20.0"
+    body-parser "1.20.1"
     content-disposition "0.5.4"
     content-type "~1.0.4"
     cookie "0.5.0"
@@ -2422,7 +2425,7 @@
     parseurl "~1.3.3"
     path-to-regexp "0.1.7"
     proxy-addr "~2.0.7"
-    qs "6.10.3"
+    qs "6.11.0"
     range-parser "~1.2.1"
     safe-buffer "5.2.1"
     send "0.18.0"
@@ -2575,9 +2578,9 @@
   integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
 
 follow-redirects@^1.12.1:
-  version "1.15.1"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
-  integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
+  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
 
 for-each@^0.3.3:
   version "0.3.3"
@@ -2672,11 +2675,6 @@
     es-abstract "^1.19.0"
     functions-have-names "^1.2.2"
 
-functional-red-black-tree@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
-  integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
-
 functions-have-names@^1.2.2:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
@@ -2697,10 +2695,10 @@
   resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
   integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==
 
-get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
-  integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
+  integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
   dependencies:
     function-bind "^1.1.1"
     has "^1.0.3"
@@ -3086,10 +3084,10 @@
     call-bind "^1.0.2"
     has-tostringtag "^1.0.0"
 
-is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
-  integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+  integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
 
 is-date-object@^1.0.1:
   version "1.0.5"
@@ -3233,6 +3231,11 @@
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
 
+js-sdsl@^4.1.4:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a"
+  integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==
+
 js-sha3@0.8.0, js-sha3@^0.8.0:
   version "0.8.0"
   resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
@@ -4025,10 +4028,10 @@
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
-qs@6.10.3:
-  version "6.10.3"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
-  integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+qs@6.11.0:
+  version "6.11.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
   dependencies:
     side-channel "^1.0.4"
 
@@ -4203,10 +4206,10 @@
   dependencies:
     queue-microtask "^1.2.2"
 
-rxjs@^7.5.6:
-  version "7.5.6"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc"
-  integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==
+rxjs@^7.5.7:
+  version "7.5.7"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
+  integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==
   dependencies:
     tslib "^2.1.0"
 
@@ -4220,6 +4223,15 @@
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
+safe-regex-test@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+  integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+  dependencies:
+    call-bind "^1.0.2"
+    get-intrinsic "^1.1.3"
+    is-regex "^1.1.4"
+
 "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@@ -4250,9 +4262,9 @@
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
 semver@^7.3.7:
-  version "7.3.7"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
-  integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+  version "7.3.8"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+  integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
   dependencies:
     lru-cache "^6.0.0"
 
@@ -4368,10 +4380,10 @@
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
-solc@0.8.14-fixed:
-  version "0.8.14-fixed"
-  resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.14-fixed.tgz#a730a1e8259ac06313f6b7287df046ebe1dddc13"
-  integrity sha512-jFYa2fKbk95olckuDbhs9kbtaUhLRllM7aC++mLinJBUcdHbaHVM8LxHaJpOIDdnHBV9TpIP4XBybVugqMDyhA==
+solc@0.8.17:
+  version "0.8.17"
+  resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.17.tgz#c748fec6a64bf029ec406aa9b37e75938d1115ae"
+  integrity sha512-Dtidk2XtTTmkB3IKdyeg6wLYopJnBVxdoykN8oP8VY3PQjN16BScYoUJTXFm2OP7P0hXNAqWiJNmmfuELtLf8g==
   dependencies:
     command-exists "^1.2.8"
     commander "^8.1.0"
@@ -4666,14 +4678,14 @@
     is-typedarray "^1.0.0"
 
 typescript@^4.7.2:
-  version "4.8.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88"
-  integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==
+  version "4.8.4"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6"
+  integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
 
 uglify-js@^3.1.4:
-  version "3.17.0"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85"
-  integrity sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==
+  version "3.17.3"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.3.tgz#f0feedf019c4510f164099e8d7e72ff2d7304377"
+  integrity sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==
 
 ultron@~1.1.0:
   version "1.1.1"
@@ -4700,10 +4712,10 @@
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
   integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
 
-update-browserslist-db@^1.0.5:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz#16279639cff1d0f800b14792de43d97df2d11b7d"
-  integrity sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==
+update-browserslist-db@^1.0.9:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
+  integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==
   dependencies:
     escalade "^3.1.1"
     picocolors "^1.0.0"
@@ -4793,85 +4805,85 @@
   resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6"
   integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==
 
-web3-bzz@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.5.tgz#edeb262c3a6619109763077a94172513cf07cdde"
-  integrity sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==
+web3-bzz@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.0.tgz#2023676d7c17ea36512bf76eb310755a02a3d464"
+  integrity sha512-caDtdKeLi7+2Vb+y+cq2yyhkNjnxkFzVW0j1DtemarBg3dycG1iEl75CVQMLNO6Wkg+HH9tZtRnUyFIe5LIUeQ==
   dependencies:
     "@types/node" "^12.12.6"
     got "12.1.0"
     swarm-js "^0.1.40"
 
-web3-core-helpers@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz#e97b3ecac787ade4b9390807a86aca78ed97872b"
-  integrity sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==
+web3-core-helpers@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz#5dcfdda1a4ea277041d912003198f1334ca29d7c"
+  integrity sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw==
   dependencies:
-    web3-eth-iban "1.7.5"
-    web3-utils "1.7.5"
+    web3-eth-iban "1.8.0"
+    web3-utils "1.8.0"
 
-web3-core-method@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.5.tgz#ffe8883c169468f0e4d13509377f2d8876d9b7be"
-  integrity sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==
+web3-core-method@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.0.tgz#9c2da8896808917d1679c319f19e2174ba17086c"
+  integrity sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA==
   dependencies:
     "@ethersproject/transactions" "^5.6.2"
-    web3-core-helpers "1.7.5"
-    web3-core-promievent "1.7.5"
-    web3-core-subscriptions "1.7.5"
-    web3-utils "1.7.5"
+    web3-core-helpers "1.8.0"
+    web3-core-promievent "1.8.0"
+    web3-core-subscriptions "1.8.0"
+    web3-utils "1.8.0"
 
-web3-core-promievent@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz#56a9b06a20e20a0a89d2ab7f88d44c8ae01d5b62"
-  integrity sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==
+web3-core-promievent@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz#979765fd4d37ab0f158f0ee54037b279b737bd53"
+  integrity sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ==
   dependencies:
     eventemitter3 "4.0.4"
 
-web3-core-requestmanager@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz#be18fc99642689aeb2e016fa43fb47bb9e8c94ce"
-  integrity sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==
+web3-core-requestmanager@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz#06189df80cf52d24a195a7ef655031afe8192df3"
+  integrity sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg==
   dependencies:
     util "^0.12.0"
-    web3-core-helpers "1.7.5"
-    web3-providers-http "1.7.5"
-    web3-providers-ipc "1.7.5"
-    web3-providers-ws "1.7.5"
+    web3-core-helpers "1.8.0"
+    web3-providers-http "1.8.0"
+    web3-providers-ipc "1.8.0"
+    web3-providers-ws "1.8.0"
 
-web3-core-subscriptions@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz#c0e25610768ea9d9f9107b4ac74b6b6573125e00"
-  integrity sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==
+web3-core-subscriptions@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz#ff66ae4467c8cb4716367248bcefb1845c0f8b83"
+  integrity sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA==
   dependencies:
     eventemitter3 "4.0.4"
-    web3-core-helpers "1.7.5"
+    web3-core-helpers "1.8.0"
 
-web3-core@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.5.tgz#8ee2ca490230a30ca970cb9f308eb65b76405e1d"
-  integrity sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==
+web3-core@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.0.tgz#90afce527ac1b1dff8cbed2acbc0336530b8aacf"
+  integrity sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA==
   dependencies:
     "@types/bn.js" "^5.1.0"
     "@types/node" "^12.12.6"
     bignumber.js "^9.0.0"
-    web3-core-helpers "1.7.5"
-    web3-core-method "1.7.5"
-    web3-core-requestmanager "1.7.5"
-    web3-utils "1.7.5"
+    web3-core-helpers "1.8.0"
+    web3-core-method "1.8.0"
+    web3-core-requestmanager "1.8.0"
+    web3-utils "1.8.0"
 
-web3-eth-abi@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz#db9d6dbcc043a6e922252f3228686e9bbd50d7c9"
-  integrity sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==
+web3-eth-abi@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.0.tgz#47fdff00bfdfa72064c9c612ff6369986598196d"
+  integrity sha512-xPeMb2hS9YLQK/Q5YZpkcmzoRGM+/R8bogSrYHhNC3hjZSSU0YRH+1ZKK0f9YF4qDZaPMI8tKWIMSCDIpjG6fg==
   dependencies:
     "@ethersproject/abi" "^5.6.3"
-    web3-utils "1.7.5"
+    web3-utils "1.8.0"
 
-web3-eth-accounts@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz#b37ee3aeebcc6bce3337636aeb272cbba0ece547"
-  integrity sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==
+web3-eth-accounts@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.0.tgz#960d947ee87a49d6c706dc6312334fbfbd6ff812"
+  integrity sha512-HQ/MDSv4bexwJLvnqsM6xpGE7c2NVOqyhzOZFyMUKXbIwIq85T3TaLnM9pCN7XqMpDcfxqiZ3q43JqQVkzHdmw==
   dependencies:
     "@ethereumjs/common" "^2.5.0"
     "@ethereumjs/tx" "^3.3.2"
@@ -4880,127 +4892,127 @@
     ethereumjs-util "^7.0.10"
     scrypt-js "^3.0.1"
     uuid "3.3.2"
-    web3-core "1.7.5"
-    web3-core-helpers "1.7.5"
-    web3-core-method "1.7.5"
-    web3-utils "1.7.5"
+    web3-core "1.8.0"
+    web3-core-helpers "1.8.0"
+    web3-core-method "1.8.0"
+    web3-utils "1.8.0"
 
-web3-eth-contract@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz#a032419579bcec062513a3d089ad0e89ac63d731"
-  integrity sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==
+web3-eth-contract@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.0.tgz#58f4ce0bde74e5ce87663502e409a92abad7b2c5"
+  integrity sha512-6xeXhW2YoCrz2Ayf2Vm4srWiMOB6LawkvxWJDnUWJ8SMATg4Pgu42C/j8rz/enXbYWt2IKuj0kk8+QszxQbK+Q==
   dependencies:
     "@types/bn.js" "^5.1.0"
-    web3-core "1.7.5"
-    web3-core-helpers "1.7.5"
-    web3-core-method "1.7.5"
-    web3-core-promievent "1.7.5"
-    web3-core-subscriptions "1.7.5"
-    web3-eth-abi "1.7.5"
-    web3-utils "1.7.5"
+    web3-core "1.8.0"
+    web3-core-helpers "1.8.0"
+    web3-core-method "1.8.0"
+    web3-core-promievent "1.8.0"
+    web3-core-subscriptions "1.8.0"
+    web3-eth-abi "1.8.0"
+    web3-utils "1.8.0"
 
-web3-eth-ens@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz#fa0e287f5e6fae20531117b7467e21b482d58cab"
-  integrity sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==
+web3-eth-ens@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.0.tgz#f1937371eac54b087ebe2e871780c2710d39998d"
+  integrity sha512-/eFbQEwvsMOEiOhw9/iuRXCsPkqAmHHWuFOrThQkozRgcnSTRnvxkkRC/b6koiT5/HaKeUs4yQDg+/ixsIxZxA==
   dependencies:
     content-hash "^2.5.2"
     eth-ens-namehash "2.0.8"
-    web3-core "1.7.5"
-    web3-core-helpers "1.7.5"
-    web3-core-promievent "1.7.5"
-    web3-eth-abi "1.7.5"
-    web3-eth-contract "1.7.5"
-    web3-utils "1.7.5"
+    web3-core "1.8.0"
+    web3-core-helpers "1.8.0"
+    web3-core-promievent "1.8.0"
+    web3-eth-abi "1.8.0"
+    web3-eth-contract "1.8.0"
+    web3-utils "1.8.0"
 
-web3-eth-iban@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz#1a50efa42cabf1b731396d38bef6a8bf92b5ee1f"
-  integrity sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==
+web3-eth-iban@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz#3af8a0c95b5f7b0b81ab0bcd2075c1e5dda31520"
+  integrity sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg==
   dependencies:
     bn.js "^5.2.1"
-    web3-utils "1.7.5"
+    web3-utils "1.8.0"
 
-web3-eth-personal@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz#615a3ddcf97aeea93e2a4569753c033fd7a495c5"
-  integrity sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==
+web3-eth-personal@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.0.tgz#433c35e2e042844402a12d543c4126ea1494b478"
+  integrity sha512-L7FT4nR3HmsfZyIAhFpEctKkYGOjRC2h6iFKs9gnFCHZga8yLcYcGaYOBIoYtaKom99MuGBoosayWt/Twh7F5A==
   dependencies:
     "@types/node" "^12.12.6"
-    web3-core "1.7.5"
-    web3-core-helpers "1.7.5"
-    web3-core-method "1.7.5"
-    web3-net "1.7.5"
-    web3-utils "1.7.5"
+    web3-core "1.8.0"
+    web3-core-helpers "1.8.0"
+    web3-core-method "1.8.0"
+    web3-net "1.8.0"
+    web3-utils "1.8.0"
 
-web3-eth@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.5.tgz#36906f50a6c35570cbc08871a33caa83dc131c9c"
-  integrity sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==
+web3-eth@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.0.tgz#006974a5d5e30644d05814111f9e162a72e4a09c"
+  integrity sha512-hist52os3OT4TQFB/GxPSMxTh3995sz6LPvQpPvj7ktSbpg9RNSFaSsPlCT63wUAHA3PZb1FemkAIeQM5t72Lw==
   dependencies:
-    web3-core "1.7.5"
-    web3-core-helpers "1.7.5"
-    web3-core-method "1.7.5"
-    web3-core-subscriptions "1.7.5"
-    web3-eth-abi "1.7.5"
-    web3-eth-accounts "1.7.5"
-    web3-eth-contract "1.7.5"
-    web3-eth-ens "1.7.5"
-    web3-eth-iban "1.7.5"
-    web3-eth-personal "1.7.5"
-    web3-net "1.7.5"
-    web3-utils "1.7.5"
+    web3-core "1.8.0"
+    web3-core-helpers "1.8.0"
+    web3-core-method "1.8.0"
+    web3-core-subscriptions "1.8.0"
+    web3-eth-abi "1.8.0"
+    web3-eth-accounts "1.8.0"
+    web3-eth-contract "1.8.0"
+    web3-eth-ens "1.8.0"
+    web3-eth-iban "1.8.0"
+    web3-eth-personal "1.8.0"
+    web3-net "1.8.0"
+    web3-utils "1.8.0"
 
-web3-net@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.5.tgz#87fbc00a9ca40515bf60c847c0092498887cfdc8"
-  integrity sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==
+web3-net@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.0.tgz#9acff92d7c647d801bc68df0ff4416f104dbe789"
+  integrity sha512-kX6EAacK7QrOe7DOh0t5yHS5q2kxZmTCxPVwSz9io9xBeE4n4UhmzGJ/VfhP2eM3OPKYeypcR3LEO6zZ8xn2vw==
   dependencies:
-    web3-core "1.7.5"
-    web3-core-method "1.7.5"
-    web3-utils "1.7.5"
+    web3-core "1.8.0"
+    web3-core-method "1.8.0"
+    web3-utils "1.8.0"
 
-web3-providers-http@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.5.tgz#144bb0c29007d1b766bafb0e20f80be050c7aa80"
-  integrity sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==
+web3-providers-http@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.0.tgz#3fd1e569ead2095343fac17d53160a3bae674c23"
+  integrity sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw==
   dependencies:
     abortcontroller-polyfill "^1.7.3"
     cross-fetch "^3.1.4"
     es6-promise "^4.2.8"
-    web3-core-helpers "1.7.5"
+    web3-core-helpers "1.8.0"
 
-web3-providers-ipc@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz#5b0f9b4f7340416953b8816d2e42e3f548d47372"
-  integrity sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==
+web3-providers-ipc@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz#d339a24c4d764e459e425d3ac868a551ac33e3ea"
+  integrity sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg==
   dependencies:
     oboe "2.1.5"
-    web3-core-helpers "1.7.5"
+    web3-core-helpers "1.8.0"
 
-web3-providers-ws@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz#196b9e56a4a48f9bee54def56875ea53dec7c711"
-  integrity sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==
+web3-providers-ws@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz#a0a73e0606981ea32bed40d215000a64753899de"
+  integrity sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg==
   dependencies:
     eventemitter3 "4.0.4"
-    web3-core-helpers "1.7.5"
+    web3-core-helpers "1.8.0"
     websocket "^1.0.32"
 
-web3-shh@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.5.tgz#742e27f5c44bea6d7adef3a49b085e0fcd6aa621"
-  integrity sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==
+web3-shh@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.0.tgz#b4abbf4f59d097ce2f74360e61e2e5c0bd6507c7"
+  integrity sha512-DNRgSa9Jf9xYFUGKSMylrf+zt3MPjhI2qF+UWX07o0y3+uf8zalDGiJOWvIS4upAsdPiKKVJ7co+Neof47OMmg==
   dependencies:
-    web3-core "1.7.5"
-    web3-core-method "1.7.5"
-    web3-core-subscriptions "1.7.5"
-    web3-net "1.7.5"
+    web3-core "1.8.0"
+    web3-core-method "1.8.0"
+    web3-core-subscriptions "1.8.0"
+    web3-net "1.8.0"
 
-web3-utils@1.7.5:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.5.tgz#081a952ac6e0322e25ac97b37358a43c7372ef6a"
-  integrity sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==
+web3-utils@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03"
+  integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ==
   dependencies:
     bn.js "^5.2.1"
     ethereum-bloom-filters "^1.0.6"
@@ -5011,17 +5023,17 @@
     utf8 "3.0.0"
 
 web3@^1.7.3:
-  version "1.7.5"
-  resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.5.tgz#4e185d2058195b5775109b3f27cdea65a34a036e"
-  integrity sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.0.tgz#3ca5f0b32de6a1f626407740411219035b5fde64"
+  integrity sha512-sldr9stK/SALSJTgI/8qpnDuBJNMGjVR84hJ+AcdQ+MLBGLMGsCDNubCoyO6qgk1/Y9SQ7ignegOI/7BPLoiDA==
   dependencies:
-    web3-bzz "1.7.5"
-    web3-core "1.7.5"
-    web3-eth "1.7.5"
-    web3-eth-personal "1.7.5"
-    web3-net "1.7.5"
-    web3-shh "1.7.5"
-    web3-utils "1.7.5"
+    web3-bzz "1.8.0"
+    web3-core "1.8.0"
+    web3-eth "1.8.0"
+    web3-eth-personal "1.8.0"
+    web3-net "1.8.0"
+    web3-shh "1.8.0"
+    web3-utils "1.8.0"
 
 webidl-conversions@^3.0.0:
   version "3.0.1"
@@ -5116,6 +5128,11 @@
     safe-buffer "~5.1.0"
     ultron "~1.1.0"
 
+ws@^8.8.1:
+  version "8.9.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e"
+  integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==
+
 xhr-request-promise@^0.1.2:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
@@ -5209,12 +5226,12 @@
     y18n "^5.0.5"
     yargs-parser "^20.2.2"
 
-yargs@^17.5.1:
-  version "17.5.1"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e"
-  integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==
+yargs@^17.6.0:
+  version "17.6.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c"
+  integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==
   dependencies:
-    cliui "^7.0.2"
+    cliui "^8.0.1"
     escalade "^3.1.1"
     get-caller-file "^2.0.5"
     require-directory "^2.1.1"