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

difftreelog

test(properties)

Fahrrader2022-05-06parent: #761b2c7.patch.diff
in: master

13 files changed

modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -34,6 +34,7 @@
     "testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts",
     "testEvent": "mocha --timeout 9999999 -r ts-node/register ./src/check-event/*.test.ts",
     "testNesting": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/**.test.ts",
+    "testProperties": "mocha --timeout 9999999 -r ts-node/register ./**/properties.test.ts",
     "testMigrationStructure": "mocha --timeout 9999999 -r ts-node/register ./**/nesting/migration-check.test.ts",
     "testAddCollectionAdmin": "mocha --timeout 9999999 -r ts-node/register ./**/addCollectionAdmin.test.ts",
     "testSetSchemaVersion": "mocha --timeout 9999999 -r ts-node/register ./**/setSchemaVersion.test.ts",
modifiedtests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -271,9 +271,9 @@
        **/
       NotFungibleDataUsedToMintFungibleCollectionToken: AugmentedError<ApiType>;
       /**
-       * Item properties are not allowed
+       * Setting item properties is not allowed
        **/
-      PropertiesNotAllowed: AugmentedError<ApiType>;
+      SettingPropertiesNotAllowed: AugmentedError<ApiType>;
       /**
        * Generic error
        **/
@@ -399,13 +399,13 @@
        **/
       NotRefungibleDataUsedToMintFungibleCollectionToken: AugmentedError<ApiType>;
       /**
-       * Item properties are not allowed
+       * Refungible token can't nest other tokens
        **/
-      PropertiesNotAllowed: AugmentedError<ApiType>;
+      RefungibleDisallowsNesting: AugmentedError<ApiType>;
       /**
-       * Refungible token can't nest other tokens
+       * Setting item properties is not allowed
        **/
-      RefungibleDisallowsNesting: AugmentedError<ApiType>;
+      SettingPropertiesNotAllowed: AugmentedError<ApiType>;
       /**
        * Maximum refungibility exceeded
        **/
