git.delta.rocks / unique-network / refs/commits / ade4bc204310

difftreelog

feat split tests into packages

Grigoriy Simonov2023-11-06parent: #2332519.patch.diff
in: master

179 files changed

modified.githooks/pre-commitdiffbeforeafterboth
--- a/.githooks/pre-commit
+++ b/.githooks/pre-commit
@@ -28,7 +28,7 @@
 fi
 
 echo "Starting eslint.."
-./tests/node_modules/.bin/eslint --max-warnings 0 ${STAGED_TEST_FILES[@]}
+./js-packages/node_modules/.bin/eslint --max-warnings 0 ${STAGED_TEST_FILES[@]}
 ESLINT_EXIT="$?"
 
 if [[ "${ESLINT_EXIT}" = 0 ]]; then
modified.github/workflows/polkadot-types.ymldiffbeforeafterboth
--- a/.github/workflows/polkadot-types.yml
+++ b/.github/workflows/polkadot-types.yml
@@ -77,10 +77,10 @@
         working-directory: tests
         run: |
           yarn install
-          /bin/bash ./scripts/wait_for_first_block.sh
+          /bin/bash ./scripts/generate_types/wait_for_first_block.sh
           git config --global user.name "Unique"
           git config --global user.email github-actions@usetech.com          
-          /bin/bash ./scripts/generate_types_package.sh --release ${{ matrix.usage }} --push
+          /bin/bash ./scripts/generate_types/generate_types_package.sh --release ${{ matrix.usage }} --push
         env:
           RPC_URL: http://127.0.0.1:9944/
 
modifiedMakefilediffbeforeafterboth
--- a/Makefile
+++ b/Makefile
@@ -7,25 +7,25 @@
 	@echo "  bench-unique"
 
 NATIVE_FUNGIBLE_EVM_STUBS=./pallets/balances-adapter/src/stubs
-NATIVE_FUNGIBLE_EVM_ABI=./tests/src/eth/abi/nativeFungible.json
+NATIVE_FUNGIBLE_EVM_ABI=./js-packages/tests/src/eth/abi/nativeFungible.json
 
 FUNGIBLE_EVM_STUBS=./pallets/fungible/src/stubs
-FUNGIBLE_EVM_ABI=./tests/src/eth/abi/fungible.json
+FUNGIBLE_EVM_ABI=./js-packages/tests/src/eth/abi/fungible.json
 
 NONFUNGIBLE_EVM_STUBS=./pallets/nonfungible/src/stubs
-NONFUNGIBLE_EVM_ABI=./tests/src/eth/abi/nonFungible.json
+NONFUNGIBLE_EVM_ABI=./js-packages/tests/src/eth/abi/nonFungible.json
 
 REFUNGIBLE_EVM_STUBS=./pallets/refungible/src/stubs
-REFUNGIBLE_EVM_ABI=./tests/src/eth/abi/reFungible.json
-REFUNGIBLE_TOKEN_EVM_ABI=./tests/src/eth/abi/reFungibleToken.json
+REFUNGIBLE_EVM_ABI=./js-packages/tests/src/eth/abi/reFungible.json
+REFUNGIBLE_TOKEN_EVM_ABI=./js-packages/tests/src/eth/abi/reFungibleToken.json
 
 CONTRACT_HELPERS_STUBS=./pallets/evm-contract-helpers/src/stubs/
-CONTRACT_HELPERS_ABI=./tests/src/eth/abi/contractHelpers.json
+CONTRACT_HELPERS_ABI=./js-packages/tests/src/eth/abi/contractHelpers.json
 
 COLLECTION_HELPER_STUBS=./pallets/unique/src/eth/stubs/
-COLLECTION_HELPER_ABI=./tests/src/eth/abi/collectionHelpers.json
+COLLECTION_HELPER_ABI=./js-packages/tests/src/eth/abi/collectionHelpers.json
 
-TESTS_API=./tests/src/eth/api/
+TESTS_API=./js-packages/tests/src/eth/api/
 
 .PHONY: regenerate_solidity
 regenerate_solidity: UniqueFungible.sol UniqueNFT.sol UniqueRefungible.sol UniqueRefungibleToken.sol ContractHelpers.sol CollectionHelpers.sol
modifiedjs-packages/.gitignorediffbeforeafterboth
--- a/js-packages/.gitignore
+++ b/js-packages/.gitignore
@@ -1,6 +1,8 @@
 /node_modules/
+/*/dist/
+/*/tsconfig.tsbuildinfo
 properties.csv
 erc721.csv
 erc20.csv
 .yarn/cache
-.yarn/install-state.gz
+.yarn/install-state.gz
\ No newline at end of file
modifiedjs-packages/package.jsondiffbeforeafterboth
--- a/js-packages/package.json
+++ b/js-packages/package.json
@@ -3,24 +3,29 @@
   "version": "1.0.0",
   "description": "Unique Chain Tests",
   "main": "",
+  "private": true,
+  "dependencies": {
+    "@openzeppelin/contracts": "^4.9.2",
+    "chai-as-promised": "^7.1.1",
+    "chai-like": "^1.1.1",
+    "csv-writer": "^1.6.0",
+    "lossless-json": "^3.0.1",
+    "solc": "^0.8.22",
+    "typechain": "^8.3.2",
+    "web3": "1.10.0"
+  },
   "devDependencies": {
-    "@polkadot/typegen": "10.10.1",
-    "@types/chai": "^4.3.3",
-    "@types/chai-as-promised": "^7.1.5",
-    "@types/chai-like": "^1.1.1",
-    "@types/chai-subset": "^1.3.3",
-    "@types/mocha": "^10.0.0",
-    "@types/node": "^20.4.2",
-    "@typescript-eslint/eslint-plugin": "^6.0.0",
-    "@typescript-eslint/parser": "^6.0.0",
-    "chai": "^4.3.6",
+    "@types/chai": "^4.3.9",
+    "@types/chai-as-promised": "^7.1.7",
+    "@types/chai-like": "^1.1.2",
+    "@types/chai-subset": "^1.3.4",
+    "@types/mocha": "^10.0.3",
+    "@types/node": "^20.8.10",
+    "@unique/opal-types": "workspace:*",
+    "@unique/playgrounds": "workspace:*",
+    "chai": "^4.3.10",
     "chai-subset": "^1.6.0",
-    "eslint": "^8.45.0",
-    "eslint-plugin-mocha": "^10.1.0",
-    "mocha": "^10.1.0",
-    "mochawesome": "^7.1.3",
-    "ts-node": "^10.9.1",
-    "typescript": "^5.1.6"
+    "typescript": "^5.2.2"
   },
   "mocha": {
     "timeout": 9999999,
@@ -31,134 +36,23 @@
   "scripts": {
     "lint": "eslint --ext .ts,.js src/",
     "fix": "yarn lint --fix",
-    "setup": "ts-node --esm ./src/util/globalSetup.ts",
-    "setIdentities": "ts-node --esm ./src/util/identitySetter.ts",
-    "checkRelayIdentities": "ts-node --esm ./src/util/relayIdentitiesChecker.ts",
-    "frankenstein": "ts-node --esm ./src/util/frankenstein.ts",
-    "_test": "yarn setup && mocha --timeout 9999999 --loader=ts-node/esm.mjs",
-    "_testParallel": "yarn setup && mocha --timeout 9999999 --parallel --loader=ts-node/esm.mjs",
-    "test": "yarn _test './src/**/*.*test.ts'",
-    "testParallelFull": "yarn testParallel && yarn testSequential",
-    "testParallel": "yarn _testParallel './src/**/*.test.ts'",
-    "testSequential": "yarn _test './src/**/*.seqtest.ts'",
-    "testStructure": "yarn _test ./**/nesting/*.*test.ts",
-    "testGovernance": "RUN_GOV_TESTS=1 yarn _test ./**/governance/*.*test.ts",
-    "testEth": "yarn _test './**/eth/**/*.*test.ts'",
-    "testEthNesting": "yarn _test './**/eth/nesting/**/*.*test.ts'",
-    "testEthFractionalizer": "yarn _test './**/eth/fractionalizer/**/*.*test.ts'",
-    "testEthMarketplace": "yarn _test './**/eth/marketplace/**/*.*test.ts'",
-    "testEthMarket": "yarn _test './**/eth/marketplace-v2/**/*.*test.ts'",
-    "testPerformance": "yarn _test ./**/performance.*test.ts",
-    "testSub": "yarn _test './**/sub/**/*.*test.ts'",
-    "testSubNesting": "yarn _test './**/sub/nesting/**/*.*test.ts'",
-    "testEvent": "yarn _test ./src/check-event/*.*test.ts",
-    "testEthPayable": "yarn _test './**/eth/payable.test.ts'",
-    "testEvmCoder": "yarn _test './**/eth/evmCoder.test.ts'",
-    "testNesting": "yarn _test ./**/nest.test.ts",
-    "testUnnesting": "yarn _test ./**/unnest.test.ts",
-    "testProperties": "yarn _test ./**/collectionProperties.*test.ts ./**/tokenProperties.*test.ts ./**/getPropertiesRpc.test.ts",
-    "testCollectionProperties": "yarn _test ./**/collectionProperties.*test.ts",
-    "testTokenProperties": "yarn _test ./**/tokenProperties.*test.ts",
-    "testMigration": "yarn _test ./**/nesting/migration-check.test.ts",
-    "testAddCollectionAdmin": "yarn _test ./**/addCollectionAdmin.test.ts",
-    "testSetCollectionLimits": "yarn _test ./**/setCollectionLimits.test.ts",
-    "testChangeCollectionOwner": "yarn _test ./**/change-collection-owner.test.ts",
-    "testSetCollectionSponsor": "yarn _test ./**/setCollectionSponsor.test.ts",
-    "testConfirmSponsorship": "yarn _test ./**/confirmSponsorship.test.ts",
-    "testRemoveCollectionAdmin": "yarn _test ./**/removeCollectionAdmin.test.ts",
-    "testRemoveCollectionSponsor": "yarn _test ./**/removeCollectionSponsor.test.ts",
-    "testAllowLists": "yarn _test ./**/allowLists.test.ts",
-    "testConnection": "yarn _test ./**/connection.test.ts",
-    "testContracts": "yarn _test ./**/contracts.test.ts",
-    "testCreateItem": "yarn _test ./**/createItem.test.ts",
-    "testCreateMultipleItems": "yarn _test ./**/createMultipleItems.test.ts",
-    "testCreateMultipleItemsEx": "yarn _test ./**/createMultipleItemsEx.test.ts",
-    "testApprove": "yarn _test ./**/approve.test.ts",
-    "testTransferFrom": "yarn _test ./**/transferFrom.test.ts",
-    "testCreateCollection": "yarn _test ./**/createCollection.test.ts",
-    "testDestroyCollection": "yarn _test ./**/destroyCollection.test.ts",
-    "testToggleContractAllowList": "yarn _test ./**/toggleContractAllowList.test.ts",
-    "testAddToContractAllowList": "yarn _test ./**/addToContractAllowList.test.ts",
-    "testTransfer": "yarn _test ./**/transfer.test.ts",
-    "testBurnItem": "yarn _test ./**/burnItem.test.ts",
-    "testAdminTransferAndBurn": "yarn _test ./**/adminTransferAndBurn.test.ts",
-    "testSetPermissions": "yarn _test ./**/setPermissions.test.ts",
-    "testCreditFeesToTreasury": "yarn _test ./**/creditFeesToTreasury.seqtest.ts",
-    "testContractSponsoring": "yarn _test ./**/eth/contractSponsoring.test.ts",
-    "testEnableContractSponsoring": "yarn _test ./**/enableContractSponsoring.test.ts",
-    "testRemoveFromContractAllowList": "yarn _test ./**/removeFromContractAllowList.test.ts",
-    "testSetContractSponsoringRateLimit": "yarn _test ./**/setContractSponsoringRateLimit.test.ts",
-    "testSetOffchainSchema": "yarn _test ./**/setOffchainSchema.test.ts",
-    "testNextSponsoring": "yarn _test ./**/nextSponsoring.test.ts",
-    "testOverflow": "yarn _test ./**/overflow.test.ts",
-    "testMaintenance": "yarn _test ./**/maintenance.seqtest.ts",
-    "testInflation": "yarn _test ./**/inflation.seqtest.ts",
-    "testScheduler": "yarn _test ./**/scheduler.seqtest.ts",
-    "testSchedulingEVM": "yarn _test ./**/eth/scheduling.test.ts",
-    "testPalletPresence": "yarn _test ./**/pallet-presence.test.ts",
-    "testEnableDisableTransfers": "yarn _test ./**/enableDisableTransfer.test.ts",
-    "testLimits": "yarn _test ./**/limits.test.ts",
-    "testEthCreateNFTCollection": "yarn _test ./**/eth/createNFTCollection.test.ts",
-    "testEthCreateRFTCollection": "yarn _test ./**/eth/createRFTCollection.test.ts",
-    "testEthNFT": "yarn _test ./**/eth/nonFungible.test.ts",
-    "testRFT": "yarn _test ./**/refungible.test.ts",
-    "testEthRFT": "yarn _test ./**/eth/reFungible.test.ts ./**/eth/reFungibleToken.test.ts",
-    "testFT": "yarn _test ./**/fungible.test.ts",
-    "testEthFT": "yarn _test ./**/eth/fungible.test.ts",
-    "testRPC": "yarn _test ./**/rpc.test.ts",
-    "testPromotion": "yarn _test ./**/appPromotion/*test.ts",
-    "testApiConsts": "yarn _test ./**/apiConsts.test.ts",
-    "testCouncil": "yarn _test ./**/council.*test.ts",
-    "testDemocracy": "yarn _test ./**/democracy.*test.ts",
-    "testCollators": "RUN_COLLATOR_TESTS=1 yarn _test ./**/collator-selection/**.*test.ts --timeout 49999999",
-    "testCollatorSelection": "RUN_COLLATOR_TESTS=1 yarn _test ./**/collatorSelection.*test.ts --timeout 49999999",
-    "testIdentity": "RUN_COLLATOR_TESTS=1 yarn _test ./**/identity.*test.ts --timeout 49999999",
-    "testLowLevelXcmUnique": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/lowLevelXcmUnique.test.ts",
-    "testXcmUnique": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/xcmUnique.test.ts",
-    "testFullXcmUnique": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/*Unique.test.ts",
-    "testXcmQuartz": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/xcmQuartz.test.ts",
-    "testLowLevelXcmQuartz": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/lowLevelXcmQuartz.test.ts",
-    "testFullXcmQuartz": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/*Quartz.test.ts",
-    "testXcmOpal": "RUN_XCM_TESTS=1 yarn _test ./**/xcm/xcmOpal.test.ts",
-    "testXcmTransferAcala": "yarn _test ./**/xcm/xcmTransferAcala.test.ts acalaId=2000 uniqueId=5000",
-    "testXcmTransferStatemine": "yarn _test ./**/xcm/xcmTransferStatemine.test.ts statemineId=1000 uniqueId=5000",
-    "testXcmTransferMoonbeam": "yarn _test ./**/xcm/xcmTransferMoonbeam.test.ts",
-    "benchMintingFee": "ts-node src/benchmarks/mintFee/benchmark.ts",
-    "load": "yarn _test './**/*.load.ts'",
-    "loadTransfer": "ts-node src/transfer.nload.ts",
-    "polkadot-types-fetch-metadata": "yarn ts-node --esm src/fetchMetadata.ts",
-    "polkadot-types-from-defs": "ts-node --esm ./node_modules/.bin/polkadot-types-from-defs --endpoint src/interfaces/metadata.json --input src/interfaces/ --package .",
-    "polkadot-types-from-chain": "ts-node --esm ./node_modules/.bin/polkadot-types-from-chain --endpoint src/interfaces/metadata.json --output src/interfaces/ --package .",
-    "polkadot-types": "echo \"export default {}\" > src/interfaces/lookup.ts && yarn polkadot-types-fetch-metadata && yarn polkadot-types-from-defs && yarn polkadot-types-from-defs && yarn polkadot-types-from-chain",
-    "generateEnv": "ts-node --esm ./src/generateEnv.ts",
-    "propose-upgrade": "ts-node --esm ./src/proposeupgrade.ts",
-    "propose-fast-track": "ts-node --esm ./src/proposefasttrack.ts"
+    "polkadot-types-fetch-metadata": "yarn ts-node --esm scripts/src/fetchMetadata.ts",
+    "polkadot-types-from-defs": "ts-node --esm ./node_modules/.bin/polkadot-types-from-defs --endpoint types/src/metadata.json --input types/src/ --package .",
+    "polkadot-types-from-chain": "ts-node --esm ./node_modules/.bin/polkadot-types-from-chain --endpoint types/src/metadata.json --output types/src/ --package .",
+    "polkadot-types": "echo \"export default {}\" > types/src/lookup.ts && yarn polkadot-types-fetch-metadata && yarn polkadot-types-from-defs && yarn polkadot-types-from-defs && yarn polkadot-types-from-chain"
   },
   "author": "",
   "license": "SEE LICENSE IN ../LICENSE",
   "homepage": "",
-  "dependencies": {
-    "@openzeppelin/contracts": "^4.9.2",
-    "@polkadot/api": "10.10.1",
-    "@polkadot/rpc-core": "^10.10.1",
-    "@polkadot/util": "12.5.1",
-    "@polkadot/util-crypto": "12.5.1",
-    "@polkadot/wasm-crypto-asmjs": "^7.2.2",
-    "@polkadot/wasm-crypto-wasm": "^7.2.2",
-    "@rmrk-team/evm-contracts": "^1.2.1",
-    "@typechain/web3-v1": "^6.0.3",
-    "chai-as-promised": "^7.1.1",
-    "chai-like": "^1.1.1",
-    "csv-writer": "^1.6.0",
-    "find-process": "^1.4.7",
-    "lossless-json": "^2.0.9",
-    "solc": "0.8.20",
-    "typechain": "^8.2.0",
-    "web3": "1.10.0"
-  },
   "resolutions": {
     "decode-uri-component": "^0.2.1"
   },
   "type": "module",
-  "packageManager": "yarn@3.6.1"
+  "packageManager": "yarn@3.6.1",
+  "workspaces": [
+    "types",
+    "playgrounds",
+    "scripts",
+    "tests"
+  ]
 }
addedjs-packages/playgrounds/package.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/playgrounds/package.json
@@ -0,0 +1,20 @@
+{
+  "author": "",
+  "license": "SEE LICENSE IN ../../../LICENSE",
+  "description": "Interfaces for interacting with contracts and contract ABIs",
+  "engines": {
+    "node": ">=16"
+  },
+  "name": "@unique/playgrounds",
+  "type": "module",
+  "version": "1.0.0",
+  "main": "unique.js",
+  "dependencies": {
+    "@polkadot/api": "10.10.1",
+    "@polkadot/util": "^12.5.1",
+    "@polkadot/util-crypto": "^12.5.1",
+    "@unique/opal-types": "workspace:*",
+    "rxjs": "^7.8.1",
+    "tslib": "^2.6.2"
+  }
+}
addedjs-packages/playgrounds/src/index.tsdiffbeforeafterboth

no changes

modifiedjs-packages/playgrounds/src/types.tsdiffbeforeafterboth
--- a/js-packages/playgrounds/src/types.ts
+++ b/js-packages/playgrounds/src/types.ts
@@ -1,7 +1,7 @@
 // Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
 // SPDX-License-Identifier: Apache-2.0
 
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 export const NON_EXISTENT_COLLECTION_ID = 4_294_967_295;
 
modifiedjs-packages/playgrounds/src/unique.dev.tsdiffbeforeafterboth
--- a/js-packages/playgrounds/src/unique.dev.ts
+++ b/js-packages/playgrounds/src/unique.dev.ts
@@ -1,20 +1,25 @@
 // Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
 // SPDX-License-Identifier: Apache-2.0
 
+import '@unique/opal-types/src/augment-api.js';
+import '@unique/opal-types/src/augment-types.js';
+import '@unique/opal-types/src/types-lookup.js';
+
 import {stringToU8a} from '@polkadot/util';
 import {blake2AsHex, encodeAddress, mnemonicGenerate} from '@polkadot/util-crypto';
-import {UniqueHelper, ChainHelperBase, ChainHelperBaseConstructor, HelperGroup, UniqueHelperConstructor} from './unique';
+import type {ChainHelperBaseConstructor, UniqueHelperConstructor} from './unique.js';
+import {UniqueHelper, ChainHelperBase, HelperGroup} from './unique.js';
 import {ApiPromise, Keyring, WsProvider} from '@polkadot/api';
-import * as defs from '../../interfaces/definitions';
-import {IKeyringPair} from '@polkadot/types/types';
-import {EventRecord} from '@polkadot/types/interfaces';
-import {ICrossAccountId, ILogger, IPovInfo, ISchedulerOptions, ITransactionResult, TSigner} from './types';
-import {FrameSystemEventRecord, StagingXcmV2TraitsError, StagingXcmV3TraitsOutcome} from '@polkadot/types/lookup';
-import {SignerOptions, VoidFn} from '@polkadot/api/types';
-import {Pallets} from '..';
+import * as defs from '@unique/opal-types/src/definitions.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import type {EventRecord} from '@polkadot/types/interfaces';
+import type {ICrossAccountId, ILogger, IPovInfo, ISchedulerOptions, ITransactionResult, TSigner} from './types.js';
+import type {FrameSystemEventRecord, StagingXcmV2TraitsError, StagingXcmV3TraitsOutcome} from '@polkadot/types/lookup';
+import type {SignerOptions, VoidFn} from '@polkadot/api/types';
 import {spawnSync} from 'child_process';
-import {AcalaHelper, AstarHelper, MoonbeamHelper, PolkadexHelper, RelayHelper, WestmintHelper, ForeignAssetsGroup, XcmGroup, XTokensGroup, TokensGroup} from './unique.xcm';
-import {CollectiveGroup, CollectiveMembershipGroup, DemocracyGroup, ICollectiveGroup, IFellowshipGroup, RankedCollectiveGroup, ReferendaGroup} from './unique.governance';
+import {AcalaHelper, AstarHelper, MoonbeamHelper, PolkadexHelper, RelayHelper, WestmintHelper, ForeignAssetsGroup, XcmGroup, XTokensGroup, TokensGroup} from './unique.xcm.js';
+import {CollectiveGroup, CollectiveMembershipGroup, DemocracyGroup, RankedCollectiveGroup, ReferendaGroup} from './unique.governance.js';
+import type {ICollectiveGroup, IFellowshipGroup} from './unique.governance.js';
 
 export class SilentLogger {
   log(_msg: any, _level: any): void { }
@@ -275,7 +280,7 @@
       super(...args);
     }
 
-    async executeExtrinsic(
+    override async executeExtrinsic(
       sender: IKeyringPair,
       extrinsic: string,
       params: any[],
@@ -307,7 +312,7 @@
       }
       return result;
     }