modifiedtests/src/interfaces/augment-api-query.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -5,7 +5,7 @@
 import type { BTreeMap, Bytes, Option, U256, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types-codec';
 import type { AnyNumber, ITuple } from '@polkadot/types-codec/types';
 import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
-import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionField, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertyPermission } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PhantomTypeUpDataStructsRpcCollection, PhantomTypeUpDataStructsTokenData, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionField, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertyPermission } from '@polkadot/types/lookup';
 import type { Observable } from '@polkadot/types/types';
 
 declare module '@polkadot/api-base/types/storage' {
@@ -92,7 +92,7 @@
       /**
        * Not used by code, exists only to provide some types to metadata
        **/
-      dummyStorageValue: AugmentedQuery<ApiType, () => Observable<Option<ITuple<[UpDataStructsCollectionStats, u32, u32, PhantomTypeUpDataStructs]>>>, []> & QueryableStorageEntry<ApiType, []>;
+      dummyStorageValue: AugmentedQuery<ApiType, () => Observable<Option<ITuple<[UpDataStructsCollectionStats, u32, u32, PhantomTypeUpDataStructsTokenData, PhantomTypeUpDataStructsRpcCollection]>>>, []> & QueryableStorageEntry<ApiType, []>;
       /**
        * List of collection admins
        **/
modifiedtests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-rpc.ts
+++ b/tests/src/interfaces/augment-api-rpc.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-chain`, do not edit
 /* eslint-disable */
 
-import type { PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsRpcCollection } from './unique';
+import type { PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenData } from './unique';
 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, u128, u32, u64 } from '@polkadot/types-codec';
@@ -13,7 +13,6 @@
 import type { PrefixedStorageKey } from '@polkadot/types/interfaces/childstate';
 import type { AuthorityId } from '@polkadot/types/interfaces/consensus';
 import type { CodeUploadRequest, CodeUploadResult, ContractCallRequest, ContractExecResult, ContractInstantiateResult, InstantiateRequest } from '@polkadot/types/interfaces/contracts';
-import type { BlockStats } from '@polkadot/types/interfaces/dev';
 import type { CreatedBlock } from '@polkadot/types/interfaces/engine';
 import type { EthAccount, EthCallRequest, EthFilter, EthFilterChanges, EthLog, EthReceipt, EthRichBlock, EthSubKind, EthSubParams, EthSyncStatus, EthTransaction, EthTransactionRequest, EthWork } from '@polkadot/types/interfaces/eth';
 import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics';
@@ -23,7 +22,7 @@
 import type { FeeDetails, RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment';
 import type { RpcMethods } from '@polkadot/types/interfaces/rpc';
 import type { AccountId, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime';
-import type { MigrationStatusResult, ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state';
+import type { ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state';
 import type { ApplyExtrinsicResult, ChainProperties, ChainType, Health, NetworkState, NodeRole, PeerInfo, SyncState } from '@polkadot/types/interfaces/system';
 import type { IExtrinsic, Observable } from '@polkadot/types/types';
 
@@ -156,12 +155,6 @@
        * Upload new code without instantiating a contract from it
        **/
       uploadCode: AugmentedRpc<(uploadRequest: CodeUploadRequest | { origin?: any; code?: any; storageDepositLimit?: any } | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable<CodeUploadResult>>;
-    };
-    dev: {
-      /**
-       * Reexecute the specified `block_hash` and gather statistics while doing so
-       **/
-      getBlockStats: AugmentedRpc<(at: Hash | string | Uint8Array) => Observable<Option<BlockStats>>>;
     };
     engine: {
       /**
@@ -341,9 +334,9 @@
     };
     grandpa: {
       /**
-       * Prove finality for the given block number, returning the Justification for the last block in the set.
+       * Prove finality for the range (begin; end] hash.
        **/
-      proveFinality: AugmentedRpc<(blockNumber: BlockNumber | AnyNumber | Uint8Array) => Observable<Option<EncodedFinalityProofs>>>;
+      proveFinality: AugmentedRpc<(begin: BlockHash | string | Uint8Array, end: BlockHash | string | Uint8Array, authoritiesSetId?: u64 | AnyNumber | Uint8Array) => Observable<Option<EncodedFinalityProofs>>>;
       /**
        * Returns the state of the current best round state as well as the ongoing background rounds
        **/
@@ -480,10 +473,6 @@
        * Provides a way to trace the re-execution of a single block
        **/
       traceBlock: AugmentedRpc<(block: Hash | string | Uint8Array, targets: Option<Text> | null | object | string | Uint8Array, storageKeys: Option<Text> | null | object | string | Uint8Array, methods: Option<Text> | null | object | string | Uint8Array) => Observable<TraceBlockResponse>>;
-      /**
-       * Check current migration state
-       **/
-      trieMigrationStatus: AugmentedRpc<(at?: BlockHash | string | Uint8Array) => Observable<MigrationStatusResult>>;
     };
     syncstate: {
       /**
@@ -631,6 +620,14 @@
        **/
       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
+       **/
+      propertyPermissions: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsPropertyKeyPermission>>>;
+      /**
+       * Get token data
+       **/
+      tokenData: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<UpDataStructsTokenData>>;
+      /**
        * Check if token exists
        **/
       tokenExists: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
@@ -639,6 +636,10 @@
        **/
       tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;
       /**
+       * Get token properties
+       **/
+      tokenProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;
+      /**
        * Get token owner, in case of nested token - find parent recursive
        **/
       topmostTokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;
modifiedtests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth
before · tests/src/interfaces/augment-api-tx.ts
1// Auto-generated via `yarn polkadot-types-from-chain`, do not edit2/* eslint-disable */34import type { ApiTypes } from '@polkadot/api-base/types';5import type { Bytes, Compact, Option, U256, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types-codec';6import type { AnyNumber, ITuple } from '@polkadot/types-codec/types';7import type { AccountId32, Call, H160, H256, MultiAddress, Perbill } from '@polkadot/types/interfaces/runtime';8import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsAccessMode, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsMetaUpdatePermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsSchemaVersion, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';910declare module '@polkadot/api-base/types/submittable' {11  export interface AugmentedSubmittables<ApiType extends ApiTypes> {12    balances: {13      /**14       * Exactly as `transfer`, except the origin must be root and the source account may be15       * specified.16       * # <weight>17       * - Same as transfer, but additional read and write because the source account is not18       * assumed to be in the overlay.19       * # </weight>20       **/21      forceTransfer: AugmentedSubmittable<(source: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact<u128> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, MultiAddress, Compact<u128>]>;22      /**23       * Unreserve some balance from a user by force.24       * 25       * Can only be called by ROOT.26       **/27      forceUnreserve: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, u128]>;28      /**29       * Set the balances of a given account.30       * 31       * This will alter `FreeBalance` and `ReservedBalance` in storage. it will32       * also alter the total issuance of the system (`TotalIssuance`) appropriately.33       * If the new free or reserved balance is below the existential deposit,34       * it will reset the account nonce (`frame_system::AccountNonce`).35       * 36       * The dispatch origin for this call is `root`.37       **/38      setBalance: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, newFree: Compact<u128> | AnyNumber | Uint8Array, newReserved: Compact<u128> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, Compact<u128>, Compact<u128>]>;39      /**40       * Transfer some liquid free balance to another account.41       * 42       * `transfer` will set the `FreeBalance` of the sender and receiver.43       * If the sender's account is below the existential deposit as a result44       * of the transfer, the account will be reaped.45       * 46       * The dispatch origin for this call must be `Signed` by the transactor.47       * 48       * # <weight>49       * - Dependent on arguments but not critical, given proper implementations for input config50       * types. See related functions below.51       * - It contains a limited number of reads and writes internally and no complex52       * computation.53       * 54       * Related functions:55       * 56       * - `ensure_can_withdraw` is always called internally but has a bounded complexity.57       * - Transferring balances to accounts that did not exist before will cause58       * `T::OnNewAccount::on_new_account` to be called.59       * - Removing enough funds from an account will trigger `T::DustRemoval::on_unbalanced`.60       * - `transfer_keep_alive` works the same way as `transfer`, but has an additional check61       * that the transfer will not kill the origin account.62       * ---------------------------------63       * - Origin account is already in memory, so no DB operations for them.64       * # </weight>65       **/66      transfer: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact<u128> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, Compact<u128>]>;67      /**68       * Transfer the entire transferable balance from the caller account.69       * 70       * NOTE: This function only attempts to transfer _transferable_ balances. This means that71       * any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be72       * transferred by this function. To ensure that this function results in a killed account,73       * you might need to prepare the account by removing any reference counters, storage74       * deposits, etc...75       * 76       * The dispatch origin of this call must be Signed.77       * 78       * - `dest`: The recipient of the transfer.79       * - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all80       * of the funds the account has, causing the sender account to be killed (false), or81       * transfer everything except at least the existential deposit, which will guarantee to82       * keep the sender account alive (true). # <weight>83       * - O(1). Just like transfer, but reading the user's transferable balance first.84       * #</weight>85       **/86      transferAll: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, keepAlive: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, bool]>;87      /**88       * Same as the [`transfer`] call, but with a check that the transfer will not kill the89       * origin account.90       * 91       * 99% of the time you want [`transfer`] instead.92       * 93       * [`transfer`]: struct.Pallet.html#method.transfer94       **/95      transferKeepAlive: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact<u128> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, Compact<u128>]>;96      /**97       * Generic tx98       **/99      [key: string]: SubmittableExtrinsicFunction<ApiType>;100    };101    charging: {102      /**103       * Generic tx104       **/105      [key: string]: SubmittableExtrinsicFunction<ApiType>;106    };107    cumulusXcm: {108      /**109       * Generic tx110       **/111      [key: string]: SubmittableExtrinsicFunction<ApiType>;112    };113    dmpQueue: {114      /**115       * Service a single overweight message.116       * 117       * - `origin`: Must pass `ExecuteOverweightOrigin`.118       * - `index`: The index of the overweight message to service.119       * - `weight_limit`: The amount of weight that message execution may take.120       * 121       * Errors:122       * - `Unknown`: Message of `index` is unknown.123       * - `OverLimit`: Message execution may use greater than `weight_limit`.124       * 125       * Events:126       * - `OverweightServiced`: On success.127       **/128      serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64, u64]>;129      /**130       * Generic tx131       **/132      [key: string]: SubmittableExtrinsicFunction<ApiType>;133    };134    ethereum: {135      /**136       * Transact an Ethereum transaction.137       **/138      transact: AugmentedSubmittable<(transaction: EthereumTransactionTransactionV2 | { Legacy: any } | { EIP2930: any } | { EIP1559: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [EthereumTransactionTransactionV2]>;139      /**140       * Generic tx141       **/142      [key: string]: SubmittableExtrinsicFunction<ApiType>;143    };144    evm: {145      /**146       * Issue an EVM call operation. This is similar to a message call transaction in Ethereum.147       **/148      call: AugmentedSubmittable<(source: H160 | string | Uint8Array, target: H160 | string | Uint8Array, input: Bytes | string | Uint8Array, value: U256 | AnyNumber | Uint8Array, gasLimit: u64 | AnyNumber | Uint8Array, maxFeePerGas: U256 | AnyNumber | Uint8Array, maxPriorityFeePerGas: Option<U256> | null | object | string | Uint8Array, nonce: Option<U256> | null | object | string | Uint8Array, accessList: Vec<ITuple<[H160, Vec<H256>]>> | ([H160 | string | Uint8Array, Vec<H256> | (H256 | string | Uint8Array)[]])[]) => SubmittableExtrinsic<ApiType>, [H160, H160, Bytes, U256, u64, U256, Option<U256>, Option<U256>, Vec<ITuple<[H160, Vec<H256>]>>]>;149      /**150       * Issue an EVM create operation. This is similar to a contract creation transaction in151       * Ethereum.152       **/153      create: AugmentedSubmittable<(source: H160 | string | Uint8Array, init: Bytes | string | Uint8Array, value: U256 | AnyNumber | Uint8Array, gasLimit: u64 | AnyNumber | Uint8Array, maxFeePerGas: U256 | AnyNumber | Uint8Array, maxPriorityFeePerGas: Option<U256> | null | object | string | Uint8Array, nonce: Option<U256> | null | object | string | Uint8Array, accessList: Vec<ITuple<[H160, Vec<H256>]>> | ([H160 | string | Uint8Array, Vec<H256> | (H256 | string | Uint8Array)[]])[]) => SubmittableExtrinsic<ApiType>, [H160, Bytes, U256, u64, U256, Option<U256>, Option<U256>, Vec<ITuple<[H160, Vec<H256>]>>]>;154      /**155       * Issue an EVM create2 operation.156       **/157      create2: AugmentedSubmittable<(source: H160 | string | Uint8Array, init: Bytes | string | Uint8Array, salt: H256 | string | Uint8Array, value: U256 | AnyNumber | Uint8Array, gasLimit: u64 | AnyNumber | Uint8Array, maxFeePerGas: U256 | AnyNumber | Uint8Array, maxPriorityFeePerGas: Option<U256> | null | object | string | Uint8Array, nonce: Option<U256> | null | object | string | Uint8Array, accessList: Vec<ITuple<[H160, Vec<H256>]>> | ([H160 | string | Uint8Array, Vec<H256> | (H256 | string | Uint8Array)[]])[]) => SubmittableExtrinsic<ApiType>, [H160, Bytes, H256, U256, u64, U256, Option<U256>, Option<U256>, Vec<ITuple<[H160, Vec<H256>]>>]>;158      /**159       * Withdraw balance from EVM into currency/balances pallet.160       **/161      withdraw: AugmentedSubmittable<(address: H160 | string | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [H160, u128]>;162      /**163       * Generic tx164       **/165      [key: string]: SubmittableExtrinsicFunction<ApiType>;166    };167    evmMigration: {168      begin: AugmentedSubmittable<(address: H160 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [H160]>;169      finish: AugmentedSubmittable<(address: H160 | string | Uint8Array, code: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [H160, Bytes]>;170      setData: AugmentedSubmittable<(address: H160 | string | Uint8Array, data: Vec<ITuple<[H256, H256]>> | ([H256 | string | Uint8Array, H256 | string | Uint8Array])[]) => SubmittableExtrinsic<ApiType>, [H160, Vec<ITuple<[H256, H256]>>]>;171      /**172       * Generic tx173       **/174      [key: string]: SubmittableExtrinsicFunction<ApiType>;175    };176    inflation: {177      /**178       * This method sets the inflation start date. Can be only called once.179       * Inflation start block can be backdated and will catch up. The method will create Treasury180       * account if it does not exist and perform the first inflation deposit.181       * 182       * # Permissions183       * 184       * * Root185       * 186       * # Arguments187       * 188       * * inflation_start_relay_block: The relay chain block at which inflation should start189       **/190      startInflation: AugmentedSubmittable<(inflationStartRelayBlock: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;191      /**192       * Generic tx193       **/194      [key: string]: SubmittableExtrinsicFunction<ApiType>;195    };196    parachainSystem: {197      authorizeUpgrade: AugmentedSubmittable<(codeHash: H256 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [H256]>;198      enactAuthorizedUpgrade: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;199      /**200       * Set the current validation data.201       * 202       * This should be invoked exactly once per block. It will panic at the finalization203       * phase if the call was not invoked.204       * 205       * The dispatch origin for this call must be `Inherent`206       * 207       * As a side effect, this function upgrades the current validation function208       * if the appropriate time has come.209       **/210      setValidationData: AugmentedSubmittable<(data: CumulusPrimitivesParachainInherentParachainInherentData | { validationData?: any; relayChainState?: any; downwardMessages?: any; horizontalMessages?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [CumulusPrimitivesParachainInherentParachainInherentData]>;211      sudoSendUpwardMessage: AugmentedSubmittable<(message: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;212      /**213       * Generic tx214       **/215      [key: string]: SubmittableExtrinsicFunction<ApiType>;216    };217    polkadotXcm: {218      /**219       * Execute an XCM message from a local, signed, origin.220       * 221       * An event is deposited indicating whether `msg` could be executed completely or only222       * partially.223       * 224       * No more than `max_weight` will be used in its attempted execution. If this is less than the225       * maximum amount of weight that the message could take to be executed, then no execution226       * attempt will be made.227       * 228       * NOTE: A successful return to this does *not* imply that the `msg` was executed successfully229       * to completion; only that *some* of it was executed.230       **/231      execute: AugmentedSubmittable<(message: XcmVersionedXcm | { V0: any } | { V1: any } | { V2: any } | string | Uint8Array, maxWeight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedXcm, u64]>;232      /**233       * Set a safe XCM version (the version that XCM should be encoded with if the most recent234       * version a destination can accept is unknown).235       * 236       * - `origin`: Must be Root.237       * - `maybe_xcm_version`: The default XCM encoding version, or `None` to disable.238       **/239      forceDefaultXcmVersion: AugmentedSubmittable<(maybeXcmVersion: Option<u32> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Option<u32>]>;240      /**241       * Ask a location to notify us regarding their XCM version and any changes to it.242       * 243       * - `origin`: Must be Root.244       * - `location`: The location to which we should subscribe for XCM version notifications.245       **/246      forceSubscribeVersionNotify: AugmentedSubmittable<(location: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation]>;247      /**248       * Require that a particular destination should no longer notify us regarding any XCM249       * version changes.250       * 251       * - `origin`: Must be Root.252       * - `location`: The location to which we are currently subscribed for XCM version253       * notifications which we no longer desire.254       **/255      forceUnsubscribeVersionNotify: AugmentedSubmittable<(location: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation]>;256      /**257       * Extoll that a particular destination can be communicated with through a particular258       * version of XCM.259       * 260       * - `origin`: Must be Root.261       * - `location`: The destination that is being described.262       * - `xcm_version`: The latest version of XCM that `location` supports.263       **/264      forceXcmVersion: AugmentedSubmittable<(location: XcmV1MultiLocation | { parents?: any; interior?: any } | string | Uint8Array, xcmVersion: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmV1MultiLocation, u32]>;265      /**266       * Transfer some assets from the local chain to the sovereign account of a destination267       * chain and forward a notification XCM.268       * 269       * Fee payment on the destination side is made from the asset in the `assets` vector of270       * index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight271       * is needed than `weight_limit`, then the operation will fail and the assets send may be272       * at risk.273       * 274       * - `origin`: Must be capable of withdrawing the `assets` and executing XCM.275       * - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send276       * from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain.277       * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be278       * an `AccountId32` value.279       * - `assets`: The assets to be withdrawn. This should include the assets used to pay the fee on the280       * `dest` side.281       * - `fee_asset_item`: The index into `assets` of the item which should be used to pay282       * fees.283       * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase.284       **/285      limitedReserveTransferAssets: AugmentedSubmittable<(dest: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, beneficiary: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, assets: XcmVersionedMultiAssets | { V0: any } | { V1: any } | string | Uint8Array, feeAssetItem: u32 | AnyNumber | Uint8Array, weightLimit: XcmV2WeightLimit | { Unlimited: any } | { Limited: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation, XcmVersionedMultiLocation, XcmVersionedMultiAssets, u32, XcmV2WeightLimit]>;286      /**287       * Teleport some assets from the local chain to some destination chain.288       * 289       * Fee payment on the destination side is made from the asset in the `assets` vector of290       * index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight291       * is needed than `weight_limit`, then the operation will fail and the assets send may be292       * at risk.293       * 294       * - `origin`: Must be capable of withdrawing the `assets` and executing XCM.295       * - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send296       * from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain.297       * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be298       * an `AccountId32` value.299       * - `assets`: The assets to be withdrawn. The first item should be the currency used to to pay the fee on the300       * `dest` side. May not be empty.301       * - `fee_asset_item`: The index into `assets` of the item which should be used to pay302       * fees.303       * - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase.304       **/305      limitedTeleportAssets: AugmentedSubmittable<(dest: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, beneficiary: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, assets: XcmVersionedMultiAssets | { V0: any } | { V1: any } | string | Uint8Array, feeAssetItem: u32 | AnyNumber | Uint8Array, weightLimit: XcmV2WeightLimit | { Unlimited: any } | { Limited: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation, XcmVersionedMultiLocation, XcmVersionedMultiAssets, u32, XcmV2WeightLimit]>;306      /**307       * Transfer some assets from the local chain to the sovereign account of a destination308       * chain and forward a notification XCM.309       * 310       * Fee payment on the destination side is made from the asset in the `assets` vector of311       * index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,312       * with all fees taken as needed from the asset.313       * 314       * - `origin`: Must be capable of withdrawing the `assets` and executing XCM.315       * - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send316       * from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain.317       * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be318       * an `AccountId32` value.319       * - `assets`: The assets to be withdrawn. This should include the assets used to pay the fee on the320       * `dest` side.321       * - `fee_asset_item`: The index into `assets` of the item which should be used to pay322       * fees.323       **/324      reserveTransferAssets: AugmentedSubmittable<(dest: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, beneficiary: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, assets: XcmVersionedMultiAssets | { V0: any } | { V1: any } | string | Uint8Array, feeAssetItem: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation, XcmVersionedMultiLocation, XcmVersionedMultiAssets, u32]>;325      send: AugmentedSubmittable<(dest: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, message: XcmVersionedXcm | { V0: any } | { V1: any } | { V2: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation, XcmVersionedXcm]>;326      /**327       * Teleport some assets from the local chain to some destination chain.328       * 329       * Fee payment on the destination side is made from the asset in the `assets` vector of330       * index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited,331       * with all fees taken as needed from the asset.332       * 333       * - `origin`: Must be capable of withdrawing the `assets` and executing XCM.334       * - `dest`: Destination context for the assets. Will typically be `X2(Parent, Parachain(..))` to send335       * from parachain to parachain, or `X1(Parachain(..))` to send from relay to parachain.336       * - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will generally be337       * an `AccountId32` value.338       * - `assets`: The assets to be withdrawn. The first item should be the currency used to to pay the fee on the339       * `dest` side. May not be empty.340       * - `fee_asset_item`: The index into `assets` of the item which should be used to pay341       * fees.342       **/343      teleportAssets: AugmentedSubmittable<(dest: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, beneficiary: XcmVersionedMultiLocation | { V0: any } | { V1: any } | string | Uint8Array, assets: XcmVersionedMultiAssets | { V0: any } | { V1: any } | string | Uint8Array, feeAssetItem: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [XcmVersionedMultiLocation, XcmVersionedMultiLocation, XcmVersionedMultiAssets, u32]>;344      /**345       * Generic tx346       **/347      [key: string]: SubmittableExtrinsicFunction<ApiType>;348    };349    structure: {350      /**351       * Generic tx352       **/353      [key: string]: SubmittableExtrinsicFunction<ApiType>;354    };355    sudo: {356      /**357       * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo358       * key.359       * 360       * The dispatch origin for this call must be _Signed_.361       * 362       * # <weight>363       * - O(1).364       * - Limited storage reads.365       * - One DB change.366       * # </weight>367       **/368      setKey: AugmentedSubmittable<(updated: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress]>;369      /**370       * Authenticates the sudo key and dispatches a function call with `Root` origin.371       * 372       * The dispatch origin for this call must be _Signed_.373       * 374       * # <weight>375       * - O(1).376       * - Limited storage reads.377       * - One DB write (event).378       * - Weight of derivative `call` execution + 10,000.379       * # </weight>380       **/381      sudo: AugmentedSubmittable<(call: Call) => SubmittableExtrinsic<ApiType>, [Call]>;382      /**383       * Authenticates the sudo key and dispatches a function call with `Signed` origin from384       * a given account.385       * 386       * The dispatch origin for this call must be _Signed_.387       * 388       * # <weight>389       * - O(1).390       * - Limited storage reads.391       * - One DB write (event).392       * - Weight of derivative `call` execution + 10,000.393       * # </weight>394       **/395      sudoAs: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, call: Call) => SubmittableExtrinsic<ApiType>, [MultiAddress, Call]>;396      /**397       * Authenticates the sudo key and dispatches a function call with `Root` origin.398       * This function does not check the weight of the call, and instead allows the399       * Sudo user to specify the weight of the call.400       * 401       * The dispatch origin for this call must be _Signed_.402       * 403       * # <weight>404       * - O(1).405       * - The weight of this call is defined by the caller.406       * # </weight>407       **/408      sudoUncheckedWeight: AugmentedSubmittable<(call: Call, weight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Call, u64]>;409      /**410       * Generic tx411       **/412      [key: string]: SubmittableExtrinsicFunction<ApiType>;413    };414    system: {415      /**416       * A dispatch that will fill the block weight up to the given ratio.417       **/418      fillBlock: AugmentedSubmittable<(ratio: Perbill | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Perbill]>;419      /**420       * Kill all storage items with a key that starts with the given prefix.421       * 422       * **NOTE:** We rely on the Root origin to provide us the number of subkeys under423       * the prefix we are removing to accurately calculate the weight of this function.424       **/425      killPrefix: AugmentedSubmittable<(prefix: Bytes | string | Uint8Array, subkeys: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes, u32]>;426      /**427       * Kill some items from storage.428       **/429      killStorage: AugmentedSubmittable<(keys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [Vec<Bytes>]>;430      /**431       * Make some on-chain remark.432       * 433       * # <weight>434       * - `O(1)`435       * # </weight>436       **/437      remark: AugmentedSubmittable<(remark: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;438      /**439       * Make some on-chain remark and emit event.440       **/441      remarkWithEvent: AugmentedSubmittable<(remark: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;442      /**443       * Set the new runtime code.444       * 445       * # <weight>446       * - `O(C + S)` where `C` length of `code` and `S` complexity of `can_set_code`447       * - 1 call to `can_set_code`: `O(S)` (calls `sp_io::misc::runtime_version` which is448       * expensive).449       * - 1 storage write (codec `O(C)`).450       * - 1 digest item.451       * - 1 event.452       * The weight of this function is dependent on the runtime, but generally this is very453       * expensive. We will treat this as a full block.454       * # </weight>455       **/456      setCode: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;457      /**458       * Set the new runtime code without doing any checks of the given `code`.459       * 460       * # <weight>461       * - `O(C)` where `C` length of `code`462       * - 1 storage write (codec `O(C)`).463       * - 1 digest item.464       * - 1 event.465       * The weight of this function is dependent on the runtime. We will treat this as a full466       * block. # </weight>467       **/468      setCodeWithoutChecks: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;469      /**470       * Set the number of pages in the WebAssembly environment's heap.471       **/472      setHeapPages: AugmentedSubmittable<(pages: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;473      /**474       * Set some items of storage.475       **/476      setStorage: AugmentedSubmittable<(items: Vec<ITuple<[Bytes, Bytes]>> | ([Bytes | string | Uint8Array, Bytes | string | Uint8Array])[]) => SubmittableExtrinsic<ApiType>, [Vec<ITuple<[Bytes, Bytes]>>]>;477      /**478       * Generic tx479       **/480      [key: string]: SubmittableExtrinsicFunction<ApiType>;481    };482    timestamp: {483      /**484       * Set the current time.485       * 486       * This call should be invoked exactly once per block. It will panic at the finalization487       * phase, if this call hasn't been invoked by that time.488       * 489       * The timestamp should be greater than the previous one by the amount specified by490       * `MinimumPeriod`.491       * 492       * The dispatch origin for this call must be `Inherent`.493       * 494       * # <weight>495       * - `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`)496       * - 1 storage read and 1 storage mutation (codec `O(1)`). (because of `DidUpdate::take` in497       * `on_finalize`)498       * - 1 event handler `on_timestamp_set`. Must be `O(1)`.499       * # </weight>500       **/501      set: AugmentedSubmittable<(now: Compact<u64> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Compact<u64>]>;502      /**503       * Generic tx504       **/505      [key: string]: SubmittableExtrinsicFunction<ApiType>;506    };507    treasury: {508      /**509       * Approve a proposal. At a later time, the proposal will be allocated to the beneficiary510       * and the original deposit will be returned.511       * 512       * May only be called from `T::ApproveOrigin`.513       * 514       * # <weight>515       * - Complexity: O(1).516       * - DbReads: `Proposals`, `Approvals`517       * - DbWrite: `Approvals`518       * # </weight>519       **/520      approveProposal: AugmentedSubmittable<(proposalId: Compact<u32> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Compact<u32>]>;521      /**522       * Put forward a suggestion for spending. A deposit proportional to the value523       * is reserved and slashed if the proposal is rejected. It is returned once the524       * proposal is awarded.525       * 526       * # <weight>527       * - Complexity: O(1)528       * - DbReads: `ProposalCount`, `origin account`529       * - DbWrites: `ProposalCount`, `Proposals`, `origin account`530       * # </weight>531       **/532      proposeSpend: AugmentedSubmittable<(value: Compact<u128> | AnyNumber | Uint8Array, beneficiary: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Compact<u128>, MultiAddress]>;533      /**534       * Reject a proposed spend. The original deposit will be slashed.535       * 536       * May only be called from `T::RejectOrigin`.537       * 538       * # <weight>539       * - Complexity: O(1)540       * - DbReads: `Proposals`, `rejected proposer account`541       * - DbWrites: `Proposals`, `rejected proposer account`542       * # </weight>543       **/544      rejectProposal: AugmentedSubmittable<(proposalId: Compact<u32> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Compact<u32>]>;545      /**546       * Generic tx547       **/548      [key: string]: SubmittableExtrinsicFunction<ApiType>;549    };550    unique: {551      /**552       * Adds an admin of the Collection.553       * NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.554       * 555       * # Permissions556       * 557       * * Collection Owner.558       * * Collection Admin.559       * 560       * # Arguments561       * 562       * * collection_id: ID of the Collection to add admin for.563       * 564       * * new_admin_id: Address of new admin to add.565       **/566      addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdminId: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;567      /**568       * Add an address to allow list.569       * 570       * # Permissions571       * 572       * * Collection Owner573       * * Collection Admin574       * 575       * # Arguments576       * 577       * * collection_id.578       * 579       * * address.580       **/581      addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;582      /**583       * Set, change, or remove approved address to transfer the ownership of the NFT.584       * 585       * # Permissions586       * 587       * * Collection Owner588       * * Collection Admin589       * * Current NFT owner590       * 591       * # Arguments592       * 593       * * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).594       * 595       * * collection_id.596       * 597       * * item_id: ID of the item.598       **/599      approve: AugmentedSubmittable<(spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;600      /**601       * Destroys a concrete instance of NFT on behalf of the owner602       * See also: [`approve`]603       * 604       * # Permissions605       * 606       * * Collection Owner.607       * * Collection Admin.608       * * Current NFT Owner.609       * 610       * # Arguments611       * 612       * * collection_id: ID of the collection.613       * 614       * * item_id: ID of NFT to burn.615       * 616       * * from: owner of item617       **/618      burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32, u128]>;619      /**620       * Destroys a concrete instance of NFT.621       * 622       * # Permissions623       * 624       * * Collection Owner.625       * * Collection Admin.626       * * Current NFT Owner.627       * 628       * # Arguments629       * 630       * * collection_id: ID of the collection.631       * 632       * * item_id: ID of NFT to burn.633       **/634      burnItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;635      /**636       * Change the owner of the collection.637       * 638       * # Permissions639       * 640       * * Collection Owner.641       * 642       * # Arguments643       * 644       * * collection_id.645       * 646       * * new_owner.647       **/648      changeCollectionOwner: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newOwner: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;649      /**650       * # Permissions651       * 652       * * Sponsor.653       * 654       * # Arguments655       * 656       * * collection_id.657       **/658      confirmSponsorship: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;659      /**660       * This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner of the collection is set to the address that signed the transaction and can be changed later.661       * 662       * # Permissions663       * 664       * * Anyone.665       * 666       * # Arguments667       * 668       * * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.669       * 670       * * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.671       * 672       * * token_prefix: UTF-8 string with token prefix.673       * 674       * * mode: [CollectionMode] collection type and type dependent data.675       **/676      createCollection: AugmentedSubmittable<(collectionName: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], collectionDescription: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], tokenPrefix: Bytes | string | Uint8Array, mode: UpDataStructsCollectionMode | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Vec<u16>, Vec<u16>, Bytes, UpDataStructsCollectionMode]>;677      /**678       * This method creates a collection679       * 680       * Prefer it to deprecated [`created_collection`] method681       **/682      createCollectionEx: AugmentedSubmittable<(data: UpDataStructsCreateCollectionData | { mode?: any; access?: any; name?: any; description?: any; tokenPrefix?: any; offchainSchema?: any; schemaVersion?: any; pendingSponsor?: any; limits?: any; variableOnChainSchema?: any; constOnChainSchema?: any; metaUpdatePermission?: any; tokenPropertyPermissions?: any; properties?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [UpDataStructsCreateCollectionData]>;683      /**684       * This method creates a concrete instance of NFT Collection created with CreateCollection method.685       * 686       * # Permissions687       * 688       * * Collection Owner.689       * * Collection Admin.690       * * Anyone if691       * * Allow List is enabled, and692       * * Address is added to allow list, and693       * * MintPermission is enabled (see SetMintPermission method)694       * 695       * # Arguments696       * 697       * * collection_id: ID of the collection.698       * 699       * * owner: Address, initial owner of the NFT.700       * 701       * * data: Token data to store on chain.702       **/703      createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCreateItemData]>;704      /**705       * This method creates multiple items in a collection created with CreateCollection method.706       * 707       * # Permissions708       * 709       * * Collection Owner.710       * * Collection Admin.711       * * Anyone if712       * * Allow List is enabled, and713       * * Address is added to allow list, and714       * * MintPermission is enabled (see SetMintPermission method)715       * 716       * # Arguments717       * 718       * * collection_id: ID of the collection.719       * 720       * * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].721       * 722       * * owner: Address, initial owner of the NFT.723       **/724      createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<UpDataStructsCreateItemData> | (UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, Vec<UpDataStructsCreateItemData>]>;725      createMultipleItemsEx: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, data: UpDataStructsCreateItemExData | { NFT: any } | { Fungible: any } | { RefungibleMultipleItems: any } | { RefungibleMultipleOwners: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCreateItemExData]>;726      deleteCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<Bytes>]>;727      deleteTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, u32, Vec<Bytes>]>;728      /**729       * **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.730       * 731       * # Permissions732       * 733       * * Collection Owner.734       * 735       * # Arguments736       * 737       * * collection_id: collection to destroy.738       **/739      destroyCollection: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;740      /**741       * Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.742       * 743       * # Permissions744       * 745       * * Collection Owner.746       * * Collection Admin.747       * 748       * # Arguments749       * 750       * * collection_id: ID of the Collection to remove admin for.751       * 752       * * account_id: Address of admin to remove.753       **/754      removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;755      /**756       * Switch back to pay-per-own-transaction model.757       * 758       * # Permissions759       * 760       * * Collection owner.761       * 762       * # Arguments763       * 764       * * collection_id.765       **/766      removeCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;767      /**768       * Remove an address from allow list.769       * 770       * # Permissions771       * 772       * * Collection Owner773       * * Collection Admin774       * 775       * # Arguments776       * 777       * * collection_id.778       * 779       * * address.780       **/781      removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;782      setCollectionLimits: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: UpDataStructsCollectionLimits | { accountTokenOwnershipLimit?: any; sponsoredDataSize?: any; sponsoredDataRateLimit?: any; tokenLimit?: any; sponsorTransferTimeout?: any; sponsorApproveTimeout?: any; ownerCanTransfer?: any; ownerCanDestroy?: any; transfersEnabled?: any; nestingRule?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionLimits]>;783      setCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsProperty>]>;784      /**785       * # Permissions786       * 787       * * Collection Owner788       * 789       * # Arguments790       * 791       * * collection_id.792       * 793       * * new_sponsor.794       **/795      setCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newSponsor: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;796      /**797       * Set const on-chain data schema.798       * 799       * # Permissions800       * 801       * * Collection Owner802       * * Collection Admin803       * 804       * # Arguments805       * 806       * * collection_id.807       * 808       * * schema: String representing the const on-chain data schema.809       **/810      setConstOnChainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;811      /**812       * Set meta_update_permission value for particular collection813       * 814       * # Permissions815       * 816       * * Collection Owner.817       * 818       * # Arguments819       * 820       * * collection_id: ID of the collection.821       * 822       * * value: New flag value.823       **/824      setMetaUpdatePermissionFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: UpDataStructsMetaUpdatePermission | 'ItemOwner' | 'Admin' | 'None' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsMetaUpdatePermission]>;825      /**826       * Allows Anyone to create tokens if:827       * * Allow List is enabled, and828       * * Address is added to allow list, and829       * * This method was called with True parameter830       * 831       * # Permissions832       * * Collection Owner833       * 834       * # Arguments835       * 836       * * collection_id.837       * 838       * * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.839       **/840      setMintPermission: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, mintPermission: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;841      /**842       * Set off-chain data schema.843       * 844       * # Permissions845       * 846       * * Collection Owner847       * * Collection Admin848       * 849       * # Arguments850       * 851       * * collection_id.852       * 853       * * schema: String representing the offchain data schema.854       **/855      setOffchainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;856      setPropertyPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyPermissions: Vec<UpDataStructsPropertyKeyPermission> | (UpDataStructsPropertyKeyPermission | { key?: any; permission?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsPropertyKeyPermission>]>;857      /**858       * Toggle between normal and allow list access for the methods with access for `Anyone`.859       * 860       * # Permissions861       * 862       * * Collection Owner.863       * 864       * # Arguments865       * 866       * * collection_id.867       * 868       * * mode: [AccessMode]869       **/870      setPublicAccessMode: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, mode: UpDataStructsAccessMode | 'Normal' | 'AllowList' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsAccessMode]>;871      /**872       * Set schema standard873       * ImageURL874       * Unique875       * 876       * # Permissions877       * 878       * * Collection Owner879       * * Collection Admin880       * 881       * # Arguments882       * 883       * * collection_id.884       * 885       * * schema: SchemaVersion: enum886       **/887      setSchemaVersion: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, version: UpDataStructsSchemaVersion | 'ImageURL' | 'Unique' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsSchemaVersion]>;888      setTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, u32, Vec<UpDataStructsProperty>]>;889      /**890       * Set transfers_enabled value for particular collection891       * 892       * # Permissions893       * 894       * * Collection Owner.895       * 896       * # Arguments897       * 898       * * collection_id: ID of the collection.899       * 900       * * value: New flag value.901       **/902      setTransfersEnabledFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;903      /**904       * Set off-chain data schema.905       * 906       * # Permissions907       * 908       * * Collection Owner909       * * Collection Admin910       * 911       * # Arguments912       * 913       * * collection_id.914       * 915       * * schema: String representing the offchain data schema.916       **/917      setVariableMetaData: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, data: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, Bytes]>;918      /**919       * Set variable on-chain data schema.920       * 921       * # Permissions922       * 923       * * Collection Owner924       * * Collection Admin925       * 926       * # Arguments927       * 928       * * collection_id.929       * 930       * * schema: String representing the variable on-chain data schema.931       **/932      setVariableOnChainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;933      /**934       * Change ownership of the token.935       * 936       * # Permissions937       * 938       * * Collection Owner939       * * Collection Admin940       * * Current NFT owner941       * 942       * # Arguments943       * 944       * * recipient: Address of token recipient.945       * 946       * * collection_id.947       * 948       * * item_id: ID of the item949       * * Non-Fungible Mode: Required.950       * * Fungible Mode: Ignored.951       * * Re-Fungible Mode: Required.952       * 953       * * value: Amount to transfer.954       * * Non-Fungible Mode: Ignored955       * * Fungible Mode: Must specify transferred amount956       * * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)957       **/958      transfer: AugmentedSubmittable<(recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;959      /**960       * Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.961       * 962       * # Permissions963       * * Collection Owner964       * * Collection Admin965       * * Current NFT owner966       * * Address approved by current NFT owner967       * 968       * # Arguments969       * 970       * * from: Address that owns token.971       * 972       * * recipient: Address of token recipient.973       * 974       * * collection_id.975       * 976       * * item_id: ID of the item.977       * 978       * * value: Amount to transfer.979       **/980      transferFrom: AugmentedSubmittable<(from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;981      /**982       * Generic tx983       **/984      [key: string]: SubmittableExtrinsicFunction<ApiType>;985    };986    vesting: {987      claim: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>, []>;988      claimFor: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress]>;989      updateVestingSchedules: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, vestingSchedules: Vec<OrmlVestingVestingSchedule> | (OrmlVestingVestingSchedule | { start?: any; period?: any; periodCount?: any; perPeriod?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [MultiAddress, Vec<OrmlVestingVestingSchedule>]>;990      vestedTransfer: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, schedule: OrmlVestingVestingSchedule | { start?: any; period?: any; periodCount?: any; perPeriod?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, OrmlVestingVestingSchedule]>;991      /**992       * Generic tx993       **/994      [key: string]: SubmittableExtrinsicFunction<ApiType>;995    };996    xcmpQueue: {997      /**998       * Resumes all XCM executions for the XCMP queue.999       * 1000       * Note that this function doesn't change the status of the in/out bound channels.1001       * 1002       * - `origin`: Must pass `ControllerOrigin`.1003       **/1004      resumeXcmExecution: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>, []>;1005      /**1006       * Services a single overweight XCM.1007       * 1008       * - `origin`: Must pass `ExecuteOverweightOrigin`.1009       * - `index`: The index of the overweight XCM to service1010       * - `weight_limit`: The amount of weight that XCM execution may take.1011       * 1012       * Errors:1013       * - `BadOverweightIndex`: XCM under `index` is not found in the `Overweight` storage map.1014       * - `BadXcm`: XCM under `index` cannot be properly decoded into a valid XCM format.1015       * - `WeightOverLimit`: XCM execution may use greater `weight_limit`.1016       * 1017       * Events:1018       * - `OverweightServiced`: On success.1019       **/1020      serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64, u64]>;1021      /**1022       * Suspends all XCM executions for the XCMP queue, regardless of the sender's origin.1023       * 1024       * - `origin`: Must pass `ControllerOrigin`.1025       **/1026      suspendXcmExecution: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>, []>;1027      /**1028       * Overwrites the number of pages of messages which must be in the queue after which we drop any further1029       * messages from the channel.1030       * 1031       * - `origin`: Must pass `Root`.1032       * - `new`: Desired value for `QueueConfigData.drop_threshold`1033       **/1034      updateDropThreshold: AugmentedSubmittable<(updated: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;1035      /**1036       * Overwrites the number of pages of messages which the queue must be reduced to before it signals that1037       * message sending may recommence after it has been suspended.1038       * 1039       * - `origin`: Must pass `Root`.1040       * - `new`: Desired value for `QueueConfigData.resume_threshold`1041       **/1042      updateResumeThreshold: AugmentedSubmittable<(updated: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;1043      /**1044       * Overwrites the number of pages of messages which must be in the queue for the other side to be told to1045       * suspend their sending.1046       * 1047       * - `origin`: Must pass `Root`.1048       * - `new`: Desired value for `QueueConfigData.suspend_value`1049       **/1050      updateSuspendThreshold: AugmentedSubmittable<(updated: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;1051      /**1052       * Overwrites the amount of remaining weight under which we stop processing messages.1053       * 1054       * - `origin`: Must pass `Root`.1055       * - `new`: Desired value for `QueueConfigData.threshold_weight`1056       **/1057      updateThresholdWeight: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;1058      /**1059       * Overwrites the speed to which the available weight approaches the maximum weight.1060       * A lower number results in a faster progression. A value of 1 makes the entire weight available initially.1061       * 1062       * - `origin`: Must pass `Root`.1063       * - `new`: Desired value for `QueueConfigData.weight_restrict_decay`.1064       **/1065      updateWeightRestrictDecay: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;1066      /**1067       * Overwrite the maximum amount of weight any individual message may consume.1068       * Messages above this weight go into the overweight queue and may only be serviced explicitly.1069       * 1070       * - `origin`: Must pass `Root`.1071       * - `new`: Desired value for `QueueConfigData.xcmp_max_individual_weight`.1072       **/1073      updateXcmpMaxIndividualWeight: AugmentedSubmittable<(updated: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u64]>;1074      /**1075       * Generic tx1076       **/1077      [key: string]: SubmittableExtrinsicFunction<ApiType>;1078    };1079  } // AugmentedSubmittables1080} // declare module
modifiedtests/src/interfaces/augment-types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-types.ts
+++ b/tests/src/interfaces/augment-types.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-defs`, do not edit
 /* eslint-disable */
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, 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, FrameSupportPalletId, FrameSupportStorageBoundedBTreeSet, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1AbridgedHrmpChannel, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionField, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsMetaUpdatePermission, UpDataStructsNestingRule, UpDataStructsProperties, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSchemaVersion, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './unique';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, 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, FrameSupportPalletId, FrameSupportStorageBoundedBTreeSet, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructsRpcCollection, PhantomTypeUpDataStructsTokenData, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1AbridgedHrmpChannel, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionField, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsMetaUpdatePermission, UpDataStructsNestingRule, UpDataStructsProperties, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSchemaVersion, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './unique';
 import type { Data, StorageKey } from '@polkadot/types';
 import type { BitVec, Bool, Bytes, I128, I16, I256, I32, I64, I8, Json, Null, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec';
 import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets';
@@ -23,7 +23,6 @@
 import type { FundIndex, FundInfo, LastContribution, TrieIndex } from '@polkadot/types/interfaces/crowdloan';
 import type { ConfigData, MessageId, OverweightIndex, PageCounter, PageIndexData } from '@polkadot/types/interfaces/cumulus';
 import type { AccountVote, AccountVoteSplit, AccountVoteStandard, Conviction, Delegations, PreimageStatus, PreimageStatusAvailable, PriorLock, PropIndex, Proposal, ProxyState, ReferendumIndex, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, ReferendumStatus, Tally, Voting, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces/democracy';
-import type { BlockStats } from '@polkadot/types/interfaces/dev';
 import type { ApprovalFlag, DefunctVoter, Renouncing, SetIndex, Vote, VoteIndex, VoteThreshold, VoterInfo } from '@polkadot/types/interfaces/elections';
 import type { CreatedBlock, ImportedAux } from '@polkadot/types/interfaces/engine';
 import type { BlockV0, BlockV1, BlockV2, EIP1559Transaction, EIP2930Transaction, EthAccessList, EthAccessListItem, EthAccount, EthAddress, EthBlock, EthBloom, EthCallRequest, EthFilter, EthFilterAddress, EthFilterChanges, EthFilterTopic, EthFilterTopicEntry, EthFilterTopicInner, EthHeader, EthLog, EthReceipt, EthRichBlock, EthRichHeader, EthStorageProof, EthSubKind, EthSubParams, EthSubResult, EthSyncInfo, EthSyncStatus, EthTransaction, EthTransactionAction, EthTransactionCondition, EthTransactionRequest, EthTransactionSignature, EthTransactionStatus, EthWork, EthereumAccountId, EthereumAddress, EthereumLookupSource, EthereumSignature, LegacyTransaction, TransactionV0, TransactionV1, TransactionV2 } from '@polkadot/types/interfaces/eth';
@@ -52,9 +51,9 @@
 import type { BeefyKey, FullIdentification, IdentificationTuple, Keys, MembershipProof, SessionIndex, SessionKeys1, SessionKeys10, SessionKeys10B, SessionKeys2, SessionKeys3, SessionKeys4, SessionKeys5, SessionKeys6, SessionKeys6B, SessionKeys7, SessionKeys7B, SessionKeys8, SessionKeys8B, SessionKeys9, SessionKeys9B, ValidatorCount } from '@polkadot/types/interfaces/session';
 import type { Bid, BidKind, SocietyJudgement, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces/society';
 import type { ActiveEraInfo, CompactAssignments, CompactAssignmentsTo257, CompactAssignmentsTo265, CompactAssignmentsWith16, CompactAssignmentsWith24, CompactScore, CompactScoreCompact, ElectionCompute, ElectionPhase, ElectionResult, ElectionScore, ElectionSize, ElectionStatus, EraIndex, EraPoints, EraRewardPoints, EraRewards, Exposure, ExtendedBalance, Forcing, IndividualExposure, KeyType, MomentOf, Nominations, NominatorIndex, NominatorIndexCompact, OffchainAccuracy, OffchainAccuracyCompact, PhragmenScore, Points, RawSolution, RawSolutionTo265, RawSolutionWith16, RawSolutionWith24, ReadySolution, RewardDestination, RewardPoint, RoundSnapshot, SeatHolder, SignedSubmission, SignedSubmissionOf, SignedSubmissionTo276, SlashJournalEntry, SlashingSpans, SlashingSpansTo204, SolutionOrSnapshotSize, SolutionSupport, SolutionSupports, SpanIndex, SpanRecord, StakingLedger, StakingLedgerTo223, StakingLedgerTo240, SubmissionIndicesOf, Supports, UnappliedSlash, UnappliedSlashOther, UnlockChunk, ValidatorIndex, ValidatorIndexCompact, ValidatorPrefs, ValidatorPrefsTo145, ValidatorPrefsTo196, ValidatorPrefsWithBlocked, ValidatorPrefsWithCommission, VoteWeight, Voter } from '@polkadot/types/interfaces/staking';
-import type { ApiId, BlockTrace, BlockTraceEvent, BlockTraceEventData, BlockTraceSpan, KeyValueOption, MigrationStatusResult, ReadProof, RuntimeVersion, RuntimeVersionApi, RuntimeVersionPartial, SpecVersion, StorageChangeSet, TraceBlockResponse, TraceError } from '@polkadot/types/interfaces/state';
+import type { ApiId, BlockTrace, BlockTraceEvent, BlockTraceEventData, BlockTraceSpan, KeyValueOption, ReadProof, RuntimeVersion, RuntimeVersionApi, RuntimeVersionPartial, SpecVersion, StorageChangeSet, TraceBlockResponse, TraceError } from '@polkadot/types/interfaces/state';
 import type { WeightToFeeCoefficient } from '@polkadot/types/interfaces/support';
-import type { AccountInfo, AccountInfoWithDualRefCount, AccountInfoWithProviders, AccountInfoWithRefCount, AccountInfoWithRefCountU8, AccountInfoWithTripleRefCount, ApplyExtrinsicResult, ArithmeticError, BlockLength, BlockWeights, ChainProperties, ChainType, ConsumedWeight, DigestOf, DispatchClass, DispatchError, DispatchErrorModule, DispatchErrorModuleU8a, DispatchErrorTo198, DispatchInfo, DispatchInfoTo190, DispatchInfoTo244, DispatchOutcome, DispatchResult, DispatchResultOf, DispatchResultTo198, Event, EventId, EventIndex, EventRecord, Health, InvalidTransaction, Key, LastRuntimeUpgradeInfo, NetworkState, NetworkStatePeerset, NetworkStatePeersetInfo, NodeRole, NotConnectedPeer, Peer, PeerEndpoint, PeerEndpointAddr, PeerInfo, PeerPing, PerDispatchClassU32, PerDispatchClassWeight, PerDispatchClassWeightsPerClass, Phase, RawOrigin, RefCount, RefCountTo259, SyncState, SystemOrigin, TokenError, TransactionValidityError, UnknownTransaction, WeightPerClass } from '@polkadot/types/interfaces/system';
+import type { AccountInfo, AccountInfoWithDualRefCount, AccountInfoWithProviders, AccountInfoWithRefCount, AccountInfoWithRefCountU8, AccountInfoWithTripleRefCount, ApplyExtrinsicResult, ArithmeticError, BlockLength, BlockWeights, ChainProperties, ChainType, ConsumedWeight, DigestOf, DispatchClass, DispatchError, DispatchErrorModule, DispatchErrorTo198, DispatchInfo, DispatchInfoTo190, DispatchInfoTo244, DispatchOutcome, DispatchResult, DispatchResultOf, DispatchResultTo198, Event, EventId, EventIndex, EventRecord, Health, InvalidTransaction, Key, LastRuntimeUpgradeInfo, NetworkState, NetworkStatePeerset, NetworkStatePeersetInfo, NodeRole, NotConnectedPeer, Peer, PeerEndpoint, PeerEndpointAddr, PeerInfo, PeerPing, PerDispatchClassU32, PerDispatchClassWeight, PerDispatchClassWeightsPerClass, Phase, RawOrigin, RefCount, RefCountTo259, SyncState, SystemOrigin, TokenError, TransactionValidityError, UnknownTransaction, WeightPerClass } from '@polkadot/types/interfaces/system';
 import type { Bounty, BountyIndex, BountyStatus, BountyStatusActive, BountyStatusCuratorProposed, BountyStatusPendingPayout, OpenTip, OpenTipFinderTo225, OpenTipTip, OpenTipTo225, TreasuryProposal } from '@polkadot/types/interfaces/treasury';
 import type { Multiplier } from '@polkadot/types/interfaces/txpayment';
 import type { ClassDetails, ClassId, ClassMetadata, DepositBalance, DepositBalanceOf, DestroyWitness, InstanceDetails, InstanceId, InstanceMetadata } from '@polkadot/types/interfaces/uniques';
@@ -154,7 +153,6 @@
     BlockNumber: BlockNumber;
     BlockNumberFor: BlockNumberFor;
     BlockNumberOf: BlockNumberOf;
-    BlockStats: BlockStats;
     BlockTrace: BlockTrace;
     BlockTraceEvent: BlockTraceEvent;
     BlockTraceEventData: BlockTraceEventData;
@@ -329,7 +327,6 @@
     DispatchClass: DispatchClass;
     DispatchError: DispatchError;
     DispatchErrorModule: DispatchErrorModule;
-    DispatchErrorModuleU8a: DispatchErrorModuleU8a;
     DispatchErrorTo198: DispatchErrorTo198;
     DispatchFeePayment: DispatchFeePayment;
     DispatchInfo: DispatchInfo;
@@ -661,7 +658,6 @@
     MetadataV13: MetadataV13;
     MetadataV14: MetadataV14;
     MetadataV9: MetadataV9;
-    MigrationStatusResult: MigrationStatusResult;
     MmrLeafProof: MmrLeafProof;
     MmrRootHash: MmrRootHash;
     ModuleConstantMetadataV10: ModuleConstantMetadataV10;
@@ -849,7 +845,8 @@
     PerU16: PerU16;
     Phantom: Phantom;
     PhantomData: PhantomData;
-    PhantomTypeUpDataStructs: PhantomTypeUpDataStructs;
+    PhantomTypeUpDataStructsRpcCollection: PhantomTypeUpDataStructsRpcCollection;
+    PhantomTypeUpDataStructsTokenData: PhantomTypeUpDataStructsTokenData;
     Phase: Phase;
     PhragmenScore: PhragmenScore;
     Points: Points;
@@ -1189,6 +1186,7 @@
     UpDataStructsSchemaVersion: UpDataStructsSchemaVersion;
     UpDataStructsSponsoringRateLimit: UpDataStructsSponsoringRateLimit;
     UpDataStructsSponsorshipState: UpDataStructsSponsorshipState;
+    UpDataStructsTokenData: UpDataStructsTokenData;
     UpgradeGoAhead: UpgradeGoAhead;
     UpgradeRestriction: UpgradeRestriction;
     UpwardMessage: UpwardMessage;
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -23,7 +23,7 @@
    * Lookup10: sp_trie::storage_proof::StorageProof
    **/
   SpTrieStorageProof: {
-    trieNodes: 'BTreeSet<Bytes>'
+    trieNodes: 'Vec<Bytes>'
   },
   /**
    * Lookup13: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot
@@ -1469,7 +1469,7 @@
   /**
    * Lookup171: frame_support::storage::bounded_btree_set::BoundedBTreeSet<up_data_structs::CollectionId, S>
    **/
-  FrameSupportStorageBoundedBTreeSet: 'BTreeSet<u32>',
+  FrameSupportStorageBoundedBTreeSet: 'Vec<u32>',
   /**
    * Lookup177: up_data_structs::MetaUpdatePermission
    **/
@@ -1487,7 +1487,9 @@
    * Lookup181: up_data_structs::PropertyPermission
    **/
   UpDataStructsPropertyPermission: {
-    _enum: ['None', 'AdminConst', 'Admin', 'ItemOwnerConst', 'ItemOwner', 'ItemOwnerOrAdmin']
+    mutable: 'bool',
+    collectionAdmin: 'bool',
+    tokenOwner: 'bool'
   },
   /**
    * Lookup184: up_data_structs::Property
@@ -1520,7 +1522,8 @@
    **/
   UpDataStructsCreateNftData: {
     constData: 'Bytes',
-    variableData: 'Bytes'
+    variableData: 'Bytes',
+    properties: 'Vec<UpDataStructsProperty>'
   },
   /**
    * Lookup191: up_data_structs::CreateFungibleData
@@ -1553,6 +1556,7 @@
   UpDataStructsCreateNftExData: {
     constData: 'Bytes',
     variableData: 'Bytes',
+    properties: 'Vec<UpDataStructsProperty>',
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
@@ -2324,12 +2328,24 @@
     alive: 'u32'
   },
   /**
-   * Lookup325: PhantomType::up_data_structs<up_data_structs::RpcCollection<sp_core::crypto::AccountId32>>
+   * Lookup325: PhantomType::up_data_structs<up_data_structs::TokenData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>>
    **/
-  PhantomTypeUpDataStructs: '[Lookup326;0]',
+  PhantomTypeUpDataStructsTokenData: '[Lookup326;0]',
   /**
-   * Lookup326: up_data_structs::RpcCollection<sp_core::crypto::AccountId32>
+   * Lookup326: up_data_structs::TokenData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
+  UpDataStructsTokenData: {
+    constData: 'Bytes',
+    properties: 'Vec<UpDataStructsProperty>',
+    owner: 'Option<PalletEvmAccountBasicCrossAccountIdRepr>'
+  },
+  /**
+   * Lookup329: PhantomType::up_data_structs<up_data_structs::RpcCollection<sp_core::crypto::AccountId32>>
+   **/
+  PhantomTypeUpDataStructsRpcCollection: '[Lookup330;0]',
+  /**
+   * Lookup330: up_data_structs::RpcCollection<sp_core::crypto::AccountId32>
+   **/
   UpDataStructsRpcCollection: {
     owner: 'AccountId32',
     mode: 'UpDataStructsCollectionMode',
@@ -2347,32 +2363,32 @@
     metaUpdatePermission: 'UpDataStructsMetaUpdatePermission'
   },
   /**
-   * Lookup328: pallet_common::pallet::Error<T>
+   * Lookup332: pallet_common::pallet::Error<T>
    **/
   PalletCommonError: {
     _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'TokenVariableDataLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'NestingIsDisabled', 'OnlyOwnerAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached']
   },
   /**
-   * Lookup330: pallet_fungible::pallet::Error<T>
+   * Lookup334: pallet_fungible::pallet::Error<T>
    **/
   PalletFungibleError: {
-    _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'PropertiesNotAllowed']
+    _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
   },
   /**
-   * Lookup331: pallet_refungible::ItemData
+   * Lookup335: pallet_refungible::ItemData
    **/
   PalletRefungibleItemData: {
     constData: 'Bytes',
     variableData: 'Bytes'
   },
   /**
-   * Lookup335: pallet_refungible::pallet::Error<T>
+   * Lookup339: pallet_refungible::pallet::Error<T>
    **/
   PalletRefungibleError: {
-    _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RefungibleDisallowsNesting', 'PropertiesNotAllowed']
+    _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
   },
   /**
-   * Lookup336: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup340: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   PalletNonfungibleItemData: {
     constData: 'Bytes',
@@ -2380,25 +2396,25 @@
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup337: pallet_nonfungible::pallet::Error<T>
+   * Lookup341: pallet_nonfungible::pallet::Error<T>
    **/
   PalletNonfungibleError: {
     _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount']
   },
   /**
-   * Lookup338: pallet_structure::pallet::Error<T>
+   * Lookup342: pallet_structure::pallet::Error<T>
    **/
   PalletStructureError: {
     _enum: ['OuroborosDetected', 'DepthLimit', 'TokenNotFound']
   },
   /**
-   * Lookup340: pallet_evm::pallet::Error<T>
+   * Lookup344: pallet_evm::pallet::Error<T>
    **/
   PalletEvmError: {
     _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce']
   },
   /**
-   * Lookup343: fp_rpc::TransactionStatus
+   * Lookup347: fp_rpc::TransactionStatus
    **/
   FpRpcTransactionStatus: {
     transactionHash: 'H256',
@@ -2410,11 +2426,11 @@
     logsBloom: 'EthbloomBloom'
   },
   /**
-   * Lookup346: ethbloom::Bloom
+   * Lookup350: ethbloom::Bloom
    **/
   EthbloomBloom: '[u8;256]',
   /**
-   * Lookup348: ethereum::receipt::ReceiptV3
+   * Lookup352: ethereum::receipt::ReceiptV3
    **/
   EthereumReceiptReceiptV3: {
     _enum: {
@@ -2424,7 +2440,7 @@
     }
   },
   /**
-   * Lookup349: ethereum::receipt::EIP658ReceiptData
+   * Lookup353: ethereum::receipt::EIP658ReceiptData
    **/
   EthereumReceiptEip658ReceiptData: {
     statusCode: 'u8',
@@ -2433,7 +2449,7 @@
     logs: 'Vec<EthereumLog>'
   },
   /**
-   * Lookup350: ethereum::block::Block<ethereum::transaction::TransactionV2>
+   * Lookup354: ethereum::block::Block<ethereum::transaction::TransactionV2>
    **/
   EthereumBlock: {
     header: 'EthereumHeader',
@@ -2441,7 +2457,7 @@
     ommers: 'Vec<EthereumHeader>'
   },
   /**
-   * Lookup351: ethereum::header::Header
+   * Lookup355: ethereum::header::Header
    **/
   EthereumHeader: {
     parentHash: 'H256',
@@ -2461,41 +2477,41 @@
     nonce: 'EthereumTypesHashH64'
   },
   /**
-   * Lookup352: ethereum_types::hash::H64
+   * Lookup356: ethereum_types::hash::H64
    **/
   EthereumTypesHashH64: '[u8;8]',
   /**
-   * Lookup357: pallet_ethereum::pallet::Error<T>
+   * Lookup361: pallet_ethereum::pallet::Error<T>
    **/
   PalletEthereumError: {
     _enum: ['InvalidSignature', 'PreLogExists']
   },
   /**
-   * Lookup358: pallet_evm_coder_substrate::pallet::Error<T>
+   * Lookup362: pallet_evm_coder_substrate::pallet::Error<T>
    **/
   PalletEvmCoderSubstrateError: {
     _enum: ['OutOfGas', 'OutOfFund']
   },
   /**
-   * Lookup359: pallet_evm_contract_helpers::SponsoringModeT
+   * Lookup363: pallet_evm_contract_helpers::SponsoringModeT
    **/
   PalletEvmContractHelpersSponsoringModeT: {
     _enum: ['Disabled', 'Allowlisted', 'Generous']
   },
   /**
-   * Lookup361: pallet_evm_contract_helpers::pallet::Error<T>
+   * Lookup365: pallet_evm_contract_helpers::pallet::Error<T>
    **/
   PalletEvmContractHelpersError: {
     _enum: ['NoPermission']
   },
   /**
-   * Lookup362: pallet_evm_migration::pallet::Error<T>
+   * Lookup366: pallet_evm_migration::pallet::Error<T>
    **/
   PalletEvmMigrationError: {
     _enum: ['AccountNotEmpty', 'AccountIsNotMigrating']
   },
   /**
-   * Lookup364: sp_runtime::MultiSignature
+   * Lookup368: sp_runtime::MultiSignature
    **/
   SpRuntimeMultiSignature: {
     _enum: {
@@ -2505,39 +2521,39 @@
     }
   },
   /**
-   * Lookup365: sp_core::ed25519::Signature
+   * Lookup369: sp_core::ed25519::Signature
    **/
   SpCoreEd25519Signature: '[u8;64]',
   /**
-   * Lookup367: sp_core::sr25519::Signature
+   * Lookup371: sp_core::sr25519::Signature
    **/
   SpCoreSr25519Signature: '[u8;64]',
   /**
-   * Lookup368: sp_core::ecdsa::Signature
+   * Lookup372: sp_core::ecdsa::Signature
    **/
   SpCoreEcdsaSignature: '[u8;65]',
   /**
-   * Lookup371: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
+   * Lookup375: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
    **/
   FrameSystemExtensionsCheckSpecVersion: 'Null',
   /**
-   * Lookup372: frame_system::extensions::check_genesis::CheckGenesis<T>
+   * Lookup376: frame_system::extensions::check_genesis::CheckGenesis<T>
    **/
   FrameSystemExtensionsCheckGenesis: 'Null',
   /**
-   * Lookup375: frame_system::extensions::check_nonce::CheckNonce<T>
+   * Lookup379: frame_system::extensions::check_nonce::CheckNonce<T>
    **/
   FrameSystemExtensionsCheckNonce: 'Compact<u32>',
   /**
-   * Lookup376: frame_system::extensions::check_weight::CheckWeight<T>
+   * Lookup380: frame_system::extensions::check_weight::CheckWeight<T>
    **/
   FrameSystemExtensionsCheckWeight: 'Null',
   /**
-   * Lookup377: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
+   * Lookup381: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
    **/
   PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact<u128>',
   /**
-   * Lookup378: opal_runtime::Runtime
+   * Lookup382: opal_runtime::Runtime
    **/
   OpalRuntimeRuntime: 'Null'
 };
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -2,7 +2,7 @@
 /* eslint-disable */
 
 declare module '@polkadot/types/lookup' {
-  import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
+  import type { BTreeMap, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
   import type { ITuple } from '@polkadot/types-codec/types';
   import type { AccountId32, Call, H160, H256, MultiAddress, Perbill } from '@polkadot/types/interfaces/runtime';
   import type { Event } from '@polkadot/types/interfaces/system';
@@ -23,7 +23,7 @@
 
   /** @name SpTrieStorageProof (10) */
   export interface SpTrieStorageProof extends Struct {
-    readonly trieNodes: BTreeSet<Bytes>;
+    readonly trieNodes: Vec<Bytes>;
   }
 
   /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (13) */
@@ -1605,7 +1605,7 @@
   }
 
   /** @name FrameSupportStorageBoundedBTreeSet (171) */
-  export interface FrameSupportStorageBoundedBTreeSet extends BTreeSet<u32> {}
+  export interface FrameSupportStorageBoundedBTreeSet extends Vec<u32> {}
 
   /** @name UpDataStructsMetaUpdatePermission (177) */
   export interface UpDataStructsMetaUpdatePermission extends Enum {
@@ -1622,14 +1622,10 @@
   }
 
   /** @name UpDataStructsPropertyPermission (181) */
-  export interface UpDataStructsPropertyPermission extends Enum {
-    readonly isNone: boolean;
-    readonly isAdminConst: boolean;
-    readonly isAdmin: boolean;
-    readonly isItemOwnerConst: boolean;
-    readonly isItemOwner: boolean;
-    readonly isItemOwnerOrAdmin: boolean;
-    readonly type: 'None' | 'AdminConst' | 'Admin' | 'ItemOwnerConst' | 'ItemOwner' | 'ItemOwnerOrAdmin';
+  export interface UpDataStructsPropertyPermission extends Struct {
+    readonly mutable: bool;
+    readonly collectionAdmin: bool;
+    readonly tokenOwner: bool;
   }
 
   /** @name UpDataStructsProperty (184) */
@@ -1662,6 +1658,7 @@
   export interface UpDataStructsCreateNftData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
+    readonly properties: Vec<UpDataStructsProperty>;
   }
 
   /** @name UpDataStructsCreateFungibleData (191) */
@@ -1693,6 +1690,7 @@
   export interface UpDataStructsCreateNftExData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
+    readonly properties: Vec<UpDataStructsProperty>;
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
@@ -2534,10 +2532,20 @@
     readonly alive: u32;
   }
 
-  /** @name PhantomTypeUpDataStructs (325) */
-  export interface PhantomTypeUpDataStructs extends Vec<UpDataStructsRpcCollection> {}
+  /** @name PhantomTypeUpDataStructsTokenData (325) */
+  export interface PhantomTypeUpDataStructsTokenData extends Vec<UpDataStructsTokenData> {}
+
+  /** @name UpDataStructsTokenData (326) */
+  export interface UpDataStructsTokenData extends Struct {
+    readonly constData: Bytes;
+    readonly properties: Vec<UpDataStructsProperty>;
+    readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;
+  }
+
+  /** @name PhantomTypeUpDataStructsRpcCollection (329) */
+  export interface PhantomTypeUpDataStructsRpcCollection extends Vec<UpDataStructsRpcCollection> {}
 
-  /** @name UpDataStructsRpcCollection (326) */
+  /** @name UpDataStructsRpcCollection (330) */
   export interface UpDataStructsRpcCollection extends Struct {
     readonly owner: AccountId32;
     readonly mode: UpDataStructsCollectionMode;
@@ -2555,7 +2563,7 @@
     readonly metaUpdatePermission: UpDataStructsMetaUpdatePermission;
   }
 
-  /** @name PalletCommonError (328) */
+  /** @name PalletCommonError (332) */
   export interface PalletCommonError extends Enum {
     readonly isCollectionNotFound: boolean;
     readonly isMustBeTokenOwner: boolean;
@@ -2590,46 +2598,46 @@
     readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'TokenVariableDataLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'NestingIsDisabled' | 'OnlyOwnerAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached';
   }
 
-  /** @name PalletFungibleError (330) */
+  /** @name PalletFungibleError (334) */
   export interface PalletFungibleError extends Enum {
     readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isFungibleItemsHaveNoId: boolean;
     readonly isFungibleItemsDontHaveData: boolean;
     readonly isFungibleDisallowsNesting: boolean;
-    readonly isPropertiesNotAllowed: boolean;
-    readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'PropertiesNotAllowed';
+    readonly isSettingPropertiesNotAllowed: boolean;
+    readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
   }
 
-  /** @name PalletRefungibleItemData (331) */
+  /** @name PalletRefungibleItemData (335) */
   export interface PalletRefungibleItemData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
   }
 
-  /** @name PalletRefungibleError (335) */
+  /** @name PalletRefungibleError (339) */
   export interface PalletRefungibleError extends Enum {
     readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isWrongRefungiblePieces: boolean;
     readonly isRefungibleDisallowsNesting: boolean;
-    readonly isPropertiesNotAllowed: boolean;
-    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'PropertiesNotAllowed';
+    readonly isSettingPropertiesNotAllowed: boolean;
+    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
   }
 
-  /** @name PalletNonfungibleItemData (336) */
+  /** @name PalletNonfungibleItemData (340) */
   export interface PalletNonfungibleItemData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
-  /** @name PalletNonfungibleError (337) */
+  /** @name PalletNonfungibleError (341) */
   export interface PalletNonfungibleError extends Enum {
     readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isNonfungibleItemsHaveNoAmount: boolean;
     readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount';
   }
 
-  /** @name PalletStructureError (338) */
+  /** @name PalletStructureError (342) */
   export interface PalletStructureError extends Enum {
     readonly isOuroborosDetected: boolean;
     readonly isDepthLimit: boolean;
@@ -2637,7 +2645,7 @@
     readonly type: 'OuroborosDetected' | 'DepthLimit' | 'TokenNotFound';
   }
 
-  /** @name PalletEvmError (340) */
+  /** @name PalletEvmError (344) */
   export interface PalletEvmError extends Enum {
     readonly isBalanceLow: boolean;
     readonly isFeeOverflow: boolean;
@@ -2648,7 +2656,7 @@
     readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';
   }
 
-  /** @name FpRpcTransactionStatus (343) */
+  /** @name FpRpcTransactionStatus (347) */
   export interface FpRpcTransactionStatus extends Struct {
     readonly transactionHash: H256;
     readonly transactionIndex: u32;
@@ -2659,10 +2667,10 @@
     readonly logsBloom: EthbloomBloom;
   }
 
-  /** @name EthbloomBloom (346) */
+  /** @name EthbloomBloom (350) */
   export interface EthbloomBloom extends U8aFixed {}
 
-  /** @name EthereumReceiptReceiptV3 (348) */
+  /** @name EthereumReceiptReceiptV3 (352) */
   export interface EthereumReceiptReceiptV3 extends Enum {
     readonly isLegacy: boolean;
     readonly asLegacy: EthereumReceiptEip658ReceiptData;
@@ -2673,7 +2681,7 @@
     readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';
   }
 
-  /** @name EthereumReceiptEip658ReceiptData (349) */
+  /** @name EthereumReceiptEip658ReceiptData (353) */
   export interface EthereumReceiptEip658ReceiptData extends Struct {
     readonly statusCode: u8;
     readonly usedGas: U256;
@@ -2681,14 +2689,14 @@
     readonly logs: Vec<EthereumLog>;
   }
 
-  /** @name EthereumBlock (350) */
+  /** @name EthereumBlock (354) */
   export interface EthereumBlock extends Struct {
     readonly header: EthereumHeader;
     readonly transactions: Vec<EthereumTransactionTransactionV2>;
     readonly ommers: Vec<EthereumHeader>;
   }
 
-  /** @name EthereumHeader (351) */
+  /** @name EthereumHeader (355) */
   export interface EthereumHeader extends Struct {
     readonly parentHash: H256;
     readonly ommersHash: H256;
@@ -2707,24 +2715,24 @@
     readonly nonce: EthereumTypesHashH64;
   }
 
-  /** @name EthereumTypesHashH64 (352) */
+  /** @name EthereumTypesHashH64 (356) */
   export interface EthereumTypesHashH64 extends U8aFixed {}
 
-  /** @name PalletEthereumError (357) */
+  /** @name PalletEthereumError (361) */
   export interface PalletEthereumError extends Enum {
     readonly isInvalidSignature: boolean;
     readonly isPreLogExists: boolean;
     readonly type: 'InvalidSignature' | 'PreLogExists';
   }
 
-  /** @name PalletEvmCoderSubstrateError (358) */
+  /** @name PalletEvmCoderSubstrateError (362) */
   export interface PalletEvmCoderSubstrateError extends Enum {
     readonly isOutOfGas: boolean;
     readonly isOutOfFund: boolean;
     readonly type: 'OutOfGas' | 'OutOfFund';
   }
 
-  /** @name PalletEvmContractHelpersSponsoringModeT (359) */
+  /** @name PalletEvmContractHelpersSponsoringModeT (363) */
   export interface PalletEvmContractHelpersSponsoringModeT extends Enum {
     readonly isDisabled: boolean;
     readonly isAllowlisted: boolean;
@@ -2732,20 +2740,20 @@
     readonly type: 'Disabled' | 'Allowlisted' | 'Generous';
   }
 
-  /** @name PalletEvmContractHelpersError (361) */
+  /** @name PalletEvmContractHelpersError (365) */
   export interface PalletEvmContractHelpersError extends Enum {
     readonly isNoPermission: boolean;
     readonly type: 'NoPermission';
   }
 
-  /** @name PalletEvmMigrationError (362) */
+  /** @name PalletEvmMigrationError (366) */
   export interface PalletEvmMigrationError extends Enum {
     readonly isAccountNotEmpty: boolean;
     readonly isAccountIsNotMigrating: boolean;
     readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';
   }
 
-  /** @name SpRuntimeMultiSignature (364) */
+  /** @name SpRuntimeMultiSignature (368) */
   export interface SpRuntimeMultiSignature extends Enum {
     readonly isEd25519: boolean;
     readonly asEd25519: SpCoreEd25519Signature;
@@ -2756,31 +2764,31 @@
     readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';
   }
 
-  /** @name SpCoreEd25519Signature (365) */
+  /** @name SpCoreEd25519Signature (369) */
   export interface SpCoreEd25519Signature extends U8aFixed {}
 
-  /** @name SpCoreSr25519Signature (367) */
+  /** @name SpCoreSr25519Signature (371) */
   export interface SpCoreSr25519Signature extends U8aFixed {}
 
-  /** @name SpCoreEcdsaSignature (368) */
+  /** @name SpCoreEcdsaSignature (372) */
   export interface SpCoreEcdsaSignature extends U8aFixed {}
 
-  /** @name FrameSystemExtensionsCheckSpecVersion (371) */
+  /** @name FrameSystemExtensionsCheckSpecVersion (375) */
   export type FrameSystemExtensionsCheckSpecVersion = Null;
 
-  /** @name FrameSystemExtensionsCheckGenesis (372) */
+  /** @name FrameSystemExtensionsCheckGenesis (376) */
   export type FrameSystemExtensionsCheckGenesis = Null;
 
-  /** @name FrameSystemExtensionsCheckNonce (375) */
+  /** @name FrameSystemExtensionsCheckNonce (379) */
   export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}
 
-  /** @name FrameSystemExtensionsCheckWeight (376) */
+  /** @name FrameSystemExtensionsCheckWeight (380) */
   export type FrameSystemExtensionsCheckWeight = Null;
 
-  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (377) */
+  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (381) */
   export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}
 
-  /** @name OpalRuntimeRuntime (378) */
+  /** @name OpalRuntimeRuntime (382) */
   export type OpalRuntimeRuntime = Null;
 
 } // declare module
modifiedtests/src/interfaces/unique/definitions.tsdiffbeforeafterboth
--- a/tests/src/interfaces/unique/definitions.ts
+++ b/tests/src/interfaces/unique/definitions.ts
@@ -54,13 +54,26 @@
     topmostTokenOwner: fun('Get token owner, in case of nested token - find parent recursive', [collectionParam, tokenParam], `Option<${CROSS_ACCOUNT_ID_TYPE}>`),
     constMetadata: fun('Get token constant metadata', [collectionParam, tokenParam], 'Vec<u8>'),
     variableMetadata: fun('Get token variable metadata', [collectionParam, tokenParam], 'Vec<u8>'),
-
     collectionProperties: fun(
       'Get collection properties',
       [collectionParam, propertyKeysParam],
       'Vec<UpDataStructsProperty>',
     ),