-    async executeExtrinsicUncheckedWeight(
+    override async executeExtrinsicUncheckedWeight(
       sender: IKeyringPair,
       extrinsic: string,
       params: any[],
@@ -504,7 +509,7 @@
     this.democracy = new DemocracyGroup(this);
   }
 
-  async connect(wsEndpoint: string, _listeners?: any): Promise<void> {
+  override async connect(wsEndpoint: string, _listeners?: any): Promise<void> {
     if(!wsEndpoint) throw new Error('wsEndpoint was not set');
     const wsProvider = new WsProvider(wsEndpoint);
     this.api = new ApiPromise({
@@ -692,7 +697,7 @@
       accounts.push(recipient);
       if(balance !== 0n) {
         const tx = this.helper.constructApiCall('api.tx.balances.transfer', [{Id: recipient.address}, balance * tokenNominal]);
-        transactions.push(this.helper.signTransaction(donor, tx, {nonce, era: 0}, 'account generation'));
+        transactions.push(this.helper.signTransaction(donor, tx, {nonce}, 'account generation'));
         nonce++;
       }
     }
@@ -806,6 +811,7 @@
     const block1date = await findCreationDate(block1);
     const block2date = await findCreationDate(block2);
     if(block2date! - block1date! < 9000) return true;
+    return false;
   };
 
   async calculcateFee(payer: ICrossAccountId, promise: () => Promise<any>): Promise<bigint> {
@@ -1388,8 +1394,8 @@
     this.helper = helper;
   }
 
-  async enable() {
-    if(this.helper.fetchMissingPalletNames([Pallets.TestUtils]).length != 0) {
+  async enable(testUtilsPalletName: string) {
+    if(this.helper.fetchMissingPalletNames([testUtilsPalletName]).length != 0) {
       return;
     }
 
@@ -1502,7 +1508,7 @@
       this.options = options.options;
     }
 
-    executeExtrinsic(sender: IKeyringPair, scheduledExtrinsic: string, scheduledParams: any[], expectSuccess?: boolean): Promise<ITransactionResult> {
+    override executeExtrinsic(sender: IKeyringPair, scheduledExtrinsic: string, scheduledParams: any[], expectSuccess?: boolean): Promise<ITransactionResult> {
       const scheduledTx = this.constructApiCall(scheduledExtrinsic, scheduledParams);
 
       const mandatorySchedArgs = [
modifiedjs-packages/playgrounds/src/unique.governance.tsdiffbeforeafterboth
--- a/js-packages/playgrounds/src/unique.governance.ts
+++ b/js-packages/playgrounds/src/unique.governance.ts
@@ -1,7 +1,7 @@
 import {blake2AsHex} from '@polkadot/util-crypto';
-import {PalletDemocracyConviction} from '@polkadot/types/lookup';
-import {IPhasicEvent, TSigner} from './types';
-import {HelperGroup, UniqueHelper} from './unique';
+import type {PalletDemocracyConviction} from '@polkadot/types/lookup';
+import type {IPhasicEvent, TSigner} from './types.js';
+import {HelperGroup, UniqueHelper} from './unique.js';
 
 export class CollectiveGroup extends HelperGroup<UniqueHelper> {
   /**
modifiedjs-packages/playgrounds/src/unique.tsdiffbeforeafterboth
--- a/js-packages/playgrounds/src/unique.ts
+++ b/js-packages/playgrounds/src/unique.ts
@@ -6,15 +6,14 @@
 /* eslint-disable no-prototype-builtins */
 
 import {ApiPromise, WsProvider, Keyring} from '@polkadot/api';
-import {SignerOptions} from '@polkadot/api/types/submittable';
-import '../../interfaces/augment-api';
-import {AugmentedSubmittables} from '@polkadot/api-base/types/submittable';
-import {ApiInterfaceEvents} from '@polkadot/api/types';
-import {encodeAddress, decodeAddress, keccakAsHex, evmToAddress, addressToEvm, base58Encode, blake2AsU8a, blake2AsHex} from '@polkadot/util-crypto';
-import {IKeyringPair} from '@polkadot/types/types';
+import type {SignerOptions} from '@polkadot/api/types';
+import type {AugmentedSubmittables} from '@polkadot/api-base/types/submittable';
+import type {ApiInterfaceEvents} from '@polkadot/api/types';
+import {encodeAddress, decodeAddress, keccakAsHex, evmToAddress, addressToEvm, base58Encode, blake2AsU8a} from '@polkadot/util-crypto';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {hexToU8a} from '@polkadot/util/hex';
 import {u8aConcat} from '@polkadot/util/u8a';
-import {
+import type {
   IApiListeners,
   IBlock,
   IEvent,
@@ -28,7 +27,6 @@
   INestingPermissions,
   IProperty,
   IStakingInfo,
-  ISchedulerOptions,
   ISubstrateBalance,
   IToken,
   ITokenPropertyPermission,
@@ -40,18 +38,14 @@
   TSubstrateAccount,
   TNetworks,
   IEthCrossAccountId,
-} from './types';
-import {RuntimeDispatchInfo} from '@polkadot/types/interfaces';
-import type {Vec} from '@polkadot/types-codec';
-import {FrameSystemEventRecord} from '@polkadot/types/lookup';
+} from './types.js';
+import type {RuntimeDispatchInfo} from '@polkadot/types/interfaces';
 
 export class CrossAccountId {
-  Substrate!: TSubstrateAccount;
-  Ethereum!: TEthereumAccount;
+  account: ICrossAccountId;
 
   constructor(account: ICrossAccountId) {
-    if('Substrate' in account) this.Substrate = account.Substrate;
-    else this.Ethereum = account.Ethereum;
+    this.account = account;
   }
 
   static fromKeyring(account: IKeyringPair, domain: 'Substrate' | 'Ethereum' = 'Substrate') {
@@ -66,16 +60,17 @@
     else return new CrossAccountId({Ethereum: address.ethereum});
   }
 
-  static normalizeSubstrateAddress(address: TSubstrateAccount, ss58Format = 42): TSubstrateAccount {
-    return encodeAddress(decodeAddress(address), ss58Format);
+  static normalizeSubstrateAddress(address: {Substrate: TSubstrateAccount}, ss58Format = 42): TSubstrateAccount {
+    return encodeAddress(decodeAddress(address.Substrate), ss58Format);
   }
 
-  static withNormalizedSubstrate(address: TSubstrateAccount, ss58Format = 42): CrossAccountId {
-    return new CrossAccountId({Substrate: CrossAccountId.normalizeSubstrateAddress(address, ss58Format)});
+  static withNormalizedSubstrate(address: ICrossAccountId, ss58Format = 42): ICrossAccountId {
+    if('Substrate' in address) return {Substrate: CrossAccountId.normalizeSubstrateAddress(address, ss58Format)};
+    return address;
   }
 
   withNormalizedSubstrate(ss58Format = 42): CrossAccountId {
-    if(this.Substrate) return CrossAccountId.withNormalizedSubstrate(this.Substrate, ss58Format);
+    if('Substrate' in this.account) this.account = CrossAccountId.withNormalizedSubstrate(this.account, ss58Format);
     return this;
   }
 
@@ -84,24 +79,43 @@
   }
 
   toEthereum(): CrossAccountId {
-    if(this.Substrate) return new CrossAccountId({Ethereum: CrossAccountId.translateSubToEth(this.Substrate)});
+    this.account = CrossAccountId.toEthereum(this.account);
     return this;
   }
 
+  static toEthereum(account: ICrossAccountId): ICrossAccountId {
+    if('Substrate' in account) return {Ethereum: CrossAccountId.translateSubToEth(account.Substrate)};
+    return account;
+  }
+
   static translateEthToSub(address: TEthereumAccount, ss58Format?: number): TSubstrateAccount {
     return evmToAddress(address, ss58Format);
   }
 
   toSubstrate(ss58Format?: number): CrossAccountId {
-    if(this.Ethereum) return new CrossAccountId({Substrate: CrossAccountId.translateEthToSub(this.Ethereum, ss58Format)});
+    this.account = CrossAccountId.toSubstrate(this.account, ss58Format);
     return this;
   }
 
+  static toSubstrate(account: ICrossAccountId, ss58Format?: number): ICrossAccountId {
+    if('Ethereum' in account) return {Substrate: CrossAccountId.translateEthToSub(account.Ethereum, ss58Format)};
+    return account;
+  }
+
   toLowerCase(): CrossAccountId {
-    if(this.Substrate) this.Substrate = this.Substrate.toLowerCase();
-    if(this.Ethereum) this.Ethereum = this.Ethereum.toLowerCase();
+    this.account = CrossAccountId.toLowerCase(this.account);
     return this;
   }
+
+  static toLowerCase(account: ICrossAccountId) {
+    if('Substrate' in account) return {Substrate: account.Substrate.toLowerCase()};
+    if('Ethereum' in account) return {Ethereum: account.Ethereum.toLowerCase()};
+    return account;
+  }
+
+  toICrossAccountId(): ICrossAccountId {
+    return this.account;
+  }
 }
 
 const nesting = {
@@ -141,8 +155,8 @@
     RPC: 'rpc',
   };
 
-  static getTokenAccount(token: IToken): CrossAccountId {
-    return new CrossAccountId({Ethereum: this.getTokenAddress(token)});
+  static getTokenAccount(token: IToken): ICrossAccountId {
+    return {Ethereum: this.getTokenAddress(token)};
   }
 
   static getTokenAddress(token: IToken): string {
@@ -228,7 +242,7 @@
     }
     let success = false;
     const tokens = [] as { collectionId: number, tokenId: number, owner: CrossAccountId, amount: bigint }[];
-    burnResult.result.events.forEach(({event: {data, method, section}}) => {
+    burnResult.result.events.forEach(({event: {data, method, section}}: any) => {
       if(method === 'ExtrinsicSuccess') {
         success = true;
       } else if((section === 'common') && (method === 'ItemDestroyed')) {
@@ -260,24 +274,19 @@
   static isTokenTransferSuccess(events: { event: IEvent }[], collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount = 1n) {
     const normalizeAddress = (address: string | ICrossAccountId) => {
       if(typeof address === 'string') return address;
-      const obj = {} as any;
-      Object.keys(address).forEach(k => {
-        obj[k.toLocaleLowerCase()] = (address as any)[k];
-      });
-      if(obj.substrate) return CrossAccountId.withNormalizedSubstrate(obj.substrate);
-      if(obj.ethereum) return CrossAccountId.fromLowerCaseKeys(obj).toLowerCase();
+      if('Substrate' in address) return CrossAccountId.withNormalizedSubstrate(address);
+      if('Ethereum' in address) return CrossAccountId.toLowerCase(address);
       return address;
     };
     let transfer = {collectionId: null, tokenId: null, from: null, to: null, amount: 1} as any;
     events.forEach(({event: {data, method, section}}) => {
       if((section === 'common') && (method === 'Transfer')) {
-        const hData = (data as any).toJSON();
         transfer = {
-          collectionId: hData[0],
-          tokenId: hData[1],
-          from: normalizeAddress(hData[2]),
-          to: normalizeAddress(hData[3]),
-          amount: BigInt(hData[4]),
+          collectionId: data[0].toJSON(),
+          tokenId: data[1].toJSON(),
+          from: normalizeAddress(data[2].toHuman()),
+          to: normalizeAddress(data[3].toHuman()),
+          amount: BigInt(data[4].toJSON()),
         };
       }
     });
@@ -303,12 +312,12 @@
 }
 
 class UniqueEventHelper {
-  private static extractIndex(index: any): [number, number] | string {
+  static extractIndex(index: any): [number, number] | string {
     if(index.toRawType() === '[u8;2]') return [index[0], index[1]];
     return index.toJSON();
   }
 
-  private static extractSub(data: any, subTypes: any): { [key: string]: any } {
+  static extractSub(data: any, subTypes: any): { [key: string]: any } {
     let obj: any = {};
     let index = 0;
 
@@ -322,11 +331,11 @@
     return obj;
   }
 
-  private static toHuman(data: any) {
+  static toHuman(data: any) {
     return data && data.toHuman ? data.toHuman() : `${data}`;
   }
 
-  private static extractData(data: any, type: any): any {
+  static extractData(data: any, type: any): any {
     if(!type) return this.toHuman(data);
     if(['u16', 'u32'].indexOf(type.type) > -1) return data.toNumber();
     if(['u64', 'u128', 'u256'].indexOf(type.type) > -1) return data.toBigInt();
@@ -361,7 +370,7 @@
 }
 const InvalidTypeSymbol = Symbol('Invalid type');
 // eslint-disable-next-line @typescript-eslint/no-unused-vars
-export type Invalid<ErrorMessage> =
+export type Invalid =
   | ((
     invalidType: typeof InvalidTypeSymbol,
     ..._: typeof InvalidTypeSymbol[]
@@ -371,7 +380,7 @@
 // Has slightly better error messages than Get
 type Get2<T, P extends string, E> =
   P extends `${infer Key}.${infer Key2}` ? Key extends keyof T ? Key2 extends keyof T[Key] ? T[Key][Key2] : E : E : E;
-type ForceFunction<T> = T extends (...args: any) => any ? T : (...args: any) => Invalid<'not a function'>;
+type ForceFunction<T> = T extends (...args: any) => any ? T : (...args: any) => Invalid;
 
 export class ChainHelperBase {
   helperBase: any;
@@ -432,7 +441,7 @@
 
   async subscribeEvents(expectedEvents: { section: string, names: string[] }[]) {
     const collectedEvents: IEvent[] = [];
-    const unsubscribe = await this.getApi().query.system.events((events: Vec<FrameSystemEventRecord>) => {
+    const unsubscribe = await this.getApi().query.system.events((events: any) => {
       const ievents = this.eventHelper.extractEvents(events);
       ievents.forEach((event) => {
         expectedEvents.forEach((e => {
@@ -523,7 +532,7 @@
       westmint: {},
     };
     if(!supportedRPC.hasOwnProperty(network)) network = await this.detectNetworkByWsEndpoint(wsEndpoint);
-    const rpc = supportedRPC[network];
+    const rpc = supportedRPC[network] as any;
 
     // TODO: investigate how to replace rpc in runtime
     // api._rpcCore.addUserInterfaces(rpc);
@@ -669,7 +678,7 @@
       ...args: any) => any = ForceFunction<
         Get2<
           AugmentedSubmittables<'promise'>,
-          E, (...args: any) => Invalid<'not found'>
+          E, (...args: any) => Invalid
         >
       >
   >(
@@ -735,15 +744,15 @@
          ...args: any) => any = ForceFunction<
             Get2<
                AugmentedSubmittables<'promise'>,
-               E, (...args: any) => Invalid<'not found'>
+               E, (...args: any) => Invalid
             >
          >
    >(
-    sender: TSigner,
-    extrinsic: `api.tx.${E}`,
-    params: Parameters<V>,
-    expectSuccess = true,
-    options: Partial<SignerOptions> | null = null,/*, failureMessage='expected success'*/
+    _sender: TSigner,
+    _extrinsic: `api.tx.${E}`,
+    _params: Parameters<V>,
+    _expectSuccess = true,
+    _options: Partial<SignerOptions> | null = null,/*, failureMessage='expected success'*/
   ): Promise<ITransactionResult> {
     throw new Error('executeExtrinsicUncheckedWeight only supported in sudo');
   }
@@ -892,11 +901,11 @@
    * @example await getAdmins(1)
    * @returns array of administrators
    */
-  async getAdmins(collectionId: number, normalize = false): Promise<CrossAccountId[]> {
-    const admins = (await this.helper.callRpc('api.rpc.unique.adminlist', [collectionId])).toHuman();
+  async getAdmins(collectionId: number, normalize = false): Promise<ICrossAccountId[]> {
+    const admins = (await this.helper.callRpc('api.rpc.unique.adminlist', [collectionId])).toHuman() as ICrossAccountId[];
 
     return normalize
-      ? admins.map((address: CrossAccountId) => address.withNormalizedSubstrate())
+      ? admins.map(address => CrossAccountId.withNormalizedSubstrate(address))
       : admins;
   }
 
@@ -907,10 +916,10 @@
    * @example await getAllowList(1)
    * @returns array of allow-listed addresses
    */
-  async getAllowList(collectionId: number, normalize = false): Promise<CrossAccountId[]> {
-    const allowListed = (await this.helper.callRpc('api.rpc.unique.allowlist', [collectionId])).toHuman();
+  async getAllowList(collectionId: number, normalize = false): Promise<ICrossAccountId[]> {
+    const allowListed = (await this.helper.callRpc('api.rpc.unique.allowlist', [collectionId])).toHuman() as ICrossAccountId[];
     return normalize
-      ? allowListed.map((address: CrossAccountId) => address.withNormalizedSubstrate())
+      ? allowListed.map(address => CrossAccountId.withNormalizedSubstrate(address))
       : allowListed;
   }
 
@@ -1372,7 +1381,7 @@
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
   async approveTokenFromEth(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount = 1n) {
-    const ethMirror = CrossAccountId.fromKeyring(signer).toEthereum();
+    const ethMirror = CrossAccountId.fromKeyring(signer).toEthereum().toICrossAccountId();
     return await this.approveTokenFrom(signer, collectionId, tokenId, ethMirror, toAddressObj, amount);
   }
 
@@ -1439,12 +1448,12 @@
    */
   async getToken(collectionId: number, tokenId: number, propertyKeys: string[] = [], blockHashAt?: string): Promise<{
     properties: IProperty[];
-    owner: CrossAccountId;
-    normalizedOwner: CrossAccountId;
+    owner: ICrossAccountId;
+    normalizedOwner: ICrossAccountId;
   } | null> {
-    let tokenData;
+    let args;
     if(typeof blockHashAt === 'undefined') {
-      tokenData = await this.helper.callRpc('api.rpc.unique.tokenData', [collectionId, tokenId]);
+      args = [collectionId, tokenId];
     }
     else {
       if(propertyKeys.length == 0) {
@@ -1452,17 +1461,11 @@
         if(!collection) return null;
         propertyKeys = collection.tokenPropertyPermissions.map((x: ITokenPropertyPermission) => x.key);
       }
-      tokenData = await this.helper.callRpc('api.rpc.unique.tokenData', [collectionId, tokenId, propertyKeys, blockHashAt]);
+      args = [collectionId, tokenId, propertyKeys, blockHashAt];
     }
-    tokenData = tokenData.toHuman();
+    const tokenData = (await this.helper.callRpc('api.rpc.unique.tokenData', args)).toHuman();
     if(tokenData === null || tokenData.owner === null) return null;
-    const owner = {} as any;
-    for(const key of Object.keys(tokenData.owner)) {
-      owner[key.toLocaleLowerCase()] = key.toLocaleLowerCase() == 'substrate'
-        ? CrossAccountId.normalizeSubstrateAddress(tokenData.owner[key])
-        : tokenData.owner[key];
-    }
-    tokenData.normalizedOwner = CrossAccountId.fromLowerCaseKeys(owner);
+    tokenData.normalizedOwner = CrossAccountId.withNormalizedSubstrate(tokenData.owner);
     return tokenData;
   }
 
@@ -1474,14 +1477,14 @@
    * @example getTokenOwner(10, 5);
    * @returns Address in CrossAccountId format, e.g. {Substrate: "5DnSF6RRjwteE3BrCj..."}
    */
-  async getTokenOwner(collectionId: number, tokenId: number, blockHashAt?: string): Promise<CrossAccountId> {
+  async getTokenOwner(collectionId: number, tokenId: number, blockHashAt?: string): Promise<ICrossAccountId> {
     let owner;
     if(typeof blockHashAt === 'undefined') {
       owner = await this.helper.callRpc('api.rpc.unique.tokenOwner', [collectionId, tokenId]);
     } else {
       owner = await this.helper.callRpc('api.rpc.unique.tokenOwner', [collectionId, tokenId, blockHashAt]);
     }
-    return CrossAccountId.fromLowerCaseKeys(owner.toJSON());
+    return CrossAccountId.fromLowerCaseKeys(owner.toJSON()).toICrossAccountId();
   }
 
   /**
@@ -1492,7 +1495,7 @@
    * @example getTokenTopmostOwner(10, 5);
    * @returns address in CrossAccountId format, e.g. {Substrate: "5DyN4Y92vZCjv38fg..."}
    */
-  async getTokenTopmostOwner(collectionId: number, tokenId: number, blockHashAt?: string): Promise<CrossAccountId | null> {
+  async getTokenTopmostOwner(collectionId: number, tokenId: number, blockHashAt?: string): Promise<ICrossAccountId | null> {
     let owner;
     if(typeof blockHashAt === 'undefined') {
       owner = await this.helper.callRpc('api.rpc.unique.topmostTokenOwner', [collectionId, tokenId]);
@@ -1702,7 +1705,7 @@
    * @example getCollectionObject(2);
    * @returns instance of UniqueNFTCollection
    */
-  getCollectionObject(collectionId: number): UniqueNFTCollection {
+  override getCollectionObject(collectionId: number): UniqueNFTCollection {
     return new UniqueNFTCollection(collectionId, this.helper);
   }
 
@@ -1713,7 +1716,7 @@
    * @example getTokenObject(10, 5);
    * @returns instance of UniqueNFTToken
    */
-  getTokenObject(collectionId: number, tokenId: number): UniqueNFToken {
+  override getTokenObject(collectionId: number, tokenId: number): UniqueNFToken {
     return new UniqueNFToken(tokenId, this.getCollectionObject(collectionId));
   }
 
@@ -1725,7 +1728,7 @@
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
   async isTokenApproved(collectionId: number, tokenId: number, toAccountObj: ICrossAccountId): Promise<boolean> {
-    return (await this.getTokenApprovedPieces(collectionId, tokenId, toAccountObj, await this.getTokenOwner(collectionId, tokenId))) === 1n;
+    return (await this.getTokenApprovedPieces(collectionId, tokenId, toAccountObj, (await this.getTokenOwner(collectionId, tokenId)))) === 1n;
   }
 
   /**
@@ -1738,7 +1741,7 @@
    * @example transferToken(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."})
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  async transferToken(signer: TSigner, collectionId: number, tokenId: number, addressObj: ICrossAccountId): Promise<boolean> {
+  override async transferToken(signer: TSigner, collectionId: number, tokenId: number, addressObj: ICrossAccountId): Promise<boolean> {
     return await super.transferToken(signer, collectionId, tokenId, addressObj, 1n);
   }
 
@@ -1754,7 +1757,7 @@
    * @example transferTokenFrom(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."}, {Ethereum: "0x9F0583DbB85..."})
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  async transferTokenFrom(signer: TSigner, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId): Promise<boolean> {
+  override async transferTokenFrom(signer: TSigner, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId): Promise<boolean> {
     return await super.transferTokenFrom(signer, collectionId, tokenId, fromAddressObj, toAddressObj, 1n);
   }
 
@@ -1789,7 +1792,7 @@
    * })
    * @returns object of the created collection
    */
-  async mintCollection(signer: TSigner, collectionOptions: ICollectionCreationOptions = {}): Promise<UniqueNFTCollection> {
+  override async mintCollection(signer: TSigner, collectionOptions: ICollectionCreationOptions = {}): Promise<UniqueNFTCollection> {
     return await super.mintCollection(signer, collectionOptions, 'NFT') as UniqueNFTCollection;
   }
 
@@ -1883,7 +1886,7 @@
    * @example approveToken(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."})
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  approveToken(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount = 1n) {
+  override approveToken(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount = 1n) {
     return super.approveToken(signer, collectionId, tokenId, toAddressObj, amount);
   }
 }
@@ -1896,7 +1899,7 @@
    * @example getCollectionObject(2);
    * @returns instance of UniqueRFTCollection
    */
-  getCollectionObject(collectionId: number): UniqueRFTCollection {
+  override getCollectionObject(collectionId: number): UniqueRFTCollection {
     return new UniqueRFTCollection(collectionId, this.helper);
   }
 
@@ -1907,7 +1910,7 @@
    * @example getTokenObject(10, 5);
    * @returns instance of UniqueNFTToken
    */
-  getTokenObject(collectionId: number, tokenId: number): UniqueRFToken {
+  override getTokenObject(collectionId: number, tokenId: number): UniqueRFToken {
     return new UniqueRFToken(tokenId, this.getCollectionObject(collectionId));
   }
 
@@ -1918,8 +1921,8 @@
    * @example getTokenTop10Owners(10, 5);
    * @returns array of top 10 owners
    */
-  async getTokenTop10Owners(collectionId: number, tokenId: number): Promise<CrossAccountId[]> {
-    return (await this.helper.callRpc('api.rpc.unique.tokenOwners', [collectionId, tokenId])).toJSON().map(CrossAccountId.fromLowerCaseKeys);
+  async getTokenTop10Owners(collectionId: number, tokenId: number): Promise<ICrossAccountId[]> {
+    return (await this.helper.callRpc('api.rpc.unique.tokenOwners', [collectionId, tokenId])).toJSON().map(CrossAccountId.fromLowerCaseKeys).map(a => a.toICrossAccountId());
   }
 
   /**
@@ -1944,7 +1947,7 @@
    * @example transferTokenFrom(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."}, 2000n)
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  async transferToken(signer: TSigner, collectionId: number, tokenId: number, addressObj: ICrossAccountId, amount = 1n): Promise<boolean> {
+  override async transferToken(signer: TSigner, collectionId: number, tokenId: number, addressObj: ICrossAccountId, amount = 1n): Promise<boolean> {
     return await super.transferToken(signer, collectionId, tokenId, addressObj, amount);
   }
 
@@ -1959,7 +1962,7 @@
    * @example transferTokenFrom(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."}, {Substrate: "5DfhbVfww7ThF8q6f3i..."}, 2000n)
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  async transferTokenFrom(signer: TSigner, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount = 1n): Promise<boolean> {
+  override async transferTokenFrom(signer: TSigner, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount = 1n): Promise<boolean> {
     return await super.transferTokenFrom(signer, collectionId, tokenId, fromAddressObj, toAddressObj, amount);
   }
 
@@ -1975,7 +1978,7 @@
    * })
    * @returns object of the created collection
    */
-  async mintCollection(signer: TSigner, collectionOptions: ICollectionCreationOptions = {}): Promise<UniqueRFTCollection> {
+  override async mintCollection(signer: TSigner, collectionOptions: ICollectionCreationOptions = {}): Promise<UniqueRFTCollection> {
     return await super.mintCollection(signer, collectionOptions, 'RFT') as UniqueRFTCollection;
   }
 
@@ -2003,15 +2006,15 @@
     return this.getTokenObject(data.collectionId, createdTokens.tokens[0].tokenId);
   }
 
-  async mintMultipleTokens(signer: TSigner, collectionId: number, tokens: { owner: ICrossAccountId, pieces: bigint, properties?: IProperty[] }[]): Promise<UniqueRFToken[]> {
+  mintMultipleTokens(_signer: TSigner, _collectionId: number, _tokens: { owner: ICrossAccountId, pieces: bigint, properties?: IProperty[] }[]): Promise<UniqueRFToken[]> {
     throw Error('Not implemented');
-    const creationResult = await this.helper.executeExtrinsic(
-      signer,
-      'api.tx.unique.createMultipleItemsEx', [collectionId, {RefungibleMultipleOwners: tokens}],
-      true, // `Unable to mint RFT tokens for ${label}`,
-    );
-    const collection = this.getCollectionObject(collectionId);
-    return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: IToken) => collection.getTokenObject(x.tokenId));
+    // const creationResult = await this.helper.executeExtrinsic(
+    //   signer,
+    //   'api.tx.unique.createMultipleItemsEx', [collectionId, {RefungibleMultipleOwners: tokens}],
+    //   true, // `Unable to mint RFT tokens for ${label}`,
+    // );
+    // const collection = this.getCollectionObject(collectionId);
+    // return this.helper.util.extractTokensFromCreationResult(creationResult).tokens.map((x: IToken) => collection.getTokenObject(x.tokenId));
   }
 
   /**
@@ -2047,7 +2050,7 @@
    * @example burnToken(aliceKeyring, 10, 5);
    * @returns ```true``` if the extrinsic is successful, otherwise ```false```
    */
-  async burnToken(signer: IKeyringPair, collectionId: number, tokenId: number, amount = 1n): Promise<boolean> {
+  override async burnToken(signer: IKeyringPair, collectionId: number, tokenId: number, amount = 1n): Promise<boolean> {
     return await super.burnToken(signer, collectionId, tokenId, amount);
   }
 
@@ -2061,7 +2064,7 @@
    * @example burnTokenFrom(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."}, 2n)
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  async burnTokenFrom(signer: IKeyringPair, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, amount = 1n): Promise<boolean> {
+  override async burnTokenFrom(signer: IKeyringPair, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, amount = 1n): Promise<boolean> {
     return await super.burnTokenFrom(signer, collectionId, tokenId, fromAddressObj, amount);
   }
 
@@ -2076,7 +2079,7 @@
    * @example approveToken(aliceKeyring, 10, 5, {Substrate: "5GHoZe9c73RYbVzq..."}, "", 10000n);
    * @returns true if the token success, otherwise false
    */
-  approveToken(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount = 1n) {
+  override approveToken(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount = 1n) {
     return super.approveToken(signer, collectionId, tokenId, toAddressObj, amount);
   }
 
@@ -2202,8 +2205,8 @@
    * @example getTop10Owners(10);
    * @returns array of ```ICrossAccountId```
    */
-  async getTop10Owners(collectionId: number): Promise<CrossAccountId[]> {
-    return (await this.helper.callRpc('api.rpc.unique.tokenOwners', [collectionId, 0])).toJSON().map(CrossAccountId.fromLowerCaseKeys);
+  async getTop10Owners(collectionId: number): Promise<ICrossAccountId[]> {
+    return (await this.helper.callRpc('api.rpc.unique.tokenOwners', [collectionId, 0])).toJSON().map(CrossAccountId.fromLowerCaseKeys).map(a => a.toICrossAccountId());
   }
 
   /**
@@ -2391,7 +2394,7 @@
     const result = await this.helper.executeExtrinsic(signer, 'api.tx.balances.transfer', [address, amount], true/*, `Unable to transfer balance from ${this.helper.getSignerAddress(signer)} to ${address}`*/);
 
     let transfer = {from: null, to: null, amount: 0n} as any;
-    result.result.events.forEach(({event: {data, method, section}}) => {
+    result.result.events.forEach(({event: {data, method, section}}: any) => {
       if((section === 'balances') && (method === 'Transfer')) {
         transfer = {
           from: this.helper.address.normalizeSubstrate(data[0]),
@@ -2458,7 +2461,7 @@
     const result = await this.helper.executeExtrinsic(signer, 'api.tx.balances.transfer', [address, amount], true);
 
     let transfer = {from: null, to: null, amount: 0n} as any;
-    result.result.events.forEach(({event: {data, method, section}}) => {
+    result.result.events.forEach(({event: {data, method, section}}: any) => {
       if((section === 'balances') && (method === 'Transfer')) {
         transfer = {
           from: data[0].toString(),
@@ -2573,7 +2576,7 @@
     const result = await this.helper.executeExtrinsic(signer, 'api.tx.balances.forceTransfer', [from, to, amount], true);
 
     let transfer = {from: null, to: null, amount: 0n} as any;
-    result.result.events.forEach(({event: {data, method, section}}) => {
+    result.result.events.forEach(({event: {data, method, section}}: any) => {
       if((section === 'balances') && (method === 'Transfer')) {
         transfer = {
           from: this.helper.address.normalizeSubstrate(data[0]),
@@ -2598,7 +2601,7 @@
   async vestedTransfer(signer: TSigner, address: TSubstrateAccount, schedule: { start: bigint, period: bigint, periodCount: bigint, perPeriod: bigint }): Promise<void> {
     const result = await this.helper.executeExtrinsic(signer, 'api.tx.vesting.vestedTransfer', [address, schedule]);
     const event = result.result.events
-      .find(e => e.event.section === 'vesting' &&
+      .find((e: any) => e.event.section === 'vesting' &&
         e.event.method === 'VestingScheduleAdded' &&
         e.event.data[0].toHuman() === signer.address);
     if(!event) throw Error('Cannot find transfer in events');
@@ -2626,7 +2629,7 @@
   async claim(signer: TSigner) {
     const result = await this.helper.executeExtrinsic(signer, 'api.tx.vesting.claim', []);
     const event = result.result.events
-      .find(e => e.event.section === 'vesting' &&
+      .find((e: any) => e.event.section === 'vesting' &&
         e.event.method === 'Claimed' &&
         e.event.data[0].toHuman() === signer.address);
     if(!event) throw Error('Cannot find claim in events');
@@ -2642,7 +2645,7 @@
    * @returns substrate address converted to normalized (i.e., starting with 5) or specified explicitly representation
    */
   normalizeSubstrate(address: TSubstrateAccount, ss58Format = 42): TSubstrateAccount {
-    return CrossAccountId.normalizeSubstrateAddress(address, ss58Format);
+    return CrossAccountId.normalizeSubstrateAddress({Substrate: address}, ss58Format);
   }
 
   /**
@@ -2766,7 +2769,7 @@
    */
   async stake(signer: TSigner, amountToStake: bigint, label?: string): Promise<boolean> {
     if(typeof label === 'undefined') label = `${signer.address} amount: ${amountToStake}`;
-    const _stakeResult = await this.helper.executeExtrinsic(
+    await this.helper.executeExtrinsic(
       signer, 'api.tx.appPromotion.stake',
       [amountToStake], true,
     );
@@ -2895,7 +2898,7 @@
     const promise = this.helper.executeExtrinsic(signer, 'api.tx.preimage.notePreimage', [bytes]);
     if(returnPreimageHash) {
       const result = await promise;
-      const events = result.result.events.filter(x => x.event.method === 'Noted' && x.event.section === 'preimage');
+      const events = result.result.events.filter((x: any) => x.event.method === 'Noted' && x.event.section === 'preimage');
       const preimageHash = events[0].event.data[0].toHuman();
       return preimageHash;
     }
@@ -3363,13 +3366,13 @@
     return await this.collection.doesTokenExist(this.tokenId);
   }
 
-  nestingAccount() {
+  nestingAccount(): ICrossAccountId {
     return this.collection.helper.util.getTokenAccount(this);
   }
 }
 
 export class UniqueNFToken extends UniqueBaseToken {
-  collection: UniqueNFTCollection;
+  declare collection: UniqueNFTCollection;
 
   constructor(tokenId: number, collection: UniqueNFTCollection) {
     super(tokenId, collection);
@@ -3426,7 +3429,7 @@
 }
 
 export class UniqueRFToken extends UniqueBaseToken {
-  collection: UniqueRFTCollection;
+  declare collection: UniqueRFTCollection;
 
   constructor(tokenId: number, collection: UniqueRFTCollection) {
     super(tokenId, collection);
modifiedjs-packages/playgrounds/src/unique.xcm.tsdiffbeforeafterboth
--- a/js-packages/playgrounds/src/unique.xcm.ts
+++ b/js-packages/playgrounds/src/unique.xcm.ts
@@ -1,12 +1,12 @@
 import {ApiPromise, WsProvider} from '@polkadot/api';
-import {IKeyringPair} from '@polkadot/types/types';
-import {ChainHelperBase, EthereumBalanceGroup, HelperGroup, SubstrateBalanceGroup, UniqueHelper} from './unique';
-import {ILogger, TSigner, TSubstrateAccount} from './types';
-import {AcalaAssetMetadata, DemocracyStandardAccountVote, IForeignAssetMetadata, MoonbeamAssetInfo} from './types.xcm';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {ChainHelperBase, EthereumBalanceGroup, HelperGroup, SubstrateBalanceGroup, UniqueHelper} from './unique.js';
+import type {ILogger, TSigner, TSubstrateAccount} from './types.js';
+import type {AcalaAssetMetadata, DemocracyStandardAccountVote, IForeignAssetMetadata, MoonbeamAssetInfo} from './types.xcm.js';
 
 
 export class XcmChainHelper extends ChainHelperBase {
-  async connect(wsEndpoint: string, _listeners?: any): Promise<void> {
+  override async connect(wsEndpoint: string, _listeners?: any): Promise<void> {
     const wsProvider = new WsProvider(wsEndpoint);
     this.api = new ApiPromise({
       provider: wsProvider,
addedjs-packages/playgrounds/tsconfig.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/playgrounds/tsconfig.json
@@ -0,0 +1,10 @@
+{
+  "extends": "../tsconfig.packages.json",
+  "compilerOptions": {
+    "rootDir": "./src",
+    "outDir": "dist"
+  },
+  "references": [
+    { "path": "../types/tsconfig.json" },
+  ]
+}
\ No newline at end of file
addedjs-packages/scripts/package.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/scripts/package.json
@@ -0,0 +1,23 @@
+{
+  "author": "",
+  "license": "SEE LICENSE IN ../../../LICENSE",
+  "description": "Interfaces for interacting with contracts and contract ABIs",
+  "engines": {
+    "node": ">=16"
+  },
+  "name": "@unique/scripts",
+  "type": "module",
+  "version": "1.0.0",
+  "main": "",
+  "dependencies": {
+    "rxjs": "^7.8.1",
+    "tslib": "^2.6.2"
+  },
+  "scripts": {
+    "benchMintingFee": "ts-node src/benchmarks/mintFee/benchmark.ts",
+    "loadTransfer": "ts-node src/transfer.nload.ts",
+    "generateEnv": "ts-node --esm ./src/generateEnv.ts",
+    "propose-upgrade": "ts-node --esm ./src/proposeupgrade.ts",
+    "propose-fast-track": "ts-node --esm ./src/proposefasttrack.ts"
+  }
+}
modifiedjs-packages/scripts/src/benchmarks/mintFee/index.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/mintFee/index.ts
+++ b/js-packages/scripts/src/benchmarks/mintFee/index.ts
@@ -1,15 +1,14 @@
-import {EthUniqueHelper, usingEthPlaygrounds} from '../../eth/util';
+import {usingEthPlaygrounds} from '@unique/tests/src/eth/util/index.js';
+import {EthUniqueHelper} from '@unique/tests/src/eth/util/playgrounds/unique.dev.js';
 import {readFile} from 'fs/promises';
-import {
-  ICrossAccountId,
-} from '../../util/playgrounds/types';
-import {IKeyringPair} from '@polkadot/types/types';
-import {UniqueNFTCollection} from '../../util/playgrounds/unique';
+import type {ICrossAccountId} from '@unique/playgrounds/src/types.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {UniqueNFTCollection} from '@unique/playgrounds/src/unique.js';
 import {Contract} from 'web3-eth-contract';
 import {createObjectCsvWriter} from 'csv-writer';
-import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES} from '../utils/common';
-import {makeNames} from '../../util';
-import {ContractImports} from '../../eth/util/playgrounds/types';
+import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES} from '../utils/common.js';
+import {makeNames} from '@unique/tests/src/util/index.js';
+import type {ContractImports} from '@unique/tests/src/eth/util/playgrounds/types.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/scripts/src/benchmarks/nesting/ABIGEN/RMRKNestableMintable.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/nesting/ABIGEN/RMRKNestableMintable.ts
+++ b/js-packages/scripts/src/benchmarks/nesting/ABIGEN/RMRKNestableMintable.ts
@@ -8,12 +8,11 @@
 import type { EventEmitter } from "events";
 import type {
   Callback,
-  PayableTransactionObject,
   NonPayableTransactionObject,
   BlockType,
   ContractEventLog,
   BaseContract,
-} from "./types";
+} from "./types.js";
 
 export interface EventOptions {
   filter?: object;
modifiedjs-packages/scripts/src/benchmarks/nesting/ABIGEN/index.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/nesting/ABIGEN/index.ts
+++ b/js-packages/scripts/src/benchmarks/nesting/ABIGEN/index.ts
@@ -1,4 +1,4 @@
 /* Autogenerated file. Do not edit manually. */
 /* tslint:disable */
 /* eslint-disable */
-export type { RMRKNestableMintable } from "./RMRKNestableMintable";
+export type { RMRKNestableMintable } from "./RMRKNestableMintable.js";
modifiedjs-packages/scripts/src/benchmarks/nesting/ABIGEN/types.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/nesting/ABIGEN/types.ts
+++ b/js-packages/scripts/src/benchmarks/nesting/ABIGEN/types.ts
@@ -3,7 +3,7 @@
 /* eslint-disable */
 import type BN from "bn.js";
 import type { EventEmitter } from "events";
-import type { EventLog, PromiEvent, TransactionReceipt } from "web3-core/types";
+import type { EventLog, PromiEvent, TransactionReceipt } from "web3-core";
 import type { Contract } from "web3-eth-contract";
 
 export interface EstimateGasOptions {
modifiedjs-packages/scripts/src/benchmarks/nesting/index.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/nesting/index.ts
+++ b/js-packages/scripts/src/benchmarks/nesting/index.ts
@@ -1,57 +1,58 @@
-import {EthUniqueHelper, usingEthPlaygrounds} from '../../eth/util';
+import {usingEthPlaygrounds} from '@unique/tests/src/eth/util/index.js';
+import {EthUniqueHelper} from '@unique/tests/src/eth/util/playgrounds/unique.dev.js';
 import {readFile} from 'fs/promises';
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
-import {convertToTokens} from '../utils/common';
-import {makeNames} from '../../util';
-import {ContractImports} from '../../eth/util/playgrounds/types';
-import {RMRKNestableMintable} from './ABIGEN';
+import {convertToTokens} from '../utils/common.js';
+import {makeNames} from '@unique/tests/src/util/index.js';
+import type {ContractImports} from '@unique/tests/src/eth/util/playgrounds/types.js';
+import type {RMRKNestableMintable} from './ABIGEN/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
 export const CONTRACT_IMPORT: ContractImports[] = [
   {
-    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/nestable/RMRKNestable.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/nestable/RMRKNestable.sol`,
     solPath: '@rmrk-team/evm-contracts/contracts/RMRK/nestable/RMRKNestable.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/nestable/IERC6059.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/nestable/IERC6059.sol`,
     solPath: '@rmrk-team/evm-contracts/contracts/RMRK/nestable/IERC6059.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/core/RMRKCore.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/core/RMRKCore.sol`,
     solPath: '@rmrk-team/evm-contracts/contracts/RMRK/core/RMRKCore.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol`,
     solPath: '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol`,
     solPath: '@openzeppelin/contracts/token/ERC721/IERC721.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol`,
     solPath: '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/Address.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/utils/Address.sol`,
     solPath: '@openzeppelin/contracts/utils/Address.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/Context.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/utils/Context.sol`,
     solPath: '@openzeppelin/contracts/utils/Context.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol`,
     solPath: '@openzeppelin/contracts/utils/introspection/IERC165.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/library/RMRKErrors.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/library/RMRKErrors.sol`,
     solPath: '@rmrk-team/evm-contracts/contracts/RMRK/library/RMRKErrors.sol',
   },
   {
-    fsPath: `${dirname}/../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/core/IRMRKCore.sol`,
+    fsPath: `${dirname}/../../../../node_modules/@rmrk-team/evm-contracts/contracts/RMRK/core/IRMRKCore.sol`,
     solPath: '@rmrk-team/evm-contracts/contracts/RMRK/core/IRMRKCore.sol',
   },
   {
modifiedjs-packages/scripts/src/benchmarks/opsFee/index.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/opsFee/index.ts
+++ b/js-packages/scripts/src/benchmarks/opsFee/index.ts
@@ -1,13 +1,15 @@
-import {EthUniqueHelper, usingEthPlaygrounds} from '../../eth/util';
+import {usingEthPlaygrounds} from '@unique/tests/src/eth/util/index.js';
+import {EthUniqueHelper} from '@unique/tests/src/eth/util/playgrounds/unique.dev.js';
 import {readFile} from 'fs/promises';
-import {CollectionLimitField,  CreateCollectionData,  TokenPermissionField} from '../../eth/util/playgrounds/types';
-import {IKeyringPair} from '@polkadot/types/types';
-import {UniqueFTCollection, UniqueNFTCollection} from '../../util/playgrounds/unique';
+import {CollectionLimitField,  CreateCollectionData,  TokenPermissionField} from '@unique/tests/src/eth/util/playgrounds/types.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {UniqueFTCollection, UniqueNFTCollection} from '@unique/playgrounds/src/unique.js';
 import {Contract} from 'web3-eth-contract';
 import {createObjectCsvWriter} from 'csv-writer';
-import {FunctionFeeVM, IFunctionFee} from '../utils/types';
-import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES, SUBS_PROPERTIES} from '../utils/common';
-import {makeNames} from '../../util';
+import {FunctionFeeVM} from '../utils/types.js';
+import type {IFunctionFee} from '../utils/types.js';
+import {convertToTokens, createCollectionForBenchmarks, PERMISSIONS, PROPERTIES, SUBS_PROPERTIES} from '../utils/common.js';
+import {makeNames} from '@unique/tests/src/util/index.js';
 
 
 const {dirname} = makeNames(import.meta.url);
modifiedjs-packages/scripts/src/benchmarks/utils/common.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/benchmarks/utils/common.ts
+++ b/js-packages/scripts/src/benchmarks/utils/common.ts
@@ -1,7 +1,7 @@
-import {EthUniqueHelper} from '../../eth/util';
-import {ITokenPropertyPermission, TCollectionMode} from '../../util/playgrounds/types';
-import {UniqueNFTCollection, UniqueRFTCollection} from '../../util/playgrounds/unique';
-import {IKeyringPair} from '@polkadot/types/types';
+import {EthUniqueHelper} from '@unique/tests/src/eth/util/playgrounds/unique.dev.js';
+import {UniqueNFTCollection, UniqueRFTCollection} from '@unique/playgrounds/src/unique.js';
+import type {ITokenPropertyPermission, TCollectionMode} from '@unique/playgrounds/src/types.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 export const PROPERTIES = Array(40)
   .fill(0)
modifiedjs-packages/scripts/src/calibrate.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/calibrate.ts
+++ b/js-packages/scripts/src/calibrate.ts
@@ -1,5 +1,6 @@
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingEthPlaygrounds, EthUniqueHelper} from './eth/util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingEthPlaygrounds} from '@unique/tests/src/eth/util/index.js';
+import {EthUniqueHelper} from '@unique/tests/src//eth/util/playgrounds/unique.dev.js';
 
 class Fract {
   static ZERO = new Fract(0n);
@@ -174,14 +175,14 @@
 
 const hypothesisLinear = (a: Fract, b: Fract) => (x: Fract) => rpn(x, a, '*', b, '+');
 
-function _error(points: { x: Fract, y: Fract }[], hypothesis: (a: Fract) => Fract) {
-  return points.map(p => {
-    const v = hypothesis(p.x);
-    const vv = p.y;
+// function error(points: { x: Fract, y: Fract }[], hypothesis: (a: Fract) => Fract) {
+//   return points.map(p => {
+//     const v = hypothesis(p.x);
+//     const vv = p.y;
 
-    return rpn(v, vv, '-', 'dup', '*');
-  }).reduce((a, b) => a.plus(b), Fract.ZERO).sqrt().div(new Fract(BigInt(points.length)));
-}
+//     return rpn(v, vv, '-', 'dup', '*');
+//   }).reduce((a, b) => a.plus(b), Fract.ZERO).sqrt().div(new Fract(BigInt(points.length)));
+// }
 
 async function calibrateWeightToFee(helper: EthUniqueHelper, privateKey: (account: string) => Promise<IKeyringPair>) {
   const alice = await privateKey('//Alice');
modifiedjs-packages/scripts/src/calibrateApply.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/calibrateApply.ts
+++ b/js-packages/scripts/src/calibrateApply.ts
@@ -1,7 +1,6 @@
 import {readFile, writeFile} from 'fs/promises';
 import path from 'path';
-import usingApi from './.outdated/substrate/substrate-api';
-import {makeNames} from './util';
+import {makeNames, usingPlaygrounds} from '@unique/tests/src/util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
@@ -10,9 +9,9 @@
 (async () => {
   let weightToFeeCoefficientOverride: string;
   let minGasPriceOverride: string;
-  await usingApi(async (api, _privateKey) => {
-    weightToFeeCoefficientOverride = (await api.query.configuration.weightToFeeCoefficientOverride() as any).toBigInt().toString();
-    minGasPriceOverride = (await api.query.configuration.minGasPriceOverride() as any).toBigInt().toString();
+  await usingPlaygrounds(async (helpers, _privateKey) => {
+    weightToFeeCoefficientOverride = (await helpers.getApi().query.configuration.weightToFeeCoefficientOverride() as any).toBigInt().toString();
+    minGasPriceOverride = (await helpers.getApi().query.configuration.minGasPriceOverride() as any).toBigInt().toString();
   });
   const constantsFile = path.resolve(dirname, '../../primitives/common/src/constants.rs');
   let constants = (await readFile(constantsFile)).toString();
modifiedjs-packages/scripts/src/fetchMetadata.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/fetchMetadata.ts
+++ b/js-packages/scripts/src/fetchMetadata.ts
@@ -25,7 +25,7 @@
       }),
     });
     const json = await response.json();
-    const output = join(srcDir, 'interfaces/metadata.json');
+    const output = join(srcDir, 'metadata.json');
     console.log(`Received response, saving to ${output}`);
     await writeFile(output, JSON.stringify(json));
     exit(0);
modifiedjs-packages/scripts/src/generateEnv.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/generateEnv.ts
+++ b/js-packages/scripts/src/generateEnv.ts
@@ -1,7 +1,7 @@
 import {ApiPromise, WsProvider} from '@polkadot/api';
 import {readFile} from 'fs/promises';
 import {join} from 'path';
-import {makeNames} from './util';
+import {makeNames} from '@unique/tests/src/util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/scripts/src/generate_types/readyness.jsdiffbeforeafterboth
--- a/js-packages/scripts/src/generate_types/readyness.js
+++ b/js-packages/scripts/src/generate_types/readyness.js
@@ -1,4 +1,4 @@
-import { ApiPromise, WsProvider } from '@polkadot/api';
+import {ApiPromise, WsProvider} from '@polkadot/api';
 
 const connect = async () => {
   const wsEndpoint = 'ws://127.0.0.1:9944';
@@ -9,26 +9,25 @@
   await api.disconnect();
   if(head < 1) throw Error('No block #1');
 
-}
-
-const sleep = time => {
-  return new Promise(resolve => {
-    setTimeout(() => resolve(), time);
-  });
 };
 
+const sleep = time => new Promise(resolve => {
+  setTimeout(() => resolve(), time);
+});
+
 const main = async () => {
+  // eslint-disable-next-line no-constant-condition
   while(true) {
     try {
       await connect();
       break;
     }
-    catch(e) {
+    catch (e) {
       await sleep(10000);
       console.log(e);
     }
   }
-}
+};
 
 main().then(() => process.exit(0)).catch(e => {
   console.error(e);
addedjs-packages/scripts/src/metadata.jsondiffbeforeafterboth

no changes

modifiedjs-packages/scripts/src/transfer.nload.tsdiffbeforeafterboth
--- a/js-packages/scripts/src/transfer.nload.ts
+++ b/js-packages/scripts/src/transfer.nload.ts
@@ -16,9 +16,9 @@
 
 /* eslint-disable @typescript-eslint/no-floating-promises */
 import os from 'os';
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds} from './util';
-import {UniqueHelper} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds} from '@unique/tests/src/util/index.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
 import * as notReallyCluster from 'cluster'; // https://github.com/nodejs/node/issues/42271#issuecomment-1063415346
 const cluster = notReallyCluster as unknown as notReallyCluster.Cluster;
 
addedjs-packages/scripts/tsconfig.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/scripts/tsconfig.json
@@ -0,0 +1,12 @@
+{
+  "extends": "../tsconfig.packages.json",
+  "compilerOptions": {
+    "rootDir": "./src",
+    "outDir": "dist"
+  },
+  "references": [
+    { "path": "../types/tsconfig.json" },
+    { "path": "../playgrounds/tsconfig.json" },
+    { "path": "../tests/tsconfig.json" }
+  ]
+}
\ No newline at end of file
addedjs-packages/tests/package.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/tests/package.json
@@ -0,0 +1,32 @@
+{
+    "author": "",
+    "license": "SEE LICENSE IN ../../../LICENSE",
+    "description": "Interfaces for interacting with contracts and contract ABIs",
+    "engines": {
+        "node": ">=16"
+    },
+    "name": "@unique/tests",
+    "type": "module",
+    "version": "1.0.0",
+    "main": "",
+    "dependencies": {
+        "rxjs": "^7.8.1",
+        "tslib": "^2.6.2"
+    },
+    "devDependencies": {
+        "@types/node": "^20.8.10",
+        "mocha": "^10.1.0",
+        "ts-node": "^10.9.1",
+        "typescript": "^5.1.6"
+    },
+    "scripts": {
+        "setup": "ts-node --esm ./src/util/globalSetup.ts",
+        "setIdentities": "ts-node --esm ./src/util/identitySetter.ts",
+        "checkRelayIdentities": "ts-node --esm ./src/util/relayIdentitiesChecker.ts",
+        "frankenstein": "ts-node --esm ./src/util/frankenstein.ts",
+        "_test": "yarn setup && mocha --timeout 9999999 --loader=ts-node/esm.mjs",
+        "_testParallel": "yarn setup && mocha --timeout 9999999 --parallel --loader=ts-node/esm.mjs",
+        "test": "yarn _test './src/**/*.*test.ts'",
+        "load": "yarn _test './**/*.load.ts'"
+    }
+}
modifiedjs-packages/tests/src/addCollectionAdmin.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/addCollectionAdmin.test.ts
+++ b/js-packages/tests/src/addCollectionAdmin.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test addCollectionAdmin(collection_id, new_admin_id):', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/adminTransferAndBurn.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/adminTransferAndBurn.test.ts
+++ b/js-packages/tests/src/adminTransferAndBurn.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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub} from './util/index.js';
 
 describe('Integration Test: ownerCanTransfer allows admins to use only transferFrom/burnFrom:', () => {
   let alice: IKeyringPair;
@@ -40,7 +40,7 @@
 
     await helper.nft.transferTokenFrom(alice, collectionId, tokenId, {Substrate: bob.address}, {Substrate: charlie.address});
     const newTokenOwner = await helper.nft.getTokenOwner(collectionId, tokenId);
-    expect(newTokenOwner.Substrate).to.be.equal(charlie.address);
+    expect(newTokenOwner).to.be.deep.equal({Substrate: charlie.address});
   });
 
   itSub('admin burns other user\'s token', async ({helper}) => {
modifiedjs-packages/tests/src/allowLists.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/allowLists.test.ts
+++ b/js-packages/tests/src/allowLists.test.ts
@@ -14,9 +14,10 @@
 // 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, expect, itSub} from './util';
-import {ICollectionPermissions, NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub} from './util/index.js';
+import type {ICollectionPermissions} from '@unique/playgrounds/src/types.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test ext. Allow list tests', () => {
   let alice: IKeyringPair;
@@ -177,7 +178,7 @@
       await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});
       await helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});
       const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-      expect(owner.Substrate).to.be.equal(charlie.address);
+      expect(owner).to.be.deep.equal({Substrate: charlie.address});
     });
 
     itSub('If Public Access mode is set to AllowList, tokens can be transferred to a allowlisted address with transferFrom.', async ({helper}) => {
@@ -190,7 +191,7 @@
 
       await helper.nft.transferTokenFrom(alice, collectionId, tokenId, {Substrate: alice.address}, {Substrate: charlie.address});
       const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-      expect(owner.Substrate).to.be.equal(charlie.address);
+      expect(owner).to.be.deep.equal({Substrate: charlie.address});
     });
 
     itSub('If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer', async ({helper}) => {
@@ -202,7 +203,7 @@
 
       await helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});
       const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-      expect(owner.Substrate).to.be.equal(charlie.address);
+      expect(owner).to.be.deep.equal({Substrate: charlie.address});
     });
 
     itSub('If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transferFrom', async ({helper}) => {
@@ -215,7 +216,7 @@
 
       await helper.nft.transferTokenFrom(alice, collectionId, tokenId, {Substrate: alice.address}, {Substrate: charlie.address});
       const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-      expect(owner.Substrate).to.be.equal(charlie.address);
+      expect(owner).to.be.deep.equal({Substrate: charlie.address});
     });
   });
 
modifiedjs-packages/tests/src/apiConsts.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/apiConsts.test.ts
+++ b/js-packages/tests/src/apiConsts.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {ApiPromise} from '@polkadot/api';
-import {usingPlaygrounds, itSub, expect, COLLECTION_HELPER, CONTRACT_HELPER} from './util';
+import {usingPlaygrounds, itSub, expect, COLLECTION_HELPER, CONTRACT_HELPER} from './util/index.js';
 
 
 const MAX_COLLECTION_DESCRIPTION_LENGTH = 256n;
modifiedjs-packages/tests/src/approve.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/approve.test.ts
+++ b/js-packages/tests/src/approve.test.ts
@@ -14,15 +14,15 @@
 // 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 {expect, itSub, Pallets, usingPlaygrounds} from './util';
-import {CrossAccountId} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, usingPlaygrounds} from './util/index.js';
+import {CrossAccountId} from '@unique/playgrounds/src/unique.js';
 
 
 
 [
-  {method: 'approveToken', account: (account: IKeyringPair) => CrossAccountId.fromKeyring(account)},
-  {method: 'approveTokenFromEth', account: (account: IKeyringPair) => CrossAccountId.fromKeyring(account).toEthereum()},
+  {method: 'approveToken', account: (account: IKeyringPair) => CrossAccountId.fromKeyring(account).toICrossAccountId()},
+  {method: 'approveTokenFromEth', account: (account: IKeyringPair) => CrossAccountId.fromKeyring(account).toEthereum().toICrossAccountId()},
 ].map(testCase => {
   describe(`Integration Test ${testCase.method}(spender, collection_id, item_id, amount):`, () => {
     let alice: IKeyringPair;
@@ -158,7 +158,7 @@
       await (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
       await helper.nft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address});
       const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-      expect(owner.Substrate).to.be.equal(alice.address);
+      expect(owner).to.be.deep.equal({Substrate: alice.address});
     });
 
     itSub('Fungible up to an approved amount', async ({helper}) => {
@@ -201,7 +201,7 @@
       await (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
       await helper.nft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address});
       const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-      expect(owner.Substrate).to.be.equal(alice.address);
+      expect(owner).to.be.deep.equal({Substrate: alice.address});
       const transferTokenFromTx = () => helper.nft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address});
       await expect(transferTokenFromTx()).to.be.rejectedWith('common.ApprovedValueTooLow');
     });
@@ -559,12 +559,12 @@
 
     await helper.nft.transferTokenFrom(alice, collectionId, tokenId, {Substrate: charlie.address}, {Substrate: dave.address});
     const owner1 = await helper.nft.getTokenOwner(collectionId, tokenId);
-    expect(owner1.Substrate).to.be.equal(dave.address);
+    expect(owner1).to.be.deep.equal({Substrate: dave.address});
 
     await helper.collection.addAdmin(alice, collectionId, {Substrate: bob.address});
     await helper.nft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: dave.address}, {Substrate: alice.address});
     const owner2 = await helper.nft.getTokenOwner(collectionId, tokenId);
-    expect(owner2.Substrate).to.be.equal(alice.address);
+    expect(owner2).to.be.deep.equal({Substrate: alice.address});
   });
 
   itSub('Fungible up to an approved amount', async ({helper}) => {
modifiedjs-packages/tests/src/burnItem.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/burnItem.test.ts
+++ b/js-packages/tests/src/burnItem.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from './util/index.js';
 
 
 describe('integration test: ext. burnItem():', () => {
modifiedjs-packages/tests/src/change-collection-owner.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/change-collection-owner.test.ts
+++ b/js-packages/tests/src/change-collection-owner.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test changeCollectionOwner(collection_id, new_owner):', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/check-event/burnItemEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/burnItemEvent.test.ts
+++ b/js-packages/tests/src/check-event/burnItemEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 
 describe('Burn Item event ', () => {
modifiedjs-packages/tests/src/check-event/createCollectionEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/createCollectionEvent.test.ts
+++ b/js-packages/tests/src/check-event/createCollectionEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 describe('Create collection event ', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/check-event/createItemEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/createItemEvent.test.ts
+++ b/js-packages/tests/src/check-event/createItemEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 describe('Create Item event ', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/check-event/createMultipleItemsEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/createMultipleItemsEvent.test.ts
+++ b/js-packages/tests/src/check-event/createMultipleItemsEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 describe('Create Multiple Items Event event ', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/check-event/destroyCollectionEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/destroyCollectionEvent.test.ts
+++ b/js-packages/tests/src/check-event/destroyCollectionEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 describe('Destroy collection event ', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/check-event/transferEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/transferEvent.test.ts
+++ b/js-packages/tests/src/check-event/transferEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 describe('Transfer event ', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/check-event/transferFromEvent.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/check-event/transferFromEvent.test.ts
+++ b/js-packages/tests/src/check-event/transferFromEvent.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub} from '../util';
-import {IEvent} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub} from '../util/index.js';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
 
 describe('Transfer event ', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/collator-selection/collatorSelection.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/collator-selection/collatorSelection.seqtest.ts
+++ b/js-packages/tests/src/collator-selection/collatorSelection.seqtest.ts
@@ -14,12 +14,12 @@
 // 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, expect, itSub, Pallets, requirePalletsOrSkip} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub, Pallets, requirePalletsOrSkip} from '../util/index.js';
 
 async function nodeAddress(name: string) {
   // eslint-disable-next-line require-await
-  return await usingPlaygrounds(async (helper, _) => {
+  return await usingPlaygrounds(async (helper) => {
     const envNodeStash = `RELAY_UNIQUE_NODE_${name.toUpperCase()}_STASH`;
 
     const nodeStash = process.env[envNodeStash];
@@ -91,7 +91,7 @@
     let deltaNode: string;
 
     before(async function() {
-      await usingPlaygrounds(async (helper, privateKey) => {
+      await usingPlaygrounds(async (helper) => {
         // todo:collator see again if blocks start to be finalized in dev mode
         // Skip the collator block production in dev mode, since the blocks are sealed automatically.
         if(await helper.arrange.isDevNode()) this.skip();
@@ -137,7 +137,7 @@
     let crowd: IKeyringPair[];
 
     before(async function() {
-      await usingPlaygrounds(async (helper, privateKey) => {
+      await usingPlaygrounds(async (helper) => {
         crowd = await helper.arrange.createCrowd(20, 100n, superuser);
 
         // set session keys for everyone
@@ -219,7 +219,7 @@
     let crowd: IKeyringPair[];
 
     before(async function() {
-      await usingPlaygrounds(async (helper, privateKey) => {
+      await usingPlaygrounds(async (helper) => {
         crowd = await helper.arrange.createCrowd(20, 100n, superuser);
 
         // set session keys for everyone
modifiedjs-packages/tests/src/collator-selection/identity.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/collator-selection/identity.seqtest.ts
+++ b/js-packages/tests/src/collator-selection/identity.seqtest.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub, Pallets, requirePalletsOrSkip} from '../util';
-import {UniqueHelper} from '../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub, Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
 
 async function getIdentities(helper: UniqueHelper) {
   const identities: [string, any][] = [];
modifiedjs-packages/tests/src/confirmSponsorship.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/confirmSponsorship.test.ts
+++ b/js-packages/tests/src/confirmSponsorship.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, itSub, Pallets} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub, Pallets} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 async function setSponsorHelper(collection: any, signer: IKeyringPair, sponsorAddress: string) {
   await collection.setSponsor(signer, sponsorAddress);
modifiedjs-packages/tests/src/connection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/connection.test.ts
+++ b/js-packages/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';
+import {itSub, expect, usingPlaygrounds} from './util/index.js';
 
 describe('Connection smoke test', () => {
   itSub('Connection can be established', async ({helper}) => {
modifiedjs-packages/tests/src/createCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/createCollection.test.ts
+++ b/js-packages/tests/src/createCollection.test.ts
@@ -14,10 +14,11 @@
 // 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, expect, itSub, Pallets} from './util';
-import {CollectionFlag, ICollectionCreationOptions, IProperty} from './util/playgrounds/types';
-import {UniqueHelper} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub, Pallets} from './util/index.js';
+import {CollectionFlag} from '@unique/playgrounds/src/types.js';
+import type {ICollectionCreationOptions, IProperty} from '@unique/playgrounds/src/types.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
 
 async function mintCollectionHelper(helper: UniqueHelper, signer: IKeyringPair, options: ICollectionCreationOptions, type?: 'nft' | 'fungible' | 'refungible') {
   let collection;
modifiedjs-packages/tests/src/createItem.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/createItem.test.ts
+++ b/js-packages/tests/src/createItem.test.ts
@@ -14,10 +14,10 @@
 // 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, expect, itSub, Pallets} from './util';
-import {IProperty, ICrossAccountId} from './util/playgrounds/types';
-import {UniqueHelper} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, itSub, Pallets} from './util/index.js';
+import type {IProperty, ICrossAccountId} from '@unique/playgrounds/src/types.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
 
 async function mintTokenHelper(helper: UniqueHelper, collection: any, signer: IKeyringPair, owner: ICrossAccountId, type: 'nft' | 'fungible' | 'refungible'='nft', properties?: IProperty[]) {
   let token;
modifiedjs-packages/tests/src/createMultipleItems.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/createMultipleItems.test.ts
+++ b/js-packages/tests/src/createMultipleItems.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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, Pallets, itSub} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, Pallets, itSub} from './util/index.js';
 
 describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => {
   let alice: IKeyringPair;
@@ -44,7 +44,7 @@
     const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);
     for(const [i, token] of tokens.entries()) {
       const tokenData = await token.getData();
-      expect(tokenData?.normalizedOwner.Substrate).to.be.deep.equal(helper.address.normalizeSubstrate(alice.address));
+      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});
       expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);
     }
   });
@@ -112,7 +112,7 @@
     const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);
     for(const [i, token] of tokens.entries()) {
       const tokenData = await token.getData();
-      expect(tokenData?.normalizedOwner.Substrate).to.be.deep.equal(helper.address.normalizeSubstrate(alice.address));
+      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});
       expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);
     }
   });
@@ -134,7 +134,7 @@
     const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);
     for(const [i, token] of tokens.entries()) {
       const tokenData = await token.getData();
-      expect(tokenData?.normalizedOwner.Substrate).to.be.deep.equal(helper.address.normalizeSubstrate(alice.address));
+      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});
       expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);
     }
   });
@@ -156,7 +156,7 @@
     const tokens = await helper.nft.mintMultipleTokensWithOneOwner(alice, collection.collectionId, {Substrate: alice.address}, args);
     for(const [i, token] of tokens.entries()) {
       const tokenData = await token.getData();
-      expect(tokenData?.normalizedOwner.Substrate).to.be.equal(helper.address.normalizeSubstrate(alice.address));
+      expect(tokenData?.normalizedOwner).to.be.deep.equal({Substrate: helper.address.normalizeSubstrate(alice.address)});
       expect(tokenData?.properties[0].value).to.be.equal(args[i].properties[0].value);
     }
   });
modifiedjs-packages/tests/src/createMultipleItemsEx.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/createMultipleItemsEx.test.ts
+++ b/js-packages/tests/src/createMultipleItemsEx.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, expect, Pallets, itSub} from './util';
-import {IProperty} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, expect, Pallets, itSub} from './util/index.js';
+import type {IProperty} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test: createMultipleItemsEx', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/creditFeesToTreasury.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/creditFeesToTreasury.seqtest.ts
+++ b/js-packages/tests/src/creditFeesToTreasury.seqtest.ts
@@ -14,10 +14,10 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {ApiPromise} from '@polkadot/api';
-import {usingPlaygrounds, expect, itSub} from './util';
+import {usingPlaygrounds, expect, itSub} from './util/index.js';
+import type {u32} from '@polkadot/types-codec';
 
 const TREASURY = '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z';
 const saneMinimumFee = 0.05;
@@ -29,7 +29,8 @@
 /*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 inflationBlockInterval = api.consts.inflation.inflationBlockInterval as u32;
+    const blockInterval = inflationBlockInterval.toNumber();
     const unsubscribe = await api.rpc.chain.subscribeNewHeads(head => {
       const currentBlock = head.number.toNumber();
       if(currentBlock % blockInterval < blockInterval - 10) {
modifiedjs-packages/tests/src/destroyCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/destroyCollection.test.ts
+++ b/js-packages/tests/src/destroyCollection.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, expect, usingPlaygrounds, Pallets} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, expect, usingPlaygrounds, Pallets} from './util/index.js';
 
 describe('integration test: ext. destroyCollection():', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/enableDisableTransfer.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/enableDisableTransfer.test.ts
+++ b/js-packages/tests/src/enableDisableTransfer.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
 
 describe('Enable/Disable Transfers', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/eth/allowlist.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/allowlist.test.ts
+++ b/js-packages/tests/src/eth/allowlist.test.ts
@@ -14,10 +14,10 @@
 // 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 {Pallets} from '../util';
-import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from './util';
-import {CreateCollectionData} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets} from '../util/index.js';
+import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from './util/index.js';
+import {CreateCollectionData} from './util/playgrounds/types.js';
 
 describe('EVM contract allowlist', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/base.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/base.test.ts
+++ b/js-packages/tests/src/eth/base.test.ts
@@ -14,8 +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 {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds, expect} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
 
 
 describe('Contract calls', () => {
modifiedjs-packages/tests/src/eth/collectionAdmin.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/collectionAdmin.test.ts
+++ b/js-packages/tests/src/eth/collectionAdmin.test.ts
@@ -13,13 +13,13 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {expect} from 'chai';
-import {Pallets} from '../util';
-import {IEthCrossAccountId} from '../util/playgrounds/types';
-import {usingEthPlaygrounds, itEth} from './util';
-import {EthUniqueHelper} from './util/playgrounds/unique.dev';
-import {CreateCollectionData} from './util/playgrounds/types';
+import {Pallets} from '../util/index.js';
+import type {IEthCrossAccountId} from '@unique/playgrounds/src/types.js';
+import {usingEthPlaygrounds, itEth} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import {CreateCollectionData} from './util/playgrounds/types.js';
 
 async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise<any>) {
   const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));
modifiedjs-packages/tests/src/eth/collectionHelperAddress.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/collectionHelperAddress.test.ts
+++ b/js-packages/tests/src/eth/collectionHelperAddress.test.ts
@@ -14,15 +14,15 @@
 // 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 {COLLECTION_HELPER, Pallets} from '../util';
+import {itEth, usingEthPlaygrounds, expect} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {COLLECTION_HELPER, Pallets} from '../util/index.js';
 
 describe('[eth]CollectionHelperAddress test: ERC20/ERC721 ', () => {
   let donor: IKeyringPair;
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds(async (_, privateKey) => {
       donor = await privateKey({url: import.meta.url});
     });
   });
modifiedjs-packages/tests/src/eth/collectionLimits.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/collectionLimits.test.ts
+++ b/js-packages/tests/src/eth/collectionLimits.test.ts
@@ -1,7 +1,7 @@
-import {IKeyringPair} from '@polkadot/types/types';
-import {Pallets} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {CollectionLimitField, CreateCollectionData} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {CollectionLimitField, CreateCollectionData} from './util/playgrounds/types.js';
 
 
 describe('Can set collection limits', () => {
modifiedjs-packages/tests/src/eth/collectionProperties.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/collectionProperties.test.ts
+++ b/js-packages/tests/src/eth/collectionProperties.test.ts
@@ -14,10 +14,10 @@
 // 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 {Pallets} from '../util';
-import {IProperty, ITokenPropertyPermission} from '../util/playgrounds/types';
-import {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds, expect} from './util/index.js';
+import {Pallets} from '../util/index.js';
+import type {IProperty, ITokenPropertyPermission} from '@unique/playgrounds/src/types.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 describe('EVM collection properties', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/collectionSponsoring.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/collectionSponsoring.test.ts
+++ b/js-packages/tests/src/eth/collectionSponsoring.test.ts
@@ -14,10 +14,10 @@
 // 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 {Pallets, requirePalletsOrSkip, usingPlaygrounds} from '../util/index';
-import {itEth, expect} from './util';
-import {CollectionLimitField, TokenPermissionField} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets, requirePalletsOrSkip, usingPlaygrounds} from '../util/index.js';
+import {itEth, expect} from './util/index.js';
+import {CollectionLimitField, TokenPermissionField} from './util/playgrounds/types.js';
 
 describe('evm nft collection sponsoring', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/contractSponsoring.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/contractSponsoring.test.ts
+++ b/js-packages/tests/src/eth/contractSponsoring.test.ts
@@ -14,11 +14,11 @@
 // 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 {EthUniqueHelper} from './util/playgrounds/unique.dev';
-import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from './util';
-import {usingPlaygrounds} from '../util';
-import {CompiledContract} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import {itEth, expect, SponsoringMode, usingEthPlaygrounds} from './util/index.js';
+import {usingPlaygrounds} from '../util/index.js';
+import type {CompiledContract} from './util/playgrounds/types.js';
 
 describe('Sponsoring EVM contracts', () => {
   let donor: IKeyringPair;
@@ -433,7 +433,7 @@
       callerBalanceBefore = callerBalanceAfter;
     };
 
-    const gasPrice = BigInt(await helper.eth.getGasPrice());
+    const gasPrice = BigInt((await helper.eth.getGasPrice())!);
     await flip(gasPrice);
     await flip(gasPrice * 2n);
     await flip(gasPrice * 21n / 10n);
modifiedjs-packages/tests/src/eth/createCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/createCollection.test.ts
+++ b/js-packages/tests/src/eth/createCollection.test.ts
@@ -14,12 +14,13 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {evmToAddress} from '@polkadot/util-crypto';
-import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {CREATE_COLLECTION_DATA_DEFAULTS, CollectionLimitField, CollectionMode, CreateCollectionData, TokenPermissionField, emptyAddress} from './util/playgrounds/types';
-import {CollectionFlag, IEthCrossAccountId, TCollectionMode} from '../util/playgrounds/types';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {CREATE_COLLECTION_DATA_DEFAULTS, CollectionLimitField, CollectionMode, CreateCollectionData, TokenPermissionField, emptyAddress} from './util/playgrounds/types.js';
+import {CollectionFlag} from '@unique/playgrounds/src/types.js';
+import type {IEthCrossAccountId, TCollectionMode} from '@unique/playgrounds/src/types.js';
 
 const DECIMALS = 18;
 const CREATE_COLLECTION_DATA_DEFAULTS_ARRAY = [
modifiedjs-packages/tests/src/eth/createFTCollection.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/createFTCollection.seqtest.ts
+++ b/js-packages/tests/src/eth/createFTCollection.seqtest.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
 
 const DECIMALS = 18;
 
modifiedjs-packages/tests/src/eth/createFTCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/createFTCollection.test.ts
+++ b/js-packages/tests/src/eth/createFTCollection.test.ts
@@ -14,11 +14,11 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {evmToAddress} from '@polkadot/util-crypto';
-import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {CollectionLimitField} from './util/playgrounds/types';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {CollectionLimitField} from './util/playgrounds/types.js';
 
 const DECIMALS = 18;
 
modifiedjs-packages/tests/src/eth/createNFTCollection.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/createNFTCollection.seqtest.ts
+++ b/js-packages/tests/src/eth/createNFTCollection.seqtest.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
 
 
 describe('Create NFT collection from EVM', () => {
modifiedjs-packages/tests/src/eth/createNFTCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/createNFTCollection.test.ts
+++ b/js-packages/tests/src/eth/createNFTCollection.test.ts
@@ -15,10 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {evmToAddress} from '@polkadot/util-crypto';
-import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {CollectionLimitField} from './util/playgrounds/types';
-import {COLLECTION_HELPER} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {CollectionLimitField} from './util/playgrounds/types.js';
 
 
 describe('Create NFT collection from EVM', () => {
modifiedjs-packages/tests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/createRFTCollection.test.ts
+++ b/js-packages/tests/src/eth/createRFTCollection.test.ts
@@ -15,10 +15,10 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {evmToAddress} from '@polkadot/util-crypto';
-import {IKeyringPair} from '@polkadot/types/types';
-import {Pallets, requirePalletsOrSkip} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {CollectionLimitField} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {CollectionLimitField} from './util/playgrounds/types.js';
 
 
 describe('Create RFT collection from EVM', () => {
modifiedjs-packages/tests/src/eth/crossTransfer.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/crossTransfer.test.ts
+++ b/js-packages/tests/src/eth/crossTransfer.test.ts
@@ -14,9 +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 {itEth, usingEthPlaygrounds} from './util';
-import {CrossAccountId} from '../util/playgrounds/unique';
-import {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds} from './util/index.js';
+import {CrossAccountId} from '@unique/playgrounds/src/unique.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 describe('Token transfer between substrate address and EVM address. Fungible', () => {
   let donor: IKeyringPair;
@@ -32,15 +32,16 @@
   });
 
   itEth('The private key X create a substrate address. Alice sends a token to the corresponding EVM address, and X can send it to Bob in the substrate', async ({helper}) => {
-    const bobCA = CrossAccountId.fromKeyring(bob);
-    const charlieCA = CrossAccountId.fromKeyring(charlie);
+    const bobCA = CrossAccountId.fromKeyring(bob).toICrossAccountId();
+    const charlieCA = CrossAccountId.fromKeyring(charlie).toICrossAccountId();
+    const charlieCAEth = CrossAccountId.fromKeyring(charlie).toEthereum().toICrossAccountId();
 
     const collection = await helper.ft.mintCollection(alice);
     await collection.setLimits(alice, {ownerCanTransfer: true});
 
     await collection.mint(alice, 200n);
-    await collection.transfer(alice, charlieCA.toEthereum(), 200n);
-    await collection.transferFrom(alice, charlieCA.toEthereum(), charlieCA, 50n);
+    await collection.transfer(alice, charlieCAEth, 200n);
+    await collection.transferFrom(alice, charlieCAEth, charlieCA, 50n);
     await collection.transfer(charlie, bobCA, 50n);
   });
 
@@ -56,8 +57,8 @@
 
     await collection.mint(alice, 200n, {Ethereum: aliceProxy});
     await contract.methods.transfer(bobProxy, 50).send({from: aliceProxy});
-    await collection.transferFrom(alice, {Ethereum: bobProxy}, CrossAccountId.fromKeyring(bob), 50n);
-    await collection.transfer(bob, CrossAccountId.fromKeyring(alice), 50n);
+    await collection.transferFrom(alice, {Ethereum: bobProxy}, CrossAccountId.fromKeyring(bob).toICrossAccountId(), 50n);
+    await collection.transfer(bob, CrossAccountId.fromKeyring(alice).toICrossAccountId(), 50n);
   });
 });
 
@@ -75,14 +76,14 @@
   });
 
   itEth('The private key X create a substrate address. Alice sends a token to the corresponding EVM address, and X can send it to Bob in the substrate', async ({helper}) => {
-    const charlieEth = CrossAccountId.fromKeyring(charlie, 'Ethereum');
+    const charlieEth = CrossAccountId.fromKeyring(charlie, 'Ethereum').toICrossAccountId();
 
     const collection = await helper.nft.mintCollection(alice);
     await collection.setLimits(alice, {ownerCanTransfer: true});
     const token = await collection.mintToken(alice);
     await token.transfer(alice, charlieEth);
-    await token.transferFrom(alice, charlieEth, CrossAccountId.fromKeyring(charlie));
-    await token.transfer(charlie, CrossAccountId.fromKeyring(bob));
+    await token.transferFrom(alice, charlieEth, CrossAccountId.fromKeyring(charlie).toICrossAccountId());
+    await token.transfer(charlie, CrossAccountId.fromKeyring(bob).toICrossAccountId());
   });
 
   itEth('The private key X create a EVM address. Alice sends a token to the substrate address corresponding to this EVM address, and X can send it to Bob in the EVM', async ({helper}) => {
modifiedjs-packages/tests/src/eth/destroyCollection.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/destroyCollection.test.ts
+++ b/js-packages/tests/src/eth/destroyCollection.test.ts
@@ -14,11 +14,11 @@
 // 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 {Pallets} from '../util';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {TCollectionMode} from '../util/playgrounds/types';
-import {CreateCollectionData} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import type {TCollectionMode} from '@unique/playgrounds/src/types.js';
+import {CreateCollectionData} from './util/playgrounds/types.js';
 
 describe('Destroy Collection from EVM', function() {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/ethFeesAreCorrect.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/ethFeesAreCorrect.test.ts
+++ b/js-packages/tests/src/eth/ethFeesAreCorrect.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://witww.gnu.org/licenses/>.
 
-import {IKeyringPair} from '@polkadot/types/types';
-import {itEth, usingEthPlaygrounds, expect} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds, expect} from './util/index.js';
 
 describe('Eth fees are correct', () => {
   let donor: IKeyringPair;
@@ -44,7 +44,7 @@
     const contract = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
 
     const balanceBeforeWeb3Transfer = await helper.balance.getEthereum(owner);
-    await contract.methods.transfer(receiver, tokenA).send({from: owner, maxFeePerGas: (await helper.eth.getGasPrice()).toString()});
+    await contract.methods.transfer(receiver, tokenA).send({from: owner, maxFeePerGas: ((await helper.eth.getGasPrice())!).toString()});
     const balanceAfterWeb3Transfer = await helper.balance.getEthereum(owner);
     const web3Diff = balanceBeforeWeb3Transfer - balanceAfterWeb3Transfer;
 
modifiedjs-packages/tests/src/eth/events.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/events.test.ts
+++ b/js-packages/tests/src/eth/events.test.ts
@@ -15,11 +15,13 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {expect} from 'chai';
-import {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';
-import {IEvent, TCollectionMode} from '../util/playgrounds/types';
-import {Pallets, requirePalletsOrSkip} from '../util';
-import {CollectionLimitField, TokenPermissionField, NormalizedEvent, CreateCollectionData} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import type {IEvent, TCollectionMode} from '@unique/playgrounds/src/types.js';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {CollectionLimitField, TokenPermissionField, CreateCollectionData} from './util/playgrounds/types.js';
+import type {NormalizedEvent} from './util/playgrounds/types.js';
 
 let donor: IKeyringPair;
 
@@ -498,9 +500,9 @@
   const mode: TCollectionMode = 'rft';
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds((helper) => {
       requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);
-      const _donor = await privateKey({url: import.meta.url});
+      return Promise.resolve();
     });
   });
 
modifiedjs-packages/tests/src/eth/evmCoder.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/evmCoder.test.ts
+++ b/js-packages/tests/src/eth/evmCoder.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 {IKeyringPair} from '@polkadot/types/types';
-import {itEth, expect, usingEthPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, expect, usingEthPlaygrounds} from './util/index.js';
 
 const getContractSource = (collectionAddress: string, contractAddress: string): string => `
   // SPDX-License-Identifier: MIT
modifiedjs-packages/tests/src/eth/fractionalizer/fractionalizer.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/fractionalizer/fractionalizer.test.ts
+++ b/js-packages/tests/src/eth/fractionalizer/fractionalizer.test.ts
@@ -17,14 +17,15 @@
 
 import {readFile} from 'fs/promises';
 
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {evmToAddress} from '@polkadot/util-crypto';
 
 import {Contract} from 'web3-eth-contract';
 
-import {usingEthPlaygrounds, expect, itEth, EthUniqueHelper} from '../util';
-import {CompiledContract} from '../util/playgrounds/types';
-import {requirePalletsOrSkip, Pallets, makeNames} from '../../util';
+import {usingEthPlaygrounds, expect, itEth} from '../util/index.js';
+import {EthUniqueHelper} from '../util/playgrounds/unique.dev.js';
+import type {CompiledContract} from '../util/playgrounds/types.js';
+import {requirePalletsOrSkip, Pallets, makeNames} from '../../util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/tests/src/eth/fungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/fungible.test.ts
+++ b/js-packages/tests/src/eth/fungible.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 {expect, itEth, usingEthPlaygrounds} from './util';
-import {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 describe('Fungible: Plain calls', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/getCode.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/getCode.test.ts
+++ b/js-packages/tests/src/eth/getCode.test.ts
@@ -14,15 +14,15 @@
 // 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';
-import {IKeyringPair} from '@polkadot/types/types';
-import {COLLECTION_HELPER, CONTRACT_HELPER} from '../util';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {COLLECTION_HELPER, CONTRACT_HELPER} from '../util/index.js';
 
 describe('RPC eth_getCode', () => {
   let donor: IKeyringPair;
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds(async (_, privateKey) => {
       donor = await privateKey({url: import.meta.url});
     });
   });
modifiedjs-packages/tests/src/eth/helpersSmoke.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/helpersSmoke.test.ts
+++ b/js-packages/tests/src/eth/helpersSmoke.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 {expect, itEth, usingEthPlaygrounds} from './util';
-import {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 describe('Helpers sanity check', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/marketplace-v2/marketplace.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/marketplace-v2/marketplace.test.ts
+++ b/js-packages/tests/src/eth/marketplace-v2/marketplace.test.ts
@@ -14,12 +14,13 @@
 // 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 Web3 from 'web3';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {readFile} from 'fs/promises';
-import {EthUniqueHelper, SponsoringMode, itEth, usingEthPlaygrounds} from '../util';
-import {makeNames} from '../../util';
+import {SponsoringMode, itEth, usingEthPlaygrounds} from '../util/index.js';
+import {EthUniqueHelper} from '../util/playgrounds/unique.dev.js';
+import {makeNames} from '../../util/index.js';
 import {expect} from 'chai';
-import Web3 from 'web3';
 
 const {dirname} = makeNames(import.meta.url);
 
@@ -54,27 +55,27 @@
         },
         {
           solPath: '@openzeppelin/contracts/utils/introspection/IERC165.sol',
-          fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol`,
+          fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol`,
         },
         {
           solPath: '@openzeppelin/contracts/access/Ownable.sol',
-          fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/access/Ownable.sol`,
+          fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/access/Ownable.sol`,
         },
         {
           solPath: '@openzeppelin/contracts/utils/Context.sol',
-          fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/Context.sol`,
+          fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/utils/Context.sol`,
         },
         {
           solPath: '@openzeppelin/contracts/security/ReentrancyGuard.sol',
-          fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol`,
+          fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol`,
         },
         {
           solPath: '@openzeppelin/contracts/utils/introspection/ERC165Checker.sol',
-          fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/utils/introspection/ERC165Checker.sol`,
+          fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/utils/introspection/ERC165Checker.sol`,
         },
         {
           solPath: '@openzeppelin/contracts/token/ERC721/IERC721.sol',
-          fsPath: `${dirname}/../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol`,
+          fsPath: `${dirname}/../../../../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol`,
         },
         {
           solPath: '@unique-nft/solidity-interfaces/contracts/CollectionHelpers.sol',
@@ -98,11 +99,12 @@
     );
   }
 
-  function substrateAddressToHex(sub: Uint8Array| string, web3: Web3) {
+  function substrateAddressToHex(sub: Uint8Array| string, web3: Web3.default) {
     if(typeof sub === 'string')
       return web3.utils.padLeft(web3.utils.toHex(web3.utils.toBN(sub)), 64);
     else if(sub instanceof Uint8Array)
       return web3.utils.padLeft(web3.utils.bytesToHex(Array.from(sub)), 64);
+    throw Error('Infallible');
   }
 
   itEth('Put + Buy [eth]', async ({helper}) => {
modifiedjs-packages/tests/src/eth/marketplace/marketplace.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/marketplace/marketplace.test.ts
+++ b/js-packages/tests/src/eth/marketplace/marketplace.test.ts
@@ -14,10 +14,10 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {readFile} from 'fs/promises';
-import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from '../util';
-import {makeNames} from '../../util';
+import {itEth, usingEthPlaygrounds, expect, SponsoringMode} from '../util/index.js';
+import {makeNames} from '../../util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/tests/src/eth/migration.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/migration.seqtest.ts
+++ b/js-packages/tests/src/eth/migration.seqtest.ts
@@ -14,11 +14,12 @@
 // 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';
-import {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {Struct} from '@polkadot/types';
 
-import {IEvent} from '../util/playgrounds/types';
+import type {IEvent} from '@unique/playgrounds/src/types.js';
+import type {InterfaceTypes} from '@polkadot/types/types/registry';
 import {ApiPromise} from '@polkadot/api';
 
 const encodeEvent = (api: ApiPromise, pallet: string, palletEvents: string, event: string, fields: any) => {
@@ -32,7 +33,8 @@
   data.push(...new Struct(api.registry, {data: metaEvent}, {data: fields}).toU8a());
 
   const typeName = api.registry.lookup.names.find(n => n.endsWith('RuntimeEvent'))!;
-  return api.registry.createType(typeName, new Uint8Array(data)).toHex();
+  const obj = api.registry.createType(typeName, new Uint8Array(data)) as InterfaceTypes['RuntimeEvent'];
+  return obj.toHex();
 };
 
 describe('EVM Migrations', () => {
modifiedjs-packages/tests/src/eth/nativeFungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/nativeFungible.test.ts
+++ b/js-packages/tests/src/eth/nativeFungible.test.ts
@@ -14,15 +14,15 @@
 // 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 {expect, itEth, usingEthPlaygrounds} from './util';
-import {UniqueHelper} from '../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
 
 describe('NativeFungible: ERC20 calls', () => {
   let donor: IKeyringPair;
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds(async (_, privateKey) => {
       donor = await privateKey({url: import.meta.url});
     });
   });
@@ -128,7 +128,7 @@
   let donor: IKeyringPair;
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds(async (_, privateKey) => {
       donor = await privateKey({url: import.meta.url});
     });
   });
modifiedjs-packages/tests/src/eth/nativeRpc/estimateGas.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/nativeRpc/estimateGas.test.ts
+++ b/js-packages/tests/src/eth/nativeRpc/estimateGas.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 {expect, itEth, usingEthPlaygrounds} from '../util';
-import {IKeyringPair} from '@polkadot/types/types';
+import {expect, itEth, usingEthPlaygrounds} from '../util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 
 
 describe('Ethereum native RPC calls', () => {
@@ -23,7 +23,7 @@
   const NATIVE_TOKEN_ADDRESS = '0x17c4e6453cc49aaaaeaca894e6d9683e00000000';
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds(async (_, privateKey) => {
       donor = await privateKey({url: import.meta.url});
     });
   });
modifiedjs-packages/tests/src/eth/nesting/nest.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/nesting/nest.test.ts
+++ b/js-packages/tests/src/eth/nesting/nest.test.ts
@@ -1,7 +1,8 @@
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
 
-import {itEth, EthUniqueHelper, usingEthPlaygrounds, expect} from '../util';
+import {itEth, usingEthPlaygrounds, expect} from '../util/index.js';
+import {EthUniqueHelper} from '../util/playgrounds/unique.dev.js';
 
 const createNestingCollection = async (
   helper: EthUniqueHelper,
modifiedjs-packages/tests/src/eth/nonFungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/nonFungible.test.ts
+++ b/js-packages/tests/src/eth/nonFungible.test.ts
@@ -14,11 +14,12 @@
 // 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';
-import {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds, expect} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
-import {ITokenPropertyPermission} from '../util/playgrounds/types';
-import {CREATE_COLLECTION_DATA_DEFAULTS, CollectionMode, CreateCollectionData, TokenPermissionField} from './util/playgrounds/types';
+import type {ITokenPropertyPermission} from '@unique/playgrounds/src/types.js';
+import {CREATE_COLLECTION_DATA_DEFAULTS, TokenPermissionField} from './util/playgrounds/types.js';
 
 describe('Check ERC721 token URI for NFT', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/payable.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/payable.test.ts
+++ b/js-packages/tests/src/eth/payable.test.ts
@@ -14,10 +14,11 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 
-import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util';
-import {makeNames} from '../util';
+import {itEth, expect, usingEthPlaygrounds} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import {makeNames} from '../util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/tests/src/eth/precompile.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/precompile.test.ts
+++ b/js-packages/tests/src/eth/precompile.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 
-import {expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
 
 describe('Precompiles', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/proxy/fungibleProxy.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/proxy/fungibleProxy.test.ts
+++ b/js-packages/tests/src/eth/proxy/fungibleProxy.test.ts
@@ -16,9 +16,10 @@
 
 import {expect} from 'chai';
 import {readFile} from 'fs/promises';
-import {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds} from '../util';
-import {makeNames} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds} from '../util/index.js';
+import {EthUniqueHelper} from '../util/playgrounds/unique.dev.js';
+import {makeNames} from '../../util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/tests/src/eth/proxy/nonFungibleProxy.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/proxy/nonFungibleProxy.test.ts
+++ b/js-packages/tests/src/eth/proxy/nonFungibleProxy.test.ts
@@ -15,9 +15,10 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {readFile} from 'fs/promises';
-import {IKeyringPair} from '@polkadot/types/types';
-import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from '../util';
-import {makeNames} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds, expect} from '../util/index.js';
+import {EthUniqueHelper} from '../util/playgrounds/unique.dev.js';
+import {makeNames} from '../../util/index.js';
 
 const {dirname} = makeNames(import.meta.url);
 
modifiedjs-packages/tests/src/eth/proxyContract.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/proxyContract.test.ts
+++ b/js-packages/tests/src/eth/proxyContract.test.ts
@@ -14,9 +14,10 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 
-import {itEth, expect, usingEthPlaygrounds, EthUniqueHelper} from './util';
+import {itEth, expect, usingEthPlaygrounds} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
 
 describe('EVM payable contracts', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/reFungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/reFungible.test.ts
+++ b/js-packages/tests/src/eth/reFungible.test.ts
@@ -14,11 +14,11 @@
 // 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';
-import {expect, itEth, usingEthPlaygrounds} from './util';
-import {IKeyringPair} from '@polkadot/types/types';
-import {ITokenPropertyPermission} from '../util/playgrounds/types';
-import {CREATE_COLLECTION_DATA_DEFAULTS, TokenPermissionField} from './util/playgrounds/types';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import type {ITokenPropertyPermission} from '@unique/playgrounds/src/types.js';
+import {CREATE_COLLECTION_DATA_DEFAULTS, TokenPermissionField} from './util/playgrounds/types.js';
 
 describe('Refungible: Plain calls', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/reFungibleToken.test.ts
+++ b/js-packages/tests/src/eth/reFungibleToken.test.ts
@@ -14,9 +14,10 @@
 // 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';
-import {EthUniqueHelper, expect, itEth, usingEthPlaygrounds} from './util';
-import {IKeyringPair} from '@polkadot/types/types';
+import {Pallets, requirePalletsOrSkip} from '../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
 
 // FIXME: Need erc721 for ReFubgible.
modifiedjs-packages/tests/src/eth/scheduling.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/scheduling.test.ts
+++ b/js-packages/tests/src/eth/scheduling.test.ts
@@ -15,14 +15,15 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {expect} from 'chai';
-import {EthUniqueHelper, itSchedEth} from './util';
-import {Pallets, usingPlaygrounds} from '../util';
+import {itSchedEth} from './util/index.js';
+import {EthUniqueHelper} from './util/playgrounds/unique.dev.js';
+import {Pallets, usingPlaygrounds} from '../util/index.js';
 
 describe('Scheduing EVM smart contracts', () => {
 
   before(async () => {
     await usingPlaygrounds(async (helper) => {
-      await helper.testUtils.enable();
+      await helper.testUtils.enable(Pallets.TestUtils);
     });
   });
 
modifiedjs-packages/tests/src/eth/sponsoring.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/sponsoring.test.ts
+++ b/js-packages/tests/src/eth/sponsoring.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itEth, expect, SponsoringMode} from './util';
-import {usingPlaygrounds} from '../util/index';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, expect, SponsoringMode} from './util/index.js';
+import {usingPlaygrounds} from '../util/index.js';
 
 describe('EVM sponsoring', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/tokenProperties.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/tokenProperties.test.ts
+++ b/js-packages/tests/src/eth/tokenProperties.test.ts
@@ -14,13 +14,13 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {Contract} from 'web3-eth-contract';
-import {itEth, usingEthPlaygrounds, expect} from './util';
-import {ITokenPropertyPermission} from '../util/playgrounds/types';
-import {Pallets} from '../util';
-import {UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection} from '../util/playgrounds/unique';
-import {CreateCollectionData, TokenPermissionField} from './util/playgrounds/types';
+import {itEth, usingEthPlaygrounds, expect} from './util/index.js';
+import type {ITokenPropertyPermission} from '@unique/playgrounds/src/types.js';
+import {Pallets} from '../util/index.js';
+import {UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection} from '@unique/playgrounds/src/unique.js';
+import {CreateCollectionData, TokenPermissionField} from './util/playgrounds/types.js';
 
 describe('EVM token properties', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/eth/tokens/callMethodsERC20.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/tokens/callMethodsERC20.test.ts
+++ b/js-packages/tests/src/eth/tokens/callMethodsERC20.test.ts
@@ -14,10 +14,10 @@
 // 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';
-import {expect, itEth, usingEthPlaygrounds} from '../util';
-import {IKeyringPair} from '@polkadot/types/types';
-import {CreateCollectionData} from '../util/playgrounds/types';
+import {Pallets, requirePalletsOrSkip} from '../../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from '../util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {CreateCollectionData} from '../util/playgrounds/types.js';
 
 [
   {mode: 'ft' as const, requiredPallets: []},
modifiedjs-packages/tests/src/eth/tokens/callMethodsERC721.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/tokens/callMethodsERC721.test.ts
+++ b/js-packages/tests/src/eth/tokens/callMethodsERC721.test.ts
@@ -14,17 +14,17 @@
 // 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} from '../../util';
-import {expect, itEth, usingEthPlaygrounds} from '../util';
-import {IKeyringPair} from '@polkadot/types/types';
-import {CreateCollectionData} from '../util/playgrounds/types';
+import {Pallets} from '../../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from '../util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {CreateCollectionData} from '../util/playgrounds/types.js';
 
 
 describe('ERC-721 call methods', () => {
   let donor: IKeyringPair;
 
   before(async function() {
-    await usingEthPlaygrounds(async (helper, privateKey) => {
+    await usingEthPlaygrounds(async (_, privateKey) => {
       donor = await privateKey({url: import.meta.url});
     });
   });
modifiedjs-packages/tests/src/eth/tokens/minting.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/tokens/minting.test.ts
+++ b/js-packages/tests/src/eth/tokens/minting.test.ts
@@ -14,10 +14,10 @@
 // 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 {Pallets} from '../../util';
-import {expect, itEth, usingEthPlaygrounds} from '../util';
-import {CreateCollectionData} from '../util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {Pallets} from '../../util/index.js';
+import {expect, itEth, usingEthPlaygrounds} from '../util/index.js';
+import {CreateCollectionData} from '../util/playgrounds/types.js';
 
 
 describe('Minting tokens', () => {
modifiedjs-packages/tests/src/eth/transferValue.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/transferValue.test.ts
+++ b/js-packages/tests/src/eth/transferValue.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 {IKeyringPair} from '@polkadot/types/types';
-import {itEth, usingEthPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds} from './util/index.js';
 import {expect} from 'chai';
 
 describe('Send value to contract', () => {
modifiedjs-packages/tests/src/eth/util/index.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/util/index.ts
+++ b/js-packages/tests/src/eth/util/index.ts
@@ -2,20 +2,19 @@
 // SPDX-License-Identifier: Apache-2.0
 
 import * as path from 'path';
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 
-import config from '../../config';
-
-import {EthUniqueHelper} from './playgrounds/unique.dev';
-import {SilentLogger, SilentConsole} from '../../util/playgrounds/unique.dev';
-import {SchedKind, makeNames} from '../../util';
+import config from '../../config.js';
 
-export {EthUniqueHelper} from './playgrounds/unique.dev';
+import {EthUniqueHelper} from './playgrounds/unique.dev.js';
+import {SilentLogger, SilentConsole} from '@unique/playgrounds/src/unique.dev.js';
+import {makeNames} from '../../util/index.js';
+import type {SchedKind} from '../../util/index.js';
 
 import chai from 'chai';
 import chaiAsPromised from 'chai-as-promised';
 import chaiLike from 'chai-like';
-import {getTestSeed, MINIMUM_DONOR_FUND, requirePalletsOrSkip} from '../../util';
+import {getTestSeed, MINIMUM_DONOR_FUND, requirePalletsOrSkip} from '../../util/index.js';
 
 chai.use(chaiAsPromised);
 chai.use(chaiLike);
modifiedjs-packages/tests/src/eth/util/playgrounds/types.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/util/playgrounds/types.ts
+++ b/js-packages/tests/src/eth/util/playgrounds/types.ts
@@ -1,4 +1,5 @@
-import {CollectionFlag, TCollectionMode} from '../../../util/playgrounds/types';
+import {CollectionFlag} from '@unique/playgrounds/src/types.js';
+import type {TCollectionMode} from '@unique/playgrounds/src/types.js';
 
 export interface ContractImports {
   solPath: string;
modifiedjs-packages/tests/src/eth/util/playgrounds/unique.dev.tsdiffbeforeafterboth
--- a/js-packages/tests/src/eth/util/playgrounds/unique.dev.ts
+++ b/js-packages/tests/src/eth/util/playgrounds/unique.dev.ts
@@ -14,11 +14,12 @@
 import solc from 'solc';
 
 import {evmToAddress} from '@polkadot/util-crypto';
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 
-import {ArrangeGroup, DevUniqueHelper} from '../../../util/playgrounds/unique.dev';
+import {ArrangeGroup, DevUniqueHelper} from '@unique/playgrounds/src/unique.dev.js';
 
-import {ContractImports, CompiledContract, CrossAddress, NormalizedEvent, EthProperty, CollectionMode, CreateCollectionData} from './types';
+import type {ContractImports, CompiledContract, CrossAddress, NormalizedEvent, EthProperty} from './types.js';
+import {CollectionMode, CreateCollectionData} from './types.js';
 
 // Native contracts ABI
 import collectionHelpersAbi from '../../abi/collectionHelpers.json' assert {type: 'json'};
@@ -32,8 +33,7 @@
 import refungibleTokenAbi from '../../abi/reFungibleToken.json' assert {type: 'json'};
 import refungibleTokenDeprecatedAbi from '../../abi/reFungibleTokenDeprecated.json' assert {type: 'json'};
 import contractHelpersAbi from '../../abi/contractHelpers.json' assert {type: 'json'};
-import {ICrossAccountId, TEthereumAccount} from '../../../util/playgrounds/types';
-import {TCollectionMode} from '../../../util/playgrounds/types';
+import type {ICrossAccountId, TEthereumAccount, TCollectionMode} from '@unique/playgrounds/src/types.js';
 
 class EthGroupBase {
   helper: EthUniqueHelper;
@@ -192,8 +192,10 @@
 
     let flags = 0;
     // convert CollectionFlags to number and join them in one number
-    if(!data.flags || typeof data.flags == 'number') {
-      flags = data.flags ?? 0;
+    if(!data.flags) {
+      flags = 0;
+    } else if(typeof data.flags == 'number') {
+      flags = data.flags;
     } else {
       for(let i = 0; i < data.flags.length; i++){
         const flag = data.flags[i];
@@ -345,7 +347,7 @@
     return this.createCollection(signer, new CreateCollectionData(name, description, tokenPrefix, 'rft')).send();
   }
 
-  createFungibleCollection(signer: string, name: string, decimals: number, description: string, tokenPrefix: string): Promise<{ collectionId: number, collectionAddress: string, events: NormalizedEvent[] }> {
+  createFungibleCollection(signer: string, name: string, _decimals: number, description: string, tokenPrefix: string): Promise<{ collectionId: number, collectionAddress: string, events: NormalizedEvent[] }> {
     return this.createCollection(signer, new CreateCollectionData(name, description, tokenPrefix, 'ft')).send();
   }
 
@@ -459,7 +461,7 @@
 
   fromCollectionId(collectionId: number): string {
     if(collectionId >= 0xffffffff || collectionId < 0) throw new Error('collectionId overflow');
-    return Web3.utils.toChecksumAddress(`0x17c4e6453cc49aaaaeaca894e6d9683e${collectionId.toString(16).padStart(8, '0')}`);
+    return (Web3 as any).utils.toChecksumAddress(`0x17c4e6453cc49aaaaeaca894e6d9683e${collectionId.toString(16).padStart(8, '0')}`);
   }
 
   extractTokenId(address: string): { collectionId: number, tokenId: number } {
@@ -545,7 +547,7 @@
 }
 
 class EthArrangeGroup extends ArrangeGroup {
-  helper: EthUniqueHelper;
+  declare helper: EthUniqueHelper;
 
   constructor(helper: EthUniqueHelper) {
     super(helper);
@@ -558,7 +560,7 @@
   }
 }
 export class EthUniqueHelper extends DevUniqueHelper {
-  web3: Web3 | null = null;
+  web3: Web3.default | null = null;
   web3Provider: WebsocketProvider | null = null;
 
   eth: EthGroup;
@@ -567,7 +569,7 @@
   ethNativeContract: NativeContractGroup;
   ethContract: ContractGroup;
   ethProperty: EthPropertyGroup;
-  arrange: EthArrangeGroup;
+  declare arrange: EthArrangeGroup;
   constructor(logger: { log: (msg: any, level: any) => void, level: any }, options: { [key: string]: any } = {}) {
     options.helperBase = options.helperBase ?? EthUniqueHelper;
 
@@ -582,30 +584,30 @@
     super.arrange = this.arrange;
   }
 
-  getWeb3(): Web3 {
+  getWeb3(): Web3.default {
     if(this.web3 === null) throw Error('Web3 not connected');
     return this.web3;
   }
 
   connectWeb3(wsEndpoint: string) {
     if(this.web3 !== null) return;
-    this.web3Provider = new Web3.providers.WebsocketProvider(wsEndpoint);
-    this.web3 = new Web3(this.web3Provider);
+    this.web3Provider = new (Web3 as any).providers.WebsocketProvider(wsEndpoint);
+    this.web3 = new (Web3 as any)(this.web3Provider);
   }
 
-  async disconnect() {
+  override async disconnect() {
     if(this.web3 === null) return;
     this.web3Provider?.connection.close();
 
     await super.disconnect();
   }
 
-  clearApi() {
+  override clearApi() {
     super.clearApi();
     this.web3 = null;
   }
 
-  clone(helperCls: EthUniqueHelperConstructor, options?: { [key: string]: any; }): EthUniqueHelper {
+  override clone(helperCls: EthUniqueHelperConstructor, options?: { [key: string]: any; }): EthUniqueHelper {
     const newHelper = super.clone(helperCls, options) as EthUniqueHelper;
     newHelper.web3 = this.web3;
     newHelper.web3Provider = this.web3Provider;
modifiedjs-packages/tests/src/fungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/fungible.test.ts
+++ b/js-packages/tests/src/fungible.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect, requirePalletsOrSkip, Pallets} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect, requirePalletsOrSkip, Pallets} from './util/index.js';
 
 const U128_MAX = (1n << 128n) - 1n;
 
modifiedjs-packages/tests/src/getPropertiesRpc.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/getPropertiesRpc.test.ts
+++ b/js-packages/tests/src/getPropertiesRpc.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
-import {UniqueHelper, UniqueNFTCollection} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
+import {UniqueHelper, UniqueNFTCollection} from '@unique/playgrounds/src/unique.js';
 
 const collectionProps = [
   {key: 'col-0', value: 'col-0-value'},
modifiedjs-packages/tests/src/governance/council.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/governance/council.test.ts
+++ b/js-packages/tests/src/governance/council.test.ts
@@ -1,8 +1,9 @@
 
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';
-import {Event} from '../util/playgrounds/unique.dev';
-import {ICounselors, initCouncil, democracyLaunchPeriod, democracyVotingPeriod, democracyEnactmentPeriod, councilMotionDuration, democracyFastTrackVotingPeriod, fellowshipRankLimit, clearCouncil, clearTechComm, initTechComm, clearFellowship, dummyProposal, dummyProposalCall, initFellowship, defaultEnactmentMoment, fellowshipPropositionOrigin} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util/index.js';
+import {Event} from '@unique/playgrounds/src/unique.dev.js';
+import {initCouncil, democracyLaunchPeriod, democracyVotingPeriod, democracyEnactmentPeriod, councilMotionDuration, democracyFastTrackVotingPeriod, fellowshipRankLimit, clearCouncil, clearTechComm, initTechComm, clearFellowship, dummyProposal, dummyProposalCall, initFellowship, defaultEnactmentMoment, fellowshipPropositionOrigin} from './util.js';
+import type {ICounselors} from './util.js';
 
 describeGov('Governance: Council tests', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/governance/democracy.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/governance/democracy.test.ts
+++ b/js-packages/tests/src/governance/democracy.test.ts
@@ -1,7 +1,7 @@
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';
-import {clearFellowship, democracyLaunchPeriod, democracyTrackMinRank, dummyProposalCall, fellowshipConfirmPeriod, fellowshipMinEnactPeriod, fellowshipPreparePeriod, fellowshipPropositionOrigin, initFellowship, voteUnanimouslyInFellowship} from './util';
-import {Event} from '../util/playgrounds/unique.dev';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util/index.js';
+import {clearFellowship, democracyLaunchPeriod, democracyTrackMinRank, dummyProposalCall, fellowshipConfirmPeriod, fellowshipMinEnactPeriod, fellowshipPreparePeriod, fellowshipPropositionOrigin, initFellowship, voteUnanimouslyInFellowship} from './util.js';
+import {Event} from '@unique/playgrounds/src/unique.dev.js';
 
 describeGov('Governance: Democracy tests', () => {
   let regularUser: IKeyringPair;
modifiedjs-packages/tests/src/governance/fellowship.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/governance/fellowship.test.ts
+++ b/js-packages/tests/src/governance/fellowship.test.ts
@@ -1,7 +1,8 @@
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';
-import {DevUniqueHelper, Event} from '../util/playgrounds/unique.dev';
-import {ICounselors, initCouncil, democracyLaunchPeriod, democracyVotingPeriod, democracyFastTrackVotingPeriod, fellowshipRankLimit, clearCouncil, clearTechComm, ITechComms, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, voteUnanimouslyInFellowship, democracyTrackMinRank, fellowshipPreparePeriod, fellowshipConfirmPeriod, fellowshipMinEnactPeriod, democracyTrackId, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util/index.js';
+import {DevUniqueHelper, Event} from '@unique/playgrounds/src/unique.dev.js';
+import {initCouncil, democracyLaunchPeriod, democracyVotingPeriod, democracyFastTrackVotingPeriod, fellowshipRankLimit, clearCouncil, clearTechComm, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, voteUnanimouslyInFellowship, democracyTrackMinRank, fellowshipPreparePeriod, fellowshipConfirmPeriod, fellowshipMinEnactPeriod, democracyTrackId, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util.js';
+import type {ICounselors, ITechComms} from './util.js';
 
 describeGov('Governance: Fellowship tests', () => {
   let members: IKeyringPair[][];
modifiedjs-packages/tests/src/governance/init.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/governance/init.test.ts
+++ b/js-packages/tests/src/governance/init.test.ts
@@ -1,7 +1,8 @@
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';
-import {Event} from '../util/playgrounds/unique.dev';
-import {ICounselors, democracyLaunchPeriod, democracyVotingPeriod, ITechComms, democracyEnactmentPeriod, clearCouncil, clearTechComm, clearFellowship} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util/index.js';
+import {Event} from '@unique/playgrounds/src/unique.dev.js';
+import {democracyLaunchPeriod, democracyVotingPeriod, democracyEnactmentPeriod, clearCouncil, clearTechComm, clearFellowship} from './util.js';
+import type {ICounselors, ITechComms} from './util.js';
 
 describeGov('Governance: Initialization', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/governance/technicalCommittee.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/governance/technicalCommittee.test.ts
+++ b/js-packages/tests/src/governance/technicalCommittee.test.ts
@@ -1,7 +1,8 @@
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util';
-import {Event} from '../util/playgrounds/unique.dev';
-import {initCouncil, democracyLaunchPeriod, democracyFastTrackVotingPeriod, clearCouncil, clearTechComm, ITechComms, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect, Pallets, requirePalletsOrSkip, describeGov} from '../util/index.js';
+import {Event} from '@unique/playgrounds/src/unique.dev.js';
+import {initCouncil, democracyLaunchPeriod, democracyFastTrackVotingPeriod, clearCouncil, clearTechComm, clearFellowship, defaultEnactmentMoment, dummyProposal, dummyProposalCall, fellowshipPropositionOrigin, initFellowship, initTechComm, hardResetFellowshipReferenda, hardResetDemocracy, hardResetGovScheduler} from './util.js';
+import type {ITechComms} from './util.js';
 
 describeGov('Governance: Technical Committee tests', () => {
   let sudoer: IKeyringPair;
@@ -190,11 +191,11 @@
   });
 
 
-  itSub.skip('[Negative] TechComm cannot promote/demote Fellowship member', async ({helper}) => {
+  itSub.skip('[Negative] TechComm cannot promote/demote Fellowship member', async () => {
 
   });
 
-  itSub.skip('[Negative] TechComm member cannot promote/demote Fellowship member', async ({helper}) => {
+  itSub.skip('[Negative] TechComm member cannot promote/demote Fellowship member', async () => {
 
   });
 
@@ -338,7 +339,7 @@
     )).to.be.rejectedWith('BadOrigin');
   });
 
-  itSub.skip('[Negative] TechComm member cannot veto external Democracy proposals until the cool-off period pass', async ({helper}) => {
+  itSub.skip('[Negative] TechComm member cannot veto external Democracy proposals until the cool-off period pass', async () => {
 
   });
 
modifiedjs-packages/tests/src/governance/util.tsdiffbeforeafterboth
--- a/js-packages/tests/src/governance/util.ts
+++ b/js-packages/tests/src/governance/util.ts
@@ -1,8 +1,9 @@
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {xxhashAsHex} from '@polkadot/util-crypto';
-import {usingPlaygrounds, expect} from '../util';
-import {UniqueHelper} from '../util/playgrounds/unique';
-import {DevUniqueHelper} from '../util/playgrounds/unique.dev';
+import type {u32} from '@polkadot/types-codec';
+import {usingPlaygrounds, expect} from '../util/index.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
+import {DevUniqueHelper} from '@unique/playgrounds/src/unique.dev.js';
 
 export const democracyLaunchPeriod = 35;
 export const democracyVotingPeriod = 35;
@@ -173,7 +174,7 @@
 
 export async function clearFellowshipReferenda(sudoer: IKeyringPair) {
   await usingPlaygrounds(async (helper) => {
-    const proposalsCount = (await helper.getApi().query.fellowshipReferenda.referendumCount());
+    const proposalsCount = (await helper.getApi().query.fellowshipReferenda.referendumCount()) as u32;
     for(let i = 0; i < proposalsCount.toNumber(); i++) {
       await helper.getSudo().fellowship.referenda.cancel(sudoer, i);
     }
modifiedjs-packages/tests/src/inflation.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/inflation.seqtest.ts
+++ b/js-packages/tests/src/inflation.seqtest.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from './util/index.js';
 
 // todo:playgrounds requires sudo, look into on the later stage
 describe('integration test: Inflation', () => {
modifiedjs-packages/tests/src/limits.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/limits.test.ts
+++ b/js-packages/tests/src/limits.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util/index.js';
 
 describe('Number of tokens per address (NFT)', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/maintenance.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/maintenance.seqtest.ts
+++ b/js-packages/tests/src/maintenance.seqtest.ts
@@ -14,11 +14,13 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {ApiPromise} from '@polkadot/api';
-import {expect, itSched, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util';
-import {itEth} from './eth/util';
-import {main as correctState} from './migrations/correctStateAfterMaintenance';
+import {expect, itSched, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util/index.js';
+import {itEth} from './eth/util/index.js';
+import {main as correctState} from './migrations/correctStateAfterMaintenance.js';
+import type {PalletBalancesIdAmount} from '@polkadot/types/lookup';
+import type {Vec} from '@polkadot/types-codec';
 
 async function maintenanceEnabled(api: ApiPromise): Promise<boolean> {
   return (await api.query.maintenance.enabled()).toJSON() as boolean;
@@ -319,7 +321,7 @@
 
         expect((await api.query.appPromotion.pendingUnstake(1)).toJSON()).to.be.deep.equal([[superuser.address, '0x00000000000000056bc75e2d63100000']]);
         expect((await api.query.appPromotion.pendingUnstake(2)).toJSON()).to.be.deep.equal([[superuser.address, '0x00000000000000056bc75e2d63100000']]);
-        expect((await api.query.balances.freezes(superuser.address))
+        expect((await api.query.balances.freezes(superuser.address) as Vec<PalletBalancesIdAmount>)
           .map(lock => ({id: lock.id.toUtf8(), amount: lock.amount.toBigInt()})))
           .to.be.deep.equal([{id: 'appstakeappstake', amount: 200000000000000000000n}]);
         await correctState();
modifiedjs-packages/tests/src/migrations/942057-appPromotion/executeMigration.tsdiffbeforeafterboth
--- a/js-packages/tests/src/migrations/942057-appPromotion/executeMigration.ts
+++ b/js-packages/tests/src/migrations/942057-appPromotion/executeMigration.ts
@@ -1,4 +1,4 @@
-import {migrateLockedToFreeze} from './lockedToFreeze';
+import {migrateLockedToFreeze} from './lockedToFreeze.js';
 
 
 const WS_RPC = process.env.WS_RPC || 'wss://ws-opal.unique.network:443';
modifiedjs-packages/tests/src/migrations/942057-appPromotion/index.tsdiffbeforeafterboth
--- a/js-packages/tests/src/migrations/942057-appPromotion/index.ts
+++ b/js-packages/tests/src/migrations/942057-appPromotion/index.ts
@@ -1,6 +1,6 @@
-import {Migration} from '../../util/frankensteinMigrate';
-import {collectData} from './collectData';
-import {migrateLockedToFreeze} from './lockedToFreeze';
+import type {Migration} from '../../util/frankensteinMigrate.js';
+import {collectData} from './collectData.js';
+import {migrateLockedToFreeze} from './lockedToFreeze.js';
 
 export const migration: Migration = {
   async before() {
@@ -9,4 +9,4 @@
   async after() {
     await migrateLockedToFreeze();
   },
-};
+};
\ No newline at end of file
modifiedjs-packages/tests/src/migrations/942057-appPromotion/lockedToFreeze.tsdiffbeforeafterboth
--- a/js-packages/tests/src/migrations/942057-appPromotion/lockedToFreeze.ts
+++ b/js-packages/tests/src/migrations/942057-appPromotion/lockedToFreeze.ts
@@ -1,10 +1,10 @@
 // import { usingApi, privateKey, onlySign } from "./../../load/lib";
 import * as fs from 'fs';
-import {usingPlaygrounds} from '../../util';
+import {usingPlaygrounds} from '../../util/index.js';
 import path, {dirname} from 'path';
 import {isInteger, parse} from 'lossless-json';
 import {fileURLToPath} from 'url';
-import config from '../../config';
+import config from '../../config.js';
 
 
 const WS_ENDPOINT = config.substrateUrl;
modifiedjs-packages/tests/src/migrations/correctStateAfterMaintenance.tsdiffbeforeafterboth
--- a/js-packages/tests/src/migrations/correctStateAfterMaintenance.ts
+++ b/js-packages/tests/src/migrations/correctStateAfterMaintenance.ts
@@ -1,7 +1,6 @@
-import config from '../config';
-import {usingPlaygrounds} from '../util';
-
-
+import config from '../config.js';
+import {usingPlaygrounds} from '../util/index.js';
+import type {u32} from '@polkadot/types-codec';
 
 const WS_ENDPOINT = config.substrateUrl;
 const DONOR_SEED = '//Alice';
@@ -20,11 +19,11 @@
     const pendingBlocks = (
       await api.query.appPromotion.pendingUnstake.entries()
     ).map(([k, _v]) =>
-      k.args[0]);
+      (k.args[0] as u32).toNumber());
 
-    const currentBlock = await api.query.system.number();
+    const currentBlock = (await api.query.system.number() as u32).toNumber();
 
-    const filteredBlocks = pendingBlocks.filter((b) => currentBlock.gt(b));
+    const filteredBlocks = pendingBlocks.filter(b => currentBlock > b);
 
     if(filteredBlocks.length != 0) {
       console.log(`During maintenance mode, ${filteredBlocks.length} block(s) were not processed. Number(s): ${filteredBlocks}`);
@@ -45,12 +44,12 @@
 
     await Promise.allSettled(promises.map((p) => p()));
 
-    const failedBlocks: bigint[] = [];
+    const failedBlocks: number[] = [];
     let isSuccess = true;
 
     for(const b of filteredBlocks) {
       if(((await api.query.appPromotion.pendingUnstake(b)).toJSON() as any[]).length != 0) {
-        failedBlocks.push(b.toBigInt());
+        failedBlocks.push(b);
         isSuccess = false;
       }
     }
modifiedjs-packages/tests/src/migrations/runCheckState.tsdiffbeforeafterboth
--- a/js-packages/tests/src/migrations/runCheckState.ts
+++ b/js-packages/tests/src/migrations/runCheckState.ts
@@ -1,4 +1,4 @@
-import {main} from './correctStateAfterMaintenance';
+import {main} from './correctStateAfterMaintenance.js';
 
 main({
   wsEndpoint: process.env.WS_RPC!,
modifiedjs-packages/tests/src/nativeFungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nativeFungible.test.ts
+++ b/js-packages/tests/src/nativeFungible.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from './util/index.js';
 
 describe('Native fungible', () => {
   let root: IKeyringPair;
modifiedjs-packages/tests/src/nesting/collectionProperties.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/collectionProperties.seqtest.ts
+++ b/js-packages/tests/src/nesting/collectionProperties.seqtest.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util/index.js';
 
 describe('Integration Test: Collection Properties with sudo', () => {
   let superuser: IKeyringPair;
modifiedjs-packages/tests/src/nesting/collectionProperties.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/collectionProperties.test.ts
+++ b/js-packages/tests/src/nesting/collectionProperties.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util/index.js';
 
 describe('Integration Test: Collection Properties', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/nesting/graphs.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/graphs.test.ts
+++ b/js-packages/tests/src/nesting/graphs.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from '../util';
-import {UniqueHelper, UniqueNFTCollection, UniqueNFToken} from '../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from '../util/index.js';
+import {UniqueHelper, UniqueNFTCollection, UniqueNFToken} from '@unique/playgrounds/src/unique.js';
 
 /**
  * ```dot
modifiedjs-packages/tests/src/nesting/propertyPermissions.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/propertyPermissions.test.ts
+++ b/js-packages/tests/src/nesting/propertyPermissions.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, usingPlaygrounds, expect} from '../util';
-import {UniqueNFTCollection, UniqueRFTCollection} from '../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect} from '../util/index.js';
+import {UniqueNFTCollection, UniqueRFTCollection} from '@unique/playgrounds/src/unique.js';
 
 describe('Integration Test: Access Rights to Token Properties', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/nesting/tokenProperties.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/tokenProperties.seqtest.ts
+++ b/js-packages/tests/src/nesting/tokenProperties.seqtest.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util/index.js';
 
 describe('Integration Test: Token Properties with sudo', () => {
   let superuser: IKeyringPair;
modifiedjs-packages/tests/src/nesting/tokenProperties.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/tokenProperties.test.ts
+++ b/js-packages/tests/src/nesting/tokenProperties.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect, sizeOfProperty} from '../util';
-import {UniqueHelper, UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect, sizeOfProperty} from '../util/index.js';
+import {UniqueHelper, UniqueNFToken, UniqueRFToken} from '@unique/playgrounds/src/unique.js';
 
 describe('Integration Test: Token Properties', () => {
   let alice: IKeyringPair; // collection owner
modifiedjs-packages/tests/src/nesting/unnest.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nesting/unnest.test.ts
+++ b/js-packages/tests/src/nesting/unnest.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from '../util';
-import {UniqueFTCollection, UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, usingPlaygrounds} from '../util/index.js';
+import {CrossAccountId, UniqueFTCollection, UniqueNFToken, UniqueRFToken} from '@unique/playgrounds/src/unique.js';
 
 describe('Integration Test: Unnesting', () => {
   let alice: IKeyringPair;
@@ -304,11 +304,11 @@
 
     // Try to unnest
     await expect(nestedToken.unnest(bob, targetToken, {Substrate: alice.address})).to.be.rejectedWith(/common\.ApprovedValueTooLow/);
-    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await nestedToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
 
     // Try to burn
     await expect(nestedToken.burnFrom(bob, targetToken.nestingAccount())).to.be.rejectedWith(/common\.ApprovedValueTooLow/);
-    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await nestedToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
   });
 
   // todo another test for creating excessive depth matryoshka with Ethereum?
modifiedjs-packages/tests/src/nextSponsoring.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/nextSponsoring.test.ts
+++ b/js-packages/tests/src/nextSponsoring.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, usingPlaygrounds} from './util/index.js';
 
 const SPONSORING_TIMEOUT = 5;
 
modifiedjs-packages/tests/src/pallet-presence.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/pallet-presence.test.ts
+++ b/js-packages/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';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
 
 // Pallets that must always be present
 const requiredPallets = [
modifiedjs-packages/tests/src/performance.seq.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/performance.seq.test.ts
+++ b/js-packages/tests/src/performance.seq.test.ts
@@ -15,10 +15,10 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {ApiPromise} from '@polkadot/api';
-import {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from './util';
-import {ICrossAccountId, IProperty} from './util/playgrounds/types';
-import {UniqueHelper} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from './util/index.js';
+import type {ICrossAccountId, IProperty} from '@unique/playgrounds/src/types.js';
+import {UniqueHelper} from '@unique/playgrounds/src/unique.js';
 
 describe('Performace tests', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/refungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/refungible.test.ts
+++ b/js-packages/tests/src/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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from './util/index.js';
 
 const MAX_REFUNGIBLE_PIECES = 1_000_000_000_000_000_000_000n;
 
modifiedjs-packages/tests/src/removeCollectionAdmin.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/removeCollectionAdmin.test.ts
+++ b/js-packages/tests/src/removeCollectionAdmin.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test removeCollectionAdmin(collection_id, account_id):', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/removeCollectionSponsor.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/removeCollectionSponsor.test.ts
+++ b/js-packages/tests/src/removeCollectionSponsor.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('integration test: ext. removeCollectionSponsor():', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/rpc.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/rpc.test.ts
+++ b/js-packages/tests/src/rpc.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, itSub, expect} from './util';
-import {CrossAccountId} from './util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, itSub, expect} from './util/index.js';
+import {ICrossAccountId} from '@unique/playgrounds/src/types.js';
 
 describe('integration test: RPC methods', () => {
   let donor: IKeyringPair;
@@ -55,9 +55,9 @@
     // Set-up over
 
     const owners = await helper.callRpc('api.rpc.unique.tokenOwners', [collection.collectionId, 0]);
-    const ids = (owners.toJSON() as any[]).map(CrossAccountId.fromLowerCaseKeys);
+    const ids = owners.toHuman() as ICrossAccountId[];
 
-    expect(ids).to.deep.include.members([{Substrate: alice.address}, ethAcc, {Substrate: bob.address}, ...facelessCrowd]);
+    expect(ids).to.have.deep.members([{Substrate: alice.address}, ethAcc, {Substrate: bob.address}, ...facelessCrowd]);
     expect(owners.length == 10).to.be.true;
 
     // Make sure only 10 results are returned with this RPC
modifiedjs-packages/tests/src/scheduler.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/scheduler.seqtest.ts
+++ b/js-packages/tests/src/scheduler.seqtest.ts
@@ -14,9 +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 {expect, itSched, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util';
-import {IKeyringPair} from '@polkadot/types/types';
-import {DevUniqueHelper, Event} from './util/playgrounds/unique.dev';
+import {expect, itSched, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from './util/index.js';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {DevUniqueHelper, Event} from '@unique/playgrounds/src/unique.dev.js';
 
 describe('Scheduling token and balance transfers', () => {
   let superuser: IKeyringPair;
@@ -32,7 +32,7 @@
       const donor = await privateKey({url: import.meta.url});
       [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
 
-      await helper.testUtils.enable();
+      await helper.testUtils.enable(Pallets.TestUtils);
     });
   });
 
@@ -571,7 +571,7 @@
       const donor = await privateKey({url: import.meta.url});
       [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
 
-      await helper.testUtils.enable();
+      await helper.testUtils.enable(Pallets.TestUtils);
     });
   });
 
modifiedjs-packages/tests/src/setCollectionLimits.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/setCollectionLimits.test.ts
+++ b/js-packages/tests/src/setCollectionLimits.test.ts
@@ -15,9 +15,9 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 // https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits
-import {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 const accountTokenOwnershipLimit = 0;
 const sponsoredDataSize = 0;
modifiedjs-packages/tests/src/setCollectionSponsor.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/setCollectionSponsor.test.ts
+++ b/js-packages/tests/src/setCollectionSponsor.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect, Pallets} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect, Pallets} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('integration test: ext. setCollectionSponsor():', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/setPermissions.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/setPermissions.test.ts
+++ b/js-packages/tests/src/setPermissions.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test: Set Permissions', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/sub/appPromotion/appPromotion.seqtest.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/appPromotion/appPromotion.seqtest.ts
+++ b/js-packages/tests/src/sub/appPromotion/appPromotion.seqtest.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from '../../util';
-import {expect} from '../../eth/util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip} from '../../util/index.js';
+import {expect} from '../../eth/util/index.js';
 
 let superuser: IKeyringPair;
 let donor: IKeyringPair;
modifiedjs-packages/tests/src/sub/appPromotion/appPromotion.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/appPromotion/appPromotion.test.ts
+++ b/js-packages/tests/src/sub/appPromotion/appPromotion.test.ts
@@ -14,12 +14,12 @@
 // 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 type {IKeyringPair} from '@polkadot/types/types';
 import {
   itSub, usingPlaygrounds, Pallets, requirePalletsOrSkip, LOCKING_PERIOD, UNLOCKING_PERIOD,
-} from '../../util';
-import {DevUniqueHelper} from '../../util/playgrounds/unique.dev';
-import {itEth, expect, SponsoringMode} from '../../eth/util';
+} from '../../util/index.js';
+import {DevUniqueHelper} from '@unique/playgrounds/src/unique.dev.js';
+import {itEth, expect, SponsoringMode} from '../../eth/util/index.js';
 
 let donor: IKeyringPair;
 let palletAdmin: IKeyringPair;
modifiedjs-packages/tests/src/sub/nesting/admin.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/nesting/admin.test.ts
+++ b/js-packages/tests/src/sub/nesting/admin.test.ts
@@ -14,8 +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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from '../../util/index.js';
+import {CrossAccountId} from '@unique/playgrounds/src/unique.js';
 
 describe('Nesting by collection admin', () => {
   let alice: IKeyringPair;
@@ -51,9 +52,9 @@
       // 1.2 From different collection:
       const nestedTokenB = await collectionB.mintToken(bob, targetTokenA.nestingAccount());
       expect(await nestedTokenA.getTopmostOwner()).to.be.deep.equal({Substrate: charlie.address});
-      expect(await nestedTokenA.getOwner()).to.be.deep.equal(targetTokenA.nestingAccount().toLowerCase());
+      expect(await nestedTokenA.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetTokenA.nestingAccount()));
       expect(await nestedTokenB.getTopmostOwner()).to.be.deep.equal({Substrate: charlie.address});
-      expect(await nestedTokenB.getOwner()).to.be.deep.equal(targetTokenA.nestingAccount().toLowerCase());
+      expect(await nestedTokenB.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetTokenA.nestingAccount()));
 
       // 2. Create a token to be nested and nest:
       const newNestedTokenA = await collectionA.mintToken(bob);
@@ -63,7 +64,7 @@
       // 2.2 From different collection:
       await newNestedTokenB.nest(bob, targetTokenA);
       expect(await newNestedTokenB.getTopmostOwner()).to.be.deep.equal({Substrate: charlie.address});
-      expect(await newNestedTokenB.getOwner()).to.be.deep.equal(targetTokenA.nestingAccount().toLowerCase());
+      expect(await newNestedTokenB.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetTokenA.nestingAccount()));
     });
   });
 
@@ -75,12 +76,12 @@
     // Admin can create an immediately nested token:
     const nestedToken = await collection.mintToken(bob, targetToken.nestingAccount());
     expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: charlie.address});
-    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await nestedToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
 
     // Owner can create and and nest:
     const newToken = await collection.mintToken(alice, {Substrate: charlie.address});
     await newToken.nest(charlie, targetToken);
     expect(await newToken.getTopmostOwner()).to.be.deep.equal({Substrate: charlie.address});
-    expect(await newToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await newToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
   });
 });
modifiedjs-packages/tests/src/sub/nesting/common.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/nesting/common.test.ts
+++ b/js-packages/tests/src/sub/nesting/common.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from '../../util';
-import {UniqueNFTCollection, UniqueRFTCollection} from '../../util/playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, usingPlaygrounds} from '../../util/index.js';
+import {CrossAccountId, UniqueNFTCollection, UniqueRFTCollection} from '@unique/playgrounds/src/unique.js';
 
 let alice: IKeyringPair;
 let bob: IKeyringPair;
@@ -51,13 +51,13 @@
         ? await (collectionForNesting as UniqueNFTCollection).mintToken(bob, targetTokenBob.nestingAccount())
         : await (collectionForNesting as UniqueRFTCollection).mintToken(bob, 10n, targetTokenBob.nestingAccount());
       expect(await nestedToken1.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});
-      expect(await nestedToken1.getOwner()).to.be.deep.equal(targetTokenBob.nestingAccount().toLowerCase());
+      expect(await nestedToken1.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetTokenBob.nestingAccount()));
 
       // 2. Bob can mint and nest token:
       const nestedToken2 = await collectionForNesting.mintToken(bob);
       await nestedToken2.nest(bob, targetTokenBob);
       expect(await nestedToken2.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});
-      expect(await nestedToken2.getOwner()).to.be.deep.equal(targetTokenBob.nestingAccount().toLowerCase());
+      expect(await nestedToken2.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetTokenBob.nestingAccount()));
     });
   });
 
@@ -79,7 +79,7 @@
 
       // 1. Alice can immediately create nested tokens:
       await collectionForNesting.mint(bob, 100n, targetTokenBob.nestingAccount());
-      expect(await collectionForNesting.getTop10Owners()).deep.eq([targetTokenBob.nestingAccount().toLowerCase()]);
+      expect(await collectionForNesting.getTop10Owners()).deep.eq([CrossAccountId.toLowerCase(targetTokenBob.nestingAccount())]);
       expect(await collectionForNesting.getBalance(targetTokenBob.nestingAccount())).eq(100n);
 
       // 2. Alice can mint and nest token:
@@ -128,10 +128,10 @@
 
     const nestedNFT = await nftCollectionToBeNested.mintToken(alice, tokenA.nestingAccount());
     const nestedRFT = await rftCollectionToBeNested.mintToken(alice, 100n, tokenA.nestingAccount());
-    const _nestedFT = await ftCollectionToBeNested.mint(alice, 100n, tokenA.nestingAccount());
+    await ftCollectionToBeNested.mint(alice, 100n, tokenA.nestingAccount());
     await nativeFtCollectionToBeNested.transfer(alice, tokenA.nestingAccount(), 100n);
-    expect(await nestedNFT.getOwner()).to.be.deep.equal(tokenA.nestingAccount().toLowerCase());
-    expect(await nestedRFT.getOwner()).to.be.deep.equal(tokenA.nestingAccount().toLowerCase());
+    expect(await nestedNFT.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(tokenA.nestingAccount()));
+    expect(await nestedRFT.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(tokenA.nestingAccount()));
     expect(await ftCollectionToBeNested.getBalance(tokenA.nestingAccount())).to.equal(100n);
     expect(await nativeFtCollectionToBeNested.getBalance(tokenA.nestingAccount())).to.equal(100n);
 
@@ -145,7 +145,7 @@
     await nativeFtCollectionToBeNested.transferFrom(alice, tokenA.nestingAccount(), tokenB.nestingAccount(), 25n);
 
     expect(await nestedNFT.getTopmostOwner()).to.be.deep.equal({Substrate: alice.address});
-    expect(await nestedNFT.getOwner()).to.be.deep.equal(tokenB.nestingAccount().toLowerCase());
+    expect(await nestedNFT.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(tokenB.nestingAccount()));
 
     expect(await nestedRFT.getBalance(tokenB.nestingAccount())).to.equal(25n);
     expect(await nestedRFT.getBalance(tokenA.nestingAccount())).to.equal(75n);
modifiedjs-packages/tests/src/sub/nesting/e2e.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/nesting/e2e.test.ts
+++ b/js-packages/tests/src/sub/nesting/e2e.test.ts
@@ -14,8 +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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from '../../util/index.js';
+import {CrossAccountId} from '@unique/playgrounds/src/unique.js';
 
 describe('Composite nesting tests', () => {
   let alice: IKeyringPair;
@@ -119,7 +120,7 @@
     // Create an immediately nested token
     const nestedToken = await collection.mintToken(alice, targetToken.nestingAccount());
     expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: alice.address});
-    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await nestedToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
 
     // Create a token to be nested
     const newToken = await collection.mintToken(alice);
@@ -127,14 +128,14 @@
     // Nest
     await newToken.nest(alice, targetToken);
     expect(await newToken.getTopmostOwner()).to.be.deep.equal({Substrate: alice.address});
-    expect(await newToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await newToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
 
     // Move bundle to different user
     await targetToken.transfer(alice, {Substrate: bob.address});
     expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});
-    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await nestedToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
     expect(await newToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});
-    expect(await newToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await newToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
 
     // Unnest
     await newToken.unnest(bob, targetToken, {Substrate: bob.address});
modifiedjs-packages/tests/src/sub/nesting/nesting.negative.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/nesting/nesting.negative.test.ts
+++ b/js-packages/tests/src/sub/nesting/nesting.negative.test.ts
@@ -14,10 +14,10 @@
 // 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 {expect, itSub, Pallets, usingPlaygrounds} from '../../util';
-import {UniqueFTCollection, UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection, UniqueRFToken} from '../../util/playgrounds/unique';
-import {itEth} from '../../eth/util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, usingPlaygrounds} from '../../util/index.js';
+import {UniqueFTCollection, UniqueNFTCollection, UniqueNFToken, UniqueRFTCollection, UniqueRFToken} from '@unique/playgrounds/src/unique.js';
+import {itEth} from '../../eth/util/index.js';
 
 let alice: IKeyringPair;
 let bob: IKeyringPair;
@@ -182,7 +182,7 @@
       // 2. Alice cannot mint and nest token:
       const nft = await nftCollectionForNesting.mintToken(alice);
       const rft = await rftCollectionForNesting.mintToken(alice, 100n);
-      const _ft = await ftCollectionForNesting.mint(alice, 100n);
+      await ftCollectionForNesting.mint(alice, 100n);
       await expect(nft.transfer(alice, testCase.token.nestingAccount())).to.be.rejectedWith(testCase.error);
       await expect(rft.transfer(alice, testCase.token.nestingAccount())).to.be.rejectedWith(testCase.error);
       await expect(ftCollectionForNesting.transfer(alice, testCase.token.nestingAccount(), 50n)).to.be.rejectedWith(testCase.error);
@@ -214,7 +214,7 @@
     const nativeFtCollection = helper.ft.getCollectionObject(0);
 
     const rftToken = await rftCollection.mintToken(alice);
-    const _ftToken = await ftCollection.mint(alice, 100n);
+    await ftCollection.mint(alice, 100n);
 
     const collectionForNesting = await helper.nft.mintCollection(alice);
 
modifiedjs-packages/tests/src/sub/nesting/refungible.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/nesting/refungible.test.ts
+++ b/js-packages/tests/src/sub/nesting/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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, usingPlaygrounds} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, usingPlaygrounds} from '../../util/index.js';
 
 describe('ReFungible-specific nesting tests', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/sub/nesting/unnesting.negative.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/nesting/unnesting.negative.test.ts
+++ b/js-packages/tests/src/sub/nesting/unnesting.negative.test.ts
@@ -14,8 +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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, usingPlaygrounds} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, usingPlaygrounds} from '../../util/index.js';
+import {CrossAccountId} from '@unique/playgrounds/src/unique.js';
 
 describe('Negative Test: Unnesting', () => {
   let alice: IKeyringPair;
@@ -48,7 +49,7 @@
 
     expect(await targetToken.getChildren()).to.be.length(1);
     expect(await nestedToken.getTopmostOwner()).to.be.deep.equal({Substrate: bob.address});
-    expect(await nestedToken.getOwner()).to.be.deep.equal(targetToken.nestingAccount().toLowerCase());
+    expect(await nestedToken.getOwner()).to.be.deep.equal(CrossAccountId.toLowerCase(targetToken.nestingAccount()));
   });
 
   [
modifiedjs-packages/tests/src/sub/refungible/burn.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/refungible/burn.test.ts
+++ b/js-packages/tests/src/sub/refungible/burn.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../../util/index.js';
 
 describe('Refungible: burn', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/sub/refungible/nesting.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/refungible/nesting.test.ts
+++ b/js-packages/tests/src/sub/refungible/nesting.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 {IKeyringPair} from '@polkadot/types/types';
-import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {expect, itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds} from '../../util/index.js';
 
 describe('Refungible nesting', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/sub/refungible/repartition.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/refungible/repartition.test.ts
+++ b/js-packages/tests/src/sub/refungible/repartition.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../../util/index.js';
 
 describe('integration test: Refungible functionality:', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/sub/refungible/transfer.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/sub/refungible/transfer.test.ts
+++ b/js-packages/tests/src/sub/refungible/transfer.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../../util/index.js';
 
 describe('Refungible transfer tests', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/transfer.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/transfer.test.ts
+++ b/js-packages/tests/src/transfer.test.ts
@@ -14,10 +14,10 @@
 // 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 {itEth, usingEthPlaygrounds} from './eth/util';
-import {itSub, Pallets, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itEth, usingEthPlaygrounds} from './eth/util/index.js';
+import {itSub, Pallets, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test Transfer(recipient, collection_id, item_id, value)', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/transferFrom.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/transferFrom.test.ts
+++ b/js-packages/tests/src/transferFrom.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, Pallets, usingPlaygrounds, expect} from './util';
-import {NON_EXISTENT_COLLECTION_ID} from './util/playgrounds/types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, Pallets, usingPlaygrounds, expect} from './util/index.js';
+import {NON_EXISTENT_COLLECTION_ID} from '@unique/playgrounds/src/types.js';
 
 describe('Integration Test transferFrom(from, recipient, collection_id, item_id, value):', () => {
   let alice: IKeyringPair;
modifiedjs-packages/tests/src/tx-version-presence.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/tx-version-presence.test.ts
+++ b/js-packages/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';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
 
 let metadata: Metadata;
 
modifiedjs-packages/tests/src/util/authorizeEnactUpgrade.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/authorizeEnactUpgrade.ts
+++ b/js-packages/tests/src/util/authorizeEnactUpgrade.ts
@@ -1,6 +1,6 @@
 import {readFile} from 'fs/promises';
 import {u8aToHex} from '@polkadot/util';
-import {usingPlaygrounds} from '.';
+import {usingPlaygrounds} from './index.js';
 import {blake2AsHex} from '@polkadot/util-crypto';
 
 
modifiedjs-packages/tests/src/util/createHrmp.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/createHrmp.ts
+++ b/js-packages/tests/src/util/createHrmp.ts
@@ -1,5 +1,5 @@
-import {usingPlaygrounds} from '.';
-import config from '../config';
+import {usingPlaygrounds} from './index.js';
+import config from '../config.js';
 
 const profile = process.argv[2];
 if(!profile) throw new Error('missing profile/relay argument');
modifiedjs-packages/tests/src/util/frankensteinMigrate.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/frankensteinMigrate.ts
+++ b/js-packages/tests/src/util/frankensteinMigrate.ts
@@ -1,4 +1,4 @@
-import {migration as locksToFreezesMigration} from '../migrations/942057-appPromotion';
+import {migration as locksToFreezesMigration} from '../migrations/942057-appPromotion/index.js';
 export interface Migration {
   before: () => Promise<void>,
   after: () => Promise<void>,
modifiedjs-packages/tests/src/util/globalSetup.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/globalSetup.ts
+++ b/js-packages/tests/src/util/globalSetup.ts
@@ -3,7 +3,7 @@
 
 import {
   usingPlaygrounds, Pallets, DONOR_FUNDING, MINIMUM_DONOR_FUND, LOCKING_PERIOD, UNLOCKING_PERIOD, makeNames,
-} from './index';
+} from './index.js';
 import * as path from 'path';
 import {promises as fs} from 'fs';
 
@@ -70,7 +70,7 @@
     const batchSize = 300;
     let balanceGrantedCounter = 0;
     for(let b = 0; b < filenames.length; b += batchSize) {
-      const tx = [];
+      const tx: Promise<boolean>[] = [];
       let batchBalanceGrantedCounter = 0;
       for(let i = 0; batchBalanceGrantedCounter < batchSize && b + i < filenames.length; i++) {
         const f = filenames[b + i];
modifiedjs-packages/tests/src/util/identitySetter.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/identitySetter.ts
+++ b/js-packages/tests/src/util/identitySetter.ts
@@ -8,9 +8,9 @@
 // Example: `yarn setIdentities wss://polkadot-rpc.dwellir.com ws://localhost:9944 escape pattern miracle train sudden cart adapt embark wedding alien lamp mesh`
 
 import {encodeAddress} from '@polkadot/keyring';
-import {IKeyringPair} from '@polkadot/types/types';
-import {usingPlaygrounds, Pallets} from './index';
-import {ChainHelperBase} from './playgrounds/unique';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {usingPlaygrounds, Pallets} from './index.js';
+import {ChainHelperBase} from '@unique/playgrounds/src/unique.js';
 
 const relayUrl = process.argv[2] ?? 'ws://localhost:9844';
 const paraUrl = process.argv[3] ?? 'ws://localhost:9944';
modifiedjs-packages/tests/src/util/index.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/index.ts
+++ b/js-packages/tests/src/util/index.ts
@@ -3,15 +3,15 @@
 
 import * as path from 'path';
 import * as crypto from 'crypto';
-import {IKeyringPair} from '@polkadot/types/types/interfaces';
+import type {IKeyringPair} from '@polkadot/types/types/interfaces';
 import chai from 'chai';
 import chaiAsPromised from 'chai-as-promised';
 import chaiSubset from 'chai-subset';
 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, DevStatemineHelper, DevStatemintHelper, DevAstarHelper, DevShidenHelper, DevPolkadexHelper} from './playgrounds/unique.dev';
+import config from '../config.js';
+import {ChainHelperBase} from '@unique/playgrounds/src/unique.js';
+import type {ILogger} from '@unique/playgrounds/src/types.js';
+import {DevUniqueHelper, SilentLogger, SilentConsole, DevMoonbeamHelper, DevMoonriverHelper, DevAcalaHelper, DevKaruraHelper, DevRelayHelper, DevWestmintHelper, DevStatemineHelper, DevStatemintHelper, DevAstarHelper, DevShidenHelper, DevPolkadexHelper} from '@unique/playgrounds/src/unique.dev.js';
 import {dirname} from 'path';
 import {fileURLToPath} from 'url';
 
modifiedjs-packages/tests/src/util/relayIdentitiesChecker.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/relayIdentitiesChecker.ts
+++ b/js-packages/tests/src/util/relayIdentitiesChecker.ts
@@ -7,8 +7,8 @@
 // Example: `yarn checkRelayIdentities wss://polkadot-rpc.dwellir.com wss://kusama-rpc.dwellir.com`
 
 import {encodeAddress} from '@polkadot/keyring';
-import {usingPlaygrounds} from './index';
-import {getIdentities, getSubs, getSupers, constructSubInfo} from './identitySetter';
+import {usingPlaygrounds} from './index.js';
+import {getIdentities, getSubs, getSupers, constructSubInfo} from './identitySetter.js';
 
 const relay1Url = process.argv[2] ?? 'ws://localhost:9844';
 const relay2Url = process.argv[3] ?? 'ws://localhost:9844';
modifiedjs-packages/tests/src/util/setCode.tsdiffbeforeafterboth
--- a/js-packages/tests/src/util/setCode.ts
+++ b/js-packages/tests/src/util/setCode.ts
@@ -1,6 +1,6 @@
 import {readFile} from 'fs/promises';
 import {u8aToHex} from '@polkadot/util';
-import {usingPlaygrounds} from '.';
+import {usingPlaygrounds} from './index.js';
 
 const codePath = process.argv[2];
 if(!codePath) throw new Error('missing code path argument');
modifiedjs-packages/tests/src/vesting.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/vesting.test.ts
+++ b/js-packages/tests/src/vesting.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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, usingPlaygrounds, expect} from './util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, usingPlaygrounds, expect} from './util/index.js';
 
 describe('Vesting', () => {
   let donor: IKeyringPair;
modifiedjs-packages/tests/src/xcm/lowLevelXcmQuartz.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/xcm/lowLevelXcmQuartz.test.ts
+++ b/js-packages/tests/src/xcm/lowLevelXcmQuartz.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import {itSub, describeXCM, usingPlaygrounds, usingKaruraPlaygrounds,  usingMoonriverPlaygrounds, usingShidenPlaygrounds, usingRelayPlaygrounds} from '../util';
-import {QUARTZ_CHAIN,  QTZ_DECIMALS,  SHIDEN_DECIMALS, karuraUrl, moonriverUrl,  shidenUrl,  SAFE_XCM_VERSION, XcmTestHelper, TRANSFER_AMOUNT, SENDER_BUDGET, relayUrl} from './xcm.types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, describeXCM, usingPlaygrounds, usingKaruraPlaygrounds,  usingMoonriverPlaygrounds, usingShidenPlaygrounds, usingRelayPlaygrounds} from '../util/index.js';
+import {QUARTZ_CHAIN,  QTZ_DECIMALS,  SHIDEN_DECIMALS, karuraUrl, moonriverUrl,  shidenUrl,  SAFE_XCM_VERSION, XcmTestHelper, TRANSFER_AMOUNT, SENDER_BUDGET, relayUrl} from './xcm.types.js';
 import {hexToString} from '@polkadot/util';
 
 const testHelper = new XcmTestHelper('quartz');
modifiedjs-packages/tests/src/xcm/lowLevelXcmUnique.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/xcm/lowLevelXcmUnique.test.ts
+++ b/js-packages/tests/src/xcm/lowLevelXcmUnique.test.ts
@@ -14,12 +14,12 @@
 // 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 config from '../config';
-import {itSub, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingMoonbeamPlaygrounds, usingAstarPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import config from '../config.js';
+import {itSub, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingMoonbeamPlaygrounds, usingAstarPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds} from '../util/index.js';
 import {nToBigInt} from '@polkadot/util';
 import {hexToString} from '@polkadot/util';
-import {ASTAR_DECIMALS, SAFE_XCM_VERSION, SENDER_BUDGET, UNIQUE_CHAIN, UNQ_DECIMALS, XcmTestHelper, acalaUrl, astarUrl,  moonbeamUrl, polkadexUrl, relayUrl, uniqueAssetId} from './xcm.types';
+import {ASTAR_DECIMALS, SAFE_XCM_VERSION, SENDER_BUDGET, UNIQUE_CHAIN, UNQ_DECIMALS, XcmTestHelper, acalaUrl, astarUrl,  moonbeamUrl, polkadexUrl, relayUrl, uniqueAssetId} from './xcm.types.js';
 
 const testHelper = new XcmTestHelper('unique');
 
modifiedjs-packages/tests/src/xcm/xcm.types.tsdiffbeforeafterboth
--- a/js-packages/tests/src/xcm/xcm.types.ts
+++ b/js-packages/tests/src/xcm/xcm.types.ts
@@ -1,8 +1,8 @@
-import {IKeyringPair} from '@polkadot/types/types';
+import type {IKeyringPair} from '@polkadot/types/types';
 import {hexToString} from '@polkadot/util';
-import {expect, usingAcalaPlaygrounds, usingAstarPlaygrounds, usingKaruraPlaygrounds, usingMoonbeamPlaygrounds, usingMoonriverPlaygrounds, usingPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds, usingShidenPlaygrounds} from '../util';
-import {DevUniqueHelper, Event} from '../util/playgrounds/unique.dev';
-import config from '../config';
+import {expect, usingAcalaPlaygrounds, usingAstarPlaygrounds, usingKaruraPlaygrounds, usingMoonbeamPlaygrounds, usingMoonriverPlaygrounds, usingPlaygrounds, usingPolkadexPlaygrounds, usingRelayPlaygrounds, usingShidenPlaygrounds} from '../util/index.js';
+import {DevUniqueHelper, Event} from '@unique/playgrounds/src/unique.dev.js';
+import config from '../config.js';
 
 export const UNIQUE_CHAIN = +(process.env.RELAY_UNIQUE_ID || 2037);
 export const STATEMINT_CHAIN = +(process.env.RELAY_STATEMINT_ID || 1000);
modifiedjs-packages/tests/src/xcm/xcmOpal.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/xcm/xcmOpal.test.ts
+++ b/js-packages/tests/src/xcm/xcmOpal.test.ts
@@ -14,9 +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 {IKeyringPair} from '@polkadot/types/types';
-import config from '../config';
-import {itSub, expect, describeXCM, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util';
+import type {IKeyringPair} from '@polkadot/types/types';
+import config from '../config.js';
+import {itSub, expect, describeXCM, usingPlaygrounds, usingWestmintPlaygrounds, usingRelayPlaygrounds} from '../util/index.js';
 
 const STATEMINE_CHAIN = +(process.env.RELAY_WESTMINT_ID || 1000);
 const UNIQUE_CHAIN = +(process.env.RELAY_OPAL_ID || 2095);
modifiedjs-packages/tests/src/xcm/xcmQuartz.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/xcm/xcmQuartz.test.ts
+++ b/js-packages/tests/src/xcm/xcmQuartz.test.ts
@@ -14,10 +14,10 @@
 // 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, expect, describeXCM, usingPlaygrounds, usingKaruraPlaygrounds, usingRelayPlaygrounds, usingMoonriverPlaygrounds, usingStateminePlaygrounds, usingShidenPlaygrounds} from '../util';
-import {DevUniqueHelper, Event} from '../util/playgrounds/unique.dev';
-import {STATEMINE_CHAIN, QUARTZ_CHAIN, KARURA_CHAIN, MOONRIVER_CHAIN, SHIDEN_CHAIN, STATEMINE_DECIMALS, KARURA_DECIMALS, QTZ_DECIMALS, RELAY_DECIMALS, SHIDEN_DECIMALS, karuraUrl, moonriverUrl, relayUrl, shidenUrl, statemineUrl} from './xcm.types';
+import type {IKeyringPair} from '@polkadot/types/types';
+import {itSub, expect, describeXCM, usingPlaygrounds, usingKaruraPlaygrounds, usingRelayPlaygrounds, usingMoonriverPlaygrounds, usingStateminePlaygrounds, usingShidenPlaygrounds} from '../util/index.js';
+import {DevUniqueHelper, Event} from '@unique/playgrounds/src/unique.dev.js';
+import {STATEMINE_CHAIN, QUARTZ_CHAIN, KARURA_CHAIN, MOONRIVER_CHAIN, SHIDEN_CHAIN, STATEMINE_DECIMALS, KARURA_DECIMALS, QTZ_DECIMALS, RELAY_DECIMALS, SHIDEN_DECIMALS, karuraUrl, moonriverUrl, relayUrl, shidenUrl, statemineUrl} from './xcm.types.js';
 import {hexToString} from '@polkadot/util';
 
 
modifiedjs-packages/tests/src/xcm/xcmUnique.test.tsdiffbeforeafterboth
--- a/js-packages/tests/src/xcm/xcmUnique.test.ts
+++ b/js-packages/tests/src/xcm/xcmUnique.test.ts
@@ -14,12 +14,12 @@
 // 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 config from '../config';
-import {itSub, expect, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingRelayPlaygrounds, usingMoonbeamPlaygrounds, usingStatemintPlaygrounds, usingAstarPlaygrounds, usingPolkadexPlaygrounds} from '../util';
-import {Event} from '../util/playgrounds/unique.dev';
+import type {IKeyringPair} from '@polkadot/types/types';
+import config from '../config.js';
+import {itSub, expect, describeXCM, usingPlaygrounds, usingAcalaPlaygrounds, usingRelayPlaygrounds, usingMoonbeamPlaygrounds, usingStatemintPlaygrounds, usingAstarPlaygrounds, usingPolkadexPlaygrounds} from '../util/index.js';
+import {Event} from '@unique/playgrounds/src/unique.dev.js';
 import {hexToString, nToBigInt} from '@polkadot/util';
-import {ACALA_CHAIN, ASTAR_CHAIN, MOONBEAM_CHAIN, POLKADEX_CHAIN, SAFE_XCM_VERSION, STATEMINT_CHAIN, UNIQUE_CHAIN, expectFailedToTransact, expectUntrustedReserveLocationFail, uniqueAssetId, uniqueVersionedMultilocation} from './xcm.types';
+import {ACALA_CHAIN, ASTAR_CHAIN, MOONBEAM_CHAIN, POLKADEX_CHAIN, SAFE_XCM_VERSION, STATEMINT_CHAIN, UNIQUE_CHAIN, expectFailedToTransact, expectUntrustedReserveLocationFail, uniqueAssetId, uniqueVersionedMultilocation} from './xcm.types.js';
 
 
 const STATEMINT_PALLET_INSTANCE = 50;
addedjs-packages/tests/tsconfig.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/tests/tsconfig.json
@@ -0,0 +1,13 @@
+{
+  "extends": "../tsconfig.packages.json",
+  "compilerOptions": {
+    "rootDir": "./src",
+    "outDir": "dist",
+    "allowSyntheticDefaultImports": true,
+    "resolveJsonModule": true,
+  },
+  "include": ["./src/**/*.json", "./src/**/*.ts"],
+  "references": [
+    { "path": "../playgrounds/tsconfig.json" }
+  ]
+}
\ No newline at end of file
addedjs-packages/tsconfig.base.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/tsconfig.base.json
@@ -0,0 +1,34 @@
+{
+    /**
+     * There uses the strictest configs as the base
+     * https://github.com/tsconfig/bases/blob/f674fa6cbca17062ff02511b02872f8729a597ec/bases/strictest.json
+     */
+    "extends": "@tsconfig/strictest/tsconfig.json",
+    "compilerOptions": {
+      /**
+       * This needs to align with scripts/polkadot-dev-build-ts & dev-ts/loader
+       * (target here is specifically tied to the minimum supported version)
+       */
+      "module": "nodenext",
+      "moduleResolution": "nodenext",
+      "target": "es2022",
+  
+      /**
+       * Specific compilation configs for polkadot-js projects as it is used
+       * (we only compile *.d.ts via the tsc command-line)
+       */
+      "declaration": true,
+      "emitDeclarationOnly": true,
+      "jsx": "preserve",
+      "verbatimModuleSyntax": true,
+  
+      /**
+       * These appear in strictest, however we don't (yet) use them. For the most part it means
+       * that we actually do have a large number of these lurking (especially on index checks)
+       */
+      "checkJs": false,
+      "exactOptionalPropertyTypes": false,
+      "noPropertyAccessFromIndexSignature": false,
+      "noUncheckedIndexedAccess": false,
+    }
+  }
\ No newline at end of file
modifiedjs-packages/tsconfig.jsondiffbeforeafterboth
--- a/js-packages/tsconfig.json
+++ b/js-packages/tsconfig.json
@@ -1,22 +1,11 @@
 {
-	"compilerOptions": {
-		"target": "ES2020",
-		"moduleResolution": "node",
-		"esModuleInterop": true,
-		"resolveJsonModule": true,
-		"module": "ESNext",
-		"sourceMap": true,
-		"outDir": "dist",
-		"strict": true,
-		"paths": {
-			"@polkadot/types/lookup": ["./src/interfaces/types-lookup.ts"],
-			"@unique-nft/types/*": ["./src/interfaces/*"]
-		}
-	},
-	"include": ["./src/**/*", "./src/interfaces/*.ts"],
-	"exclude": ["./src/.outdated"],
-	"lib": ["es2017"],
-	"ts-node": {
-		"experimentalSpecifierResolution": "node"
-	}
-}
+	"references": [
+	  { "path": "./types/tsconfig.json" },
+	  { "path": "./playgrounds/tsconfig.json" },
+	  { "path": "./scripts/tsconfig.json" },
+	  { "path": "./tests/tsconfig.json" }
+	],
+	"files": [],
+	"exclude": ["**/node_modules"]
+  }
+  
\ No newline at end of file
addedjs-packages/tsconfig.packages.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/tsconfig.packages.json
@@ -0,0 +1,32 @@
+{
+  "compilerOptions": {
+    "composite": true,
+    "skipLibCheck": true,
+
+    /**
+     * This needs to align with scripts/polkadot-dev-build-ts & dev-ts/loader
+     * (target here is specifically tied to the minimum supported version)
+     */
+     "module": "nodenext",
+     "moduleResolution": "nodenext",
+     "target": "ES2022",
+ 
+     /**
+      * Specific compilation configs for polkadot-js projects as it is used
+      * (we only compile *.d.ts via the tsc command-line)
+      */
+     "declaration": true,
+     "emitDeclarationOnly": true,
+     "jsx": "preserve",
+     "verbatimModuleSyntax": false,
+ 
+     /**
+      * These appear in strictest, however we don't (yet) use them. For the most part it means
+      * that we actually do have a large number of these lurking (especially on index checks)
+      */
+     "checkJs": false,
+     "exactOptionalPropertyTypes": false,
+     "noPropertyAccessFromIndexSignature": false,
+     "noUncheckedIndexedAccess": false,
+  },
+}
\ No newline at end of file
addedjs-packages/types/package.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/types/package.json
@@ -0,0 +1,16 @@
+{
+    "author": "",
+    "license": "SEE LICENSE IN ../../../LICENSE",
+    "description": "Interfaces for interacting with contracts and contract ABIs",
+    "engines": {
+        "node": ">=16"
+    },
+    "name": "@unique/opal-types",
+    "type": "module",
+    "version": "1.0.0",
+    "main": "index.js",
+    "dependencies": {
+        "rxjs": "^7.8.1",
+        "tslib": "^2.6.2"
+    }
+}
modifiedjs-packages/types/src/augment-api-rpc.tsdiffbeforeafterboth
--- a/js-packages/types/src/augment-api-rpc.ts
+++ b/js-packages/types/src/augment-api-rpc.ts
@@ -5,11 +5,11 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/rpc-core/types/jsonrpc';
 
-import type { PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo } from './default';
+import type { PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo } from './default/index.js';
 import type { AugmentedRpc } from '@polkadot/rpc-core/types';
 import type { Metadata, StorageKey } from '@polkadot/types';
-import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, f64, u128, u32, u64 } from '@polkadot/types-codec';
-import type { AnyNumber, Codec, ITuple } from '@polkadot/types-codec/types';
+import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, f64, u32, u64 } from '@polkadot/types-codec';
+import type { AnyNumber, Codec } from '@polkadot/types-codec/types';
 import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';
 import type { EpochAuthorship } from '@polkadot/types/interfaces/babe';
 import type { BeefySignedCommitment } from '@polkadot/types/interfaces/beefy';
@@ -35,24 +35,6 @@
 
 declare module '@polkadot/rpc-core/types/jsonrpc' {
   interface RpcInterface {
-    appPromotion: {
-      /**
-       * Returns the total amount of unstaked tokens
-       **/
-      pendingUnstake: AugmentedRpc<(staker?: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
-      /**
-       * Returns the total amount of unstaked tokens per block
-       **/
-      pendingUnstakePerBlock: AugmentedRpc<(staker: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<ITuple<[u32, u128]>>>>;
-      /**
-       * Returns the total amount of staked tokens
-       **/
-      totalStaked: AugmentedRpc<(staker?: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
-      /**
-       * Returns the total amount of staked tokens per block when staked
-       **/
-      totalStakedPerBlock: AugmentedRpc<(staker: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<ITuple<[u32, u128]>>>>;
-    };
     author: {
       /**
        * Returns true if the keystore has private keys for the given public key and key type.
@@ -444,12 +426,6 @@
        **/
       queryInfo: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<RuntimeDispatchInfoV1>>;
     };
-    povinfo: {
-      /**
-       * Estimate PoV size of encoded signed extrinsics
-       **/
-      estimateExtrinsicPoV: AugmentedRpc<(encodedXt: Vec<Bytes> | (Bytes | string | Uint8Array)[], at?: Hash | string | Uint8Array) => Observable<UpPovEstimateRpcPovInfo>>;
-    };
     rpc: {
       /**
        * Retrieves the list of RPC methods that are exposed by the node
@@ -627,116 +603,6 @@
        * Retrieves the version of the node
        **/
       version: AugmentedRpc<() => Observable<Text>>;
-    };
-    unique: {
-      /**
-       * Get the amount of any user tokens owned by an account
-       **/
-      accountBalance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
-      /**
-       * Get tokens owned by an account in a collection
-       **/
-      accountTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;
-      /**
-       * Get the list of admin accounts of a collection
-       **/
-      adminlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
-      /**
-       * Get the amount of currently possible sponsored transactions on a token for the fee to be taken off a sponsor
-       **/
-      allowance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, sender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
-      /**
-       * Tells whether the given `owner` approves the `operator`.
-       **/
-      allowanceForAll: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, operator: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<bool>>>;
-      /**
-       * Check if a user is allowed to operate within a collection
-       **/
-      allowed: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
-      /**
-       * Get the list of accounts allowed to operate within a collection
-       **/
-      allowlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
-      /**
-       * Get the amount of a specific token owned by an account
-       **/
-      balance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
-      /**
-       * Get a collection by the specified ID
-       **/
-      collectionById: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsRpcCollection>>>;
-      /**
-       * Get collection properties, optionally limited to the provided keys
-       **/
-      collectionProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys?: Option<Vec<Text>> | null | Uint8Array | Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;
-      /**
-       * Get chain stats about collections
-       **/
-      collectionStats: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<UpDataStructsCollectionStats>>;
-      /**
-       * Get tokens contained within a collection
-       **/
-      collectionTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;
-      /**
-       * Get token constant metadata
-       **/
-      constMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
-      /**
-       * Get effective collection limits
-       **/
-      effectiveCollectionLimits: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsCollectionLimits>>>;
-      /**
-       * Get the last token ID created in a collection
-       **/
-      lastTokenId: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
-      /**
-       * Get the number of blocks until sponsoring a transaction is available
-       **/
-      nextSponsored: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u64>>>;
-      /**
-       * Get property permissions, optionally limited to the provided keys
-       **/
-      propertyPermissions: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys?: Option<Vec<Text>> | null | Uint8Array | Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsPropertyKeyPermission>>>;
-      /**
-       * Get tokens nested directly into the token
-       **/
-      tokenChildren: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsTokenChild>>>;
-      /**
-       * Get token data, including properties, optionally limited to the provided keys, and total pieces for an RFT
-       **/
-      tokenData: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Option<Vec<Text>> | null | Uint8Array | Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<UpDataStructsTokenData>>;
-      /**
-       * Check if the token exists
-       **/
-      tokenExists: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
-      /**
-       * Get the token owner
-       **/
-      tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;
-      /**
-       * Returns 10 tokens owners in no particular order
-       **/
-      tokenOwners: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
-      /**
-       * Get token properties, optionally limited to the provided keys
-       **/
-      tokenProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Option<Vec<Text>> | null | Uint8Array | Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;
-      /**
-       * Get the topmost token owner in the hierarchy of a possibly nested token
-       **/
-      topmostTokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;
-      /**
-       * Get the total amount of pieces of an RFT
-       **/
-      totalPieces: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<u128>>>;
-      /**
-       * Get the amount of distinctive tokens present in a collection
-       **/
-      totalSupply: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
-      /**
-       * Get token variable metadata
-       **/
-      variableMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
     };
     web3: {
       /**
modifiedjs-packages/types/src/augment-types.tsdiffbeforeafterboth
--- a/js-packages/types/src/augment-types.ts
+++ b/js-packages/types/src/augment-types.ts
@@ -5,7 +5,8 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/types/types/registry';
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemCodeUpgradeAuthorization, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletParachainSystemRelayStateSnapshotRelayDispatchQueueRemainingCapacity, CumulusPalletParachainSystemUnincludedSegmentAncestor, CumulusPalletParachainSystemUnincludedSegmentHrmpChannelUpdate, CumulusPalletParachainSystemUnincludedSegmentSegmentTracker, CumulusPalletParachainSystemUnincludedSegmentUsedBandwidth, 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, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportPreimagesBounded, FrameSupportScheduleDispatchTime, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OpalRuntimeRuntimeCommonSessionKeys, OpalRuntimeRuntimeHoldReason, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesIdAmount, PalletBalancesReasons, PalletBalancesReserveData, PalletCollatorSelectionCall, PalletCollatorSelectionError, PalletCollatorSelectionEvent, PalletCollatorSelectionHoldReason, PalletCollectiveCall, PalletCollectiveError, PalletCollectiveEvent, PalletCollectiveRawOrigin, PalletCollectiveVotes, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletConfigurationEvent, PalletDemocracyCall, PalletDemocracyConviction, PalletDemocracyDelegations, PalletDemocracyError, PalletDemocracyEvent, PalletDemocracyMetadataOwner, PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyTally, PalletDemocracyVoteAccountVote, PalletDemocracyVotePriorLock, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCodeMetadata, PalletEvmCoderSubstrateError, PalletEvmContractHelpersCall, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetId, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletGovOriginsOrigin, PalletIdentityBitFlags, PalletIdentityCall, PalletIdentityError, PalletIdentityEvent, PalletIdentityIdentityField, PalletIdentityIdentityInfo, PalletIdentityJudgement, PalletIdentityRegistrarInfo, PalletIdentityRegistration, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletMembershipCall, PalletMembershipError, PalletMembershipEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletRankedCollectiveCall, PalletRankedCollectiveError, PalletRankedCollectiveEvent, PalletRankedCollectiveMemberRecord, PalletRankedCollectiveTally, PalletRankedCollectiveVoteRecord, PalletReferendaCall, PalletReferendaCurve, PalletReferendaDecidingStatus, PalletReferendaDeposit, PalletReferendaError, PalletReferendaEvent, PalletReferendaReferendumInfo, PalletReferendaReferendumStatus, PalletReferendaTrackInfo, PalletRefungibleError, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduled, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletStateTrieMigrationCall, PalletStateTrieMigrationError, PalletStateTrieMigrationEvent, PalletStateTrieMigrationMigrationCompute, PalletStateTrieMigrationMigrationLimits, PalletStateTrieMigrationMigrationTask, PalletStateTrieMigrationProgress, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PalletXcmQueryStatus, PalletXcmRemoteLockedFungibleRecord, PalletXcmVersionMigrationStage, ParachainInfoCall, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesPrimitivesXcmpMessageFormat, PolkadotPrimitivesV5AbridgedHostConfiguration, PolkadotPrimitivesV5AbridgedHrmpChannel, PolkadotPrimitivesV5PersistedValidationData, PolkadotPrimitivesV5UpgradeGoAhead, PolkadotPrimitivesV5UpgradeRestriction, PolkadotPrimitivesVstagingAsyncBackingParams, SpArithmeticArithmeticError, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionValidityInvalidTransaction, SpRuntimeTransactionValidityTransactionValidityError, SpRuntimeTransactionValidityUnknownTransaction, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, StagingXcmDoubleEncoded, StagingXcmV2BodyId, StagingXcmV2BodyPart, StagingXcmV2Instruction, StagingXcmV2Junction, StagingXcmV2MultiAsset, StagingXcmV2MultiLocation, StagingXcmV2MultiassetAssetId, StagingXcmV2MultiassetAssetInstance, StagingXcmV2MultiassetFungibility, StagingXcmV2MultiassetMultiAssetFilter, StagingXcmV2MultiassetMultiAssets, StagingXcmV2MultiassetWildFungibility, StagingXcmV2MultiassetWildMultiAsset, StagingXcmV2MultilocationJunctions, StagingXcmV2NetworkId, StagingXcmV2OriginKind, StagingXcmV2Response, StagingXcmV2TraitsError, StagingXcmV2WeightLimit, StagingXcmV2Xcm, StagingXcmV3Instruction, StagingXcmV3Junction, StagingXcmV3JunctionBodyId, StagingXcmV3JunctionBodyPart, StagingXcmV3JunctionNetworkId, StagingXcmV3Junctions, StagingXcmV3MaybeErrorCode, StagingXcmV3MultiAsset, StagingXcmV3MultiLocation, StagingXcmV3MultiassetAssetId, StagingXcmV3MultiassetAssetInstance, StagingXcmV3MultiassetFungibility, StagingXcmV3MultiassetMultiAssetFilter, StagingXcmV3MultiassetMultiAssets, StagingXcmV3MultiassetWildFungibility, StagingXcmV3MultiassetWildMultiAsset, StagingXcmV3PalletInfo, StagingXcmV3QueryResponseInfo, StagingXcmV3Response, StagingXcmV3TraitsError, StagingXcmV3TraitsOutcome, StagingXcmV3WeightLimit, StagingXcmV3Xcm, StagingXcmVersionedAssetId, StagingXcmVersionedMultiAsset, StagingXcmVersionedMultiAssets, StagingXcmVersionedMultiLocation, StagingXcmVersionedResponse, StagingXcmVersionedXcm, 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, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo, UpPovEstimateRpcTrieKeyValue } from './default';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemCodeUpgradeAuthorization, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletParachainSystemRelayStateSnapshotRelayDispatchQueueRemainingCapacity, CumulusPalletParachainSystemUnincludedSegmentAncestor, CumulusPalletParachainSystemUnincludedSegmentHrmpChannelUpdate, CumulusPalletParachainSystemUnincludedSegmentSegmentTracker, CumulusPalletParachainSystemUnincludedSegmentUsedBandwidth, 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, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportPreimagesBounded, FrameSupportScheduleDispatchTime, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OpalRuntimeRuntimeCommonSessionKeys, OpalRuntimeRuntimeHoldReason, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesIdAmount, PalletBalancesReasons, PalletBalancesReserveData, PalletCollatorSelectionCall, PalletCollatorSelectionError, PalletCollatorSelectionEvent, PalletCollatorSelectionHoldReason, PalletCollectiveCall, PalletCollectiveError, PalletCollectiveEvent, PalletCollectiveRawOrigin, PalletCollectiveVotes, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletConfigurationEvent, PalletDemocracyCall, PalletDemocracyConviction, PalletDemocracyDelegations, PalletDemocracyError, PalletDemocracyEvent, PalletDemocracyMetadataOwner, PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyTally, PalletDemocracyVoteAccountVote, PalletDemocracyVotePriorLock, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCodeMetadata, PalletEvmCoderSubstrateError, PalletEvmContractHelpersCall, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetId, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletGovOriginsOrigin, PalletIdentityBitFlags, PalletIdentityCall, PalletIdentityError, PalletIdentityEvent, PalletIdentityIdentityField, PalletIdentityIdentityInfo, PalletIdentityJudgement, PalletIdentityRegistrarInfo, PalletIdentityRegistration, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletMembershipCall, PalletMembershipError, PalletMembershipEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletRankedCollectiveCall, PalletRankedCollectiveError, PalletRankedCollectiveEvent, PalletRankedCollectiveMemberRecord, PalletRankedCollectiveTally, PalletRankedCollectiveVoteRecord, PalletReferendaCall, PalletReferendaCurve, PalletReferendaDecidingStatus, PalletReferendaDeposit, PalletReferendaError, PalletReferendaEvent, PalletReferendaReferendumInfo, PalletReferendaReferendumStatus, PalletReferendaTrackInfo, PalletRefungibleError, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduled, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletStateTrieMigrationCall, PalletStateTrieMigrationError, PalletStateTrieMigrationEvent, PalletStateTrieMigrationMigrationCompute, PalletStateTrieMigrationMigrationLimits, PalletStateTrieMigrationMigrationTask, PalletStateTrieMigrationProgress, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PalletXcmQueryStatus, PalletXcmRemoteLockedFungibleRecord, PalletXcmVersionMigrationStage, ParachainInfoCall, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesPrimitivesXcmpMessageFormat, PolkadotPrimitivesV5AbridgedHostConfiguration, PolkadotPrimitivesV5AbridgedHrmpChannel, PolkadotPrimitivesV5PersistedValidationData, PolkadotPrimitivesV5UpgradeGoAhead, PolkadotPrimitivesV5UpgradeRestriction, PolkadotPrimitivesVstagingAsyncBackingParams, SpArithmeticArithmeticError, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionValidityInvalidTransaction, SpRuntimeTransactionValidityTransactionValidityError, SpRuntimeTransactionValidityUnknownTransaction, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, StagingXcmDoubleEncoded, StagingXcmV2BodyId, StagingXcmV2BodyPart, StagingXcmV2Instruction, StagingXcmV2Junction, StagingXcmV2MultiAsset, StagingXcmV2MultiLocation, StagingXcmV2MultiassetAssetId, StagingXcmV2MultiassetAssetInstance, StagingXcmV2MultiassetFungibility, StagingXcmV2MultiassetMultiAssetFilter, StagingXcmV2MultiassetMultiAssets, StagingXcmV2MultiassetWildFungibility, StagingXcmV2MultiassetWildMultiAsset, StagingXcmV2MultilocationJunctions, StagingXcmV2NetworkId, StagingXcmV2OriginKind, StagingXcmV2Response, StagingXcmV2TraitsError, StagingXcmV2WeightLimit, StagingXcmV2Xcm, StagingXcmV3Instruction, StagingXcmV3Junction, StagingXcmV3JunctionBodyId, StagingXcmV3JunctionBodyPart, StagingXcmV3JunctionNetworkId, StagingXcmV3Junctions, StagingXcmV3MaybeErrorCode, StagingXcmV3MultiAsset, StagingXcmV3MultiLocation, StagingXcmV3MultiassetAssetId, StagingXcmV3MultiassetAssetInstance, StagingXcmV3MultiassetFungibility, StagingXcmV3MultiassetMultiAssetFilter, StagingXcmV3MultiassetMultiAssets, StagingXcmV3MultiassetWildFungibility, StagingXcmV3MultiassetWildMultiAsset, StagingXcmV3PalletInfo, StagingXcmV3QueryResponseInfo, StagingXcmV3Response, StagingXcmV3TraitsError, StagingXcmV3TraitsOutcome, StagingXcmV3WeightLimit, StagingXcmV3Xcm, StagingXcmVersionedAssetId, StagingXcmVersionedMultiAsset, StagingXcmVersionedMultiAssets, StagingXcmVersionedMultiLocation, StagingXcmVersionedResponse, StagingXcmVersionedXcm, 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, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo, UpPovEstimateRpcTrieKeyValue } from '@polkadot/types/lookup';
 import type { Data, StorageKey } from '@polkadot/types';
 import type { BitVec, Bool, Bytes, F32, F64, I128, I16, I256, I32, I64, I8, ISize, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, f32, f64, i128, i16, i256, i32, i64, i8, isize, 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';
@@ -325,34 +326,6 @@
     CoreState: CoreState;
     CrateVersion: CrateVersion;
     CreatedBlock: CreatedBlock;
-    CumulusPalletDmpQueueCall: CumulusPalletDmpQueueCall;
-    CumulusPalletDmpQueueConfigData: CumulusPalletDmpQueueConfigData;
-    CumulusPalletDmpQueueError: CumulusPalletDmpQueueError;
-    CumulusPalletDmpQueueEvent: CumulusPalletDmpQueueEvent;
-    CumulusPalletDmpQueuePageIndexData: CumulusPalletDmpQueuePageIndexData;
-    CumulusPalletParachainSystemCall: CumulusPalletParachainSystemCall;
-    CumulusPalletParachainSystemCodeUpgradeAuthorization: CumulusPalletParachainSystemCodeUpgradeAuthorization;
-    CumulusPalletParachainSystemError: CumulusPalletParachainSystemError;
-    CumulusPalletParachainSystemEvent: CumulusPalletParachainSystemEvent;
-    CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot: CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot;
-    CumulusPalletParachainSystemRelayStateSnapshotRelayDispatchQueueRemainingCapacity: CumulusPalletParachainSystemRelayStateSnapshotRelayDispatchQueueRemainingCapacity;
-    CumulusPalletParachainSystemUnincludedSegmentAncestor: CumulusPalletParachainSystemUnincludedSegmentAncestor;
-    CumulusPalletParachainSystemUnincludedSegmentHrmpChannelUpdate: CumulusPalletParachainSystemUnincludedSegmentHrmpChannelUpdate;
-    CumulusPalletParachainSystemUnincludedSegmentSegmentTracker: CumulusPalletParachainSystemUnincludedSegmentSegmentTracker;
-    CumulusPalletParachainSystemUnincludedSegmentUsedBandwidth: CumulusPalletParachainSystemUnincludedSegmentUsedBandwidth;
-    CumulusPalletXcmCall: CumulusPalletXcmCall;
-    CumulusPalletXcmError: CumulusPalletXcmError;
-    CumulusPalletXcmEvent: CumulusPalletXcmEvent;
-    CumulusPalletXcmOrigin: CumulusPalletXcmOrigin;
-    CumulusPalletXcmpQueueCall: CumulusPalletXcmpQueueCall;
-    CumulusPalletXcmpQueueError: CumulusPalletXcmpQueueError;
-    CumulusPalletXcmpQueueEvent: CumulusPalletXcmpQueueEvent;
-    CumulusPalletXcmpQueueInboundChannelDetails: CumulusPalletXcmpQueueInboundChannelDetails;
-    CumulusPalletXcmpQueueInboundState: CumulusPalletXcmpQueueInboundState;
-    CumulusPalletXcmpQueueOutboundChannelDetails: CumulusPalletXcmpQueueOutboundChannelDetails;
-    CumulusPalletXcmpQueueOutboundState: CumulusPalletXcmpQueueOutboundState;
-    CumulusPalletXcmpQueueQueueConfigData: CumulusPalletXcmpQueueQueueConfigData;
-    CumulusPrimitivesParachainInherentParachainInherentData: CumulusPrimitivesParachainInherentParachainInherentData;
     CustomMetadata15: CustomMetadata15;
     CustomValueMetadata15: CustomValueMetadata15;
     Data: Data;
@@ -429,25 +402,11 @@
     EthAddress: EthAddress;
     EthBlock: EthBlock;
     EthBloom: EthBloom;
-    EthbloomBloom: EthbloomBloom;
     EthCallRequest: EthCallRequest;
     EthereumAccountId: EthereumAccountId;
     EthereumAddress: EthereumAddress;
-    EthereumBlock: EthereumBlock;
-    EthereumHeader: EthereumHeader;
-    EthereumLog: EthereumLog;
     EthereumLookupSource: EthereumLookupSource;
-    EthereumReceiptEip658ReceiptData: EthereumReceiptEip658ReceiptData;
-    EthereumReceiptReceiptV3: EthereumReceiptReceiptV3;
     EthereumSignature: EthereumSignature;
-    EthereumTransactionAccessListItem: EthereumTransactionAccessListItem;
-    EthereumTransactionEip1559Transaction: EthereumTransactionEip1559Transaction;
-    EthereumTransactionEip2930Transaction: EthereumTransactionEip2930Transaction;
-    EthereumTransactionLegacyTransaction: EthereumTransactionLegacyTransaction;
-    EthereumTransactionTransactionAction: EthereumTransactionTransactionAction;
-    EthereumTransactionTransactionSignature: EthereumTransactionTransactionSignature;
-    EthereumTransactionTransactionV2: EthereumTransactionTransactionV2;
-    EthereumTypesHashH64: EthereumTypesHashH64;
     EthFeeHistory: EthFeeHistory;
     EthFilter: EthFilter;
     EthFilterAddress: EthFilterAddress;
@@ -489,11 +448,6 @@
     EvmAccount: EvmAccount;
     EvmCallInfo: EvmCallInfo;
     EvmCallInfoV2: EvmCallInfoV2;
-    EvmCoreErrorExitError: EvmCoreErrorExitError;
-    EvmCoreErrorExitFatal: EvmCoreErrorExitFatal;
-    EvmCoreErrorExitReason: EvmCoreErrorExitReason;
-    EvmCoreErrorExitRevert: EvmCoreErrorExitRevert;
-    EvmCoreErrorExitSucceed: EvmCoreErrorExitSucceed;
     EvmCreateInfo: EvmCreateInfo;
     EvmCreateInfoV2: EvmCreateInfoV2;
     EvmLog: EvmLog;
@@ -543,33 +497,6 @@
     Forcing: Forcing;
     ForkTreePendingChange: ForkTreePendingChange;
     ForkTreePendingChangeNode: ForkTreePendingChangeNode;
-    FpRpcTransactionStatus: FpRpcTransactionStatus;
-    FrameSupportDispatchDispatchClass: FrameSupportDispatchDispatchClass;
-    FrameSupportDispatchDispatchInfo: FrameSupportDispatchDispatchInfo;
-    FrameSupportDispatchPays: FrameSupportDispatchPays;
-    FrameSupportDispatchPerDispatchClassU32: FrameSupportDispatchPerDispatchClassU32;
-    FrameSupportDispatchPerDispatchClassWeight: FrameSupportDispatchPerDispatchClassWeight;
-    FrameSupportDispatchPerDispatchClassWeightsPerClass: FrameSupportDispatchPerDispatchClassWeightsPerClass;
-    FrameSupportDispatchRawOrigin: FrameSupportDispatchRawOrigin;
-    FrameSupportPalletId: FrameSupportPalletId;
-    FrameSupportPreimagesBounded: FrameSupportPreimagesBounded;
-    FrameSupportScheduleDispatchTime: FrameSupportScheduleDispatchTime;
-    FrameSupportTokensMiscBalanceStatus: FrameSupportTokensMiscBalanceStatus;
-    FrameSystemAccountInfo: FrameSystemAccountInfo;
-    FrameSystemCall: FrameSystemCall;
-    FrameSystemError: FrameSystemError;
-    FrameSystemEvent: FrameSystemEvent;
-    FrameSystemEventRecord: FrameSystemEventRecord;
-    FrameSystemExtensionsCheckGenesis: FrameSystemExtensionsCheckGenesis;
-    FrameSystemExtensionsCheckNonce: FrameSystemExtensionsCheckNonce;
-    FrameSystemExtensionsCheckSpecVersion: FrameSystemExtensionsCheckSpecVersion;
-    FrameSystemExtensionsCheckTxVersion: FrameSystemExtensionsCheckTxVersion;
-    FrameSystemExtensionsCheckWeight: FrameSystemExtensionsCheckWeight;
-    FrameSystemLastRuntimeUpgradeInfo: FrameSystemLastRuntimeUpgradeInfo;
-    FrameSystemLimitsBlockLength: FrameSystemLimitsBlockLength;
-    FrameSystemLimitsBlockWeights: FrameSystemLimitsBlockWeights;
-    FrameSystemLimitsWeightsPerClass: FrameSystemLimitsWeightsPerClass;
-    FrameSystemPhase: FrameSystemPhase;
     FullIdentification: FullIdentification;
     FunctionArgumentMetadataLatest: FunctionArgumentMetadataLatest;
     FunctionArgumentMetadataV10: FunctionArgumentMetadataV10;
@@ -807,12 +734,6 @@
     OffenceDetails: OffenceDetails;
     Offender: Offender;
     OldV1SessionInfo: OldV1SessionInfo;
-    OpalRuntimeOriginCaller: OpalRuntimeOriginCaller;
-    OpalRuntimeRuntime: OpalRuntimeRuntime;
-    OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls: OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls;
-    OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance: OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance;
-    OpalRuntimeRuntimeCommonSessionKeys: OpalRuntimeRuntimeCommonSessionKeys;
-    OpalRuntimeRuntimeHoldReason: OpalRuntimeRuntimeHoldReason;
     OpaqueCall: OpaqueCall;
     OpaqueKeyOwnershipProof: OpaqueKeyOwnershipProof;
     OpaqueMetadata: OpaqueMetadata;
@@ -831,19 +752,6 @@
     OriginKindV0: OriginKindV0;
     OriginKindV1: OriginKindV1;
     OriginKindV2: OriginKindV2;
-    OrmlTokensAccountData: OrmlTokensAccountData;
-    OrmlTokensBalanceLock: OrmlTokensBalanceLock;
-    OrmlTokensModuleCall: OrmlTokensModuleCall;
-    OrmlTokensModuleError: OrmlTokensModuleError;
-    OrmlTokensModuleEvent: OrmlTokensModuleEvent;
-    OrmlTokensReserveData: OrmlTokensReserveData;
-    OrmlVestingModuleCall: OrmlVestingModuleCall;
-    OrmlVestingModuleError: OrmlVestingModuleError;
-    OrmlVestingModuleEvent: OrmlVestingModuleEvent;
-    OrmlVestingVestingSchedule: OrmlVestingVestingSchedule;
-    OrmlXtokensModuleCall: OrmlXtokensModuleCall;
-    OrmlXtokensModuleError: OrmlXtokensModuleError;
-    OrmlXtokensModuleEvent: OrmlXtokensModuleEvent;
     OutboundHrmpMessage: OutboundHrmpMessage;
     OutboundLaneData: OutboundLaneData;
     OutboundMessageFee: OutboundMessageFee;
@@ -855,170 +763,23 @@
     Owner: Owner;
     PageCounter: PageCounter;
     PageIndexData: PageIndexData;
-    PalletAppPromotionCall: PalletAppPromotionCall;
-    PalletAppPromotionError: PalletAppPromotionError;
-    PalletAppPromotionEvent: PalletAppPromotionEvent;
-    PalletBalancesAccountData: PalletBalancesAccountData;
-    PalletBalancesBalanceLock: PalletBalancesBalanceLock;
-    PalletBalancesCall: PalletBalancesCall;
-    PalletBalancesError: PalletBalancesError;
-    PalletBalancesEvent: PalletBalancesEvent;
-    PalletBalancesIdAmount: PalletBalancesIdAmount;
-    PalletBalancesReasons: PalletBalancesReasons;
-    PalletBalancesReserveData: PalletBalancesReserveData;
     PalletCallMetadataLatest: PalletCallMetadataLatest;
     PalletCallMetadataV14: PalletCallMetadataV14;
-    PalletCollatorSelectionCall: PalletCollatorSelectionCall;
-    PalletCollatorSelectionError: PalletCollatorSelectionError;
-    PalletCollatorSelectionEvent: PalletCollatorSelectionEvent;
-    PalletCollatorSelectionHoldReason: PalletCollatorSelectionHoldReason;
-    PalletCollectiveCall: PalletCollectiveCall;
-    PalletCollectiveError: PalletCollectiveError;
-    PalletCollectiveEvent: PalletCollectiveEvent;
-    PalletCollectiveRawOrigin: PalletCollectiveRawOrigin;
-    PalletCollectiveVotes: PalletCollectiveVotes;
-    PalletCommonError: PalletCommonError;
-    PalletCommonEvent: PalletCommonEvent;
-    PalletConfigurationAppPromotionConfiguration: PalletConfigurationAppPromotionConfiguration;
-    PalletConfigurationCall: PalletConfigurationCall;
-    PalletConfigurationError: PalletConfigurationError;
-    PalletConfigurationEvent: PalletConfigurationEvent;
     PalletConstantMetadataLatest: PalletConstantMetadataLatest;
     PalletConstantMetadataV14: PalletConstantMetadataV14;
-    PalletDemocracyCall: PalletDemocracyCall;
-    PalletDemocracyConviction: PalletDemocracyConviction;
-    PalletDemocracyDelegations: PalletDemocracyDelegations;
-    PalletDemocracyError: PalletDemocracyError;
-    PalletDemocracyEvent: PalletDemocracyEvent;
-    PalletDemocracyMetadataOwner: PalletDemocracyMetadataOwner;
-    PalletDemocracyReferendumInfo: PalletDemocracyReferendumInfo;
-    PalletDemocracyReferendumStatus: PalletDemocracyReferendumStatus;
-    PalletDemocracyTally: PalletDemocracyTally;
-    PalletDemocracyVoteAccountVote: PalletDemocracyVoteAccountVote;
-    PalletDemocracyVotePriorLock: PalletDemocracyVotePriorLock;
-    PalletDemocracyVoteThreshold: PalletDemocracyVoteThreshold;
-    PalletDemocracyVoteVoting: PalletDemocracyVoteVoting;
     PalletErrorMetadataLatest: PalletErrorMetadataLatest;
     PalletErrorMetadataV14: PalletErrorMetadataV14;
-    PalletEthereumCall: PalletEthereumCall;
-    PalletEthereumError: PalletEthereumError;
-    PalletEthereumEvent: PalletEthereumEvent;
-    PalletEthereumFakeTransactionFinalizer: PalletEthereumFakeTransactionFinalizer;
-    PalletEthereumRawOrigin: PalletEthereumRawOrigin;
     PalletEventMetadataLatest: PalletEventMetadataLatest;
     PalletEventMetadataV14: PalletEventMetadataV14;
-    PalletEvmAccountBasicCrossAccountIdRepr: PalletEvmAccountBasicCrossAccountIdRepr;
-    PalletEvmCall: PalletEvmCall;
-    PalletEvmCodeMetadata: PalletEvmCodeMetadata;
-    PalletEvmCoderSubstrateError: PalletEvmCoderSubstrateError;
-    PalletEvmContractHelpersCall: PalletEvmContractHelpersCall;
-    PalletEvmContractHelpersError: PalletEvmContractHelpersError;
-    PalletEvmContractHelpersEvent: PalletEvmContractHelpersEvent;
-    PalletEvmContractHelpersSponsoringModeT: PalletEvmContractHelpersSponsoringModeT;
-    PalletEvmError: PalletEvmError;
-    PalletEvmEvent: PalletEvmEvent;
-    PalletEvmMigrationCall: PalletEvmMigrationCall;
-    PalletEvmMigrationError: PalletEvmMigrationError;
-    PalletEvmMigrationEvent: PalletEvmMigrationEvent;
-    PalletForeignAssetsAssetId: PalletForeignAssetsAssetId;
-    PalletForeignAssetsModuleAssetMetadata: PalletForeignAssetsModuleAssetMetadata;
-    PalletForeignAssetsModuleCall: PalletForeignAssetsModuleCall;
-    PalletForeignAssetsModuleError: PalletForeignAssetsModuleError;
-    PalletForeignAssetsModuleEvent: PalletForeignAssetsModuleEvent;
-    PalletForeignAssetsNativeCurrency: PalletForeignAssetsNativeCurrency;
-    PalletFungibleError: PalletFungibleError;
-    PalletGovOriginsOrigin: PalletGovOriginsOrigin;
     PalletId: PalletId;
-    PalletIdentityBitFlags: PalletIdentityBitFlags;
-    PalletIdentityCall: PalletIdentityCall;
-    PalletIdentityError: PalletIdentityError;
-    PalletIdentityEvent: PalletIdentityEvent;
-    PalletIdentityIdentityField: PalletIdentityIdentityField;
-    PalletIdentityIdentityInfo: PalletIdentityIdentityInfo;
-    PalletIdentityJudgement: PalletIdentityJudgement;
-    PalletIdentityRegistrarInfo: PalletIdentityRegistrarInfo;
-    PalletIdentityRegistration: PalletIdentityRegistration;
-    PalletInflationCall: PalletInflationCall;
-    PalletMaintenanceCall: PalletMaintenanceCall;
-    PalletMaintenanceError: PalletMaintenanceError;
-    PalletMaintenanceEvent: PalletMaintenanceEvent;
-    PalletMembershipCall: PalletMembershipCall;
-    PalletMembershipError: PalletMembershipError;
-    PalletMembershipEvent: PalletMembershipEvent;
     PalletMetadataLatest: PalletMetadataLatest;
     PalletMetadataV14: PalletMetadataV14;
     PalletMetadataV15: PalletMetadataV15;
-    PalletNonfungibleError: PalletNonfungibleError;
-    PalletNonfungibleItemData: PalletNonfungibleItemData;
-    PalletPreimageCall: PalletPreimageCall;
-    PalletPreimageError: PalletPreimageError;
-    PalletPreimageEvent: PalletPreimageEvent;
-    PalletPreimageRequestStatus: PalletPreimageRequestStatus;
-    PalletRankedCollectiveCall: PalletRankedCollectiveCall;
-    PalletRankedCollectiveError: PalletRankedCollectiveError;
-    PalletRankedCollectiveEvent: PalletRankedCollectiveEvent;
-    PalletRankedCollectiveMemberRecord: PalletRankedCollectiveMemberRecord;
-    PalletRankedCollectiveTally: PalletRankedCollectiveTally;
-    PalletRankedCollectiveVoteRecord: PalletRankedCollectiveVoteRecord;
-    PalletReferendaCall: PalletReferendaCall;
-    PalletReferendaCurve: PalletReferendaCurve;
-    PalletReferendaDecidingStatus: PalletReferendaDecidingStatus;
-    PalletReferendaDeposit: PalletReferendaDeposit;
-    PalletReferendaError: PalletReferendaError;
-    PalletReferendaEvent: PalletReferendaEvent;
-    PalletReferendaReferendumInfo: PalletReferendaReferendumInfo;
-    PalletReferendaReferendumStatus: PalletReferendaReferendumStatus;
-    PalletReferendaTrackInfo: PalletReferendaTrackInfo;
-    PalletRefungibleError: PalletRefungibleError;
-    PalletSchedulerCall: PalletSchedulerCall;
-    PalletSchedulerError: PalletSchedulerError;
-    PalletSchedulerEvent: PalletSchedulerEvent;
-    PalletSchedulerScheduled: PalletSchedulerScheduled;
-    PalletSessionCall: PalletSessionCall;
-    PalletSessionError: PalletSessionError;
-    PalletSessionEvent: PalletSessionEvent;
     PalletsOrigin: PalletsOrigin;
-    PalletStateTrieMigrationCall: PalletStateTrieMigrationCall;
-    PalletStateTrieMigrationError: PalletStateTrieMigrationError;
-    PalletStateTrieMigrationEvent: PalletStateTrieMigrationEvent;
-    PalletStateTrieMigrationMigrationCompute: PalletStateTrieMigrationMigrationCompute;
-    PalletStateTrieMigrationMigrationLimits: PalletStateTrieMigrationMigrationLimits;
-    PalletStateTrieMigrationMigrationTask: PalletStateTrieMigrationMigrationTask;
-    PalletStateTrieMigrationProgress: PalletStateTrieMigrationProgress;
     PalletStorageMetadataLatest: PalletStorageMetadataLatest;
     PalletStorageMetadataV14: PalletStorageMetadataV14;
-    PalletStructureCall: PalletStructureCall;
-    PalletStructureError: PalletStructureError;
-    PalletStructureEvent: PalletStructureEvent;
-    PalletSudoCall: PalletSudoCall;
-    PalletSudoError: PalletSudoError;
-    PalletSudoEvent: PalletSudoEvent;
-    PalletTemplateTransactionPaymentChargeTransactionPayment: PalletTemplateTransactionPaymentChargeTransactionPayment;
-    PalletTestUtilsCall: PalletTestUtilsCall;
-    PalletTestUtilsError: PalletTestUtilsError;
-    PalletTestUtilsEvent: PalletTestUtilsEvent;
-    PalletTimestampCall: PalletTimestampCall;
-    PalletTransactionPaymentEvent: PalletTransactionPaymentEvent;
-    PalletTransactionPaymentReleases: PalletTransactionPaymentReleases;
-    PalletTreasuryCall: PalletTreasuryCall;
-    PalletTreasuryError: PalletTreasuryError;
-    PalletTreasuryEvent: PalletTreasuryEvent;
-    PalletTreasuryProposal: PalletTreasuryProposal;
-    PalletUniqueCall: PalletUniqueCall;
-    PalletUniqueError: PalletUniqueError;
-    PalletUtilityCall: PalletUtilityCall;
-    PalletUtilityError: PalletUtilityError;
-    PalletUtilityEvent: PalletUtilityEvent;
     PalletVersion: PalletVersion;
-    PalletXcmCall: PalletXcmCall;
-    PalletXcmError: PalletXcmError;
-    PalletXcmEvent: PalletXcmEvent;
-    PalletXcmOrigin: PalletXcmOrigin;
-    PalletXcmQueryStatus: PalletXcmQueryStatus;
-    PalletXcmRemoteLockedFungibleRecord: PalletXcmRemoteLockedFungibleRecord;
-    PalletXcmVersionMigrationStage: PalletXcmVersionMigrationStage;
     ParachainDispatchOrigin: ParachainDispatchOrigin;
-    ParachainInfoCall: ParachainInfoCall;
     ParachainInherentData: ParachainInherentData;
     ParachainProposal: ParachainProposal;
     ParachainsInherentData: ParachainsInherentData;
@@ -1058,20 +819,9 @@
     PerU16: PerU16;
     Phantom: Phantom;
     PhantomData: PhantomData;
-    PhantomTypeUpDataStructs: PhantomTypeUpDataStructs;
     Phase: Phase;
     PhragmenScore: PhragmenScore;
     Points: Points;
-    PolkadotCorePrimitivesInboundDownwardMessage: PolkadotCorePrimitivesInboundDownwardMessage;
-    PolkadotCorePrimitivesInboundHrmpMessage: PolkadotCorePrimitivesInboundHrmpMessage;
-    PolkadotCorePrimitivesOutboundHrmpMessage: PolkadotCorePrimitivesOutboundHrmpMessage;
-    PolkadotParachainPrimitivesPrimitivesXcmpMessageFormat: PolkadotParachainPrimitivesPrimitivesXcmpMessageFormat;
-    PolkadotPrimitivesV5AbridgedHostConfiguration: PolkadotPrimitivesV5AbridgedHostConfiguration;
-    PolkadotPrimitivesV5AbridgedHrmpChannel: PolkadotPrimitivesV5AbridgedHrmpChannel;
-    PolkadotPrimitivesV5PersistedValidationData: PolkadotPrimitivesV5PersistedValidationData;
-    PolkadotPrimitivesV5UpgradeGoAhead: PolkadotPrimitivesV5UpgradeGoAhead;
-    PolkadotPrimitivesV5UpgradeRestriction: PolkadotPrimitivesV5UpgradeRestriction;
-    PolkadotPrimitivesVstagingAsyncBackingParams: PolkadotPrimitivesVstagingAsyncBackingParams;
     PortableType: PortableType;
     PortableTypeV14: PortableTypeV14;
     Precommits: Precommits;
@@ -1284,80 +1034,8 @@
     SolutionSupports: SolutionSupports;
     SpanIndex: SpanIndex;
     SpanRecord: SpanRecord;
-    SpArithmeticArithmeticError: SpArithmeticArithmeticError;
-    SpConsensusAuraSr25519AppSr25519Public: SpConsensusAuraSr25519AppSr25519Public;
-    SpCoreCryptoKeyTypeId: SpCoreCryptoKeyTypeId;
-    SpCoreEcdsaSignature: SpCoreEcdsaSignature;
-    SpCoreEd25519Signature: SpCoreEd25519Signature;
-    SpCoreSr25519Public: SpCoreSr25519Public;
-    SpCoreSr25519Signature: SpCoreSr25519Signature;
-    SpCoreVoid: SpCoreVoid;
     SpecVersion: SpecVersion;
-    SpRuntimeDigest: SpRuntimeDigest;
-    SpRuntimeDigestDigestItem: SpRuntimeDigestDigestItem;
-    SpRuntimeDispatchError: SpRuntimeDispatchError;
-    SpRuntimeModuleError: SpRuntimeModuleError;
-    SpRuntimeMultiSignature: SpRuntimeMultiSignature;
-    SpRuntimeTokenError: SpRuntimeTokenError;
-    SpRuntimeTransactionalError: SpRuntimeTransactionalError;
-    SpRuntimeTransactionValidityInvalidTransaction: SpRuntimeTransactionValidityInvalidTransaction;
-    SpRuntimeTransactionValidityTransactionValidityError: SpRuntimeTransactionValidityTransactionValidityError;
-    SpRuntimeTransactionValidityUnknownTransaction: SpRuntimeTransactionValidityUnknownTransaction;
-    SpTrieStorageProof: SpTrieStorageProof;
-    SpVersionRuntimeVersion: SpVersionRuntimeVersion;
-    SpWeightsRuntimeDbWeight: SpWeightsRuntimeDbWeight;
-    SpWeightsWeightV2Weight: SpWeightsWeightV2Weight;
     Sr25519Signature: Sr25519Signature;
-    StagingXcmDoubleEncoded: StagingXcmDoubleEncoded;
-    StagingXcmV2BodyId: StagingXcmV2BodyId;
-    StagingXcmV2BodyPart: StagingXcmV2BodyPart;
-    StagingXcmV2Instruction: StagingXcmV2Instruction;
-    StagingXcmV2Junction: StagingXcmV2Junction;
-    StagingXcmV2MultiAsset: StagingXcmV2MultiAsset;
-    StagingXcmV2MultiassetAssetId: StagingXcmV2MultiassetAssetId;
-    StagingXcmV2MultiassetAssetInstance: StagingXcmV2MultiassetAssetInstance;
-    StagingXcmV2MultiassetFungibility: StagingXcmV2MultiassetFungibility;
-    StagingXcmV2MultiassetMultiAssetFilter: StagingXcmV2MultiassetMultiAssetFilter;
-    StagingXcmV2MultiassetMultiAssets: StagingXcmV2MultiassetMultiAssets;
-    StagingXcmV2MultiassetWildFungibility: StagingXcmV2MultiassetWildFungibility;
-    StagingXcmV2MultiassetWildMultiAsset: StagingXcmV2MultiassetWildMultiAsset;
-    StagingXcmV2MultiLocation: StagingXcmV2MultiLocation;
-    StagingXcmV2MultilocationJunctions: StagingXcmV2MultilocationJunctions;
-    StagingXcmV2NetworkId: StagingXcmV2NetworkId;
-    StagingXcmV2OriginKind: StagingXcmV2OriginKind;
-    StagingXcmV2Response: StagingXcmV2Response;
-    StagingXcmV2TraitsError: StagingXcmV2TraitsError;
-    StagingXcmV2WeightLimit: StagingXcmV2WeightLimit;
-    StagingXcmV2Xcm: StagingXcmV2Xcm;
-    StagingXcmV3Instruction: StagingXcmV3Instruction;
-    StagingXcmV3Junction: StagingXcmV3Junction;
-    StagingXcmV3JunctionBodyId: StagingXcmV3JunctionBodyId;
-    StagingXcmV3JunctionBodyPart: StagingXcmV3JunctionBodyPart;
-    StagingXcmV3JunctionNetworkId: StagingXcmV3JunctionNetworkId;
-    StagingXcmV3Junctions: StagingXcmV3Junctions;
-    StagingXcmV3MaybeErrorCode: StagingXcmV3MaybeErrorCode;
-    StagingXcmV3MultiAsset: StagingXcmV3MultiAsset;
-    StagingXcmV3MultiassetAssetId: StagingXcmV3MultiassetAssetId;
-    StagingXcmV3MultiassetAssetInstance: StagingXcmV3MultiassetAssetInstance;
-    StagingXcmV3MultiassetFungibility: StagingXcmV3MultiassetFungibility;
-    StagingXcmV3MultiassetMultiAssetFilter: StagingXcmV3MultiassetMultiAssetFilter;
-    StagingXcmV3MultiassetMultiAssets: StagingXcmV3MultiassetMultiAssets;
-    StagingXcmV3MultiassetWildFungibility: StagingXcmV3MultiassetWildFungibility;
-    StagingXcmV3MultiassetWildMultiAsset: StagingXcmV3MultiassetWildMultiAsset;
-    StagingXcmV3MultiLocation: StagingXcmV3MultiLocation;
-    StagingXcmV3PalletInfo: StagingXcmV3PalletInfo;
-    StagingXcmV3QueryResponseInfo: StagingXcmV3QueryResponseInfo;
-    StagingXcmV3Response: StagingXcmV3Response;
-    StagingXcmV3TraitsError: StagingXcmV3TraitsError;
-    StagingXcmV3TraitsOutcome: StagingXcmV3TraitsOutcome;
-    StagingXcmV3WeightLimit: StagingXcmV3WeightLimit;
-    StagingXcmV3Xcm: StagingXcmV3Xcm;
-    StagingXcmVersionedAssetId: StagingXcmVersionedAssetId;
-    StagingXcmVersionedMultiAsset: StagingXcmVersionedMultiAsset;
-    StagingXcmVersionedMultiAssets: StagingXcmVersionedMultiAssets;
-    StagingXcmVersionedMultiLocation: StagingXcmVersionedMultiLocation;
-    StagingXcmVersionedResponse: StagingXcmVersionedResponse;
-    StagingXcmVersionedXcm: StagingXcmVersionedXcm;
     StakingLedger: StakingLedger;
     StakingLedgerTo223: StakingLedgerTo223;
     StakingLedgerTo240: StakingLedgerTo240;
@@ -1459,41 +1137,8 @@
     UnlockChunk: UnlockChunk;
     UnrewardedRelayer: UnrewardedRelayer;
     UnrewardedRelayersState: UnrewardedRelayersState;
-    UpDataStructsAccessMode: UpDataStructsAccessMode;
-    UpDataStructsCollection: UpDataStructsCollection;
-    UpDataStructsCollectionLimits: UpDataStructsCollectionLimits;
-    UpDataStructsCollectionMode: UpDataStructsCollectionMode;
-    UpDataStructsCollectionPermissions: UpDataStructsCollectionPermissions;
-    UpDataStructsCollectionStats: UpDataStructsCollectionStats;
-    UpDataStructsCreateCollectionData: UpDataStructsCreateCollectionData;
-    UpDataStructsCreateFungibleData: UpDataStructsCreateFungibleData;
-    UpDataStructsCreateItemData: UpDataStructsCreateItemData;
-    UpDataStructsCreateItemExData: UpDataStructsCreateItemExData;
-    UpDataStructsCreateNftData: UpDataStructsCreateNftData;
-    UpDataStructsCreateNftExData: UpDataStructsCreateNftExData;
-    UpDataStructsCreateReFungibleData: UpDataStructsCreateReFungibleData;
-    UpDataStructsCreateRefungibleExMultipleOwners: UpDataStructsCreateRefungibleExMultipleOwners;
-    UpDataStructsCreateRefungibleExSingleOwner: UpDataStructsCreateRefungibleExSingleOwner;
-    UpDataStructsNestingPermissions: UpDataStructsNestingPermissions;
-    UpDataStructsOwnerRestrictedSet: UpDataStructsOwnerRestrictedSet;
-    UpDataStructsProperties: UpDataStructsProperties;
-    UpDataStructsPropertiesMapBoundedVec: UpDataStructsPropertiesMapBoundedVec;
-    UpDataStructsPropertiesMapPropertyPermission: UpDataStructsPropertiesMapPropertyPermission;
-    UpDataStructsProperty: UpDataStructsProperty;
-    UpDataStructsPropertyKeyPermission: UpDataStructsPropertyKeyPermission;
-    UpDataStructsPropertyPermission: UpDataStructsPropertyPermission;
-    UpDataStructsPropertyScope: UpDataStructsPropertyScope;
-    UpDataStructsRpcCollection: UpDataStructsRpcCollection;
-    UpDataStructsRpcCollectionFlags: UpDataStructsRpcCollectionFlags;
-    UpDataStructsSponsoringRateLimit: UpDataStructsSponsoringRateLimit;
-    UpDataStructsSponsorshipStateAccountId32: UpDataStructsSponsorshipStateAccountId32;
-    UpDataStructsSponsorshipStateBasicCrossAccountIdRepr: UpDataStructsSponsorshipStateBasicCrossAccountIdRepr;
-    UpDataStructsTokenChild: UpDataStructsTokenChild;
-    UpDataStructsTokenData: UpDataStructsTokenData;
     UpgradeGoAhead: UpgradeGoAhead;
     UpgradeRestriction: UpgradeRestriction;
-    UpPovEstimateRpcPovInfo: UpPovEstimateRpcPovInfo;
-    UpPovEstimateRpcTrieKeyValue: UpPovEstimateRpcTrieKeyValue;
     UpwardMessage: UpwardMessage;
     usize: usize;
     USize: USize;
modifiedjs-packages/types/src/default/definitions.tsdiffbeforeafterboth
--- a/js-packages/types/src/default/definitions.ts
+++ b/js-packages/types/src/default/definitions.ts
@@ -1,4 +1,4 @@
-import types from '../lookup';
+import types from '../lookup.js';
 
 export default {
   types,
modifiedjs-packages/types/src/definitions.tsdiffbeforeafterboth
--- a/js-packages/types/src/definitions.ts
+++ b/js-packages/types/src/definitions.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/>.
 
-export {default as unique} from './unique/definitions';
-export {default as appPromotion} from './appPromotion/definitions';
-export {default as povinfo} from './povinfo/definitions';
-export {default as default} from './default/definitions';
+export {default as unique} from './unique/definitions.js';
+export {default as appPromotion} from './appPromotion/definitions.js';
+export {default as povinfo} from './povinfo/definitions.js';
+export {default as default} from './default/definitions.js';
modifiedjs-packages/types/src/registry.tsdiffbeforeafterboth
--- a/js-packages/types/src/registry.ts
+++ b/js-packages/types/src/registry.ts
@@ -5,7 +5,8 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/types/types/registry';
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemCodeUpgradeAuthorization, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletParachainSystemRelayStateSnapshotRelayDispatchQueueRemainingCapacity, CumulusPalletParachainSystemUnincludedSegmentAncestor, CumulusPalletParachainSystemUnincludedSegmentHrmpChannelUpdate, CumulusPalletParachainSystemUnincludedSegmentSegmentTracker, CumulusPalletParachainSystemUnincludedSegmentUsedBandwidth, 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, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportPreimagesBounded, FrameSupportScheduleDispatchTime, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OpalRuntimeRuntimeCommonSessionKeys, OpalRuntimeRuntimeHoldReason, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesIdAmount, PalletBalancesReasons, PalletBalancesReserveData, PalletCollatorSelectionCall, PalletCollatorSelectionError, PalletCollatorSelectionEvent, PalletCollatorSelectionHoldReason, PalletCollectiveCall, PalletCollectiveError, PalletCollectiveEvent, PalletCollectiveRawOrigin, PalletCollectiveVotes, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletConfigurationEvent, PalletDemocracyCall, PalletDemocracyConviction, PalletDemocracyDelegations, PalletDemocracyError, PalletDemocracyEvent, PalletDemocracyMetadataOwner, PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyTally, PalletDemocracyVoteAccountVote, PalletDemocracyVotePriorLock, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCodeMetadata, PalletEvmCoderSubstrateError, PalletEvmContractHelpersCall, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetId, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletGovOriginsOrigin, PalletIdentityBitFlags, PalletIdentityCall, PalletIdentityError, PalletIdentityEvent, PalletIdentityIdentityField, PalletIdentityIdentityInfo, PalletIdentityJudgement, PalletIdentityRegistrarInfo, PalletIdentityRegistration, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletMembershipCall, PalletMembershipError, PalletMembershipEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletRankedCollectiveCall, PalletRankedCollectiveError, PalletRankedCollectiveEvent, PalletRankedCollectiveMemberRecord, PalletRankedCollectiveTally, PalletRankedCollectiveVoteRecord, PalletReferendaCall, PalletReferendaCurve, PalletReferendaDecidingStatus, PalletReferendaDeposit, PalletReferendaError, PalletReferendaEvent, PalletReferendaReferendumInfo, PalletReferendaReferendumStatus, PalletReferendaTrackInfo, PalletRefungibleError, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduled, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletStateTrieMigrationCall, PalletStateTrieMigrationError, PalletStateTrieMigrationEvent, PalletStateTrieMigrationMigrationCompute, PalletStateTrieMigrationMigrationLimits, PalletStateTrieMigrationMigrationTask, PalletStateTrieMigrationProgress, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PalletXcmQueryStatus, PalletXcmRemoteLockedFungibleRecord, PalletXcmVersionMigrationStage, ParachainInfoCall, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesPrimitivesXcmpMessageFormat, PolkadotPrimitivesV5AbridgedHostConfiguration, PolkadotPrimitivesV5AbridgedHrmpChannel, PolkadotPrimitivesV5PersistedValidationData, PolkadotPrimitivesV5UpgradeGoAhead, PolkadotPrimitivesV5UpgradeRestriction, PolkadotPrimitivesVstagingAsyncBackingParams, SpArithmeticArithmeticError, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionValidityInvalidTransaction, SpRuntimeTransactionValidityTransactionValidityError, SpRuntimeTransactionValidityUnknownTransaction, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, StagingXcmDoubleEncoded, StagingXcmV2BodyId, StagingXcmV2BodyPart, StagingXcmV2Instruction, StagingXcmV2Junction, StagingXcmV2MultiAsset, StagingXcmV2MultiLocation, StagingXcmV2MultiassetAssetId, StagingXcmV2MultiassetAssetInstance, StagingXcmV2MultiassetFungibility, StagingXcmV2MultiassetMultiAssetFilter, StagingXcmV2MultiassetMultiAssets, StagingXcmV2MultiassetWildFungibility, StagingXcmV2MultiassetWildMultiAsset, StagingXcmV2MultilocationJunctions, StagingXcmV2NetworkId, StagingXcmV2OriginKind, StagingXcmV2Response, StagingXcmV2TraitsError, StagingXcmV2WeightLimit, StagingXcmV2Xcm, StagingXcmV3Instruction, StagingXcmV3Junction, StagingXcmV3JunctionBodyId, StagingXcmV3JunctionBodyPart, StagingXcmV3JunctionNetworkId, StagingXcmV3Junctions, StagingXcmV3MaybeErrorCode, StagingXcmV3MultiAsset, StagingXcmV3MultiLocation, StagingXcmV3MultiassetAssetId, StagingXcmV3MultiassetAssetInstance, StagingXcmV3MultiassetFungibility, StagingXcmV3MultiassetMultiAssetFilter, StagingXcmV3MultiassetMultiAssets, StagingXcmV3MultiassetWildFungibility, StagingXcmV3MultiassetWildMultiAsset, StagingXcmV3PalletInfo, StagingXcmV3QueryResponseInfo, StagingXcmV3Response, StagingXcmV3TraitsError, StagingXcmV3TraitsOutcome, StagingXcmV3WeightLimit, StagingXcmV3Xcm, StagingXcmVersionedAssetId, StagingXcmVersionedMultiAsset, StagingXcmVersionedMultiAssets, StagingXcmVersionedMultiLocation, StagingXcmVersionedResponse, StagingXcmVersionedXcm, 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, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo, UpPovEstimateRpcTrieKeyValue } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemCodeUpgradeAuthorization, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletParachainSystemRelayStateSnapshotRelayDispatchQueueRemainingCapacity, CumulusPalletParachainSystemUnincludedSegmentAncestor, CumulusPalletParachainSystemUnincludedSegmentHrmpChannelUpdate, CumulusPalletParachainSystemUnincludedSegmentSegmentTracker, CumulusPalletParachainSystemUnincludedSegmentUsedBandwidth, 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, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportPreimagesBounded, FrameSupportScheduleDispatchTime, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OpalRuntimeRuntimeCommonSessionKeys, OpalRuntimeRuntimeHoldReason, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesIdAmount, PalletBalancesReasons, PalletBalancesReserveData, PalletCollatorSelectionCall, PalletCollatorSelectionError, PalletCollatorSelectionEvent, PalletCollatorSelectionHoldReason, PalletCollectiveCall, PalletCollectiveError, PalletCollectiveEvent, PalletCollectiveRawOrigin, PalletCollectiveVotes, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletConfigurationEvent, PalletDemocracyCall, PalletDemocracyConviction, PalletDemocracyDelegations, PalletDemocracyError, PalletDemocracyEvent, PalletDemocracyMetadataOwner, PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyTally, PalletDemocracyVoteAccountVote, PalletDemocracyVotePriorLock, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCodeMetadata, PalletEvmCoderSubstrateError, PalletEvmContractHelpersCall, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetId, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletGovOriginsOrigin, PalletIdentityBitFlags, PalletIdentityCall, PalletIdentityError, PalletIdentityEvent, PalletIdentityIdentityField, PalletIdentityIdentityInfo, PalletIdentityJudgement, PalletIdentityRegistrarInfo, PalletIdentityRegistration, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletMembershipCall, PalletMembershipError, PalletMembershipEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletRankedCollectiveCall, PalletRankedCollectiveError, PalletRankedCollectiveEvent, PalletRankedCollectiveMemberRecord, PalletRankedCollectiveTally, PalletRankedCollectiveVoteRecord, PalletReferendaCall, PalletReferendaCurve, PalletReferendaDecidingStatus, PalletReferendaDeposit, PalletReferendaError, PalletReferendaEvent, PalletReferendaReferendumInfo, PalletReferendaReferendumStatus, PalletReferendaTrackInfo, PalletRefungibleError, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduled, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletStateTrieMigrationCall, PalletStateTrieMigrationError, PalletStateTrieMigrationEvent, PalletStateTrieMigrationMigrationCompute, PalletStateTrieMigrationMigrationLimits, PalletStateTrieMigrationMigrationTask, PalletStateTrieMigrationProgress, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PalletXcmQueryStatus, PalletXcmRemoteLockedFungibleRecord, PalletXcmVersionMigrationStage, ParachainInfoCall, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesPrimitivesXcmpMessageFormat, PolkadotPrimitivesV5AbridgedHostConfiguration, PolkadotPrimitivesV5AbridgedHrmpChannel, PolkadotPrimitivesV5PersistedValidationData, PolkadotPrimitivesV5UpgradeGoAhead, PolkadotPrimitivesV5UpgradeRestriction, PolkadotPrimitivesVstagingAsyncBackingParams, SpArithmeticArithmeticError, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionValidityInvalidTransaction, SpRuntimeTransactionValidityTransactionValidityError, SpRuntimeTransactionValidityUnknownTransaction, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, StagingXcmDoubleEncoded, StagingXcmV2BodyId, StagingXcmV2BodyPart, StagingXcmV2Instruction, StagingXcmV2Junction, StagingXcmV2MultiAsset, StagingXcmV2MultiLocation, StagingXcmV2MultiassetAssetId, StagingXcmV2MultiassetAssetInstance, StagingXcmV2MultiassetFungibility, StagingXcmV2MultiassetMultiAssetFilter, StagingXcmV2MultiassetMultiAssets, StagingXcmV2MultiassetWildFungibility, StagingXcmV2MultiassetWildMultiAsset, StagingXcmV2MultilocationJunctions, StagingXcmV2NetworkId, StagingXcmV2OriginKind, StagingXcmV2Response, StagingXcmV2TraitsError, StagingXcmV2WeightLimit, StagingXcmV2Xcm, StagingXcmV3Instruction, StagingXcmV3Junction, StagingXcmV3JunctionBodyId, StagingXcmV3JunctionBodyPart, StagingXcmV3JunctionNetworkId, StagingXcmV3Junctions, StagingXcmV3MaybeErrorCode, StagingXcmV3MultiAsset, StagingXcmV3MultiLocation, StagingXcmV3MultiassetAssetId, StagingXcmV3MultiassetAssetInstance, StagingXcmV3MultiassetFungibility, StagingXcmV3MultiassetMultiAssetFilter, StagingXcmV3MultiassetMultiAssets, StagingXcmV3MultiassetWildFungibility, StagingXcmV3MultiassetWildMultiAsset, StagingXcmV3PalletInfo, StagingXcmV3QueryResponseInfo, StagingXcmV3Response, StagingXcmV3TraitsError, StagingXcmV3TraitsOutcome, StagingXcmV3WeightLimit, StagingXcmV3Xcm, StagingXcmVersionedAssetId, StagingXcmVersionedMultiAsset, StagingXcmVersionedMultiAssets, StagingXcmVersionedMultiLocation, StagingXcmVersionedResponse, StagingXcmVersionedXcm, 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, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo, UpPovEstimateRpcTrieKeyValue } from '@polkadot/types/lookup';
 
 declare module '@polkadot/types/types/registry' {
   interface InterfaceTypes {
addedjs-packages/types/tsconfig.jsondiffbeforeafterboth
--- /dev/null
+++ b/js-packages/types/tsconfig.json
@@ -0,0 +1,7 @@
+{
+  "extends": "../tsconfig.packages.json",
+  "compilerOptions": {
+    "rootDir": "./src",
+    "outDir": "dist"
+  }
+}
\ No newline at end of file
deletedtests/.dockerignorediffbeforeafterboth
--- a/tests/.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules/
-Dockerfile-tests