-
+    tokenProperties: fun(
+      'Get token properties',
+      [collectionParam, tokenParam, propertyKeysParam],
+      'Vec<UpDataStructsProperty>',
+    ),
+    propertyPermissions: fun(
+      'Get property permissions',
+      [collectionParam, propertyKeysParam],
+      'Vec<UpDataStructsPropertyKeyPermission>',
+    ),
+    tokenData: fun(
+      'Get token data',
+      [collectionParam, tokenParam, propertyKeysParam],
+      'UpDataStructsTokenData',
+    ),
     tokenExists: fun('Check if token exists', [collectionParam, tokenParam], 'bool'),
     collectionById: fun('Get collection by specified id', [collectionParam], 'Option<UpDataStructsRpcCollection>'),
     collectionStats: fun('Get collection stats', [], 'UpDataStructsCollectionStats'),
modifiedtests/src/interfaces/unique/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/unique/types.ts
+++ b/tests/src/interfaces/unique/types.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-defs`, do not edit
 /* eslint-disable */
 
-import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
+import type { BTreeMap, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { ITuple } from '@polkadot/types-codec/types';
 import type { AccountId32, Call, H160, H256, MultiAddress, Perbill } from '@polkadot/types/interfaces/runtime';
 import type { Event } from '@polkadot/types/interfaces/system';
@@ -447,7 +447,7 @@
 export interface FrameSupportPalletId extends U8aFixed {}
 
 /** @name FrameSupportStorageBoundedBTreeSet */
-export interface FrameSupportStorageBoundedBTreeSet extends BTreeSet<u32> {}
+export interface FrameSupportStorageBoundedBTreeSet extends Vec<u32> {}
 
 /** @name FrameSupportTokensMiscBalanceStatus */
 export interface FrameSupportTokensMiscBalanceStatus extends Enum {
@@ -1086,8 +1086,8 @@
   readonly isFungibleItemsHaveNoId: boolean;
   readonly isFungibleItemsDontHaveData: boolean;
   readonly isFungibleDisallowsNesting: boolean;
-  readonly isPropertiesNotAllowed: boolean;
-  readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'PropertiesNotAllowed';
+  readonly isSettingPropertiesNotAllowed: boolean;
+  readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
 }
 
 /** @name PalletInflationCall */
@@ -1118,8 +1118,8 @@
   readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;
   readonly isWrongRefungiblePieces: boolean;
   readonly isRefungibleDisallowsNesting: boolean;
-  readonly isPropertiesNotAllowed: boolean;
-  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'PropertiesNotAllowed';
+  readonly isSettingPropertiesNotAllowed: boolean;
+  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
 }
 
 /** @name PalletRefungibleItemData */
@@ -1632,8 +1632,11 @@
   readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';
 }
 
-/** @name PhantomTypeUpDataStructs */
-export interface PhantomTypeUpDataStructs extends Vec<Lookup326> {}
+/** @name PhantomTypeUpDataStructsRpcCollection */
+export interface PhantomTypeUpDataStructsRpcCollection extends Vec<Lookup330> {}
+
+/** @name PhantomTypeUpDataStructsTokenData */
+export interface PhantomTypeUpDataStructsTokenData extends Vec<Lookup326> {}
 
 /** @name PolkadotCorePrimitivesInboundDownwardMessage */
 export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {
@@ -1782,7 +1785,7 @@
 
 /** @name SpTrieStorageProof */
 export interface SpTrieStorageProof extends Struct {
-  readonly trieNodes: BTreeSet<Bytes>;
+  readonly trieNodes: Vec<Bytes>;
 }
 
 /** @name SpVersionRuntimeVersion */
@@ -1908,12 +1911,14 @@
 export interface UpDataStructsCreateNftData extends Struct {
   readonly constData: Bytes;
   readonly variableData: Bytes;
+  readonly properties: Vec<UpDataStructsProperty>;
 }
 
 /** @name UpDataStructsCreateNftExData */
 export interface UpDataStructsCreateNftExData extends Struct {
   readonly constData: Bytes;
   readonly variableData: Bytes;
+  readonly properties: Vec<UpDataStructsProperty>;
   readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
 }
 
@@ -1968,14 +1973,10 @@
 }
 
 /** @name UpDataStructsPropertyPermission */
-export interface UpDataStructsPropertyPermission extends Enum {
-  readonly isNone: boolean;
-  readonly isAdminConst: boolean;
-  readonly isAdmin: boolean;
-  readonly isItemOwnerConst: boolean;
-  readonly isItemOwner: boolean;
-  readonly isItemOwnerOrAdmin: boolean;
-  readonly type: 'None' | 'AdminConst' | 'Admin' | 'ItemOwnerConst' | 'ItemOwner' | 'ItemOwnerOrAdmin';
+export interface UpDataStructsPropertyPermission extends Struct {
+  readonly mutable: bool;
+  readonly collectionAdmin: bool;
+  readonly tokenOwner: bool;
 }
 
 /** @name UpDataStructsRpcCollection */
@@ -2021,6 +2022,13 @@
   readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';
 }
 
+/** @name UpDataStructsTokenData */
+export interface UpDataStructsTokenData extends Struct {
+  readonly constData: Bytes;
+  readonly properties: Vec<UpDataStructsProperty>;
+  readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;
+}
+
 /** @name XcmDoubleEncoded */
 export interface XcmDoubleEncoded extends Struct {
   readonly encoded: Bytes;
modifiedtests/src/nesting/migration-check.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/migration-check.test.ts
+++ b/tests/src/nesting/migration-check.test.ts
@@ -5,6 +5,8 @@
 import {IKeyringPair} from '@polkadot/types/types';
 import {strToUTF16} from '../util/util';
 import waitNewBlocks from '../substrate/wait-new-blocks';
+// Used for polkadot-launch signalling
+import find from 'find-process';
 
 // todo skip
 describe('Migration testing for pallet-common', () => {
@@ -54,13 +56,12 @@
     let newVersion = oldVersion!;
     let connectionFailCounter = 0;
 
-    // Cooperate with polkadot-launch if it's running (assuming custom name change), and send a custom signal
-    const find = require('find-process');
-    find('name', 'polkadot-launch', true).then(function (list: [any]) {
-      for (let proc of list) {
+    // Cooperate with polkadot-launch if it's running (assuming custom name change to 'polkadot-launch'), and send a custom signal
+    find('name', 'polkadot-launch', true).then((list) => {
+      for (const proc of list) {
         process.kill(proc.pid, 'SIGUSR1');
       }
-    })
+    });
 
     // And wait for the parachain upgrade
     while (newVersion == oldVersion! && connectionFailCounter < 2) {
addedtests/src/nesting/properties.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/nesting/properties.test.ts
@@ -0,0 +1,652 @@
+import {expect} from 'chai';
+import privateKey from '../substrate/privateKey';
+import usingApi, {executeTransaction} from '../substrate/substrate-api';
+import {
+  addCollectionAdminExpectSuccess,
+  createCollectionExpectSuccess,
+  createItemExpectSuccess,
+  getCreateCollectionResult,
+  transferExpectSuccess,
+} from '../util/helpers';
+import {IKeyringPair} from '@polkadot/types/types';
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
+let charlie: IKeyringPair;
+
+// ---------- COLLECTION PROPERTIES
+
+describe('Integration Test: Collection Properties', () => {
+  before(async () => {
+    alice = privateKey('//Alice');
+    bob = privateKey('//Bob');
+  });
+
+  it('Reads properties from a collection', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+      const properties = (await api.query.common.collectionProperties(collection)).toJSON();
+      expect(properties.map).to.be.empty;
+      expect(properties.consumedSpace).to.equal(0);
+    });
+  });
+
+  it('Sets properties for a collection', async () => {
+    await usingApi(async api => {
+      const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: 'NFT'}));
+      const {collectionId} = getCreateCollectionResult(events);
+
+      // As owner
+      await expect(executeTransaction(
+        api, 
+        bob, 
+        api.tx.unique.setCollectionProperties(collectionId, [{key: 'electron', value: 'come bond'}]), 
+      )).to.not.be.rejected;
+
+      await addCollectionAdminExpectSuccess(bob, collectionId, alice.address);
+
+      // As administrator
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setCollectionProperties(collectionId, [{key: 'black hole'}]), 
+      )).to.not.be.rejected;
+
+      const properties = (await api.rpc.unique.collectionProperties(collectionId, ['electron', 'black hole'])).toJSON();
+      expect(properties).to.be.deep.equal([
+        {key: `0x${Buffer.from('electron').toString('hex')}`, value: `0x${Buffer.from('come bond').toString('hex')}`},
+        {key: `0x${Buffer.from('black hole').toString('hex')}`, value: `0x${Buffer.from('').toString('hex')}`},
+      ]);
+    });
+  });
+
+  it('Changes properties of a collection', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black hole'}]), 
+      )).to.not.be.rejected;
+
+      // Mutate the properties
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'bonded'}, {key: 'black hole', value: 'LIGO'}]), 
+      )).to.not.be.rejected;
+
+      const properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black hole'])).toJSON();
+      expect(properties).to.be.deep.equal([
+        {key: `0x${Buffer.from('electron').toString('hex')}`, value: `0x${Buffer.from('bonded').toString('hex')}`},
+        {key: `0x${Buffer.from('black hole').toString('hex')}`, value: `0x${Buffer.from('LIGO').toString('hex')}`},
+      ]);
+    });
+  });
+
+  it('Deletes properties of a collection', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black hole', value: 'LIGO'}]), 
+      )).to.not.be.rejected;
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.deleteCollectionProperties(collection, ['electron']), 
+      )).to.not.be.rejected;
+
+      const properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black hole'])).toJSON();
+      expect(properties).to.be.deep.equal([
+        {key: `0x${Buffer.from('black hole').toString('hex')}`, value: `0x${Buffer.from('LIGO').toString('hex')}`},
+      ]);
+    });
+  });
+});
+
+describe('Negative Integration Test: Collection Properties', () => {
+  before(async () => {
+    alice = privateKey('//Alice');
+    bob = privateKey('//Bob');
+  });
+  
+  it('Fails to set properties in a collection if not its onwer/administrator', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        bob, 
+        api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black hole', value: 'LIGO'}]), 
+      )).to.be.rejectedWith(/common\.NoPermission/);
+  
+      const properties = (await api.query.common.collectionProperties(collection)).toJSON();
+      expect(properties.map).to.be.empty;
+      expect(properties.consumedSpace).to.equal(0);
+    });
+  });
+  
+  it('Fails to set properties that exceed the limits', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+      const spaceLimit = (await api.query.common.collectionProperties(collection)).toJSON().spaceLimit as number; 
+
+      // Mute the general tx parsing error, too many bytes to process
+      {
+        console.error = () => {};
+        await expect(executeTransaction(
+          api, 
+          alice, 
+          api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))}]), 
+        )).to.be.rejected;
+      }
+
+      let properties = (await api.rpc.unique.collectionProperties(collection, ['electron'])).toJSON();
+      expect(properties).to.be.empty;
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setCollectionProperties(collection, [
+          {key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 18))}, 
+          {key: 'black hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))}, 
+        ]), 
+      )).to.be.rejectedWith(/common\.NoSpaceForProperty/);
+
+      properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black hole'])).toJSON();
+      expect(properties).to.be.empty;
+    });
+  });
+  
+  it('Fails to set more properties than it is allowed', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      const propertiesToBeSet = [];
+      for (let i = 0; i < 65; i++) {
+        propertiesToBeSet.push({
+          key: 'electron ' + i,
+          value: Math.random() > 0.5 ? 'high' : 'low',
+        });
+      }
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setCollectionProperties(collection, propertiesToBeSet), 
+      )).to.be.rejectedWith(/common\.PropertyLimitReached/);
+
+      const properties = (await api.query.common.collectionProperties(collection)).toJSON();
+      expect(properties.map).to.be.empty;
+      expect(properties.consumedSpace).to.equal(0);
+    });
+  });
+});
+
+// ---------- ACCESS RIGHTS
+
+describe('Integration Test: Access Rights to Token Properties', () => {
+  before(async () => {
+    alice = privateKey('//Alice');
+    bob = privateKey('//Bob');
+  });
+  
+  it('Reads access rights to properties of a collection', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+      const propertyRights = (await api.query.common.collectionPropertyPermissions(collection)).toJSON();
+      expect(propertyRights).to.be.empty;
+    });
+  });
+  
+  it('Sets access rights to properties of a collection', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true}}]), 
+      )).to.not.be.rejected;
+
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]), 
+      )).to.not.be.rejected;
+
+      const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery', 'mindgame'])).toJSON();
+      expect(propertyRights).to.be.deep.equal([
+        {key: `0x${Buffer.from('skullduggery').toString('hex')}`, permission: {'mutable': true, 'collectionAdmin': false, 'tokenOwner': false}},
+        {key: `0x${Buffer.from('mindgame').toString('hex')}`, permission: {'mutable': false, 'collectionAdmin': true, 'tokenOwner': false}},
+      ]);
+    });
+  });
+  
+  it('Changes access rights to properties of a collection', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]), 
+      )).to.not.be.rejected;
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), 
+      )).to.not.be.rejected;
+
+      const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toJSON();
+      expect(propertyRights).to.be.deep.equal([
+        {key: `0x${Buffer.from('skullduggery').toString('hex')}`, permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
+      ]);
+    });
+  });
+});
+
+describe('Negative Integration Test: Access Rights to Token Properties', () => {
+  before(async () => {
+    alice = privateKey('//Alice');
+    bob = privateKey('//Bob');
+  });
+
+  it('Prevents from setting access rights to properties of a collection if not an onwer/admin', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        bob, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]), 
+      )).to.be.rejectedWith(/common\.NoPermission/);
+
+      const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toJSON();
+      expect(propertyRights).to.be.empty;
+    });
+  });
+
+  it('Prevents from adding too many possible properties', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      const constitution = [];
+      for (let i = 0; i < 65; i++) {
+        constitution.push({
+          key: 'property ' + i,
+          permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {},
+        });
+      }
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, constitution), 
+      )).to.be.rejectedWith(/common\.PropertyLimitReached/);
+
+      const propertyRights = (await api.query.common.collectionPropertyPermissions(collection)).toJSON();
+      expect(propertyRights).to.be.empty;
+    });
+  });
+
+  it('Prevents access rights to be modified if constant', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), 
+      )).to.not.be.rejected;
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {}}]), 
+      )).to.be.rejectedWith(/common\.NoPermission/);
+
+      const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toJSON();
+      expect(propertyRights).to.deep.equal([
+        {key: `0x${Buffer.from('skullduggery').toString('hex')}`, permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
+      ]);
+    });
+  });
+});
+
+// ---------- TOKEN PROPERTIES
+
+describe('Integration Test: Token Properties', () => {
+  let collection: number;
+  let token: number;
+  let permissions: {permission: any, signers: IKeyringPair[]}[];
+
+  before(async () => {
+    alice = privateKey('//Alice');
+    bob = privateKey('//Bob');
+    charlie = privateKey('//Charlie');
+
+    permissions = [
+      {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]},
+      {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob]},
+      {permission: {mutable: true, tokenOwner: true}, signers: [charlie]},
+      {permission: {mutable: false, tokenOwner: true}, signers: [charlie]},
+      {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]},
+      {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie]},
+    ];
+  });
+
+  beforeEach(async () => {
+    collection = await createCollectionExpectSuccess();
+    token = await createItemExpectSuccess(alice, collection, 'NFT');
+    await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+    await transferExpectSuccess(collection, token, alice, charlie);
+  });
+  
+  it('Reads properties of a token', async () => {
+    await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess();
+      const token = await createItemExpectSuccess(alice, collection, 'NFT');
+  
+      const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
+      expect(properties.map).to.be.empty;
+      expect(properties.consumedSpace).to.be.equal(0);
+
+      const tokenData = (await api.rpc.unique.tokenData(collection, token, ['anything'])).toJSON().properties;
+      expect(tokenData).to.be.empty;
+    });
+  });
+
+  it('Assigns properties to a token according to permissions', async () => {
+    await usingApi(async api => {
+      const propertyKeys: string[] = [];
+      let i = 0;
+      for (const permission of permissions) {
+        for (const signer of permission.signers) {
+          const key = i + ' ' + signer.address;
+          propertyKeys.push(key);
+
+          await expect(executeTransaction(
+            api, 
+            alice, 
+            api.tx.unique.setPropertyPermissions(collection, [{key: key, permission: permission.permission}]), 
+          ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
+
+          await expect(executeTransaction(
+            api, 
+            signer, 
+            api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]), 
+          ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
+        }
+
+        i++;
+      }
+
+      const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toJSON() as any[];
+      const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toJSON().properties as any[];
+      for (let i = 0; i < properties.length; i++) {
+        expect(properties[i].value).to.be.equal(`0x${Buffer.from('Serotonin increase').toString('hex')}`);
+        expect(tokensData[i].value).to.be.equal(`0x${Buffer.from('Serotonin increase').toString('hex')}`);
+      }
+    });
+  });
+
+  it('Changes properties of a token according to permissions', async () => {
+    await usingApi(async api => {
+      const propertyKeys: string[] = [];
+      let i = 0;
+      for (const permission of permissions) {
+        if (!permission.permission.mutable) continue;
+        
+        for (const signer of permission.signers) {
+          const key = i + ' ' + signer.address;
+          propertyKeys.push(key);
+
+          await expect(executeTransaction(
+            api, 
+            alice, 
+            api.tx.unique.setPropertyPermissions(collection, [{key: key, permission: permission.permission}]), 
+          ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
+
+          await expect(executeTransaction(
+            api, 
+            signer, 
+            api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]), 
+          ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
+
+          await expect(executeTransaction(
+            api, 
+            signer, 
+            api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin stable'}]), 
+          ), `on changing property ${i} by ${signer.address}`).to.not.be.rejected;
+        }
+
+        i++;
+      }
+
+      const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toJSON() as any[];
+      const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toJSON().properties as any[];
+      for (let i = 0; i < properties.length; i++) {
+        expect(properties[i].value).to.be.equal(`0x${Buffer.from('Serotonin stable').toString('hex')}`);
+        expect(tokensData[i].value).to.be.equal(`0x${Buffer.from('Serotonin stable').toString('hex')}`);
+      }
+    });
+  });
+
+  it('Deletes properties of a token according to permissions', async () => {
+    await usingApi(async api => {
+      const propertyKeys: string[] = [];
+      let i = 0;
+
+      for (const permission of permissions) {
+        if (!permission.permission.mutable) continue;
+        
+        for (const signer of permission.signers) {
+          const key = i + ' ' + signer.address;
+          propertyKeys.push(key);
+
+          await expect(executeTransaction(
+            api, 
+            alice, 
+            api.tx.unique.setPropertyPermissions(collection, [{key: key, permission: permission.permission}]), 
+          ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
+
+          await expect(executeTransaction(
+            api, 
+            signer, 
+            api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]), 
+          ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
+
+          await expect(executeTransaction(
+            api, 
+            signer, 
+            api.tx.unique.deleteTokenProperties(collection, token, [key]), 
+          ), `on deleting property ${i} by ${signer.address}`).to.not.be.rejected;
+        }
+        
+        i++;
+      }
+
+      const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toJSON() as any[];
+      expect(properties).to.be.empty;
+      const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toJSON().properties as any[];
+      expect(tokensData).to.be.empty;
+      expect((await api.query.nonfungible.tokenProperties(collection, token)).toJSON().consumedSpace).to.be.equal(0);
+    });
+  });
+});
+
+describe('Negative Integration Test: Token Properties', () => {
+  let collection: number;
+  let token: number;
+  let originalSpace: number;
+  let constitution: {permission: any, signers: IKeyringPair[], sinner: IKeyringPair}[];
+
+  before(async () => {
+    alice = privateKey('//Alice');
+    bob = privateKey('//Bob');
+    charlie = privateKey('//Charlie');
+    const dave = privateKey('//Dave');
+
+    constitution = [
+      {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob], sinner: charlie},
+      {permission: {mutable: false, collectionAdmin: true}, signers: [alice, bob], sinner: charlie},
+      {permission: {mutable: true, tokenOwner: true}, signers: [charlie], sinner: alice},
+      {permission: {mutable: false, tokenOwner: true}, signers: [charlie], sinner: alice},
+      {permission: {mutable: true, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave},
+      {permission: {mutable: false, collectionAdmin: true, tokenOwner: true}, signers: [alice, bob, charlie], sinner: dave},
+    ];
+  });
+
+  beforeEach(async () => {
+    collection = await createCollectionExpectSuccess();
+    token = await createItemExpectSuccess(alice, collection, 'NFT');
+    await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+    await transferExpectSuccess(collection, token, alice, charlie);
+        
+    await usingApi(async api => {
+      let i = 0;
+      for (const passage of constitution) {
+        const signer = passage.signers[0];
+        
+        await expect(executeTransaction(
+          api, 
+          alice, 
+          api.tx.unique.setPropertyPermissions(collection, [{key: i, permission: passage.permission}]), 
+        ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
+
+        await expect(executeTransaction(
+          api, 
+          signer, 
+          api.tx.unique.setTokenProperties(collection, token, [{key: i, value: 'Serotonin increase'}]), 
+        ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
+
+        i++;
+      }
+
+      originalSpace = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON().consumedSpace as number;
+    });
+  });
+
+  it('Forbids changing/deleting properties of a token if the user is outside of permissions', async () => {
+    await usingApi(async api => {
+      let i = -1;
+      for (const forbiddance of constitution) {
+        i++;
+        if (!forbiddance.permission.mutable) continue;
+
+        await expect(executeTransaction(
+          api, 
+          forbiddance.sinner, 
+          api.tx.unique.setTokenProperties(collection, token, [{key: i, value: 'Serotonin down'}]), 
+        ), `on failing to change property ${i} by ${forbiddance.sinner.address}`).to.be.rejectedWith(/common\.NoPermission/);
+
+        await expect(executeTransaction(
+          api, 
+          forbiddance.sinner, 
+          api.tx.unique.deleteTokenProperties(collection, token, [forbiddance.permission]), 
+        ), `on failing to delete property ${i} by ${forbiddance.sinner.address}`).to.be.rejectedWith(/common\.NoPermission/);
+      }
+
+      // todo RPC?
+      const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
+      expect(properties.consumedSpace).to.be.equal(originalSpace);
+    });
+  });
+
+  it('Forbids changing/deleting properties of a token if the property is permanent (constant)', async () => {
+    await usingApi(async api => {
+      let i = -1;
+      for (const permission of constitution) {
+        i++;
+        if (permission.permission.mutable) continue;
+
+        await expect(executeTransaction(
+          api, 
+          permission.signers[0], 
+          api.tx.unique.setTokenProperties(collection, token, [{key: i, value: 'Serotonin down'}]), 
+        ), `on failing to change property ${i} by ${permission.signers[0].address}`).to.be.rejectedWith(/common\.NoPermission/);
+
+        await expect(executeTransaction(
+          api, 
+          permission.signers[0], 
+          api.tx.unique.deleteTokenProperties(collection, token, [i.toString()]), 
+        ), `on failing to delete property ${i} by ${permission.signers[0].address}`).to.be.rejectedWith(/common\.NoPermission/);
+      }
+
+      // todo RPC?
+      const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
+      expect(properties.consumedSpace).to.be.equal(originalSpace);
+    });
+  });
+
+  it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission', async () => {
+    await usingApi(async api => {
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [{key: 'non-existent', value: 'I exist!'}]), 
+      ), 'on failing to add a previously non-existent property').to.be.rejectedWith(/common\.NoPermission/);
+        
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [{key: 'now-existent', permission: {}}]), 
+      ), 'on setting a new non-permitted property').to.not.be.rejected;
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [{key: 'now-existent', value: 'I exist!'}]), 
+      ), 'on failing to add a property forbidden by the \'None\' permission').to.be.rejectedWith(/common\.NoPermission/);
+
+      expect((await api.rpc.unique.tokenProperties(collection, token, ['non-existent', 'now-existent'])).toJSON()).to.be.empty;
+      const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
+      expect(properties.consumedSpace).to.be.equal(originalSpace);
+    });
+  });
+
+  it('Forbids adding too many properties to a token', async () => {
+    await usingApi(async api => {
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setPropertyPermissions(collection, [
+          {key: 'a holy book', permission: {collectionAdmin: true, tokenOwner: true}}, 
+          {key: 'young years', permission: {collectionAdmin: true, tokenOwner: true}},
+        ]), 
+      ), 'on setting a new non-permitted property').to.not.be.rejected;
+
+      // Mute the general tx parsing error
+      {
+        console.error = () => {};
+        await expect(executeTransaction(
+          api, 
+          alice, 
+          api.tx.unique.setCollectionProperties(collection, [{key: 'a holy book', value: 'word '.repeat(6554)}]), 
+        )).to.be.rejected;
+      }
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [
+          {key: 'a holy book', value: 'word '.repeat(3277)}, 
+          {key: 'young years', value: 'neverending'.repeat(1490)},
+        ]), 
+      )).to.be.rejectedWith(/common\.NoSpaceForProperty/);
+
+      expect((await api.rpc.unique.tokenProperties(collection, token, ['a holy book', 'young years'])).toJSON()).to.be.empty;
+      const propertiesMap = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
+      expect(propertiesMap.consumedSpace).to.be.equal(originalSpace);
+    });
+  });
+});
\ No newline at end of file
modifiedtests/src/nesting/unnest.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/unnest.test.ts
+++ b/tests/src/nesting/unnest.test.ts
@@ -10,7 +10,6 @@
   getTopmostTokenOwner, 
   normalizeAccountId, 
   setCollectionLimitsExpectSuccess, 
-  transferExpectFailure, 
   transferExpectSuccess, 
 } from '../util/helpers';
 import {IKeyringPair} from '@polkadot/types/types';