git.delta.rocks / unique-network / refs/commits / 0f4242c739ad

difftreelog

feat add ApproveFrom eth mirror

Grigoriy Simonov2023-01-09parent: #fe83568.patch.diff
in: master

26 files changed

modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -746,6 +746,8 @@
 		ApprovedValueTooLow,
 		/// Tried to approve more than owned
 		CantApproveMoreThanOwned,
+		/// Only spending from eth mirror could be approved
+		AddressIsNotEthMirror,
 
 		/// Can't transfer tokens to ethereum zero address
 		AddressIsZero,
@@ -1797,6 +1799,9 @@
 	/// The price of setting the permission of the operation from another user.
 	fn approve() -> Weight;
 
+	/// The price of setting the permission of the operation from another user for eth mirror.
+	fn approve_from() -> Weight;
+
 	/// Transfer price from another user.
 	fn transfer_from() -> Weight;
 
@@ -2008,6 +2013,22 @@
 		amount: u128,
 	) -> DispatchResultWithPostInfo;
 
+	/// Grant access to another account to transfer parts of the token owned by the calling user's eth mirror via [Self::transfer_from].
+	///
+	/// * `sender` - The user who grants access to the token.
+	/// * `from` - Spender's eth mirror.
+	/// * `to` - The user to whom the rights are granted.
+	/// * `token` - The token to which access is granted.
+	/// * `amount` - The amount of pieces that another user can dispose of.
+	fn approve_from(
+		&self,
+		sender: T::CrossAccountId,
+		from: T::CrossAccountId,
+		to: T::CrossAccountId,
+		token: TokenId,
+		amount: u128,
+	) -> DispatchResultWithPostInfo;
+
 	/// Send parts of a token owned by another user.
 	///
 	/// Before calling this method, you must grant rights to the calling user via [`Self::approve`].
modifiedpallets/evm-contract-helpers/src/stubs/ContractHelpers.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/evm-contract-helpers/src/stubs/ContractHelpers.soldiffbeforeafterboth
--- a/pallets/evm-contract-helpers/src/stubs/ContractHelpers.sol
+++ b/pallets/evm-contract-helpers/src/stubs/ContractHelpers.sol
@@ -283,8 +283,8 @@
 
 /// Ethereum representation of Optional value with CrossAddress.
 struct OptionCrossAddress {
-	/// TODO: field description
+	/// Whether or not this CrossAdress is valid and has meaning.
 	bool status;
-	/// TODO: field description
+	/// The underlying CrossAddress value. If the status is false, can be set to whatever.
 	CrossAddress value;
 }
modifiedpallets/fungible/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/fungible/src/benchmarking.rs
+++ b/pallets/fungible/src/benchmarking.rs
@@ -82,6 +82,16 @@
 		<Pallet<T>>::create_item(&collection, &owner, (sender.clone(), 200), &Unlimited)?;
 	}: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, 100)?}
 
+	approve_from {
+		bench_init!{
+			owner: sub; collection: collection(owner);
+			owner: cross_from_sub; sender: cross_sub; spender: cross_sub;
+
+		};
+		let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());
+		<Pallet<T>>::create_item(&collection, &owner, (owner_eth.clone(), 200), &Unlimited)?;
+	}: {<Pallet<T>>::set_allowance_for(&collection, &sender, &owner_eth, &spender, 100)?}
+
 	transfer_from {
 		bench_init!{
 			owner: sub; collection: collection(owner);
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -87,6 +87,10 @@
 		<SelfWeightOf<T>>::approve()
 	}
 
+	fn approve_from() -> Weight {
+		<SelfWeightOf<T>>::approve_from()
+	}
+
 	fn transfer_from() -> Weight {
 		<SelfWeightOf<T>>::transfer_from()
 	}
@@ -254,6 +258,25 @@
 		)
 	}
 
+	fn approve_from(
+		&self,
+		sender: T::CrossAccountId,
+		from: T::CrossAccountId,
+		to: T::CrossAccountId,
+		token: TokenId,
+		amount: u128,
+	) -> DispatchResultWithPostInfo {
+		ensure!(
+			token == TokenId::default(),
+			<Error<T>>::FungibleItemsHaveNoId
+		);
+
+		with_weight(
+			<Pallet<T>>::set_allowance_for(self, &sender, &from, &to, amount),
+			<CommonWeights<T>>::approve_from(),
+		)
+	}
+
 	fn transfer_from(
 		&self,
 		sender: T::CrossAccountId,
modifiedpallets/fungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -613,6 +613,45 @@
 		Ok(())
 	}
 
+	/// Set allowance for the spender to `transfer` or `burn` owner's tokens from eth mirror.
+	///
+	/// - `collection`: Collection that contains the token
+	/// - `sender`: Owner of tokens that sets the allowance.
+	/// - `from`: Owner's eth mirror.
+	/// - `to`: Recipient of the allowance rights.
+	/// - `amount`: Amount of tokens the spender is allowed to `transfer` or `burn`.
+	pub fn set_allowance_for(
+		collection: &FungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		from: &T::CrossAccountId,
+		to: &T::CrossAccountId,
+		amount: u128,
+	) -> DispatchResult {
+		if collection.permissions.access() == AccessMode::AllowList {
+			collection.check_allowlist(sender)?;
+			collection.check_allowlist(from)?;
+			collection.check_allowlist(to)?;
+		}
+
+		ensure!(
+			*sender.as_eth() == *from.as_eth(),
+			<CommonError<T>>::AddressIsNotEthMirror
+		);
+
+		if <Balance<T>>::get((collection.id, from)) < amount {
+			ensure!(
+				collection.limits.owner_can_transfer()
+					&& (collection.is_owner_or_admin(sender) || collection.is_owner_or_admin(from)),
+				<CommonError<T>>::CantApproveMoreThanOwned
+			);
+		}
+
+		// =========
+
+		Self::set_allowance_unchecked(collection, from, to, amount);
+		Ok(())
+	}
+
 	/// Checks if a non-owner has (enough) allowance from the owner to perform operations on the tokens.
 	/// Returns the expected remaining allowance - it should be set manually if the transaction proceeds.
 	///
modifiedpallets/fungible/src/weights.rsdiffbeforeafterboth
--- a/pallets/fungible/src/weights.rs
+++ b/pallets/fungible/src/weights.rs
@@ -39,6 +39,7 @@
 	fn burn_item() -> Weight;
 	fn transfer() -> Weight;
 	fn approve() -> Weight;
+	fn approve_from() -> Weight;
 	fn transfer_from() -> Weight;
 	fn burn_from() -> Weight;
 }
@@ -84,6 +85,13 @@
 			.saturating_add(T::DbWeight::get().reads(1 as u64))
 			.saturating_add(T::DbWeight::get().writes(1 as u64))
 	}
+	// Storage: Fungible Balance (r:1 w:0)
+	// Storage: Fungible Allowance (r:0 w:1)
+	fn approve_from() -> Weight {
+		Weight::from_ref_time(19_817_000 as u64)
+			.saturating_add(T::DbWeight::get().reads(1 as u64))
+			.saturating_add(T::DbWeight::get().writes(1 as u64))
+	}
 	// Storage: Fungible Allowance (r:1 w:1)
 	// Storage: Fungible Balance (r:2 w:2)
 	fn transfer_from() -> Weight {
@@ -141,6 +149,13 @@
 			.saturating_add(RocksDbWeight::get().reads(1 as u64))
 			.saturating_add(RocksDbWeight::get().writes(1 as u64))
 	}
+	// Storage: Fungible Balance (r:1 w:0)
+	// Storage: Fungible Allowance (r:0 w:1)
+	fn approve_from() -> Weight {
+		Weight::from_ref_time(19_817_000 as u64)
+			.saturating_add(RocksDbWeight::get().reads(1 as u64))
+			.saturating_add(RocksDbWeight::get().writes(1 as u64))
+	}
 	// Storage: Fungible Allowance (r:1 w:1)
 	// Storage: Fungible Balance (r:2 w:2)
 	fn transfer_from() -> Weight {
modifiedpallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/benchmarking.rs
+++ b/pallets/nonfungible/src/benchmarking.rs
@@ -134,6 +134,15 @@
 		let item = create_max_item(&collection, &owner, sender.clone())?;
 	}: {<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&spender))?}
 
+	approve_from {
+		bench_init!{
+			owner: sub; collection: collection(owner);
+			owner: cross_from_sub; sender: cross_sub; spender: cross_sub;
+		};
+		let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());
+		let item = create_max_item(&collection, &owner, owner_eth.clone())?;
+	}: {<Pallet<T>>::set_allowance_for(&collection, &sender, &owner_eth, item, Some(&spender))?}
+
 	transfer_from {
 		bench_init!{
 			owner: sub; collection: collection(owner);
modifiedpallets/nonfungible/src/common.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -102,6 +102,10 @@
 		<SelfWeightOf<T>>::approve()
 	}
 
+	fn approve_from() -> Weight {
+		<SelfWeightOf<T>>::approve_from()
+	}
+
 	fn transfer_from() -> Weight {
 		<SelfWeightOf<T>>::transfer_from()
 	}
@@ -353,6 +357,26 @@
 		)
 	}
 
+	fn approve_from(
+		&self,
+		sender: T::CrossAccountId,
+		from: T::CrossAccountId,
+		to: T::CrossAccountId,
+		token: TokenId,
+		amount: u128,
+	) -> DispatchResultWithPostInfo {
+		ensure!(amount <= 1, <Error<T>>::NonfungibleItemsHaveNoAmount);
+
+		with_weight(
+			if amount == 1 {
+				<Pallet<T>>::set_allowance_for(self, &sender, &from, token, Some(&to))
+			} else {
+				<Pallet<T>>::set_allowance_for(self, &sender, &from, token, None)
+			},
+			<CommonWeights<T>>::approve_from(),
+		)
+	}
+
 	fn transfer_from(
 		&self,
 		sender: T::CrossAccountId,
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -1171,6 +1171,51 @@
 		Ok(())
 	}
 
+	/// Set allowance for the spender to `transfer` or `burn` sender's token from eth mirror.
+	///
+	/// - `from`: Address of sender's eth mirror.
+	/// - `to`: Adress of spender.
+	/// - `token`: Token the spender is allowed to `transfer` or `burn`.
+	pub fn set_allowance_for(
+		collection: &NonfungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		from: &T::CrossAccountId,
+		token: TokenId,
+		to: Option<&T::CrossAccountId>,
+	) -> DispatchResult {
+		if collection.permissions.access() == AccessMode::AllowList {
+			collection.check_allowlist(sender)?;
+			collection.check_allowlist(from)?;
+			if let Some(to) = to {
+				collection.check_allowlist(to)?;
+			}
+		}
+
+		if let Some(to) = to {
+			<PalletCommon<T>>::ensure_correct_receiver(to)?;
+		}
+
+		ensure!(
+			*sender.as_eth() == *from.as_eth(),
+			<CommonError<T>>::AddressIsNotEthMirror
+		);
+
+		let token_data =
+			<TokenData<T>>::get((collection.id, token)).ok_or(<CommonError<T>>::TokenNotFound)?;
+		if token_data.owner != *from {
+			ensure!(
+				collection.limits.owner_can_transfer()
+					&& (collection.is_owner_or_admin(sender) || collection.is_owner_or_admin(from)),
+				<CommonError<T>>::CantApproveMoreThanOwned
+			);
+		}
+
+		// =========
+
+		Self::set_allowance_unchecked(collection, from, token, to, false);
+		Ok(())
+	}
+
 	/// Checks allowance for the spender to use the token.
 	fn check_allowed(
 		collection: &NonfungibleHandle<T>,
modifiedpallets/nonfungible/src/weights.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/weights.rs
+++ b/pallets/nonfungible/src/weights.rs
@@ -42,6 +42,7 @@
 	fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight;
 	fn transfer() -> Weight;
 	fn approve() -> Weight;
+	fn approve_from() -> Weight;
 	fn transfer_from() -> Weight;
 	fn burn_from() -> Weight;
 	fn set_token_property_permissions(b: u32, ) -> Weight;
@@ -147,6 +148,13 @@
 			.saturating_add(T::DbWeight::get().reads(2 as u64))
 			.saturating_add(T::DbWeight::get().writes(1 as u64))
 	}
+	// Storage: Nonfungible TokenData (r:1 w:0)
+	// Storage: Nonfungible Allowance (r:1 w:1)
+	fn approve_from() -> Weight {
+		Weight::from_ref_time(18_965_000 as u64)
+			.saturating_add(T::DbWeight::get().reads(2 as u64))
+			.saturating_add(T::DbWeight::get().writes(1 as u64))
+	}
 	// Storage: Nonfungible Allowance (r:1 w:1)
 	// Storage: Nonfungible TokenData (r:1 w:1)
 	// Storage: Nonfungible AccountBalance (r:2 w:2)
@@ -310,6 +318,13 @@
 			.saturating_add(RocksDbWeight::get().reads(2 as u64))
 			.saturating_add(RocksDbWeight::get().writes(1 as u64))
 	}
+	// Storage: Nonfungible TokenData (r:1 w:0)
+	// Storage: Nonfungible Allowance (r:1 w:1)
+	fn approve_from() -> Weight {
+		Weight::from_ref_time(18_965_000 as u64)
+			.saturating_add(RocksDbWeight::get().reads(2 as u64))
+			.saturating_add(RocksDbWeight::get().writes(1 as u64))
+	}
 	// Storage: Nonfungible Allowance (r:1 w:1)
 	// Storage: Nonfungible TokenData (r:1 w:1)
 	// Storage: Nonfungible AccountBalance (r:2 w:2)
modifiedpallets/refungible/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/refungible/src/benchmarking.rs
+++ b/pallets/refungible/src/benchmarking.rs
@@ -163,6 +163,15 @@
 		let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;
 	}: {<Pallet<T>>::set_allowance(&collection, &sender, &spender, item, 100)?}
 
+	approve_from {
+		bench_init!{
+			owner: sub; collection: collection(owner);
+			owner: cross_from_sub; sender: cross_sub; spender: cross_sub;
+		};
+		let owner_eth = T::CrossAccountId::from_eth(*sender.as_eth());
+		let item = create_max_item(&collection, &owner, [(owner_eth.clone(), 200)])?;
+	}: {<Pallet<T>>::set_allowance_for(&collection, &sender, &owner_eth, &spender, item, 100)?}
+
 	transfer_from_normal {
 		bench_init!{
 			owner: sub; collection: collection(owner);
modifiedpallets/refungible/src/common.rsdiffbeforeafterboth
--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -127,6 +127,10 @@
 		<SelfWeightOf<T>>::approve()
 	}
 
+	fn approve_from() -> Weight {
+		<SelfWeightOf<T>>::approve_from()
+	}
+
 	fn transfer_from() -> Weight {
 		max_weight_of!(
 			transfer_from_normal(),
@@ -314,6 +318,20 @@
 		)
 	}
 
+	fn approve_from(
+		&self,
+		sender: T::CrossAccountId,
+		from: T::CrossAccountId,
+		to: T::CrossAccountId,
+		token_id: TokenId,
+		amount: u128,
+	) -> DispatchResultWithPostInfo {
+		with_weight(
+			<Pallet<T>>::set_allowance_for(self, &sender, &from, &to, token_id, amount),
+			<CommonWeights<T>>::approve_from(),
+		)
+	}
+
 	fn transfer_from(
 		&self,
 		sender: T::CrossAccountId,
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -1102,6 +1102,47 @@
 		Ok(())
 	}
 
+	/// Set allowance to spend from sender's eth mirror
+	///
+	/// - `from`: Address of sender's eth mirror.
+	/// - `to`: Adress of spender.
+	/// - `amount`: Amount of token pieces the spender is allowed to `transfer` or `burn.
+	pub fn set_allowance_for(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		from: &T::CrossAccountId,
+		to: &T::CrossAccountId,
+		token_id: TokenId,
+		amount: u128,
+	) -> DispatchResult {
+		if collection.permissions.access() == AccessMode::AllowList {
+			collection.check_allowlist(sender)?;
+			collection.check_allowlist(from)?;
+			collection.check_allowlist(to)?;
+		}
+
+		<PalletCommon<T>>::ensure_correct_receiver(to)?;
+
+		ensure!(
+			*sender.as_eth() == *from.as_eth(),
+			<CommonError<T>>::AddressIsNotEthMirror
+		);
+
+		if <Balance<T>>::get((collection.id, token_id, from)) < amount {
+			ensure!(
+				collection.limits.owner_can_transfer()
+					&& (collection.is_owner_or_admin(sender) || collection.is_owner_or_admin(from))
+					&& Self::token_exists(collection, token_id),
+				<CommonError<T>>::CantApproveMoreThanOwned
+			);
+		}
+
+		// =========
+
+		Self::set_allowance_unchecked(collection, from, to, token_id, amount);
+		Ok(())
+	}
+
 	/// Returns allowance, which should be set after transaction
 	fn check_allowed(
 		collection: &RefungibleHandle<T>,
modifiedpallets/refungible/src/weights.rsdiffbeforeafterboth
--- a/pallets/refungible/src/weights.rs
+++ b/pallets/refungible/src/weights.rs
@@ -45,6 +45,7 @@
 	fn transfer_removing() -> Weight;
 	fn transfer_creating_removing() -> Weight;
 	fn approve() -> Weight;
+	fn approve_from() -> Weight;
 	fn transfer_from_normal() -> Weight;
 	fn transfer_from_creating() -> Weight;
 	fn transfer_from_removing() -> Weight;
@@ -175,6 +176,13 @@
 			.saturating_add(T::DbWeight::get().reads(1 as u64))
 			.saturating_add(T::DbWeight::get().writes(1 as u64))
 	}
+	// Storage: Refungible Balance (r:1 w:0)
+	// Storage: Refungible Allowance (r:0 w:1)
+	fn approve_from() -> Weight {
+		Weight::from_ref_time(20_649_000 as u64)
+			.saturating_add(T::DbWeight::get().reads(1 as u64))
+			.saturating_add(T::DbWeight::get().writes(1 as u64))
+	}
 	// Storage: Refungible Allowance (r:1 w:1)
 	// Storage: Refungible CollectionAllowance (r:1 w:0)
 	// Storage: Refungible Balance (r:2 w:2)
@@ -400,6 +408,13 @@
 			.saturating_add(RocksDbWeight::get().reads(1 as u64))
 			.saturating_add(RocksDbWeight::get().writes(1 as u64))
 	}
+	// Storage: Refungible Balance (r:1 w:0)
+	// Storage: Refungible Allowance (r:0 w:1)
+	fn approve_from() -> Weight {
+		Weight::from_ref_time(20_649_000 as u64)
+			.saturating_add(RocksDbWeight::get().reads(1 as u64))
+			.saturating_add(RocksDbWeight::get().writes(1 as u64))
+	}
 	// Storage: Refungible Allowance (r:1 w:1)
 	// Storage: Refungible CollectionAllowance (r:1 w:0)
 	// Storage: Refungible Balance (r:2 w:2)
modifiedpallets/unique/src/lib.rsdiffbeforeafterboth
--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -851,6 +851,29 @@
 			dispatch_tx::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))
 		}
 
+		/// Allow a non-permissioned address to transfer or burn an item from owner's eth mirror.
+		///
+		/// # Permissions
+		///
+		/// * Collection owner
+		/// * Collection admin
+		/// * Current item owner
+		///
+		/// # Arguments
+		///
+		/// * `from`: Owner's account eth mirror
+		/// * `to`: Account to be approved to make specific transactions on non-owned tokens.
+		/// * `collection_id`: ID of the collection the item belongs to.
+		/// * `item_id`: ID of the item transactions on which are now approved.
+		/// * `amount`: Number of pieces of the item approved for a transaction (maximum of 1 for NFTs).
+		/// Set to 0 to revoke the approval.
+		#[weight = T::CommonWeightInfo::approve_from()]
+		pub fn approve_from(origin, from:T::CrossAccountId, to: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {
+			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+			dispatch_tx::<T, _>(collection_id, |d| d.approve_from(sender, from, to, item_id, amount))
+		}
+
 		/// Change ownership of an item on behalf of the owner as a non-owner account.
 		///
 		/// See the [`approve`][`Pallet::approve`] method for additional information.
modifiedruntime/common/identity.rsdiffbeforeafterboth
--- a/runtime/common/identity.rs
+++ b/runtime/common/identity.rs
@@ -21,9 +21,7 @@
 
 use sp_runtime::{
 	traits::{DispatchInfoOf, SignedExtension},
-	transaction_validity::{
-		TransactionValidity, ValidTransaction, InvalidTransaction, TransactionValidityError,
-	},
+	transaction_validity::{TransactionValidity, ValidTransaction, TransactionValidityError},
 };
 
 #[derive(Debug, Encode, Decode, PartialEq, Eq, Clone, TypeInfo)]
modifiedruntime/common/weights.rsdiffbeforeafterboth
--- a/runtime/common/weights.rs
+++ b/runtime/common/weights.rs
@@ -101,6 +101,10 @@
 		dispatch_weight::<T>() + max_weight_of!(approve())
 	}
 
+	fn approve_from() -> Weight {
+		dispatch_weight::<T>() + max_weight_of!(approve_from())
+	}
+
 	fn transfer_from() -> Weight {
 		dispatch_weight::<T>() + max_weight_of!(transfer_from())
 	}
modifiedtests/src/approve.test.tsdiffbeforeafterboth
--- a/tests/src/approve.test.ts
+++ b/tests/src/approve.test.ts
@@ -16,336 +16,521 @@
 
 import {IKeyringPair} from '@polkadot/types/types';
 import {expect, itSub, Pallets, usingPlaygrounds} from './util';
+import {CrossAccountId} from './util/playgrounds/unique';
+
 
 
-describe('Integration Test approve(spender, collection_id, item_id, amount):', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
+[
+  {method: 'approveToken', account: (account: IKeyringPair) => CrossAccountId.fromKeyring(account)},
+  {method: 'approveTokenFromEth', account: (account: IKeyringPair) => CrossAccountId.fromKeyring(account).toEthereum()},
+].map(testCase => {
+  describe(`Integration Test ${testCase.method}(spender, collection_id, item_id, amount):`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
     });
-  });
 
-  itSub('[nft] Execute the extrinsic and check approvedList', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});
-    await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.true;
-  });
+    itSub('[nft] Execute the extrinsic and check approvedList', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice)});
+      await (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.true;
+    });
+
+    itSub('[fungible] Execute the extrinsic and check approvedList', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(alice));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      const amount = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amount).to.be.equal(BigInt(1));
+    });
+
+    itSub.ifWithPallets('[refungible] Execute the extrinsic and check approvedList', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice), pieces: 100n});
+      await (helper.rft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      const amount = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amount).to.be.equal(BigInt(1));
+    });
+
+    itSub('[nft] Remove approval by using 0 amount', async ({helper}) => {
+      const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const collectionId = collection.collectionId;
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice)});
+      await (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.true;
+      await (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.false;
+    });
 
-  itSub('[fungible] Execute the extrinsic and check approvedList', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, {Substrate: alice.address});
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    const amount = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amount).to.be.equal(BigInt(1));
-  });
+    itSub('[fungible] Remove approval by using 0 amount', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(alice));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      const amountBefore = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountBefore).to.be.equal(BigInt(1));
 
-  itSub.ifWithPallets('[refungible] Execute the extrinsic and check approvedList', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
-    await helper.rft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    const amount = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amount).to.be.equal(BigInt(1));
-  });
+      await (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
+      const amountAfter = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountAfter).to.be.equal(BigInt(0));
+    });
 
-  itSub('[nft] Remove approval by using 0 amount', async ({helper}) => {
-    const collection = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const collectionId = collection.collectionId;
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});
-    await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.true;
-    await helper.signTransaction(alice, helper.constructApiCall('api.tx.unique.approve', [{Substrate: bob.address}, collectionId, tokenId, 0]));
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.false;
-  });
+    itSub.ifWithPallets('[refungible] Remove approval by using 0 amount', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice), pieces: 100n});
+      await (helper.rft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      const amountBefore = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountBefore).to.be.equal(BigInt(1));
 
-  itSub('[fungible] Remove approval by using 0 amount', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, {Substrate: alice.address});
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    const amountBefore = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountBefore).to.be.equal(BigInt(1));
+      await (helper.rft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
+      const amountAfter = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountAfter).to.be.equal(BigInt(0));
+    });
 
-    await helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
-    const amountAfter = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountAfter).to.be.equal(BigInt(0));
+    itSub('can`t be called by collection owner on non-owned item when OwnerCanTransfer == false', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob)});
+      const result = (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: charlie.address});
+      await expect(result).to.be.rejected;
+    });
   });
 
-  itSub.ifWithPallets('[refungible] Remove approval by using 0 amount', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
-    await helper.rft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    const amountBefore = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountBefore).to.be.equal(BigInt(1));
+  describe(`[${testCase.method}] Normal user can approve other users to transfer:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
 
-    await helper.rft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
-    const amountAfter = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountAfter).to.be.equal(BigInt(0));
-  });
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
 
-  itSub('can`t be called by collection owner on non-owned item when OwnerCanTransfer == false', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: bob.address});
-    const approveTokenTx = () => helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: charlie.address});
-    await expect(approveTokenTx()).to.be.rejected;
-  });
-});
+    itSub('NFT', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob)});
+      await (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: charlie.address})).to.be.true;
+    });
 
-describe('Normal user can approve other users to transfer:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
+    itSub('Fungible up to an approved amount', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(bob));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      const amount = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: charlie.address}, testCase.account(bob));
+      expect(amount).to.be.equal(BigInt(1));
+    });
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    itSub.ifWithPallets('ReFungible up to an approved amount', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob), pieces: 100n});
+      await (helper.rft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address}, 100n);
+      const amount = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: charlie.address}, testCase.account(bob));
+      expect(amount).to.be.equal(BigInt(100n));
     });
   });
 
-  itSub('NFT', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: bob.address});
-    await helper.nft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: charlie.address})).to.be.true;
-  });
+  describe(`[${testCase.method}] Approved users can transferFrom up to approved amount:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
 
-  itSub('Fungible up to an approved amount', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, bob.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    const amount = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: charlie.address}, {Substrate: bob.address});
-    expect(amount).to.be.equal(BigInt(1));
-  });
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
 
-  itSub.ifWithPallets('ReFungible up to an approved amount', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: bob.address, pieces: 100n});
-    await helper.rft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address}, 100n);
-    const amount = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: charlie.address}, {Substrate: bob.address});
-    expect(amount).to.be.equal(BigInt(100n));
+    itSub('NFT', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob)});
+      await (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      await helper.nft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address});
+      const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
+      expect(owner.Substrate).to.be.equal(alice.address);
+    });
+
+    itSub('Fungible up to an approved amount', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(bob));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      const before = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
+      await helper.ft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address}, 1n);
+      const after = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
+      expect(after - before).to.be.equal(BigInt(1));
+    });
+
+    itSub.ifWithPallets('ReFungible up to an approved amount', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob), pieces: 100n});
+      await (helper.rft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      const before = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
+      await helper.rft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address}, 1n);
+      const after = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
+      expect(after - before).to.be.equal(BigInt(1));
+    });
   });
-});
 
-describe('Approved users can transferFrom up to approved amount:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
+  describe(`[${testCase.method}] Approved users cannot use transferFrom to repeat transfers if approved amount was already transferred:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
+
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
+
+    itSub('NFT', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob)});
+      await (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      await helper.nft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address});
+      const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
+      expect(owner.Substrate).to.be.equal(alice.address);
+      const transferTokenFromTx = () => helper.nft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address});
+      await expect(transferTokenFromTx()).to.be.rejected;
+    });
+
+    itSub('Fungible up to an approved amount', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(bob));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      const before = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
+      await helper.ft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address}, 1n);
+      const after = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
+      expect(after - before).to.be.equal(BigInt(1));
+
+      const transferTokenFromTx = () => helper.ft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address}, 1n);
+      await expect(transferTokenFromTx()).to.be.rejected;
+    });
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    itSub.ifWithPallets('ReFungible up to an approved amount', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob), pieces: 100n});
+      await (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address}, 100n);
+      const before = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
+      await helper.rft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address}, 100n);
+      const after = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
+      expect(after - before).to.be.equal(BigInt(100));
+      const transferTokenFromTx = () => helper.rft.transferTokenFrom(charlie, collectionId, tokenId, testCase.account(bob), {Substrate: alice.address}, 100n);
+      await expect(transferTokenFromTx()).to.be.rejected;
     });
   });
 
-  itSub('NFT', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: bob.address});
-    await helper.nft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    await helper.nft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-    expect(owner.Substrate).to.be.equal(alice.address);
+  describe(`[${testCase.method}] Approved amount decreases by the transferred amount:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
+    let dave: IKeyringPair;
+
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
+      });
+    });
+
+    itSub('If a user B is approved to transfer 10 Fungible tokens from user A, they can transfer 2 tokens to user C, which will result in decreasing approval from 10 to 8. Then user B can transfer 8 tokens to user D.', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(alice));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 10n);
+
+      const charlieBefore = await helper.ft.getBalance(collectionId, {Substrate: charlie.address});
+      await helper.ft.transferTokenFrom(bob, collectionId, tokenId, testCase.account(alice), {Substrate: charlie.address}, 2n);
+      const charlieAfter = await helper.ft.getBalance(collectionId, {Substrate: charlie.address});
+      expect(charlieAfter - charlieBefore).to.be.equal(BigInt(2));
+
+      const daveBefore = await helper.ft.getBalance(collectionId, {Substrate: dave.address});
+      await helper.ft.transferTokenFrom(bob, collectionId, tokenId, testCase.account(alice), {Substrate: dave.address}, 8n);
+      const daveAfter = await helper.ft.getBalance(collectionId, {Substrate: dave.address});
+      expect(daveAfter - daveBefore).to.be.equal(BigInt(8));
+    });
   });
 
-  itSub('Fungible up to an approved amount', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, bob.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    const before = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
-    await helper.ft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address}, 1n);
-    const after = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
-    expect(after - before).to.be.equal(BigInt(1));
+  describe(`[${testCase.method}] User may clear the approvals to approving for 0 amount:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
+
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
+
+    itSub('NFT', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice)});
+      await (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.true;
+      await (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.false;
+      const transferTokenFromTx = () => helper.nft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: bob.address}, {Substrate: bob.address});
+      await expect(transferTokenFromTx()).to.be.rejected;
+    });
+
+    itSub('Fungible', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(alice));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      await (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      const amountBefore = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountBefore).to.be.equal(BigInt(1));
+
+      await (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
+      const amountAfter = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountAfter).to.be.equal(BigInt(0));
+
+      const transferTokenFromTx = () => helper.ft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: bob.address}, {Substrate: charlie.address}, 1n);
+      await expect(transferTokenFromTx()).to.be.rejected;
+    });
+
+    itSub.ifWithPallets('ReFungible', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice), pieces: 100n});
+      await (helper.rft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address});
+      const amountBefore = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountBefore).to.be.equal(BigInt(1));
+
+      await (helper.rft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
+      const amountAfter = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, testCase.account(alice));
+      expect(amountAfter).to.be.equal(BigInt(0));
+
+      const transferTokenFromTx = () => helper.rft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: bob.address}, {Substrate: charlie.address}, 100n);
+      await expect(transferTokenFromTx()).to.be.rejected;
+    });
   });
 
-  itSub.ifWithPallets('ReFungible up to an approved amount', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: bob.address, pieces: 100n});
-    await helper.rft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    const before = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
-    await helper.rft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address}, 1n);
-    const after = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
-    expect(after - before).to.be.equal(BigInt(1));
+  describe(`[${testCase.method}] User cannot approve for the amount greater than they own:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
+
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
+
+    itSub('1 for NFT', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob)});
+      const result = (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address}, 2n);
+      await expect(result).to.be.rejected;
+      expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: charlie.address})).to.be.false;
+    });
+
+    itSub('Fungible', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(alice));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      const result = (helper.ft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 11n);
+      await expect(result).to.be.rejected;
+    });
+
+    itSub.ifWithPallets('ReFungible', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice), pieces: 100n});
+      const result = (helper.rft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: bob.address}, 101n);
+      await expect(result).to.be.rejected;
+    });
   });
-});
 
-describe('Approved users cannot use transferFrom to repeat transfers if approved amount was already transferred:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
+  describe(`[${testCase.method}] Integration Test approve(spender, collection_id, item_id, amount) with collection admin permissions:`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
+
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    itSub('can be called by collection admin on non-owned item', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice)});
+      await helper.collection.addAdmin(alice, collectionId, {Substrate: bob.address});
+      const result = (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: charlie.address});
+      await expect(result).to.be.rejected;
     });
   });
 
-  itSub('NFT', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: bob.address});
-    await helper.nft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    await helper.nft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    const owner = await helper.nft.getTokenOwner(collectionId, tokenId);
-    expect(owner.Substrate).to.be.equal(alice.address);
-    const transferTokenFromTx = () => helper.nft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    await expect(transferTokenFromTx()).to.be.rejected;
-  });
+  describe(`[${testCase.method}] Negative Integration Test approve(spender, collection_id, item_id, amount):`, () => {
+    let alice: IKeyringPair;
+    let bob: IKeyringPair;
+    let charlie: IKeyringPair;
 
-  itSub('Fungible up to an approved amount', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, bob.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    const before = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
-    await helper.ft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address}, 1n);
-    const after = await helper.ft.getBalance(collectionId, {Substrate: alice.address});
-    expect(after - before).to.be.equal(BigInt(1));
+    before(async () => {
+      await usingPlaygrounds(async (helper, privateKey) => {
+        const donor = await privateKey({filename: __filename});
+        [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      });
+    });
 
-    const transferTokenFromTx = () => helper.ft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address}, 1n);
-    await expect(transferTokenFromTx()).to.be.rejected;
-  });
+    itSub('[nft] Approve for a collection that does not exist', async ({helper}) => {
+      const collectionId = 1 << 32 - 1;
+      await expect((helper.nft as any)[testCase.method](bob, collectionId, 1, {Substrate: charlie.address})).to.be.rejected;
+    });
+
+    itSub('[fungible] Approve for a collection that does not exist', async ({helper}) => {
+      const collectionId = 1 << 32 - 1;
+      const approveTx = () => (helper.ft as any)[testCase.method](bob, collectionId, 1, {Substrate: charlie.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-  itSub.ifWithPallets('ReFungible up to an approved amount', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: bob.address, pieces: 100n});
-    await helper.rft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address}, 100n);
-    const before = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
-    await helper.rft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address}, 100n);
-    const after = await helper.rft.getTokenBalance(collectionId, tokenId, {Substrate: alice.address});
-    expect(after - before).to.be.equal(BigInt(100));
-    const transferTokenFromTx = () => helper.rft.transferTokenFrom(charlie, collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address}, 100n);
-    await expect(transferTokenFromTx()).to.be.rejected;
-  });
-});
+    itSub.ifWithPallets('[refungible] Approve for a collection that does not exist', [Pallets.ReFungible], async ({helper}) => {
+      const collectionId = 1 << 32 - 1;
+      const approveTx = () => (helper.rft as any)[testCase.method](bob, collectionId, 1, {Substrate: charlie.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-describe('Approved amount decreases by the transferred amount:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
-  let dave: IKeyringPair;
+    itSub('[nft] Approve for a collection that was destroyed', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      await helper.nft.burn(alice, collectionId);
+      const approveTx = () => (helper.nft as any)[testCase.method](alice, collectionId, 1, {Substrate: bob.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie, dave] = await helper.arrange.createAccounts([100n, 100n, 100n, 100n], donor);
+    itSub('[fungible] Approve for a collection that was destroyed', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      await helper.ft.burn(alice, collectionId);
+      const approveTx = () => (helper.ft as any)[testCase.method](alice, collectionId, 1, {Substrate: bob.address});
+      await expect(approveTx()).to.be.rejected;
     });
-  });
 
-  itSub('If a user B is approved to transfer 10 Fungible tokens from user A, they can transfer 2 tokens to user C, which will result in decreasing approval from 10 to 8. Then user B can transfer 8 tokens to user D.', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, alice.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 10n);
+    itSub.ifWithPallets('[refungible] Approve for a collection that was destroyed', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      await helper.rft.burn(alice, collectionId);
+      const approveTx = () => (helper.rft as any)[testCase.method](alice, collectionId, 1, {Substrate: bob.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-    const charlieBefore = await helper.ft.getBalance(collectionId, {Substrate: charlie.address});
-    await helper.ft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: alice.address}, {Substrate: charlie.address}, 2n);
-    const charlieAfter = await helper.ft.getBalance(collectionId, {Substrate: charlie.address});
-    expect(charlieAfter - charlieBefore).to.be.equal(BigInt(2));
+    itSub('[nft] Approve transfer of a token that does not exist', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const approveTx = () => (helper.nft as any)[testCase.method](alice, collectionId, 2, {Substrate: bob.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-    const daveBefore = await helper.ft.getBalance(collectionId, {Substrate: dave.address});
-    await helper.ft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: alice.address}, {Substrate: dave.address}, 8n);
-    const daveAfter = await helper.ft.getBalance(collectionId, {Substrate: dave.address});
-    expect(daveAfter - daveBefore).to.be.equal(BigInt(8));
-  });
-});
+    itSub.ifWithPallets('[refungible] Approve transfer of a token that does not exist', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const approveTx = () => (helper.rft as any)[testCase.method](alice, collectionId, 2, {Substrate: bob.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-describe('User may clear the approvals to approving for 0 amount:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
+    itSub('[nft] Approve using the address that does not own the approved token', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice)});
+      const approveTx = () => (helper.nft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+    itSub('[fungible] Approve using the address that does not own the approved token', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      await helper.ft.mintTokens(alice, collectionId, 10n, testCase.account(alice));
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
+      const approveTx = () => (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address});
+      await expect(approveTx()).to.be.rejected;
     });
-  });
 
-  itSub('NFT', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});
-    await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.true;
-    await helper.signTransaction(alice, helper.constructApiCall('api.tx.unique.approve', [{Substrate: bob.address}, collectionId, tokenId, 0]));
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: bob.address})).to.be.false;
-    const transferTokenFromTx = () => helper.nft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: bob.address}, {Substrate: bob.address});
-    await expect(transferTokenFromTx()).to.be.rejected;
-  });
+    itSub.ifWithPallets('[refungible] Approve using the address that does not own the approved token', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(alice), pieces: 100n});
+      const approveTx = () => (helper.rft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address});
+      await expect(approveTx()).to.be.rejected;
+    });
 
-  itSub('Fungible', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, alice.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    await helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    const amountBefore = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountBefore).to.be.equal(BigInt(1));
+    itSub.ifWithPallets('should fail if approved more ReFungibles than owned', [Pallets.ReFungible], async ({helper}) => {
+      const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
+      await helper.rft.transferToken(alice, collectionId, tokenId, testCase.account(bob), 100n);
+      await (helper.rft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address}, 100n);
 
-    await helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
-    const amountAfter = await helper.ft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountAfter).to.be.equal(BigInt(0));
+      const approveTx = () => (helper.rft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address}, 101n);
+      await expect(approveTx()).to.be.rejected;
+    });
 
-    const transferTokenFromTx = () => helper.ft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: bob.address}, {Substrate: charlie.address}, 1n);
-    await expect(transferTokenFromTx()).to.be.rejected;
-  });
+    itSub('should fail if approved more Fungibles than owned', async ({helper}) => {
+      const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      await helper.ft.mintTokens(alice, collectionId, 10n, alice.address);
+      const tokenId = await helper.ft.getLastTokenId(collectionId);
 
-  itSub.ifWithPallets('ReFungible', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
-    await helper.rft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});
-    const amountBefore = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountBefore).to.be.equal(BigInt(1));
+      await helper.ft.transferToken(alice, collectionId, tokenId, testCase.account(bob), 10n);
+      await (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address}, 10n);
+      const approveTx = () => (helper.ft as any)[testCase.method](bob, collectionId, tokenId, {Substrate: alice.address}, 11n);
+      await expect(approveTx()).to.be.rejected;
+    });
 
-    await helper.rft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 0n);
-    const amountAfter = await helper.rft.getTokenApprovedPieces(collectionId, tokenId, {Substrate: bob.address}, {Substrate: alice.address});
-    expect(amountAfter).to.be.equal(BigInt(0));
+    itSub('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async ({helper}) => {
+      const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
+      const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: testCase.account(bob)});
+      await helper.collection.setLimits(alice, collectionId, {ownerCanTransfer: false});
 
-    const transferTokenFromTx = () => helper.rft.transferTokenFrom(bob, collectionId, tokenId, {Substrate: bob.address}, {Substrate: charlie.address}, 100n);
-    await expect(transferTokenFromTx()).to.be.rejected;
+      const approveTx = () => (helper.nft as any)[testCase.method](alice, collectionId, tokenId, {Substrate: charlie.address});
+      await expect(approveTx()).to.be.rejected;
+    });
   });
 });
 
-describe('User cannot approve for the amount greater than they own:', () => {
+describe('Normal user can approve other users to be wallet operator:', () => {
   let alice: IKeyringPair;
   let bob: IKeyringPair;
-  let charlie: IKeyringPair;
 
   before(async () => {
     await usingPlaygrounds(async (helper, privateKey) => {
       const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
+      [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
     });
   });
 
-  itSub('1 for NFT', async ({helper}) => {
+  itSub('[nft] Enable and disable approval', async ({helper}) => {
     const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: bob.address});
-    const approveTx = () => helper.signTransaction(bob, helper.constructApiCall('api.tx.unique.approve', [{Substrate: charlie.address}, collectionId, tokenId, 2]));
-    await expect(approveTx()).to.be.rejected;
-    expect(await helper.nft.isTokenApproved(collectionId, tokenId, {Substrate: charlie.address})).to.be.false;
-  });
 
-  itSub('Fungible', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 0);
-    await helper.ft.mintTokens(alice, collectionId, 10n, alice.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    const approveTx = () => helper.ft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 11n);
-    await expect(approveTx()).to.be.rejected;
+    const checkBeforeApproval = await helper.nft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
+    expect(checkBeforeApproval).to.be.false;
+
+    await helper.nft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, true);
+    const checkAfterApproval = await helper.nft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
+    expect(checkAfterApproval).to.be.true;
+
+    await helper.nft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, false);
+    const checkAfterDisapproval = await helper.nft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
+    expect(checkAfterDisapproval).to.be.false;
   });
 
-  itSub.ifWithPallets('ReFungible', [Pallets.ReFungible], async ({helper}) => {
+  itSub.ifWithPallets('[rft] Enable and disable approval', [Pallets.ReFungible], async ({helper}) => {
     const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
-    const approveTx = () => helper.rft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address}, 101n);
-    await expect(approveTx()).to.be.rejected;
+
+    const checkBeforeApproval = await helper.rft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
+    expect(checkBeforeApproval).to.be.false;
+
+    await helper.rft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, true);
+    const checkAfterApproval = await helper.rft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
+    expect(checkAfterApproval).to.be.true;
+
+    await helper.rft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, false);
+    const checkAfterDisapproval = await helper.rft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
+    expect(checkAfterDisapproval).to.be.false;
   });
 });
 
@@ -464,184 +649,5 @@
     await token.approve(dave, {Substrate: bob.address}, 50n);
     await expect(token.approve(dave, {Substrate: charlie.address}, 51n))
       .to.be.rejectedWith('this test would fail (since it is skipped), replace this expecting message with what would have been received');
-  });
-});
-
-describe('Integration Test approve(spender, collection_id, item_id, amount) with collection admin permissions:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
-    });
-  });
-
-  itSub('can be called by collection admin on non-owned item', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});
-    await helper.collection.addAdmin(alice, collectionId, {Substrate: bob.address});
-    const approveTx = () => helper.nft.approveToken(bob, collectionId, tokenId, {Substrate: charlie.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-});
-
-describe('Negative Integration Test approve(spender, collection_id, item_id, amount):', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-  let charlie: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);
-    });
-  });
-
-  itSub('[nft] Approve for a collection that does not exist', async ({helper}) => {
-    const collectionId = 1 << 32 - 1;
-    const approveTx = () => helper.nft.approveToken(bob, collectionId, 1, {Substrate: charlie.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('[fungible] Approve for a collection that does not exist', async ({helper}) => {
-    const collectionId = 1 << 32 - 1;
-    const approveTx = () => helper.ft.approveToken(bob, collectionId, 1, {Substrate: charlie.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub.ifWithPallets('[refungible] Approve for a collection that does not exist', [Pallets.ReFungible], async ({helper}) => {
-    const collectionId = 1 << 32 - 1;
-    const approveTx = () => helper.rft.approveToken(bob, collectionId, 1, {Substrate: charlie.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('[nft] Approve for a collection that was destroyed', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    await helper.nft.burn(alice, collectionId);
-    const approveTx = () => helper.nft.approveToken(alice, collectionId, 1, {Substrate: bob.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('[fungible] Approve for a collection that was destroyed', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    await helper.ft.burn(alice, collectionId);
-    const approveTx = () => helper.ft.approveToken(alice, collectionId, 1, {Substrate: bob.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub.ifWithPallets('[refungible] Approve for a collection that was destroyed', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    await helper.rft.burn(alice, collectionId);
-    const approveTx = () => helper.rft.approveToken(alice, collectionId, 1, {Substrate: bob.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('[nft] Approve transfer of a token that does not exist', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const approveTx = () => helper.nft.approveToken(alice, collectionId, 2, {Substrate: bob.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub.ifWithPallets('[refungible] Approve transfer of a token that does not exist', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const approveTx = () => helper.rft.approveToken(alice, collectionId, 2, {Substrate: bob.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('[nft] Approve using the address that does not own the approved token', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});
-    const approveTx = () => helper.nft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('[fungible] Approve using the address that does not own the approved token', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    await helper.ft.mintTokens(alice, collectionId, 10n, alice.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-    const approveTx = () => helper.ft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub.ifWithPallets('[refungible] Approve using the address that does not own the approved token', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
-    const approveTx = () => helper.rft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub.ifWithPallets('should fail if approved more ReFungibles than owned', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.rft.mintToken(alice, {collectionId: collectionId, owner: alice.address, pieces: 100n});
-    await helper.rft.transferToken(alice, collectionId, tokenId, {Substrate: bob.address}, 100n);
-    await helper.rft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address}, 100n);
-
-    const approveTx = () => helper.rft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address}, 101n);
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('should fail if approved more Fungibles than owned', async ({helper}) => {
-    const {collectionId} = await helper.ft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    await helper.ft.mintTokens(alice, collectionId, 10n, alice.address);
-    const tokenId = await helper.ft.getLastTokenId(collectionId);
-
-    await helper.ft.transferToken(alice, collectionId, tokenId, {Substrate: bob.address}, 10n);
-    await helper.ft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address}, 10n);
-    const approveTx = () => helper.ft.approveToken(bob, collectionId, tokenId, {Substrate: alice.address}, 11n);
-    await expect(approveTx()).to.be.rejected;
-  });
-
-  itSub('fails when called by collection owner on non-owned item when OwnerCanTransfer == false', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-    const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: bob.address});
-    await helper.collection.setLimits(alice, collectionId, {ownerCanTransfer: false});
-
-    const approveTx = () => helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: charlie.address});
-    await expect(approveTx()).to.be.rejected;
-  });
-});
-
-describe('Normal user can approve other users to be wallet operator:', () => {
-  let alice: IKeyringPair;
-  let bob: IKeyringPair;
-
-  before(async () => {
-    await usingPlaygrounds(async (helper, privateKey) => {
-      const donor = await privateKey({filename: __filename});
-      [alice, bob] = await helper.arrange.createAccounts([100n, 100n], donor);
-    });
-  });
-
-  itSub('[nft] Enable and disable approval', async ({helper}) => {
-    const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-
-    const checkBeforeApproval = await helper.nft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
-    expect(checkBeforeApproval).to.be.false;
-
-    await helper.nft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, true);
-    const checkAfterApproval = await helper.nft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
-    expect(checkAfterApproval).to.be.true;
-
-    await helper.nft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, false);
-    const checkAfterDisapproval = await helper.nft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
-    expect(checkAfterDisapproval).to.be.false;
-  });
-
-  itSub.ifWithPallets('[rft] Enable and disable approval', [Pallets.ReFungible], async ({helper}) => {
-    const {collectionId} = await helper.rft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});
-
-    const checkBeforeApproval = await helper.rft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
-    expect(checkBeforeApproval).to.be.false;
-
-    await helper.rft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, true);
-    const checkAfterApproval = await helper.rft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
-    expect(checkAfterApproval).to.be.true;
-
-    await helper.rft.setAllowanceForAll(alice, collectionId, {Substrate: bob.address}, false);
-    const checkAfterDisapproval = await helper.rft.allowanceForAll(collectionId, {Substrate: alice.address}, {Substrate: bob.address});
-    expect(checkAfterDisapproval).to.be.false;
   });
 });
modifiedtests/src/eth/api/ContractHelpers.soldiffbeforeafterboth
--- a/tests/src/eth/api/ContractHelpers.sol
+++ b/tests/src/eth/api/ContractHelpers.sol
@@ -183,9 +183,9 @@
 
 /// Ethereum representation of Optional value with CrossAddress.
 struct OptionCrossAddress {
-	/// TODO: field description
+	/// Whether or not this CrossAdress is valid and has meaning.
 	bool status;
-	/// TODO: field description
+	/// The underlying CrossAddress value. If the status is false, can be set to whatever.
 	CrossAddress value;
 }
 
modifiedtests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -85,6 +85,10 @@
        **/
       AccountTokenLimitExceeded: AugmentedError<ApiType>;
       /**
+       * Only spending from eth mirror could be approved
+       **/
+      AddressIsNotEthMirror: AugmentedError<ApiType>;
+      /**
        * Can't transfer tokens to ethereum zero address
        **/
       AddressIsZero: AugmentedError<ApiType>;
modifiedtests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -1214,6 +1214,25 @@
        **/
       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]>;
       /**
+       * Allow a non-permissioned address to transfer or burn an item from owner's eth mirror.
+       * 
+       * # Permissions
+       * 
+       * * Collection owner
+       * * Collection admin
+       * * Current item owner
+       * 
+       * # Arguments
+       * 
+       * * `from`: Owner's account eth mirror
+       * * `to`: Account to be approved to make specific transactions on non-owned tokens.
+       * * `collection_id`: ID of the collection the item belongs to.
+       * * `item_id`: ID of the item transactions on which are now approved.
+       * * `amount`: Number of pieces of the item approved for a transaction (maximum of 1 for NFTs).
+       * Set to 0 to revoke the approval.
+       **/
+      approveFrom: AugmentedSubmittable<(from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, to: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+      /**
        * Destroy a token on behalf of the owner as a non-owner account.
        * 
        * See also: [`approve`][`Pallet::approve`].
modifiedtests/src/interfaces/default/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/default/types.ts
+++ b/tests/src/interfaces/default/types.ts
@@ -1216,6 +1216,7 @@
   readonly isTokenValueTooLow: boolean;
   readonly isApprovedValueTooLow: boolean;
   readonly isCantApproveMoreThanOwned: boolean;
+  readonly isAddressIsNotEthMirror: boolean;
   readonly isAddressIsZero: boolean;
   readonly isUnsupportedOperation: boolean;
   readonly isNotSufficientFounds: boolean;
@@ -1231,7 +1232,7 @@
   readonly isCollectionIsInternal: boolean;
   readonly isConfirmSponsorshipFail: boolean;
   readonly isUserIsNotCollectionAdmin: boolean;
-  readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal' | 'ConfirmSponsorshipFail' | 'UserIsNotCollectionAdmin';
+  readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsNotEthMirror' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal' | 'ConfirmSponsorshipFail' | 'UserIsNotCollectionAdmin';
 }
 
 /** @name PalletCommonEvent */
@@ -2306,6 +2307,14 @@
     readonly itemId: u32;
     readonly amount: u128;
   } & Struct;
+  readonly isApproveFrom: boolean;
+  readonly asApproveFrom: {
+    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;
+    readonly to: PalletEvmAccountBasicCrossAccountIdRepr;
+    readonly collectionId: u32;
+    readonly itemId: u32;
+    readonly amount: u128;
+  } & Struct;
   readonly isTransferFrom: boolean;
   readonly asTransferFrom: {
     readonly from: PalletEvmAccountBasicCrossAccountIdRepr;
@@ -2345,7 +2354,7 @@
     readonly collectionId: u32;
     readonly itemId: u32;
   } & Struct;
-  readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition' | 'SetAllowanceForAll' | 'ForceRepairCollection' | 'ForceRepairItem';
+  readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'ApproveFrom' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition' | 'SetAllowanceForAll' | 'ForceRepairCollection' | 'ForceRepairItem';
 }
 
 /** @name PalletUniqueError */
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -2264,6 +2264,13 @@
         itemId: 'u32',
         amount: 'u128',
       },
+      approve_from: {
+        from: 'PalletEvmAccountBasicCrossAccountIdRepr',
+        to: 'PalletEvmAccountBasicCrossAccountIdRepr',
+        collectionId: 'u32',
+        itemId: 'u32',
+        amount: 'u128',
+      },
       transfer_from: {
         from: 'PalletEvmAccountBasicCrossAccountIdRepr',
         recipient: 'PalletEvmAccountBasicCrossAccountIdRepr',
@@ -3280,7 +3287,7 @@
    * Lookup423: pallet_common::pallet::Error<T>
    **/
   PalletCommonError: {
-    _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'CantDestroyNotEmptyCollection', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'UserIsNotAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached', 'PropertyKeyIsTooLong', 'InvalidCharacterInPropertyKey', 'EmptyPropertyKey', 'CollectionIsExternal', 'CollectionIsInternal', 'ConfirmSponsorshipFail', 'UserIsNotCollectionAdmin']
+    _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'CantDestroyNotEmptyCollection', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsNotEthMirror', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'UserIsNotAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached', 'PropertyKeyIsTooLong', 'InvalidCharacterInPropertyKey', 'EmptyPropertyKey', 'CollectionIsExternal', 'CollectionIsInternal', 'ConfirmSponsorshipFail', 'UserIsNotCollectionAdmin']
   },
   /**
    * Lookup425: pallet_fungible::pallet::Error<T>
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
before · tests/src/interfaces/types-lookup.ts
1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34// import type lookup before we augment - in some environments5// this is required to allow for ambient/previous definitions6import '@polkadot/types/lookup';78import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';9import type { ITuple } from '@polkadot/types-codec/types';10import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';11import type { Event } from '@polkadot/types/interfaces/system';1213declare module '@polkadot/types/lookup' {14  /** @name FrameSystemAccountInfo (3) */15  interface FrameSystemAccountInfo extends Struct {16    readonly nonce: u32;17    readonly consumers: u32;18    readonly providers: u32;19    readonly sufficients: u32;20    readonly data: PalletBalancesAccountData;21  }2223  /** @name PalletBalancesAccountData (5) */24  interface PalletBalancesAccountData extends Struct {25    readonly free: u128;26    readonly reserved: u128;27    readonly miscFrozen: u128;28    readonly feeFrozen: u128;29  }3031  /** @name FrameSupportDispatchPerDispatchClassWeight (7) */32  interface FrameSupportDispatchPerDispatchClassWeight extends Struct {33    readonly normal: SpWeightsWeightV2Weight;34    readonly operational: SpWeightsWeightV2Weight;35    readonly mandatory: SpWeightsWeightV2Weight;36  }3738  /** @name SpWeightsWeightV2Weight (8) */39  interface SpWeightsWeightV2Weight extends Struct {40    readonly refTime: Compact<u64>;41    readonly proofSize: Compact<u64>;42  }4344  /** @name SpRuntimeDigest (13) */45  interface SpRuntimeDigest extends Struct {46    readonly logs: Vec<SpRuntimeDigestDigestItem>;47  }4849  /** @name SpRuntimeDigestDigestItem (15) */50  interface SpRuntimeDigestDigestItem extends Enum {51    readonly isOther: boolean;52    readonly asOther: Bytes;53    readonly isConsensus: boolean;54    readonly asConsensus: ITuple<[U8aFixed, Bytes]>;55    readonly isSeal: boolean;56    readonly asSeal: ITuple<[U8aFixed, Bytes]>;57    readonly isPreRuntime: boolean;58    readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;59    readonly isRuntimeEnvironmentUpdated: boolean;60    readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';61  }6263  /** @name FrameSystemEventRecord (18) */64  interface FrameSystemEventRecord extends Struct {65    readonly phase: FrameSystemPhase;66    readonly event: Event;67    readonly topics: Vec<H256>;68  }6970  /** @name FrameSystemEvent (20) */71  interface FrameSystemEvent extends Enum {72    readonly isExtrinsicSuccess: boolean;73    readonly asExtrinsicSuccess: {74      readonly dispatchInfo: FrameSupportDispatchDispatchInfo;75    } & Struct;76    readonly isExtrinsicFailed: boolean;77    readonly asExtrinsicFailed: {78      readonly dispatchError: SpRuntimeDispatchError;79      readonly dispatchInfo: FrameSupportDispatchDispatchInfo;80    } & Struct;81    readonly isCodeUpdated: boolean;82    readonly isNewAccount: boolean;83    readonly asNewAccount: {84      readonly account: AccountId32;85    } & Struct;86    readonly isKilledAccount: boolean;87    readonly asKilledAccount: {88      readonly account: AccountId32;89    } & Struct;90    readonly isRemarked: boolean;91    readonly asRemarked: {92      readonly sender: AccountId32;93      readonly hash_: H256;94    } & Struct;95    readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';96  }9798  /** @name FrameSupportDispatchDispatchInfo (21) */99  interface FrameSupportDispatchDispatchInfo extends Struct {100    readonly weight: SpWeightsWeightV2Weight;101    readonly class: FrameSupportDispatchDispatchClass;102    readonly paysFee: FrameSupportDispatchPays;103  }104105  /** @name FrameSupportDispatchDispatchClass (22) */106  interface FrameSupportDispatchDispatchClass extends Enum {107    readonly isNormal: boolean;108    readonly isOperational: boolean;109    readonly isMandatory: boolean;110    readonly type: 'Normal' | 'Operational' | 'Mandatory';111  }112113  /** @name FrameSupportDispatchPays (23) */114  interface FrameSupportDispatchPays extends Enum {115    readonly isYes: boolean;116    readonly isNo: boolean;117    readonly type: 'Yes' | 'No';118  }119120  /** @name SpRuntimeDispatchError (24) */121  interface SpRuntimeDispatchError extends Enum {122    readonly isOther: boolean;123    readonly isCannotLookup: boolean;124    readonly isBadOrigin: boolean;125    readonly isModule: boolean;126    readonly asModule: SpRuntimeModuleError;127    readonly isConsumerRemaining: boolean;128    readonly isNoProviders: boolean;129    readonly isTooManyConsumers: boolean;130    readonly isToken: boolean;131    readonly asToken: SpRuntimeTokenError;132    readonly isArithmetic: boolean;133    readonly asArithmetic: SpRuntimeArithmeticError;134    readonly isTransactional: boolean;135    readonly asTransactional: SpRuntimeTransactionalError;136    readonly isExhausted: boolean;137    readonly isCorruption: boolean;138    readonly isUnavailable: boolean;139    readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional' | 'Exhausted' | 'Corruption' | 'Unavailable';140  }141142  /** @name SpRuntimeModuleError (25) */143  interface SpRuntimeModuleError extends Struct {144    readonly index: u8;145    readonly error: U8aFixed;146  }147148  /** @name SpRuntimeTokenError (26) */149  interface SpRuntimeTokenError extends Enum {150    readonly isNoFunds: boolean;151    readonly isWouldDie: boolean;152    readonly isBelowMinimum: boolean;153    readonly isCannotCreate: boolean;154    readonly isUnknownAsset: boolean;155    readonly isFrozen: boolean;156    readonly isUnsupported: boolean;157    readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';158  }159160  /** @name SpRuntimeArithmeticError (27) */161  interface SpRuntimeArithmeticError extends Enum {162    readonly isUnderflow: boolean;163    readonly isOverflow: boolean;164    readonly isDivisionByZero: boolean;165    readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';166  }167168  /** @name SpRuntimeTransactionalError (28) */169  interface SpRuntimeTransactionalError extends Enum {170    readonly isLimitReached: boolean;171    readonly isNoLayer: boolean;172    readonly type: 'LimitReached' | 'NoLayer';173  }174175  /** @name CumulusPalletParachainSystemEvent (29) */176  interface CumulusPalletParachainSystemEvent extends Enum {177    readonly isValidationFunctionStored: boolean;178    readonly isValidationFunctionApplied: boolean;179    readonly asValidationFunctionApplied: {180      readonly relayChainBlockNum: u32;181    } & Struct;182    readonly isValidationFunctionDiscarded: boolean;183    readonly isUpgradeAuthorized: boolean;184    readonly asUpgradeAuthorized: {185      readonly codeHash: H256;186    } & Struct;187    readonly isDownwardMessagesReceived: boolean;188    readonly asDownwardMessagesReceived: {189      readonly count: u32;190    } & Struct;191    readonly isDownwardMessagesProcessed: boolean;192    readonly asDownwardMessagesProcessed: {193      readonly weightUsed: SpWeightsWeightV2Weight;194      readonly dmqHead: H256;195    } & Struct;196    readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';197  }198199  /** @name PalletBalancesEvent (30) */200  interface PalletBalancesEvent extends Enum {201    readonly isEndowed: boolean;202    readonly asEndowed: {203      readonly account: AccountId32;204      readonly freeBalance: u128;205    } & Struct;206    readonly isDustLost: boolean;207    readonly asDustLost: {208      readonly account: AccountId32;209      readonly amount: u128;210    } & Struct;211    readonly isTransfer: boolean;212    readonly asTransfer: {213      readonly from: AccountId32;214      readonly to: AccountId32;215      readonly amount: u128;216    } & Struct;217    readonly isBalanceSet: boolean;218    readonly asBalanceSet: {219      readonly who: AccountId32;220      readonly free: u128;221      readonly reserved: u128;222    } & Struct;223    readonly isReserved: boolean;224    readonly asReserved: {225      readonly who: AccountId32;226      readonly amount: u128;227    } & Struct;228    readonly isUnreserved: boolean;229    readonly asUnreserved: {230      readonly who: AccountId32;231      readonly amount: u128;232    } & Struct;233    readonly isReserveRepatriated: boolean;234    readonly asReserveRepatriated: {235      readonly from: AccountId32;236      readonly to: AccountId32;237      readonly amount: u128;238      readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;239    } & Struct;240    readonly isDeposit: boolean;241    readonly asDeposit: {242      readonly who: AccountId32;243      readonly amount: u128;244    } & Struct;245    readonly isWithdraw: boolean;246    readonly asWithdraw: {247      readonly who: AccountId32;248      readonly amount: u128;249    } & Struct;250    readonly isSlashed: boolean;251    readonly asSlashed: {252      readonly who: AccountId32;253      readonly amount: u128;254    } & Struct;255    readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';256  }257258  /** @name FrameSupportTokensMiscBalanceStatus (31) */259  interface FrameSupportTokensMiscBalanceStatus extends Enum {260    readonly isFree: boolean;261    readonly isReserved: boolean;262    readonly type: 'Free' | 'Reserved';263  }264265  /** @name PalletTransactionPaymentEvent (32) */266  interface PalletTransactionPaymentEvent extends Enum {267    readonly isTransactionFeePaid: boolean;268    readonly asTransactionFeePaid: {269      readonly who: AccountId32;270      readonly actualFee: u128;271      readonly tip: u128;272    } & Struct;273    readonly type: 'TransactionFeePaid';274  }275276  /** @name PalletTreasuryEvent (33) */277  interface PalletTreasuryEvent extends Enum {278    readonly isProposed: boolean;279    readonly asProposed: {280      readonly proposalIndex: u32;281    } & Struct;282    readonly isSpending: boolean;283    readonly asSpending: {284      readonly budgetRemaining: u128;285    } & Struct;286    readonly isAwarded: boolean;287    readonly asAwarded: {288      readonly proposalIndex: u32;289      readonly award: u128;290      readonly account: AccountId32;291    } & Struct;292    readonly isRejected: boolean;293    readonly asRejected: {294      readonly proposalIndex: u32;295      readonly slashed: u128;296    } & Struct;297    readonly isBurnt: boolean;298    readonly asBurnt: {299      readonly burntFunds: u128;300    } & Struct;301    readonly isRollover: boolean;302    readonly asRollover: {303      readonly rolloverBalance: u128;304    } & Struct;305    readonly isDeposit: boolean;306    readonly asDeposit: {307      readonly value: u128;308    } & Struct;309    readonly isSpendApproved: boolean;310    readonly asSpendApproved: {311      readonly proposalIndex: u32;312      readonly amount: u128;313      readonly beneficiary: AccountId32;314    } & Struct;315    readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit' | 'SpendApproved';316  }317318  /** @name PalletSudoEvent (34) */319  interface PalletSudoEvent extends Enum {320    readonly isSudid: boolean;321    readonly asSudid: {322      readonly sudoResult: Result<Null, SpRuntimeDispatchError>;323    } & Struct;324    readonly isKeyChanged: boolean;325    readonly asKeyChanged: {326      readonly oldSudoer: Option<AccountId32>;327    } & Struct;328    readonly isSudoAsDone: boolean;329    readonly asSudoAsDone: {330      readonly sudoResult: Result<Null, SpRuntimeDispatchError>;331    } & Struct;332    readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';333  }334335  /** @name OrmlVestingModuleEvent (38) */336  interface OrmlVestingModuleEvent extends Enum {337    readonly isVestingScheduleAdded: boolean;338    readonly asVestingScheduleAdded: {339      readonly from: AccountId32;340      readonly to: AccountId32;341      readonly vestingSchedule: OrmlVestingVestingSchedule;342    } & Struct;343    readonly isClaimed: boolean;344    readonly asClaimed: {345      readonly who: AccountId32;346      readonly amount: u128;347    } & Struct;348    readonly isVestingSchedulesUpdated: boolean;349    readonly asVestingSchedulesUpdated: {350      readonly who: AccountId32;351    } & Struct;352    readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';353  }354355  /** @name OrmlVestingVestingSchedule (39) */356  interface OrmlVestingVestingSchedule extends Struct {357    readonly start: u32;358    readonly period: u32;359    readonly periodCount: u32;360    readonly perPeriod: Compact<u128>;361  }362363  /** @name OrmlXtokensModuleEvent (41) */364  interface OrmlXtokensModuleEvent extends Enum {365    readonly isTransferredMultiAssets: boolean;366    readonly asTransferredMultiAssets: {367      readonly sender: AccountId32;368      readonly assets: XcmV1MultiassetMultiAssets;369      readonly fee: XcmV1MultiAsset;370      readonly dest: XcmV1MultiLocation;371    } & Struct;372    readonly type: 'TransferredMultiAssets';373  }374375  /** @name XcmV1MultiassetMultiAssets (42) */376  interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}377378  /** @name XcmV1MultiAsset (44) */379  interface XcmV1MultiAsset extends Struct {380    readonly id: XcmV1MultiassetAssetId;381    readonly fun: XcmV1MultiassetFungibility;382  }383384  /** @name XcmV1MultiassetAssetId (45) */385  interface XcmV1MultiassetAssetId extends Enum {386    readonly isConcrete: boolean;387    readonly asConcrete: XcmV1MultiLocation;388    readonly isAbstract: boolean;389    readonly asAbstract: Bytes;390    readonly type: 'Concrete' | 'Abstract';391  }392393  /** @name XcmV1MultiLocation (46) */394  interface XcmV1MultiLocation extends Struct {395    readonly parents: u8;396    readonly interior: XcmV1MultilocationJunctions;397  }398399  /** @name XcmV1MultilocationJunctions (47) */400  interface XcmV1MultilocationJunctions extends Enum {401    readonly isHere: boolean;402    readonly isX1: boolean;403    readonly asX1: XcmV1Junction;404    readonly isX2: boolean;405    readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;406    readonly isX3: boolean;407    readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;408    readonly isX4: boolean;409    readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;410    readonly isX5: boolean;411    readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;412    readonly isX6: boolean;413    readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;414    readonly isX7: boolean;415    readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;416    readonly isX8: boolean;417    readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;418    readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';419  }420421  /** @name XcmV1Junction (48) */422  interface XcmV1Junction extends Enum {423    readonly isParachain: boolean;424    readonly asParachain: Compact<u32>;425    readonly isAccountId32: boolean;426    readonly asAccountId32: {427      readonly network: XcmV0JunctionNetworkId;428      readonly id: U8aFixed;429    } & Struct;430    readonly isAccountIndex64: boolean;431    readonly asAccountIndex64: {432      readonly network: XcmV0JunctionNetworkId;433      readonly index: Compact<u64>;434    } & Struct;435    readonly isAccountKey20: boolean;436    readonly asAccountKey20: {437      readonly network: XcmV0JunctionNetworkId;438      readonly key: U8aFixed;439    } & Struct;440    readonly isPalletInstance: boolean;441    readonly asPalletInstance: u8;442    readonly isGeneralIndex: boolean;443    readonly asGeneralIndex: Compact<u128>;444    readonly isGeneralKey: boolean;445    readonly asGeneralKey: Bytes;446    readonly isOnlyChild: boolean;447    readonly isPlurality: boolean;448    readonly asPlurality: {449      readonly id: XcmV0JunctionBodyId;450      readonly part: XcmV0JunctionBodyPart;451    } & Struct;452    readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';453  }454455  /** @name XcmV0JunctionNetworkId (50) */456  interface XcmV0JunctionNetworkId extends Enum {457    readonly isAny: boolean;458    readonly isNamed: boolean;459    readonly asNamed: Bytes;460    readonly isPolkadot: boolean;461    readonly isKusama: boolean;462    readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';463  }464465  /** @name XcmV0JunctionBodyId (53) */466  interface XcmV0JunctionBodyId extends Enum {467    readonly isUnit: boolean;468    readonly isNamed: boolean;469    readonly asNamed: Bytes;470    readonly isIndex: boolean;471    readonly asIndex: Compact<u32>;472    readonly isExecutive: boolean;473    readonly isTechnical: boolean;474    readonly isLegislative: boolean;475    readonly isJudicial: boolean;476    readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';477  }478479  /** @name XcmV0JunctionBodyPart (54) */480  interface XcmV0JunctionBodyPart extends Enum {481    readonly isVoice: boolean;482    readonly isMembers: boolean;483    readonly asMembers: {484      readonly count: Compact<u32>;485    } & Struct;486    readonly isFraction: boolean;487    readonly asFraction: {488      readonly nom: Compact<u32>;489      readonly denom: Compact<u32>;490    } & Struct;491    readonly isAtLeastProportion: boolean;492    readonly asAtLeastProportion: {493      readonly nom: Compact<u32>;494      readonly denom: Compact<u32>;495    } & Struct;496    readonly isMoreThanProportion: boolean;497    readonly asMoreThanProportion: {498      readonly nom: Compact<u32>;499      readonly denom: Compact<u32>;500    } & Struct;501    readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';502  }503504  /** @name XcmV1MultiassetFungibility (55) */505  interface XcmV1MultiassetFungibility extends Enum {506    readonly isFungible: boolean;507    readonly asFungible: Compact<u128>;508    readonly isNonFungible: boolean;509    readonly asNonFungible: XcmV1MultiassetAssetInstance;510    readonly type: 'Fungible' | 'NonFungible';511  }512513  /** @name XcmV1MultiassetAssetInstance (56) */514  interface XcmV1MultiassetAssetInstance extends Enum {515    readonly isUndefined: boolean;516    readonly isIndex: boolean;517    readonly asIndex: Compact<u128>;518    readonly isArray4: boolean;519    readonly asArray4: U8aFixed;520    readonly isArray8: boolean;521    readonly asArray8: U8aFixed;522    readonly isArray16: boolean;523    readonly asArray16: U8aFixed;524    readonly isArray32: boolean;525    readonly asArray32: U8aFixed;526    readonly isBlob: boolean;527    readonly asBlob: Bytes;528    readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';529  }530531  /** @name OrmlTokensModuleEvent (59) */532  interface OrmlTokensModuleEvent extends Enum {533    readonly isEndowed: boolean;534    readonly asEndowed: {535      readonly currencyId: PalletForeignAssetsAssetIds;536      readonly who: AccountId32;537      readonly amount: u128;538    } & Struct;539    readonly isDustLost: boolean;540    readonly asDustLost: {541      readonly currencyId: PalletForeignAssetsAssetIds;542      readonly who: AccountId32;543      readonly amount: u128;544    } & Struct;545    readonly isTransfer: boolean;546    readonly asTransfer: {547      readonly currencyId: PalletForeignAssetsAssetIds;548      readonly from: AccountId32;549      readonly to: AccountId32;550      readonly amount: u128;551    } & Struct;552    readonly isReserved: boolean;553    readonly asReserved: {554      readonly currencyId: PalletForeignAssetsAssetIds;555      readonly who: AccountId32;556      readonly amount: u128;557    } & Struct;558    readonly isUnreserved: boolean;559    readonly asUnreserved: {560      readonly currencyId: PalletForeignAssetsAssetIds;561      readonly who: AccountId32;562      readonly amount: u128;563    } & Struct;564    readonly isReserveRepatriated: boolean;565    readonly asReserveRepatriated: {566      readonly currencyId: PalletForeignAssetsAssetIds;567      readonly from: AccountId32;568      readonly to: AccountId32;569      readonly amount: u128;570      readonly status: FrameSupportTokensMiscBalanceStatus;571    } & Struct;572    readonly isBalanceSet: boolean;573    readonly asBalanceSet: {574      readonly currencyId: PalletForeignAssetsAssetIds;575      readonly who: AccountId32;576      readonly free: u128;577      readonly reserved: u128;578    } & Struct;579    readonly isTotalIssuanceSet: boolean;580    readonly asTotalIssuanceSet: {581      readonly currencyId: PalletForeignAssetsAssetIds;582      readonly amount: u128;583    } & Struct;584    readonly isWithdrawn: boolean;585    readonly asWithdrawn: {586      readonly currencyId: PalletForeignAssetsAssetIds;587      readonly who: AccountId32;588      readonly amount: u128;589    } & Struct;590    readonly isSlashed: boolean;591    readonly asSlashed: {592      readonly currencyId: PalletForeignAssetsAssetIds;593      readonly who: AccountId32;594      readonly freeAmount: u128;595      readonly reservedAmount: u128;596    } & Struct;597    readonly isDeposited: boolean;598    readonly asDeposited: {599      readonly currencyId: PalletForeignAssetsAssetIds;600      readonly who: AccountId32;601      readonly amount: u128;602    } & Struct;603    readonly isLockSet: boolean;604    readonly asLockSet: {605      readonly lockId: U8aFixed;606      readonly currencyId: PalletForeignAssetsAssetIds;607      readonly who: AccountId32;608      readonly amount: u128;609    } & Struct;610    readonly isLockRemoved: boolean;611    readonly asLockRemoved: {612      readonly lockId: U8aFixed;613      readonly currencyId: PalletForeignAssetsAssetIds;614      readonly who: AccountId32;615    } & Struct;616    readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'BalanceSet' | 'TotalIssuanceSet' | 'Withdrawn' | 'Slashed' | 'Deposited' | 'LockSet' | 'LockRemoved';617  }618619  /** @name PalletForeignAssetsAssetIds (60) */620  interface PalletForeignAssetsAssetIds extends Enum {621    readonly isForeignAssetId: boolean;622    readonly asForeignAssetId: u32;623    readonly isNativeAssetId: boolean;624    readonly asNativeAssetId: PalletForeignAssetsNativeCurrency;625    readonly type: 'ForeignAssetId' | 'NativeAssetId';626  }627628  /** @name PalletForeignAssetsNativeCurrency (61) */629  interface PalletForeignAssetsNativeCurrency extends Enum {630    readonly isHere: boolean;631    readonly isParent: boolean;632    readonly type: 'Here' | 'Parent';633  }634635  /** @name CumulusPalletXcmpQueueEvent (62) */636  interface CumulusPalletXcmpQueueEvent extends Enum {637    readonly isSuccess: boolean;638    readonly asSuccess: {639      readonly messageHash: Option<H256>;640      readonly weight: SpWeightsWeightV2Weight;641    } & Struct;642    readonly isFail: boolean;643    readonly asFail: {644      readonly messageHash: Option<H256>;645      readonly error: XcmV2TraitsError;646      readonly weight: SpWeightsWeightV2Weight;647    } & Struct;648    readonly isBadVersion: boolean;649    readonly asBadVersion: {650      readonly messageHash: Option<H256>;651    } & Struct;652    readonly isBadFormat: boolean;653    readonly asBadFormat: {654      readonly messageHash: Option<H256>;655    } & Struct;656    readonly isUpwardMessageSent: boolean;657    readonly asUpwardMessageSent: {658      readonly messageHash: Option<H256>;659    } & Struct;660    readonly isXcmpMessageSent: boolean;661    readonly asXcmpMessageSent: {662      readonly messageHash: Option<H256>;663    } & Struct;664    readonly isOverweightEnqueued: boolean;665    readonly asOverweightEnqueued: {666      readonly sender: u32;667      readonly sentAt: u32;668      readonly index: u64;669      readonly required: SpWeightsWeightV2Weight;670    } & Struct;671    readonly isOverweightServiced: boolean;672    readonly asOverweightServiced: {673      readonly index: u64;674      readonly used: SpWeightsWeightV2Weight;675    } & Struct;676    readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';677  }678679  /** @name XcmV2TraitsError (64) */680  interface XcmV2TraitsError extends Enum {681    readonly isOverflow: boolean;682    readonly isUnimplemented: boolean;683    readonly isUntrustedReserveLocation: boolean;684    readonly isUntrustedTeleportLocation: boolean;685    readonly isMultiLocationFull: boolean;686    readonly isMultiLocationNotInvertible: boolean;687    readonly isBadOrigin: boolean;688    readonly isInvalidLocation: boolean;689    readonly isAssetNotFound: boolean;690    readonly isFailedToTransactAsset: boolean;691    readonly isNotWithdrawable: boolean;692    readonly isLocationCannotHold: boolean;693    readonly isExceedsMaxMessageSize: boolean;694    readonly isDestinationUnsupported: boolean;695    readonly isTransport: boolean;696    readonly isUnroutable: boolean;697    readonly isUnknownClaim: boolean;698    readonly isFailedToDecode: boolean;699    readonly isMaxWeightInvalid: boolean;700    readonly isNotHoldingFees: boolean;701    readonly isTooExpensive: boolean;702    readonly isTrap: boolean;703    readonly asTrap: u64;704    readonly isUnhandledXcmVersion: boolean;705    readonly isWeightLimitReached: boolean;706    readonly asWeightLimitReached: u64;707    readonly isBarrier: boolean;708    readonly isWeightNotComputable: boolean;709    readonly type: 'Overflow' | 'Unimplemented' | 'UntrustedReserveLocation' | 'UntrustedTeleportLocation' | 'MultiLocationFull' | 'MultiLocationNotInvertible' | 'BadOrigin' | 'InvalidLocation' | 'AssetNotFound' | 'FailedToTransactAsset' | 'NotWithdrawable' | 'LocationCannotHold' | 'ExceedsMaxMessageSize' | 'DestinationUnsupported' | 'Transport' | 'Unroutable' | 'UnknownClaim' | 'FailedToDecode' | 'MaxWeightInvalid' | 'NotHoldingFees' | 'TooExpensive' | 'Trap' | 'UnhandledXcmVersion' | 'WeightLimitReached' | 'Barrier' | 'WeightNotComputable';710  }711712  /** @name PalletXcmEvent (66) */713  interface PalletXcmEvent extends Enum {714    readonly isAttempted: boolean;715    readonly asAttempted: XcmV2TraitsOutcome;716    readonly isSent: boolean;717    readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;718    readonly isUnexpectedResponse: boolean;719    readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;720    readonly isResponseReady: boolean;721    readonly asResponseReady: ITuple<[u64, XcmV2Response]>;722    readonly isNotified: boolean;723    readonly asNotified: ITuple<[u64, u8, u8]>;724    readonly isNotifyOverweight: boolean;725    readonly asNotifyOverweight: ITuple<[u64, u8, u8, SpWeightsWeightV2Weight, SpWeightsWeightV2Weight]>;726    readonly isNotifyDispatchError: boolean;727    readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;728    readonly isNotifyDecodeFailed: boolean;729    readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;730    readonly isInvalidResponder: boolean;731    readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;732    readonly isInvalidResponderVersion: boolean;733    readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;734    readonly isResponseTaken: boolean;735    readonly asResponseTaken: u64;736    readonly isAssetsTrapped: boolean;737    readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;738    readonly isVersionChangeNotified: boolean;739    readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;740    readonly isSupportedVersionChanged: boolean;741    readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;742    readonly isNotifyTargetSendFail: boolean;743    readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;744    readonly isNotifyTargetMigrationFail: boolean;745    readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;746    readonly isAssetsClaimed: boolean;747    readonly asAssetsClaimed: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;748    readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail' | 'AssetsClaimed';749  }750751  /** @name XcmV2TraitsOutcome (67) */752  interface XcmV2TraitsOutcome extends Enum {753    readonly isComplete: boolean;754    readonly asComplete: u64;755    readonly isIncomplete: boolean;756    readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;757    readonly isError: boolean;758    readonly asError: XcmV2TraitsError;759    readonly type: 'Complete' | 'Incomplete' | 'Error';760  }761762  /** @name XcmV2Xcm (68) */763  interface XcmV2Xcm extends Vec<XcmV2Instruction> {}764765  /** @name XcmV2Instruction (70) */766  interface XcmV2Instruction extends Enum {767    readonly isWithdrawAsset: boolean;768    readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;769    readonly isReserveAssetDeposited: boolean;770    readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;771    readonly isReceiveTeleportedAsset: boolean;772    readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;773    readonly isQueryResponse: boolean;774    readonly asQueryResponse: {775      readonly queryId: Compact<u64>;776      readonly response: XcmV2Response;777      readonly maxWeight: Compact<u64>;778    } & Struct;779    readonly isTransferAsset: boolean;780    readonly asTransferAsset: {781      readonly assets: XcmV1MultiassetMultiAssets;782      readonly beneficiary: XcmV1MultiLocation;783    } & Struct;784    readonly isTransferReserveAsset: boolean;785    readonly asTransferReserveAsset: {786      readonly assets: XcmV1MultiassetMultiAssets;787      readonly dest: XcmV1MultiLocation;788      readonly xcm: XcmV2Xcm;789    } & Struct;790    readonly isTransact: boolean;791    readonly asTransact: {792      readonly originType: XcmV0OriginKind;793      readonly requireWeightAtMost: Compact<u64>;794      readonly call: XcmDoubleEncoded;795    } & Struct;796    readonly isHrmpNewChannelOpenRequest: boolean;797    readonly asHrmpNewChannelOpenRequest: {798      readonly sender: Compact<u32>;799      readonly maxMessageSize: Compact<u32>;800      readonly maxCapacity: Compact<u32>;801    } & Struct;802    readonly isHrmpChannelAccepted: boolean;803    readonly asHrmpChannelAccepted: {804      readonly recipient: Compact<u32>;805    } & Struct;806    readonly isHrmpChannelClosing: boolean;807    readonly asHrmpChannelClosing: {808      readonly initiator: Compact<u32>;809      readonly sender: Compact<u32>;810      readonly recipient: Compact<u32>;811    } & Struct;812    readonly isClearOrigin: boolean;813    readonly isDescendOrigin: boolean;814    readonly asDescendOrigin: XcmV1MultilocationJunctions;815    readonly isReportError: boolean;816    readonly asReportError: {817      readonly queryId: Compact<u64>;818      readonly dest: XcmV1MultiLocation;819      readonly maxResponseWeight: Compact<u64>;820    } & Struct;821    readonly isDepositAsset: boolean;822    readonly asDepositAsset: {823      readonly assets: XcmV1MultiassetMultiAssetFilter;824      readonly maxAssets: Compact<u32>;825      readonly beneficiary: XcmV1MultiLocation;826    } & Struct;827    readonly isDepositReserveAsset: boolean;828    readonly asDepositReserveAsset: {829      readonly assets: XcmV1MultiassetMultiAssetFilter;830      readonly maxAssets: Compact<u32>;831      readonly dest: XcmV1MultiLocation;832      readonly xcm: XcmV2Xcm;833    } & Struct;834    readonly isExchangeAsset: boolean;835    readonly asExchangeAsset: {836      readonly give: XcmV1MultiassetMultiAssetFilter;837      readonly receive: XcmV1MultiassetMultiAssets;838    } & Struct;839    readonly isInitiateReserveWithdraw: boolean;840    readonly asInitiateReserveWithdraw: {841      readonly assets: XcmV1MultiassetMultiAssetFilter;842      readonly reserve: XcmV1MultiLocation;843      readonly xcm: XcmV2Xcm;844    } & Struct;845    readonly isInitiateTeleport: boolean;846    readonly asInitiateTeleport: {847      readonly assets: XcmV1MultiassetMultiAssetFilter;848      readonly dest: XcmV1MultiLocation;849      readonly xcm: XcmV2Xcm;850    } & Struct;851    readonly isQueryHolding: boolean;852    readonly asQueryHolding: {853      readonly queryId: Compact<u64>;854      readonly dest: XcmV1MultiLocation;855      readonly assets: XcmV1MultiassetMultiAssetFilter;856      readonly maxResponseWeight: Compact<u64>;857    } & Struct;858    readonly isBuyExecution: boolean;859    readonly asBuyExecution: {860      readonly fees: XcmV1MultiAsset;861      readonly weightLimit: XcmV2WeightLimit;862    } & Struct;863    readonly isRefundSurplus: boolean;864    readonly isSetErrorHandler: boolean;865    readonly asSetErrorHandler: XcmV2Xcm;866    readonly isSetAppendix: boolean;867    readonly asSetAppendix: XcmV2Xcm;868    readonly isClearError: boolean;869    readonly isClaimAsset: boolean;870    readonly asClaimAsset: {871      readonly assets: XcmV1MultiassetMultiAssets;872      readonly ticket: XcmV1MultiLocation;873    } & Struct;874    readonly isTrap: boolean;875    readonly asTrap: Compact<u64>;876    readonly isSubscribeVersion: boolean;877    readonly asSubscribeVersion: {878      readonly queryId: Compact<u64>;879      readonly maxResponseWeight: Compact<u64>;880    } & Struct;881    readonly isUnsubscribeVersion: boolean;882    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'ClearOrigin' | 'DescendOrigin' | 'ReportError' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution' | 'RefundSurplus' | 'SetErrorHandler' | 'SetAppendix' | 'ClearError' | 'ClaimAsset' | 'Trap' | 'SubscribeVersion' | 'UnsubscribeVersion';883  }884885  /** @name XcmV2Response (71) */886  interface XcmV2Response extends Enum {887    readonly isNull: boolean;888    readonly isAssets: boolean;889    readonly asAssets: XcmV1MultiassetMultiAssets;890    readonly isExecutionResult: boolean;891    readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;892    readonly isVersion: boolean;893    readonly asVersion: u32;894    readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';895  }896897  /** @name XcmV0OriginKind (74) */898  interface XcmV0OriginKind extends Enum {899    readonly isNative: boolean;900    readonly isSovereignAccount: boolean;901    readonly isSuperuser: boolean;902    readonly isXcm: boolean;903    readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';904  }905906  /** @name XcmDoubleEncoded (75) */907  interface XcmDoubleEncoded extends Struct {908    readonly encoded: Bytes;909  }910911  /** @name XcmV1MultiassetMultiAssetFilter (76) */912  interface XcmV1MultiassetMultiAssetFilter extends Enum {913    readonly isDefinite: boolean;914    readonly asDefinite: XcmV1MultiassetMultiAssets;915    readonly isWild: boolean;916    readonly asWild: XcmV1MultiassetWildMultiAsset;917    readonly type: 'Definite' | 'Wild';918  }919920  /** @name XcmV1MultiassetWildMultiAsset (77) */921  interface XcmV1MultiassetWildMultiAsset extends Enum {922    readonly isAll: boolean;923    readonly isAllOf: boolean;924    readonly asAllOf: {925      readonly id: XcmV1MultiassetAssetId;926      readonly fun: XcmV1MultiassetWildFungibility;927    } & Struct;928    readonly type: 'All' | 'AllOf';929  }930931  /** @name XcmV1MultiassetWildFungibility (78) */932  interface XcmV1MultiassetWildFungibility extends Enum {933    readonly isFungible: boolean;934    readonly isNonFungible: boolean;935    readonly type: 'Fungible' | 'NonFungible';936  }937938  /** @name XcmV2WeightLimit (79) */939  interface XcmV2WeightLimit extends Enum {940    readonly isUnlimited: boolean;941    readonly isLimited: boolean;942    readonly asLimited: Compact<u64>;943    readonly type: 'Unlimited' | 'Limited';944  }945946  /** @name XcmVersionedMultiAssets (81) */947  interface XcmVersionedMultiAssets extends Enum {948    readonly isV0: boolean;949    readonly asV0: Vec<XcmV0MultiAsset>;950    readonly isV1: boolean;951    readonly asV1: XcmV1MultiassetMultiAssets;952    readonly type: 'V0' | 'V1';953  }954955  /** @name XcmV0MultiAsset (83) */956  interface XcmV0MultiAsset extends Enum {957    readonly isNone: boolean;958    readonly isAll: boolean;959    readonly isAllFungible: boolean;960    readonly isAllNonFungible: boolean;961    readonly isAllAbstractFungible: boolean;962    readonly asAllAbstractFungible: {963      readonly id: Bytes;964    } & Struct;965    readonly isAllAbstractNonFungible: boolean;966    readonly asAllAbstractNonFungible: {967      readonly class: Bytes;968    } & Struct;969    readonly isAllConcreteFungible: boolean;970    readonly asAllConcreteFungible: {971      readonly id: XcmV0MultiLocation;972    } & Struct;973    readonly isAllConcreteNonFungible: boolean;974    readonly asAllConcreteNonFungible: {975      readonly class: XcmV0MultiLocation;976    } & Struct;977    readonly isAbstractFungible: boolean;978    readonly asAbstractFungible: {979      readonly id: Bytes;980      readonly amount: Compact<u128>;981    } & Struct;982    readonly isAbstractNonFungible: boolean;983    readonly asAbstractNonFungible: {984      readonly class: Bytes;985      readonly instance: XcmV1MultiassetAssetInstance;986    } & Struct;987    readonly isConcreteFungible: boolean;988    readonly asConcreteFungible: {989      readonly id: XcmV0MultiLocation;990      readonly amount: Compact<u128>;991    } & Struct;992    readonly isConcreteNonFungible: boolean;993    readonly asConcreteNonFungible: {994      readonly class: XcmV0MultiLocation;995      readonly instance: XcmV1MultiassetAssetInstance;996    } & Struct;997    readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';998  }9991000  /** @name XcmV0MultiLocation (84) */1001  interface XcmV0MultiLocation extends Enum {1002    readonly isNull: boolean;1003    readonly isX1: boolean;1004    readonly asX1: XcmV0Junction;1005    readonly isX2: boolean;1006    readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;1007    readonly isX3: boolean;1008    readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;1009    readonly isX4: boolean;1010    readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;1011    readonly isX5: boolean;1012    readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;1013    readonly isX6: boolean;1014    readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;1015    readonly isX7: boolean;1016    readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;1017    readonly isX8: boolean;1018    readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;1019    readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';1020  }10211022  /** @name XcmV0Junction (85) */1023  interface XcmV0Junction extends Enum {1024    readonly isParent: boolean;1025    readonly isParachain: boolean;1026    readonly asParachain: Compact<u32>;1027    readonly isAccountId32: boolean;1028    readonly asAccountId32: {1029      readonly network: XcmV0JunctionNetworkId;1030      readonly id: U8aFixed;1031    } & Struct;1032    readonly isAccountIndex64: boolean;1033    readonly asAccountIndex64: {1034      readonly network: XcmV0JunctionNetworkId;1035      readonly index: Compact<u64>;1036    } & Struct;1037    readonly isAccountKey20: boolean;1038    readonly asAccountKey20: {1039      readonly network: XcmV0JunctionNetworkId;1040      readonly key: U8aFixed;1041    } & Struct;1042    readonly isPalletInstance: boolean;1043    readonly asPalletInstance: u8;1044    readonly isGeneralIndex: boolean;1045    readonly asGeneralIndex: Compact<u128>;1046    readonly isGeneralKey: boolean;1047    readonly asGeneralKey: Bytes;1048    readonly isOnlyChild: boolean;1049    readonly isPlurality: boolean;1050    readonly asPlurality: {1051      readonly id: XcmV0JunctionBodyId;1052      readonly part: XcmV0JunctionBodyPart;1053    } & Struct;1054    readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';1055  }10561057  /** @name XcmVersionedMultiLocation (86) */1058  interface XcmVersionedMultiLocation extends Enum {1059    readonly isV0: boolean;1060    readonly asV0: XcmV0MultiLocation;1061    readonly isV1: boolean;1062    readonly asV1: XcmV1MultiLocation;1063    readonly type: 'V0' | 'V1';1064  }10651066  /** @name CumulusPalletXcmEvent (87) */1067  interface CumulusPalletXcmEvent extends Enum {1068    readonly isInvalidFormat: boolean;1069    readonly asInvalidFormat: U8aFixed;1070    readonly isUnsupportedVersion: boolean;1071    readonly asUnsupportedVersion: U8aFixed;1072    readonly isExecutedDownward: boolean;1073    readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;1074    readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';1075  }10761077  /** @name CumulusPalletDmpQueueEvent (88) */1078  interface CumulusPalletDmpQueueEvent extends Enum {1079    readonly isInvalidFormat: boolean;1080    readonly asInvalidFormat: {1081      readonly messageId: U8aFixed;1082    } & Struct;1083    readonly isUnsupportedVersion: boolean;1084    readonly asUnsupportedVersion: {1085      readonly messageId: U8aFixed;1086    } & Struct;1087    readonly isExecutedDownward: boolean;1088    readonly asExecutedDownward: {1089      readonly messageId: U8aFixed;1090      readonly outcome: XcmV2TraitsOutcome;1091    } & Struct;1092    readonly isWeightExhausted: boolean;1093    readonly asWeightExhausted: {1094      readonly messageId: U8aFixed;1095      readonly remainingWeight: SpWeightsWeightV2Weight;1096      readonly requiredWeight: SpWeightsWeightV2Weight;1097    } & Struct;1098    readonly isOverweightEnqueued: boolean;1099    readonly asOverweightEnqueued: {1100      readonly messageId: U8aFixed;1101      readonly overweightIndex: u64;1102      readonly requiredWeight: SpWeightsWeightV2Weight;1103    } & Struct;1104    readonly isOverweightServiced: boolean;1105    readonly asOverweightServiced: {1106      readonly overweightIndex: u64;1107      readonly weightUsed: SpWeightsWeightV2Weight;1108    } & Struct;1109    readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';1110  }11111112  /** @name PalletConfigurationEvent (89) */1113  interface PalletConfigurationEvent extends Enum {1114    readonly isNewDesiredCollators: boolean;1115    readonly asNewDesiredCollators: {1116      readonly desiredCollators: Option<u32>;1117    } & Struct;1118    readonly isNewCollatorLicenseBond: boolean;1119    readonly asNewCollatorLicenseBond: {1120      readonly bondCost: Option<u128>;1121    } & Struct;1122    readonly isNewCollatorKickThreshold: boolean;1123    readonly asNewCollatorKickThreshold: {1124      readonly lengthInBlocks: Option<u32>;1125    } & Struct;1126    readonly type: 'NewDesiredCollators' | 'NewCollatorLicenseBond' | 'NewCollatorKickThreshold';1127  }11281129  /** @name PalletCommonEvent (92) */1130  interface PalletCommonEvent extends Enum {1131    readonly isCollectionCreated: boolean;1132    readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;1133    readonly isCollectionDestroyed: boolean;1134    readonly asCollectionDestroyed: u32;1135    readonly isItemCreated: boolean;1136    readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1137    readonly isItemDestroyed: boolean;1138    readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1139    readonly isTransfer: boolean;1140    readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1141    readonly isApproved: boolean;1142    readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1143    readonly isApprovedForAll: boolean;1144    readonly asApprovedForAll: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, bool]>;1145    readonly isCollectionPropertySet: boolean;1146    readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;1147    readonly isCollectionPropertyDeleted: boolean;1148    readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;1149    readonly isTokenPropertySet: boolean;1150    readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;1151    readonly isTokenPropertyDeleted: boolean;1152    readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;1153    readonly isPropertyPermissionSet: boolean;1154    readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;1155    readonly isAllowListAddressAdded: boolean;1156    readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1157    readonly isAllowListAddressRemoved: boolean;1158    readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1159    readonly isCollectionAdminAdded: boolean;1160    readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1161    readonly isCollectionAdminRemoved: boolean;1162    readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1163    readonly isCollectionLimitSet: boolean;1164    readonly asCollectionLimitSet: u32;1165    readonly isCollectionOwnerChanged: boolean;1166    readonly asCollectionOwnerChanged: ITuple<[u32, AccountId32]>;1167    readonly isCollectionPermissionSet: boolean;1168    readonly asCollectionPermissionSet: u32;1169    readonly isCollectionSponsorSet: boolean;1170    readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;1171    readonly isSponsorshipConfirmed: boolean;1172    readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;1173    readonly isCollectionSponsorRemoved: boolean;1174    readonly asCollectionSponsorRemoved: u32;1175    readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'ApprovedForAll' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet' | 'AllowListAddressAdded' | 'AllowListAddressRemoved' | 'CollectionAdminAdded' | 'CollectionAdminRemoved' | 'CollectionLimitSet' | 'CollectionOwnerChanged' | 'CollectionPermissionSet' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionSponsorRemoved';1176  }11771178  /** @name PalletEvmAccountBasicCrossAccountIdRepr (95) */1179  interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1180    readonly isSubstrate: boolean;1181    readonly asSubstrate: AccountId32;1182    readonly isEthereum: boolean;1183    readonly asEthereum: H160;1184    readonly type: 'Substrate' | 'Ethereum';1185  }11861187  /** @name PalletStructureEvent (99) */1188  interface PalletStructureEvent extends Enum {1189    readonly isExecuted: boolean;1190    readonly asExecuted: Result<Null, SpRuntimeDispatchError>;1191    readonly type: 'Executed';1192  }11931194  /** @name PalletRmrkCoreEvent (100) */1195  interface PalletRmrkCoreEvent extends Enum {1196    readonly isCollectionCreated: boolean;1197    readonly asCollectionCreated: {1198      readonly issuer: AccountId32;1199      readonly collectionId: u32;1200    } & Struct;1201    readonly isCollectionDestroyed: boolean;1202    readonly asCollectionDestroyed: {1203      readonly issuer: AccountId32;1204      readonly collectionId: u32;1205    } & Struct;1206    readonly isIssuerChanged: boolean;1207    readonly asIssuerChanged: {1208      readonly oldIssuer: AccountId32;1209      readonly newIssuer: AccountId32;1210      readonly collectionId: u32;1211    } & Struct;1212    readonly isCollectionLocked: boolean;1213    readonly asCollectionLocked: {1214      readonly issuer: AccountId32;1215      readonly collectionId: u32;1216    } & Struct;1217    readonly isNftMinted: boolean;1218    readonly asNftMinted: {1219      readonly owner: AccountId32;1220      readonly collectionId: u32;1221      readonly nftId: u32;1222    } & Struct;1223    readonly isNftBurned: boolean;1224    readonly asNftBurned: {1225      readonly owner: AccountId32;1226      readonly nftId: u32;1227    } & Struct;1228    readonly isNftSent: boolean;1229    readonly asNftSent: {1230      readonly sender: AccountId32;1231      readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1232      readonly collectionId: u32;1233      readonly nftId: u32;1234      readonly approvalRequired: bool;1235    } & Struct;1236    readonly isNftAccepted: boolean;1237    readonly asNftAccepted: {1238      readonly sender: AccountId32;1239      readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1240      readonly collectionId: u32;1241      readonly nftId: u32;1242    } & Struct;1243    readonly isNftRejected: boolean;1244    readonly asNftRejected: {1245      readonly sender: AccountId32;1246      readonly collectionId: u32;1247      readonly nftId: u32;1248    } & Struct;1249    readonly isPropertySet: boolean;1250    readonly asPropertySet: {1251      readonly collectionId: u32;1252      readonly maybeNftId: Option<u32>;1253      readonly key: Bytes;1254      readonly value: Bytes;1255    } & Struct;1256    readonly isResourceAdded: boolean;1257    readonly asResourceAdded: {1258      readonly nftId: u32;1259      readonly resourceId: u32;1260    } & Struct;1261    readonly isResourceRemoval: boolean;1262    readonly asResourceRemoval: {1263      readonly nftId: u32;1264      readonly resourceId: u32;1265    } & Struct;1266    readonly isResourceAccepted: boolean;1267    readonly asResourceAccepted: {1268      readonly nftId: u32;1269      readonly resourceId: u32;1270    } & Struct;1271    readonly isResourceRemovalAccepted: boolean;1272    readonly asResourceRemovalAccepted: {1273      readonly nftId: u32;1274      readonly resourceId: u32;1275    } & Struct;1276    readonly isPrioritySet: boolean;1277    readonly asPrioritySet: {1278      readonly collectionId: u32;1279      readonly nftId: u32;1280    } & Struct;1281    readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';1282  }12831284  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (101) */1285  interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {1286    readonly isAccountId: boolean;1287    readonly asAccountId: AccountId32;1288    readonly isCollectionAndNftTuple: boolean;1289    readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;1290    readonly type: 'AccountId' | 'CollectionAndNftTuple';1291  }12921293  /** @name PalletRmrkEquipEvent (104) */1294  interface PalletRmrkEquipEvent extends Enum {1295    readonly isBaseCreated: boolean;1296    readonly asBaseCreated: {1297      readonly issuer: AccountId32;1298      readonly baseId: u32;1299    } & Struct;1300    readonly isEquippablesUpdated: boolean;1301    readonly asEquippablesUpdated: {1302      readonly baseId: u32;1303      readonly slotId: u32;1304    } & Struct;1305    readonly type: 'BaseCreated' | 'EquippablesUpdated';1306  }13071308  /** @name PalletAppPromotionEvent (105) */1309  interface PalletAppPromotionEvent extends Enum {1310    readonly isStakingRecalculation: boolean;1311    readonly asStakingRecalculation: ITuple<[AccountId32, u128, u128]>;1312    readonly isStake: boolean;1313    readonly asStake: ITuple<[AccountId32, u128]>;1314    readonly isUnstake: boolean;1315    readonly asUnstake: ITuple<[AccountId32, u128]>;1316    readonly isSetAdmin: boolean;1317    readonly asSetAdmin: AccountId32;1318    readonly type: 'StakingRecalculation' | 'Stake' | 'Unstake' | 'SetAdmin';1319  }13201321  /** @name PalletForeignAssetsModuleEvent (106) */1322  interface PalletForeignAssetsModuleEvent extends Enum {1323    readonly isForeignAssetRegistered: boolean;1324    readonly asForeignAssetRegistered: {1325      readonly assetId: u32;1326      readonly assetAddress: XcmV1MultiLocation;1327      readonly metadata: PalletForeignAssetsModuleAssetMetadata;1328    } & Struct;1329    readonly isForeignAssetUpdated: boolean;1330    readonly asForeignAssetUpdated: {1331      readonly assetId: u32;1332      readonly assetAddress: XcmV1MultiLocation;1333      readonly metadata: PalletForeignAssetsModuleAssetMetadata;1334    } & Struct;1335    readonly isAssetRegistered: boolean;1336    readonly asAssetRegistered: {1337      readonly assetId: PalletForeignAssetsAssetIds;1338      readonly metadata: PalletForeignAssetsModuleAssetMetadata;1339    } & Struct;1340    readonly isAssetUpdated: boolean;1341    readonly asAssetUpdated: {1342      readonly assetId: PalletForeignAssetsAssetIds;1343      readonly metadata: PalletForeignAssetsModuleAssetMetadata;1344    } & Struct;1345    readonly type: 'ForeignAssetRegistered' | 'ForeignAssetUpdated' | 'AssetRegistered' | 'AssetUpdated';1346  }13471348  /** @name PalletForeignAssetsModuleAssetMetadata (107) */1349  interface PalletForeignAssetsModuleAssetMetadata extends Struct {1350    readonly name: Bytes;1351    readonly symbol: Bytes;1352    readonly decimals: u8;1353    readonly minimalBalance: u128;1354  }13551356  /** @name PalletEvmEvent (108) */1357  interface PalletEvmEvent extends Enum {1358    readonly isLog: boolean;1359    readonly asLog: {1360      readonly log: EthereumLog;1361    } & Struct;1362    readonly isCreated: boolean;1363    readonly asCreated: {1364      readonly address: H160;1365    } & Struct;1366    readonly isCreatedFailed: boolean;1367    readonly asCreatedFailed: {1368      readonly address: H160;1369    } & Struct;1370    readonly isExecuted: boolean;1371    readonly asExecuted: {1372      readonly address: H160;1373    } & Struct;1374    readonly isExecutedFailed: boolean;1375    readonly asExecutedFailed: {1376      readonly address: H160;1377    } & Struct;1378    readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed';1379  }13801381  /** @name EthereumLog (109) */1382  interface EthereumLog extends Struct {1383    readonly address: H160;1384    readonly topics: Vec<H256>;1385    readonly data: Bytes;1386  }13871388  /** @name PalletEthereumEvent (111) */1389  interface PalletEthereumEvent extends Enum {1390    readonly isExecuted: boolean;1391    readonly asExecuted: {1392      readonly from: H160;1393      readonly to: H160;1394      readonly transactionHash: H256;1395      readonly exitReason: EvmCoreErrorExitReason;1396    } & Struct;1397    readonly type: 'Executed';1398  }13991400  /** @name EvmCoreErrorExitReason (112) */1401  interface EvmCoreErrorExitReason extends Enum {1402    readonly isSucceed: boolean;1403    readonly asSucceed: EvmCoreErrorExitSucceed;1404    readonly isError: boolean;1405    readonly asError: EvmCoreErrorExitError;1406    readonly isRevert: boolean;1407    readonly asRevert: EvmCoreErrorExitRevert;1408    readonly isFatal: boolean;1409    readonly asFatal: EvmCoreErrorExitFatal;1410    readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';1411  }14121413  /** @name EvmCoreErrorExitSucceed (113) */1414  interface EvmCoreErrorExitSucceed extends Enum {1415    readonly isStopped: boolean;1416    readonly isReturned: boolean;1417    readonly isSuicided: boolean;1418    readonly type: 'Stopped' | 'Returned' | 'Suicided';1419  }14201421  /** @name EvmCoreErrorExitError (114) */1422  interface EvmCoreErrorExitError extends Enum {1423    readonly isStackUnderflow: boolean;1424    readonly isStackOverflow: boolean;1425    readonly isInvalidJump: boolean;1426    readonly isInvalidRange: boolean;1427    readonly isDesignatedInvalid: boolean;1428    readonly isCallTooDeep: boolean;1429    readonly isCreateCollision: boolean;1430    readonly isCreateContractLimit: boolean;1431    readonly isOutOfOffset: boolean;1432    readonly isOutOfGas: boolean;1433    readonly isOutOfFund: boolean;1434    readonly isPcUnderflow: boolean;1435    readonly isCreateEmpty: boolean;1436    readonly isOther: boolean;1437    readonly asOther: Text;1438    readonly isInvalidCode: boolean;1439    readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';1440  }14411442  /** @name EvmCoreErrorExitRevert (117) */1443  interface EvmCoreErrorExitRevert extends Enum {1444    readonly isReverted: boolean;1445    readonly type: 'Reverted';1446  }14471448  /** @name EvmCoreErrorExitFatal (118) */1449  interface EvmCoreErrorExitFatal extends Enum {1450    readonly isNotSupported: boolean;1451    readonly isUnhandledInterrupt: boolean;1452    readonly isCallErrorAsFatal: boolean;1453    readonly asCallErrorAsFatal: EvmCoreErrorExitError;1454    readonly isOther: boolean;1455    readonly asOther: Text;1456    readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';1457  }14581459  /** @name PalletEvmContractHelpersEvent (119) */1460  interface PalletEvmContractHelpersEvent extends Enum {1461    readonly isContractSponsorSet: boolean;1462    readonly asContractSponsorSet: ITuple<[H160, AccountId32]>;1463    readonly isContractSponsorshipConfirmed: boolean;1464    readonly asContractSponsorshipConfirmed: ITuple<[H160, AccountId32]>;1465    readonly isContractSponsorRemoved: boolean;1466    readonly asContractSponsorRemoved: H160;1467    readonly type: 'ContractSponsorSet' | 'ContractSponsorshipConfirmed' | 'ContractSponsorRemoved';1468  }14691470  /** @name PalletEvmMigrationEvent (120) */1471  interface PalletEvmMigrationEvent extends Enum {1472    readonly isTestEvent: boolean;1473    readonly type: 'TestEvent';1474  }14751476  /** @name PalletMaintenanceEvent (121) */1477  interface PalletMaintenanceEvent extends Enum {1478    readonly isMaintenanceEnabled: boolean;1479    readonly isMaintenanceDisabled: boolean;1480    readonly type: 'MaintenanceEnabled' | 'MaintenanceDisabled';1481  }14821483  /** @name PalletTestUtilsEvent (122) */1484  interface PalletTestUtilsEvent extends Enum {1485    readonly isValueIsSet: boolean;1486    readonly isShouldRollback: boolean;1487    readonly isBatchCompleted: boolean;1488    readonly type: 'ValueIsSet' | 'ShouldRollback' | 'BatchCompleted';1489  }14901491  /** @name FrameSystemPhase (123) */1492  interface FrameSystemPhase extends Enum {1493    readonly isApplyExtrinsic: boolean;1494    readonly asApplyExtrinsic: u32;1495    readonly isFinalization: boolean;1496    readonly isInitialization: boolean;1497    readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';1498  }14991500  /** @name FrameSystemLastRuntimeUpgradeInfo (126) */1501  interface FrameSystemLastRuntimeUpgradeInfo extends Struct {1502    readonly specVersion: Compact<u32>;1503    readonly specName: Text;1504  }15051506  /** @name FrameSystemCall (127) */1507  interface FrameSystemCall extends Enum {1508    readonly isRemark: boolean;1509    readonly asRemark: {1510      readonly remark: Bytes;1511    } & Struct;1512    readonly isSetHeapPages: boolean;1513    readonly asSetHeapPages: {1514      readonly pages: u64;1515    } & Struct;1516    readonly isSetCode: boolean;1517    readonly asSetCode: {1518      readonly code: Bytes;1519    } & Struct;1520    readonly isSetCodeWithoutChecks: boolean;1521    readonly asSetCodeWithoutChecks: {1522      readonly code: Bytes;1523    } & Struct;1524    readonly isSetStorage: boolean;1525    readonly asSetStorage: {1526      readonly items: Vec<ITuple<[Bytes, Bytes]>>;1527    } & Struct;1528    readonly isKillStorage: boolean;1529    readonly asKillStorage: {1530      readonly keys_: Vec<Bytes>;1531    } & Struct;1532    readonly isKillPrefix: boolean;1533    readonly asKillPrefix: {1534      readonly prefix: Bytes;1535      readonly subkeys: u32;1536    } & Struct;1537    readonly isRemarkWithEvent: boolean;1538    readonly asRemarkWithEvent: {1539      readonly remark: Bytes;1540    } & Struct;1541    readonly type: 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';1542  }15431544  /** @name FrameSystemLimitsBlockWeights (131) */1545  interface FrameSystemLimitsBlockWeights extends Struct {1546    readonly baseBlock: SpWeightsWeightV2Weight;1547    readonly maxBlock: SpWeightsWeightV2Weight;1548    readonly perClass: FrameSupportDispatchPerDispatchClassWeightsPerClass;1549  }15501551  /** @name FrameSupportDispatchPerDispatchClassWeightsPerClass (132) */1552  interface FrameSupportDispatchPerDispatchClassWeightsPerClass extends Struct {1553    readonly normal: FrameSystemLimitsWeightsPerClass;1554    readonly operational: FrameSystemLimitsWeightsPerClass;1555    readonly mandatory: FrameSystemLimitsWeightsPerClass;1556  }15571558  /** @name FrameSystemLimitsWeightsPerClass (133) */1559  interface FrameSystemLimitsWeightsPerClass extends Struct {1560    readonly baseExtrinsic: SpWeightsWeightV2Weight;1561    readonly maxExtrinsic: Option<SpWeightsWeightV2Weight>;1562    readonly maxTotal: Option<SpWeightsWeightV2Weight>;1563    readonly reserved: Option<SpWeightsWeightV2Weight>;1564  }15651566  /** @name FrameSystemLimitsBlockLength (135) */1567  interface FrameSystemLimitsBlockLength extends Struct {1568    readonly max: FrameSupportDispatchPerDispatchClassU32;1569  }15701571  /** @name FrameSupportDispatchPerDispatchClassU32 (136) */1572  interface FrameSupportDispatchPerDispatchClassU32 extends Struct {1573    readonly normal: u32;1574    readonly operational: u32;1575    readonly mandatory: u32;1576  }15771578  /** @name SpWeightsRuntimeDbWeight (137) */1579  interface SpWeightsRuntimeDbWeight extends Struct {1580    readonly read: u64;1581    readonly write: u64;1582  }15831584  /** @name SpVersionRuntimeVersion (138) */1585  interface SpVersionRuntimeVersion extends Struct {1586    readonly specName: Text;1587    readonly implName: Text;1588    readonly authoringVersion: u32;1589    readonly specVersion: u32;1590    readonly implVersion: u32;1591    readonly apis: Vec<ITuple<[U8aFixed, u32]>>;1592    readonly transactionVersion: u32;1593    readonly stateVersion: u8;1594  }15951596  /** @name FrameSystemError (143) */1597  interface FrameSystemError extends Enum {1598    readonly isInvalidSpecName: boolean;1599    readonly isSpecVersionNeedsToIncrease: boolean;1600    readonly isFailedToExtractRuntimeVersion: boolean;1601    readonly isNonDefaultComposite: boolean;1602    readonly isNonZeroRefCount: boolean;1603    readonly isCallFiltered: boolean;1604    readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';1605  }16061607  /** @name PolkadotPrimitivesV2PersistedValidationData (144) */1608  interface PolkadotPrimitivesV2PersistedValidationData extends Struct {1609    readonly parentHead: Bytes;1610    readonly relayParentNumber: u32;1611    readonly relayParentStorageRoot: H256;1612    readonly maxPovSize: u32;1613  }16141615  /** @name PolkadotPrimitivesV2UpgradeRestriction (147) */1616  interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {1617    readonly isPresent: boolean;1618    readonly type: 'Present';1619  }16201621  /** @name SpTrieStorageProof (148) */1622  interface SpTrieStorageProof extends Struct {1623    readonly trieNodes: BTreeSet<Bytes>;1624  }16251626  /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (150) */1627  interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {1628    readonly dmqMqcHead: H256;1629    readonly relayDispatchQueueSize: ITuple<[u32, u32]>;1630    readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;1631    readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;1632  }16331634  /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (153) */1635  interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {1636    readonly maxCapacity: u32;1637    readonly maxTotalSize: u32;1638    readonly maxMessageSize: u32;1639    readonly msgCount: u32;1640    readonly totalSize: u32;1641    readonly mqcHead: Option<H256>;1642  }16431644  /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (154) */1645  interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {1646    readonly maxCodeSize: u32;1647    readonly maxHeadDataSize: u32;1648    readonly maxUpwardQueueCount: u32;1649    readonly maxUpwardQueueSize: u32;1650    readonly maxUpwardMessageSize: u32;1651    readonly maxUpwardMessageNumPerCandidate: u32;1652    readonly hrmpMaxMessageNumPerCandidate: u32;1653    readonly validationUpgradeCooldown: u32;1654    readonly validationUpgradeDelay: u32;1655  }16561657  /** @name PolkadotCorePrimitivesOutboundHrmpMessage (160) */1658  interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {1659    readonly recipient: u32;1660    readonly data: Bytes;1661  }16621663  /** @name CumulusPalletParachainSystemCall (161) */1664  interface CumulusPalletParachainSystemCall extends Enum {1665    readonly isSetValidationData: boolean;1666    readonly asSetValidationData: {1667      readonly data: CumulusPrimitivesParachainInherentParachainInherentData;1668    } & Struct;1669    readonly isSudoSendUpwardMessage: boolean;1670    readonly asSudoSendUpwardMessage: {1671      readonly message: Bytes;1672    } & Struct;1673    readonly isAuthorizeUpgrade: boolean;1674    readonly asAuthorizeUpgrade: {1675      readonly codeHash: H256;1676    } & Struct;1677    readonly isEnactAuthorizedUpgrade: boolean;1678    readonly asEnactAuthorizedUpgrade: {1679      readonly code: Bytes;1680    } & Struct;1681    readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';1682  }16831684  /** @name CumulusPrimitivesParachainInherentParachainInherentData (162) */1685  interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {1686    readonly validationData: PolkadotPrimitivesV2PersistedValidationData;1687    readonly relayChainState: SpTrieStorageProof;1688    readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;1689    readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;1690  }16911692  /** @name PolkadotCorePrimitivesInboundDownwardMessage (164) */1693  interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {1694    readonly sentAt: u32;1695    readonly msg: Bytes;1696  }16971698  /** @name PolkadotCorePrimitivesInboundHrmpMessage (167) */1699  interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {1700    readonly sentAt: u32;1701    readonly data: Bytes;1702  }17031704  /** @name CumulusPalletParachainSystemError (170) */1705  interface CumulusPalletParachainSystemError extends Enum {1706    readonly isOverlappingUpgrades: boolean;1707    readonly isProhibitedByPolkadot: boolean;1708    readonly isTooBig: boolean;1709    readonly isValidationDataNotAvailable: boolean;1710    readonly isHostConfigurationNotAvailable: boolean;1711    readonly isNotScheduled: boolean;1712    readonly isNothingAuthorized: boolean;1713    readonly isUnauthorized: boolean;1714    readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';1715  }17161717  /** @name PalletBalancesBalanceLock (172) */1718  interface PalletBalancesBalanceLock extends Struct {1719    readonly id: U8aFixed;1720    readonly amount: u128;1721    readonly reasons: PalletBalancesReasons;1722  }17231724  /** @name PalletBalancesReasons (173) */1725  interface PalletBalancesReasons extends Enum {1726    readonly isFee: boolean;1727    readonly isMisc: boolean;1728    readonly isAll: boolean;1729    readonly type: 'Fee' | 'Misc' | 'All';1730  }17311732  /** @name PalletBalancesReserveData (176) */1733  interface PalletBalancesReserveData extends Struct {1734    readonly id: U8aFixed;1735    readonly amount: u128;1736  }17371738  /** @name PalletBalancesCall (178) */1739  interface PalletBalancesCall extends Enum {1740    readonly isTransfer: boolean;1741    readonly asTransfer: {1742      readonly dest: MultiAddress;1743      readonly value: Compact<u128>;1744    } & Struct;1745    readonly isSetBalance: boolean;1746    readonly asSetBalance: {1747      readonly who: MultiAddress;1748      readonly newFree: Compact<u128>;1749      readonly newReserved: Compact<u128>;1750    } & Struct;1751    readonly isForceTransfer: boolean;1752    readonly asForceTransfer: {1753      readonly source: MultiAddress;1754      readonly dest: MultiAddress;1755      readonly value: Compact<u128>;1756    } & Struct;1757    readonly isTransferKeepAlive: boolean;1758    readonly asTransferKeepAlive: {1759      readonly dest: MultiAddress;1760      readonly value: Compact<u128>;1761    } & Struct;1762    readonly isTransferAll: boolean;1763    readonly asTransferAll: {1764      readonly dest: MultiAddress;1765      readonly keepAlive: bool;1766    } & Struct;1767    readonly isForceUnreserve: boolean;1768    readonly asForceUnreserve: {1769      readonly who: MultiAddress;1770      readonly amount: u128;1771    } & Struct;1772    readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';1773  }17741775  /** @name PalletBalancesError (181) */1776  interface PalletBalancesError extends Enum {1777    readonly isVestingBalance: boolean;1778    readonly isLiquidityRestrictions: boolean;1779    readonly isInsufficientBalance: boolean;1780    readonly isExistentialDeposit: boolean;1781    readonly isKeepAlive: boolean;1782    readonly isExistingVestingSchedule: boolean;1783    readonly isDeadAccount: boolean;1784    readonly isTooManyReserves: boolean;1785    readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';1786  }17871788  /** @name PalletTimestampCall (183) */1789  interface PalletTimestampCall extends Enum {1790    readonly isSet: boolean;1791    readonly asSet: {1792      readonly now: Compact<u64>;1793    } & Struct;1794    readonly type: 'Set';1795  }17961797  /** @name PalletTransactionPaymentReleases (185) */1798  interface PalletTransactionPaymentReleases extends Enum {1799    readonly isV1Ancient: boolean;1800    readonly isV2: boolean;1801    readonly type: 'V1Ancient' | 'V2';1802  }18031804  /** @name PalletTreasuryProposal (186) */1805  interface PalletTreasuryProposal extends Struct {1806    readonly proposer: AccountId32;1807    readonly value: u128;1808    readonly beneficiary: AccountId32;1809    readonly bond: u128;1810  }18111812  /** @name PalletTreasuryCall (189) */1813  interface PalletTreasuryCall extends Enum {1814    readonly isProposeSpend: boolean;1815    readonly asProposeSpend: {1816      readonly value: Compact<u128>;1817      readonly beneficiary: MultiAddress;1818    } & Struct;1819    readonly isRejectProposal: boolean;1820    readonly asRejectProposal: {1821      readonly proposalId: Compact<u32>;1822    } & Struct;1823    readonly isApproveProposal: boolean;1824    readonly asApproveProposal: {1825      readonly proposalId: Compact<u32>;1826    } & Struct;1827    readonly isSpend: boolean;1828    readonly asSpend: {1829      readonly amount: Compact<u128>;1830      readonly beneficiary: MultiAddress;1831    } & Struct;1832    readonly isRemoveApproval: boolean;1833    readonly asRemoveApproval: {1834      readonly proposalId: Compact<u32>;1835    } & Struct;1836    readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'Spend' | 'RemoveApproval';1837  }18381839  /** @name FrameSupportPalletId (191) */1840  interface FrameSupportPalletId extends U8aFixed {}18411842  /** @name PalletTreasuryError (192) */1843  interface PalletTreasuryError extends Enum {1844    readonly isInsufficientProposersBalance: boolean;1845    readonly isInvalidIndex: boolean;1846    readonly isTooManyApprovals: boolean;1847    readonly isInsufficientPermission: boolean;1848    readonly isProposalNotApproved: boolean;1849    readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'InsufficientPermission' | 'ProposalNotApproved';1850  }18511852  /** @name PalletSudoCall (193) */1853  interface PalletSudoCall extends Enum {1854    readonly isSudo: boolean;1855    readonly asSudo: {1856      readonly call: Call;1857    } & Struct;1858    readonly isSudoUncheckedWeight: boolean;1859    readonly asSudoUncheckedWeight: {1860      readonly call: Call;1861      readonly weight: SpWeightsWeightV2Weight;1862    } & Struct;1863    readonly isSetKey: boolean;1864    readonly asSetKey: {1865      readonly new_: MultiAddress;1866    } & Struct;1867    readonly isSudoAs: boolean;1868    readonly asSudoAs: {1869      readonly who: MultiAddress;1870      readonly call: Call;1871    } & Struct;1872    readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';1873  }18741875  /** @name OrmlVestingModuleCall (195) */1876  interface OrmlVestingModuleCall extends Enum {1877    readonly isClaim: boolean;1878    readonly isVestedTransfer: boolean;1879    readonly asVestedTransfer: {1880      readonly dest: MultiAddress;1881      readonly schedule: OrmlVestingVestingSchedule;1882    } & Struct;1883    readonly isUpdateVestingSchedules: boolean;1884    readonly asUpdateVestingSchedules: {1885      readonly who: MultiAddress;1886      readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;1887    } & Struct;1888    readonly isClaimFor: boolean;1889    readonly asClaimFor: {1890      readonly dest: MultiAddress;1891    } & Struct;1892    readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';1893  }18941895  /** @name OrmlXtokensModuleCall (197) */1896  interface OrmlXtokensModuleCall extends Enum {1897    readonly isTransfer: boolean;1898    readonly asTransfer: {1899      readonly currencyId: PalletForeignAssetsAssetIds;1900      readonly amount: u128;1901      readonly dest: XcmVersionedMultiLocation;1902      readonly destWeightLimit: XcmV2WeightLimit;1903    } & Struct;1904    readonly isTransferMultiasset: boolean;1905    readonly asTransferMultiasset: {1906      readonly asset: XcmVersionedMultiAsset;1907      readonly dest: XcmVersionedMultiLocation;1908      readonly destWeightLimit: XcmV2WeightLimit;1909    } & Struct;1910    readonly isTransferWithFee: boolean;1911    readonly asTransferWithFee: {1912      readonly currencyId: PalletForeignAssetsAssetIds;1913      readonly amount: u128;1914      readonly fee: u128;1915      readonly dest: XcmVersionedMultiLocation;1916      readonly destWeightLimit: XcmV2WeightLimit;1917    } & Struct;1918    readonly isTransferMultiassetWithFee: boolean;1919    readonly asTransferMultiassetWithFee: {1920      readonly asset: XcmVersionedMultiAsset;1921      readonly fee: XcmVersionedMultiAsset;1922      readonly dest: XcmVersionedMultiLocation;1923      readonly destWeightLimit: XcmV2WeightLimit;1924    } & Struct;1925    readonly isTransferMulticurrencies: boolean;1926    readonly asTransferMulticurrencies: {1927      readonly currencies: Vec<ITuple<[PalletForeignAssetsAssetIds, u128]>>;1928      readonly feeItem: u32;1929      readonly dest: XcmVersionedMultiLocation;1930      readonly destWeightLimit: XcmV2WeightLimit;1931    } & Struct;1932    readonly isTransferMultiassets: boolean;1933    readonly asTransferMultiassets: {1934      readonly assets: XcmVersionedMultiAssets;1935      readonly feeItem: u32;1936      readonly dest: XcmVersionedMultiLocation;1937      readonly destWeightLimit: XcmV2WeightLimit;1938    } & Struct;1939    readonly type: 'Transfer' | 'TransferMultiasset' | 'TransferWithFee' | 'TransferMultiassetWithFee' | 'TransferMulticurrencies' | 'TransferMultiassets';1940  }19411942  /** @name XcmVersionedMultiAsset (198) */1943  interface XcmVersionedMultiAsset extends Enum {1944    readonly isV0: boolean;1945    readonly asV0: XcmV0MultiAsset;1946    readonly isV1: boolean;1947    readonly asV1: XcmV1MultiAsset;1948    readonly type: 'V0' | 'V1';1949  }19501951  /** @name OrmlTokensModuleCall (201) */1952  interface OrmlTokensModuleCall extends Enum {1953    readonly isTransfer: boolean;1954    readonly asTransfer: {1955      readonly dest: MultiAddress;1956      readonly currencyId: PalletForeignAssetsAssetIds;1957      readonly amount: Compact<u128>;1958    } & Struct;1959    readonly isTransferAll: boolean;1960    readonly asTransferAll: {1961      readonly dest: MultiAddress;1962      readonly currencyId: PalletForeignAssetsAssetIds;1963      readonly keepAlive: bool;1964    } & Struct;1965    readonly isTransferKeepAlive: boolean;1966    readonly asTransferKeepAlive: {1967      readonly dest: MultiAddress;1968      readonly currencyId: PalletForeignAssetsAssetIds;1969      readonly amount: Compact<u128>;1970    } & Struct;1971    readonly isForceTransfer: boolean;1972    readonly asForceTransfer: {1973      readonly source: MultiAddress;1974      readonly dest: MultiAddress;1975      readonly currencyId: PalletForeignAssetsAssetIds;1976      readonly amount: Compact<u128>;1977    } & Struct;1978    readonly isSetBalance: boolean;1979    readonly asSetBalance: {1980      readonly who: MultiAddress;1981      readonly currencyId: PalletForeignAssetsAssetIds;1982      readonly newFree: Compact<u128>;1983      readonly newReserved: Compact<u128>;1984    } & Struct;1985    readonly type: 'Transfer' | 'TransferAll' | 'TransferKeepAlive' | 'ForceTransfer' | 'SetBalance';1986  }19871988  /** @name CumulusPalletXcmpQueueCall (202) */1989  interface CumulusPalletXcmpQueueCall extends Enum {1990    readonly isServiceOverweight: boolean;1991    readonly asServiceOverweight: {1992      readonly index: u64;1993      readonly weightLimit: u64;1994    } & Struct;1995    readonly isSuspendXcmExecution: boolean;1996    readonly isResumeXcmExecution: boolean;1997    readonly isUpdateSuspendThreshold: boolean;1998    readonly asUpdateSuspendThreshold: {1999      readonly new_: u32;2000    } & Struct;2001    readonly isUpdateDropThreshold: boolean;2002    readonly asUpdateDropThreshold: {2003      readonly new_: u32;2004    } & Struct;2005    readonly isUpdateResumeThreshold: boolean;2006    readonly asUpdateResumeThreshold: {2007      readonly new_: u32;2008    } & Struct;2009    readonly isUpdateThresholdWeight: boolean;2010    readonly asUpdateThresholdWeight: {2011      readonly new_: u64;2012    } & Struct;2013    readonly isUpdateWeightRestrictDecay: boolean;2014    readonly asUpdateWeightRestrictDecay: {2015      readonly new_: u64;2016    } & Struct;2017    readonly isUpdateXcmpMaxIndividualWeight: boolean;2018    readonly asUpdateXcmpMaxIndividualWeight: {2019      readonly new_: u64;2020    } & Struct;2021    readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';2022  }20232024  /** @name PalletXcmCall (203) */2025  interface PalletXcmCall extends Enum {2026    readonly isSend: boolean;2027    readonly asSend: {2028      readonly dest: XcmVersionedMultiLocation;2029      readonly message: XcmVersionedXcm;2030    } & Struct;2031    readonly isTeleportAssets: boolean;2032    readonly asTeleportAssets: {2033      readonly dest: XcmVersionedMultiLocation;2034      readonly beneficiary: XcmVersionedMultiLocation;2035      readonly assets: XcmVersionedMultiAssets;2036      readonly feeAssetItem: u32;2037    } & Struct;2038    readonly isReserveTransferAssets: boolean;2039    readonly asReserveTransferAssets: {2040      readonly dest: XcmVersionedMultiLocation;2041      readonly beneficiary: XcmVersionedMultiLocation;2042      readonly assets: XcmVersionedMultiAssets;2043      readonly feeAssetItem: u32;2044    } & Struct;2045    readonly isExecute: boolean;2046    readonly asExecute: {2047      readonly message: XcmVersionedXcm;2048      readonly maxWeight: u64;2049    } & Struct;2050    readonly isForceXcmVersion: boolean;2051    readonly asForceXcmVersion: {2052      readonly location: XcmV1MultiLocation;2053      readonly xcmVersion: u32;2054    } & Struct;2055    readonly isForceDefaultXcmVersion: boolean;2056    readonly asForceDefaultXcmVersion: {2057      readonly maybeXcmVersion: Option<u32>;2058    } & Struct;2059    readonly isForceSubscribeVersionNotify: boolean;2060    readonly asForceSubscribeVersionNotify: {2061      readonly location: XcmVersionedMultiLocation;2062    } & Struct;2063    readonly isForceUnsubscribeVersionNotify: boolean;2064    readonly asForceUnsubscribeVersionNotify: {2065      readonly location: XcmVersionedMultiLocation;2066    } & Struct;2067    readonly isLimitedReserveTransferAssets: boolean;2068    readonly asLimitedReserveTransferAssets: {2069      readonly dest: XcmVersionedMultiLocation;2070      readonly beneficiary: XcmVersionedMultiLocation;2071      readonly assets: XcmVersionedMultiAssets;2072      readonly feeAssetItem: u32;2073      readonly weightLimit: XcmV2WeightLimit;2074    } & Struct;2075    readonly isLimitedTeleportAssets: boolean;2076    readonly asLimitedTeleportAssets: {2077      readonly dest: XcmVersionedMultiLocation;2078      readonly beneficiary: XcmVersionedMultiLocation;2079      readonly assets: XcmVersionedMultiAssets;2080      readonly feeAssetItem: u32;2081      readonly weightLimit: XcmV2WeightLimit;2082    } & Struct;2083    readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';2084  }20852086  /** @name XcmVersionedXcm (204) */2087  interface XcmVersionedXcm extends Enum {2088    readonly isV0: boolean;2089    readonly asV0: XcmV0Xcm;2090    readonly isV1: boolean;2091    readonly asV1: XcmV1Xcm;2092    readonly isV2: boolean;2093    readonly asV2: XcmV2Xcm;2094    readonly type: 'V0' | 'V1' | 'V2';2095  }20962097  /** @name XcmV0Xcm (205) */2098  interface XcmV0Xcm extends Enum {2099    readonly isWithdrawAsset: boolean;2100    readonly asWithdrawAsset: {2101      readonly assets: Vec<XcmV0MultiAsset>;2102      readonly effects: Vec<XcmV0Order>;2103    } & Struct;2104    readonly isReserveAssetDeposit: boolean;2105    readonly asReserveAssetDeposit: {2106      readonly assets: Vec<XcmV0MultiAsset>;2107      readonly effects: Vec<XcmV0Order>;2108    } & Struct;2109    readonly isTeleportAsset: boolean;2110    readonly asTeleportAsset: {2111      readonly assets: Vec<XcmV0MultiAsset>;2112      readonly effects: Vec<XcmV0Order>;2113    } & Struct;2114    readonly isQueryResponse: boolean;2115    readonly asQueryResponse: {2116      readonly queryId: Compact<u64>;2117      readonly response: XcmV0Response;2118    } & Struct;2119    readonly isTransferAsset: boolean;2120    readonly asTransferAsset: {2121      readonly assets: Vec<XcmV0MultiAsset>;2122      readonly dest: XcmV0MultiLocation;2123    } & Struct;2124    readonly isTransferReserveAsset: boolean;2125    readonly asTransferReserveAsset: {2126      readonly assets: Vec<XcmV0MultiAsset>;2127      readonly dest: XcmV0MultiLocation;2128      readonly effects: Vec<XcmV0Order>;2129    } & Struct;2130    readonly isTransact: boolean;2131    readonly asTransact: {2132      readonly originType: XcmV0OriginKind;2133      readonly requireWeightAtMost: u64;2134      readonly call: XcmDoubleEncoded;2135    } & Struct;2136    readonly isHrmpNewChannelOpenRequest: boolean;2137    readonly asHrmpNewChannelOpenRequest: {2138      readonly sender: Compact<u32>;2139      readonly maxMessageSize: Compact<u32>;2140      readonly maxCapacity: Compact<u32>;2141    } & Struct;2142    readonly isHrmpChannelAccepted: boolean;2143    readonly asHrmpChannelAccepted: {2144      readonly recipient: Compact<u32>;2145    } & Struct;2146    readonly isHrmpChannelClosing: boolean;2147    readonly asHrmpChannelClosing: {2148      readonly initiator: Compact<u32>;2149      readonly sender: Compact<u32>;2150      readonly recipient: Compact<u32>;2151    } & Struct;2152    readonly isRelayedFrom: boolean;2153    readonly asRelayedFrom: {2154      readonly who: XcmV0MultiLocation;2155      readonly message: XcmV0Xcm;2156    } & Struct;2157    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';2158  }21592160  /** @name XcmV0Order (207) */2161  interface XcmV0Order extends Enum {2162    readonly isNull: boolean;2163    readonly isDepositAsset: boolean;2164    readonly asDepositAsset: {2165      readonly assets: Vec<XcmV0MultiAsset>;2166      readonly dest: XcmV0MultiLocation;2167    } & Struct;2168    readonly isDepositReserveAsset: boolean;2169    readonly asDepositReserveAsset: {2170      readonly assets: Vec<XcmV0MultiAsset>;2171      readonly dest: XcmV0MultiLocation;2172      readonly effects: Vec<XcmV0Order>;2173    } & Struct;2174    readonly isExchangeAsset: boolean;2175    readonly asExchangeAsset: {2176      readonly give: Vec<XcmV0MultiAsset>;2177      readonly receive: Vec<XcmV0MultiAsset>;2178    } & Struct;2179    readonly isInitiateReserveWithdraw: boolean;2180    readonly asInitiateReserveWithdraw: {2181      readonly assets: Vec<XcmV0MultiAsset>;2182      readonly reserve: XcmV0MultiLocation;2183      readonly effects: Vec<XcmV0Order>;2184    } & Struct;2185    readonly isInitiateTeleport: boolean;2186    readonly asInitiateTeleport: {2187      readonly assets: Vec<XcmV0MultiAsset>;2188      readonly dest: XcmV0MultiLocation;2189      readonly effects: Vec<XcmV0Order>;2190    } & Struct;2191    readonly isQueryHolding: boolean;2192    readonly asQueryHolding: {2193      readonly queryId: Compact<u64>;2194      readonly dest: XcmV0MultiLocation;2195      readonly assets: Vec<XcmV0MultiAsset>;2196    } & Struct;2197    readonly isBuyExecution: boolean;2198    readonly asBuyExecution: {2199      readonly fees: XcmV0MultiAsset;2200      readonly weight: u64;2201      readonly debt: u64;2202      readonly haltOnError: bool;2203      readonly xcm: Vec<XcmV0Xcm>;2204    } & Struct;2205    readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';2206  }22072208  /** @name XcmV0Response (209) */2209  interface XcmV0Response extends Enum {2210    readonly isAssets: boolean;2211    readonly asAssets: Vec<XcmV0MultiAsset>;2212    readonly type: 'Assets';2213  }22142215  /** @name XcmV1Xcm (210) */2216  interface XcmV1Xcm extends Enum {2217    readonly isWithdrawAsset: boolean;2218    readonly asWithdrawAsset: {2219      readonly assets: XcmV1MultiassetMultiAssets;2220      readonly effects: Vec<XcmV1Order>;2221    } & Struct;2222    readonly isReserveAssetDeposited: boolean;2223    readonly asReserveAssetDeposited: {2224      readonly assets: XcmV1MultiassetMultiAssets;2225      readonly effects: Vec<XcmV1Order>;2226    } & Struct;2227    readonly isReceiveTeleportedAsset: boolean;2228    readonly asReceiveTeleportedAsset: {2229      readonly assets: XcmV1MultiassetMultiAssets;2230      readonly effects: Vec<XcmV1Order>;2231    } & Struct;2232    readonly isQueryResponse: boolean;2233    readonly asQueryResponse: {2234      readonly queryId: Compact<u64>;2235      readonly response: XcmV1Response;2236    } & Struct;2237    readonly isTransferAsset: boolean;2238    readonly asTransferAsset: {2239      readonly assets: XcmV1MultiassetMultiAssets;2240      readonly beneficiary: XcmV1MultiLocation;2241    } & Struct;2242    readonly isTransferReserveAsset: boolean;2243    readonly asTransferReserveAsset: {2244      readonly assets: XcmV1MultiassetMultiAssets;2245      readonly dest: XcmV1MultiLocation;2246      readonly effects: Vec<XcmV1Order>;2247    } & Struct;2248    readonly isTransact: boolean;2249    readonly asTransact: {2250      readonly originType: XcmV0OriginKind;2251      readonly requireWeightAtMost: u64;2252      readonly call: XcmDoubleEncoded;2253    } & Struct;2254    readonly isHrmpNewChannelOpenRequest: boolean;2255    readonly asHrmpNewChannelOpenRequest: {2256      readonly sender: Compact<u32>;2257      readonly maxMessageSize: Compact<u32>;2258      readonly maxCapacity: Compact<u32>;2259    } & Struct;2260    readonly isHrmpChannelAccepted: boolean;2261    readonly asHrmpChannelAccepted: {2262      readonly recipient: Compact<u32>;2263    } & Struct;2264    readonly isHrmpChannelClosing: boolean;2265    readonly asHrmpChannelClosing: {2266      readonly initiator: Compact<u32>;2267      readonly sender: Compact<u32>;2268      readonly recipient: Compact<u32>;2269    } & Struct;2270    readonly isRelayedFrom: boolean;2271    readonly asRelayedFrom: {2272      readonly who: XcmV1MultilocationJunctions;2273      readonly message: XcmV1Xcm;2274    } & Struct;2275    readonly isSubscribeVersion: boolean;2276    readonly asSubscribeVersion: {2277      readonly queryId: Compact<u64>;2278      readonly maxResponseWeight: Compact<u64>;2279    } & Struct;2280    readonly isUnsubscribeVersion: boolean;2281    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';2282  }22832284  /** @name XcmV1Order (212) */2285  interface XcmV1Order extends Enum {2286    readonly isNoop: boolean;2287    readonly isDepositAsset: boolean;2288    readonly asDepositAsset: {2289      readonly assets: XcmV1MultiassetMultiAssetFilter;2290      readonly maxAssets: u32;2291      readonly beneficiary: XcmV1MultiLocation;2292    } & Struct;2293    readonly isDepositReserveAsset: boolean;2294    readonly asDepositReserveAsset: {2295      readonly assets: XcmV1MultiassetMultiAssetFilter;2296      readonly maxAssets: u32;2297      readonly dest: XcmV1MultiLocation;2298      readonly effects: Vec<XcmV1Order>;2299    } & Struct;2300    readonly isExchangeAsset: boolean;2301    readonly asExchangeAsset: {2302      readonly give: XcmV1MultiassetMultiAssetFilter;2303      readonly receive: XcmV1MultiassetMultiAssets;2304    } & Struct;2305    readonly isInitiateReserveWithdraw: boolean;2306    readonly asInitiateReserveWithdraw: {2307      readonly assets: XcmV1MultiassetMultiAssetFilter;2308      readonly reserve: XcmV1MultiLocation;2309      readonly effects: Vec<XcmV1Order>;2310    } & Struct;2311    readonly isInitiateTeleport: boolean;2312    readonly asInitiateTeleport: {2313      readonly assets: XcmV1MultiassetMultiAssetFilter;2314      readonly dest: XcmV1MultiLocation;2315      readonly effects: Vec<XcmV1Order>;2316    } & Struct;2317    readonly isQueryHolding: boolean;2318    readonly asQueryHolding: {2319      readonly queryId: Compact<u64>;2320      readonly dest: XcmV1MultiLocation;2321      readonly assets: XcmV1MultiassetMultiAssetFilter;2322    } & Struct;2323    readonly isBuyExecution: boolean;2324    readonly asBuyExecution: {2325      readonly fees: XcmV1MultiAsset;2326      readonly weight: u64;2327      readonly debt: u64;2328      readonly haltOnError: bool;2329      readonly instructions: Vec<XcmV1Xcm>;2330    } & Struct;2331    readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';2332  }23332334  /** @name XcmV1Response (214) */2335  interface XcmV1Response extends Enum {2336    readonly isAssets: boolean;2337    readonly asAssets: XcmV1MultiassetMultiAssets;2338    readonly isVersion: boolean;2339    readonly asVersion: u32;2340    readonly type: 'Assets' | 'Version';2341  }23422343  /** @name CumulusPalletXcmCall (228) */2344  type CumulusPalletXcmCall = Null;23452346  /** @name CumulusPalletDmpQueueCall (229) */2347  interface CumulusPalletDmpQueueCall extends Enum {2348    readonly isServiceOverweight: boolean;2349    readonly asServiceOverweight: {2350      readonly index: u64;2351      readonly weightLimit: u64;2352    } & Struct;2353    readonly type: 'ServiceOverweight';2354  }23552356  /** @name PalletInflationCall (230) */2357  interface PalletInflationCall extends Enum {2358    readonly isStartInflation: boolean;2359    readonly asStartInflation: {2360      readonly inflationStartRelayBlock: u32;2361    } & Struct;2362    readonly type: 'StartInflation';2363  }23642365  /** @name PalletUniqueCall (231) */2366  interface PalletUniqueCall extends Enum {2367    readonly isCreateCollection: boolean;2368    readonly asCreateCollection: {2369      readonly collectionName: Vec<u16>;2370      readonly collectionDescription: Vec<u16>;2371      readonly tokenPrefix: Bytes;2372      readonly mode: UpDataStructsCollectionMode;2373    } & Struct;2374    readonly isCreateCollectionEx: boolean;2375    readonly asCreateCollectionEx: {2376      readonly data: UpDataStructsCreateCollectionData;2377    } & Struct;2378    readonly isDestroyCollection: boolean;2379    readonly asDestroyCollection: {2380      readonly collectionId: u32;2381    } & Struct;2382    readonly isAddToAllowList: boolean;2383    readonly asAddToAllowList: {2384      readonly collectionId: u32;2385      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;2386    } & Struct;2387    readonly isRemoveFromAllowList: boolean;2388    readonly asRemoveFromAllowList: {2389      readonly collectionId: u32;2390      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;2391    } & Struct;2392    readonly isChangeCollectionOwner: boolean;2393    readonly asChangeCollectionOwner: {2394      readonly collectionId: u32;2395      readonly newOwner: AccountId32;2396    } & Struct;2397    readonly isAddCollectionAdmin: boolean;2398    readonly asAddCollectionAdmin: {2399      readonly collectionId: u32;2400      readonly newAdminId: PalletEvmAccountBasicCrossAccountIdRepr;2401    } & Struct;2402    readonly isRemoveCollectionAdmin: boolean;2403    readonly asRemoveCollectionAdmin: {2404      readonly collectionId: u32;2405      readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;2406    } & Struct;2407    readonly isSetCollectionSponsor: boolean;2408    readonly asSetCollectionSponsor: {2409      readonly collectionId: u32;2410      readonly newSponsor: AccountId32;2411    } & Struct;2412    readonly isConfirmSponsorship: boolean;2413    readonly asConfirmSponsorship: {2414      readonly collectionId: u32;2415    } & Struct;2416    readonly isRemoveCollectionSponsor: boolean;2417    readonly asRemoveCollectionSponsor: {2418      readonly collectionId: u32;2419    } & Struct;2420    readonly isCreateItem: boolean;2421    readonly asCreateItem: {2422      readonly collectionId: u32;2423      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2424      readonly data: UpDataStructsCreateItemData;2425    } & Struct;2426    readonly isCreateMultipleItems: boolean;2427    readonly asCreateMultipleItems: {2428      readonly collectionId: u32;2429      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2430      readonly itemsData: Vec<UpDataStructsCreateItemData>;2431    } & Struct;2432    readonly isSetCollectionProperties: boolean;2433    readonly asSetCollectionProperties: {2434      readonly collectionId: u32;2435      readonly properties: Vec<UpDataStructsProperty>;2436    } & Struct;2437    readonly isDeleteCollectionProperties: boolean;2438    readonly asDeleteCollectionProperties: {2439      readonly collectionId: u32;2440      readonly propertyKeys: Vec<Bytes>;2441    } & Struct;2442    readonly isSetTokenProperties: boolean;2443    readonly asSetTokenProperties: {2444      readonly collectionId: u32;2445      readonly tokenId: u32;2446      readonly properties: Vec<UpDataStructsProperty>;2447    } & Struct;2448    readonly isDeleteTokenProperties: boolean;2449    readonly asDeleteTokenProperties: {2450      readonly collectionId: u32;2451      readonly tokenId: u32;2452      readonly propertyKeys: Vec<Bytes>;2453    } & Struct;2454    readonly isSetTokenPropertyPermissions: boolean;2455    readonly asSetTokenPropertyPermissions: {2456      readonly collectionId: u32;2457      readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2458    } & Struct;2459    readonly isCreateMultipleItemsEx: boolean;2460    readonly asCreateMultipleItemsEx: {2461      readonly collectionId: u32;2462      readonly data: UpDataStructsCreateItemExData;2463    } & Struct;2464    readonly isSetTransfersEnabledFlag: boolean;2465    readonly asSetTransfersEnabledFlag: {2466      readonly collectionId: u32;2467      readonly value: bool;2468    } & Struct;2469    readonly isBurnItem: boolean;2470    readonly asBurnItem: {2471      readonly collectionId: u32;2472      readonly itemId: u32;2473      readonly value: u128;2474    } & Struct;2475    readonly isBurnFrom: boolean;2476    readonly asBurnFrom: {2477      readonly collectionId: u32;2478      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;2479      readonly itemId: u32;2480      readonly value: u128;2481    } & Struct;2482    readonly isTransfer: boolean;2483    readonly asTransfer: {2484      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;2485      readonly collectionId: u32;2486      readonly itemId: u32;2487      readonly value: u128;2488    } & Struct;2489    readonly isApprove: boolean;2490    readonly asApprove: {2491      readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;2492      readonly collectionId: u32;2493      readonly itemId: u32;2494      readonly amount: u128;2495    } & Struct;2496    readonly isTransferFrom: boolean;2497    readonly asTransferFrom: {2498      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;2499      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;2500      readonly collectionId: u32;2501      readonly itemId: u32;2502      readonly value: u128;2503    } & Struct;2504    readonly isSetCollectionLimits: boolean;2505    readonly asSetCollectionLimits: {2506      readonly collectionId: u32;2507      readonly newLimit: UpDataStructsCollectionLimits;2508    } & Struct;2509    readonly isSetCollectionPermissions: boolean;2510    readonly asSetCollectionPermissions: {2511      readonly collectionId: u32;2512      readonly newPermission: UpDataStructsCollectionPermissions;2513    } & Struct;2514    readonly isRepartition: boolean;2515    readonly asRepartition: {2516      readonly collectionId: u32;2517      readonly tokenId: u32;2518      readonly amount: u128;2519    } & Struct;2520    readonly isSetAllowanceForAll: boolean;2521    readonly asSetAllowanceForAll: {2522      readonly collectionId: u32;2523      readonly operator: PalletEvmAccountBasicCrossAccountIdRepr;2524      readonly approve: bool;2525    } & Struct;2526    readonly isForceRepairCollection: boolean;2527    readonly asForceRepairCollection: {2528      readonly collectionId: u32;2529    } & Struct;2530    readonly isForceRepairItem: boolean;2531    readonly asForceRepairItem: {2532      readonly collectionId: u32;2533      readonly itemId: u32;2534    } & Struct;2535    readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition' | 'SetAllowanceForAll' | 'ForceRepairCollection' | 'ForceRepairItem';2536  }25372538  /** @name UpDataStructsCollectionMode (236) */2539  interface UpDataStructsCollectionMode extends Enum {2540    readonly isNft: boolean;2541    readonly isFungible: boolean;2542    readonly asFungible: u8;2543    readonly isReFungible: boolean;2544    readonly type: 'Nft' | 'Fungible' | 'ReFungible';2545  }25462547  /** @name UpDataStructsCreateCollectionData (237) */2548  interface UpDataStructsCreateCollectionData extends Struct {2549    readonly mode: UpDataStructsCollectionMode;2550    readonly access: Option<UpDataStructsAccessMode>;2551    readonly name: Vec<u16>;2552    readonly description: Vec<u16>;2553    readonly tokenPrefix: Bytes;2554    readonly pendingSponsor: Option<AccountId32>;2555    readonly limits: Option<UpDataStructsCollectionLimits>;2556    readonly permissions: Option<UpDataStructsCollectionPermissions>;2557    readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2558    readonly properties: Vec<UpDataStructsProperty>;2559  }25602561  /** @name UpDataStructsAccessMode (239) */2562  interface UpDataStructsAccessMode extends Enum {2563    readonly isNormal: boolean;2564    readonly isAllowList: boolean;2565    readonly type: 'Normal' | 'AllowList';2566  }25672568  /** @name UpDataStructsCollectionLimits (241) */2569  interface UpDataStructsCollectionLimits extends Struct {2570    readonly accountTokenOwnershipLimit: Option<u32>;2571    readonly sponsoredDataSize: Option<u32>;2572    readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;2573    readonly tokenLimit: Option<u32>;2574    readonly sponsorTransferTimeout: Option<u32>;2575    readonly sponsorApproveTimeout: Option<u32>;2576    readonly ownerCanTransfer: Option<bool>;2577    readonly ownerCanDestroy: Option<bool>;2578    readonly transfersEnabled: Option<bool>;2579  }25802581  /** @name UpDataStructsSponsoringRateLimit (243) */2582  interface UpDataStructsSponsoringRateLimit extends Enum {2583    readonly isSponsoringDisabled: boolean;2584    readonly isBlocks: boolean;2585    readonly asBlocks: u32;2586    readonly type: 'SponsoringDisabled' | 'Blocks';2587  }25882589  /** @name UpDataStructsCollectionPermissions (246) */2590  interface UpDataStructsCollectionPermissions extends Struct {2591    readonly access: Option<UpDataStructsAccessMode>;2592    readonly mintMode: Option<bool>;2593    readonly nesting: Option<UpDataStructsNestingPermissions>;2594  }25952596  /** @name UpDataStructsNestingPermissions (248) */2597  interface UpDataStructsNestingPermissions extends Struct {2598    readonly tokenOwner: bool;2599    readonly collectionAdmin: bool;2600    readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;2601  }26022603  /** @name UpDataStructsOwnerRestrictedSet (250) */2604  interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}26052606  /** @name UpDataStructsPropertyKeyPermission (255) */2607  interface UpDataStructsPropertyKeyPermission extends Struct {2608    readonly key: Bytes;2609    readonly permission: UpDataStructsPropertyPermission;2610  }26112612  /** @name UpDataStructsPropertyPermission (256) */2613  interface UpDataStructsPropertyPermission extends Struct {2614    readonly mutable: bool;2615    readonly collectionAdmin: bool;2616    readonly tokenOwner: bool;2617  }26182619  /** @name UpDataStructsProperty (259) */2620  interface UpDataStructsProperty extends Struct {2621    readonly key: Bytes;2622    readonly value: Bytes;2623  }26242625  /** @name UpDataStructsCreateItemData (262) */2626  interface UpDataStructsCreateItemData extends Enum {2627    readonly isNft: boolean;2628    readonly asNft: UpDataStructsCreateNftData;2629    readonly isFungible: boolean;2630    readonly asFungible: UpDataStructsCreateFungibleData;2631    readonly isReFungible: boolean;2632    readonly asReFungible: UpDataStructsCreateReFungibleData;2633    readonly type: 'Nft' | 'Fungible' | 'ReFungible';2634  }26352636  /** @name UpDataStructsCreateNftData (263) */2637  interface UpDataStructsCreateNftData extends Struct {2638    readonly properties: Vec<UpDataStructsProperty>;2639  }26402641  /** @name UpDataStructsCreateFungibleData (264) */2642  interface UpDataStructsCreateFungibleData extends Struct {2643    readonly value: u128;2644  }26452646  /** @name UpDataStructsCreateReFungibleData (265) */2647  interface UpDataStructsCreateReFungibleData extends Struct {2648    readonly pieces: u128;2649    readonly properties: Vec<UpDataStructsProperty>;2650  }26512652  /** @name UpDataStructsCreateItemExData (268) */2653  interface UpDataStructsCreateItemExData extends Enum {2654    readonly isNft: boolean;2655    readonly asNft: Vec<UpDataStructsCreateNftExData>;2656    readonly isFungible: boolean;2657    readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2658    readonly isRefungibleMultipleItems: boolean;2659    readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExSingleOwner>;2660    readonly isRefungibleMultipleOwners: boolean;2661    readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExMultipleOwners;2662    readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';2663  }26642665  /** @name UpDataStructsCreateNftExData (270) */2666  interface UpDataStructsCreateNftExData extends Struct {2667    readonly properties: Vec<UpDataStructsProperty>;2668    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2669  }26702671  /** @name UpDataStructsCreateRefungibleExSingleOwner (277) */2672  interface UpDataStructsCreateRefungibleExSingleOwner extends Struct {2673    readonly user: PalletEvmAccountBasicCrossAccountIdRepr;2674    readonly pieces: u128;2675    readonly properties: Vec<UpDataStructsProperty>;2676  }26772678  /** @name UpDataStructsCreateRefungibleExMultipleOwners (279) */2679  interface UpDataStructsCreateRefungibleExMultipleOwners extends Struct {2680    readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2681    readonly properties: Vec<UpDataStructsProperty>;2682  }26832684  /** @name PalletConfigurationCall (280) */2685  interface PalletConfigurationCall extends Enum {2686    readonly isSetWeightToFeeCoefficientOverride: boolean;2687    readonly asSetWeightToFeeCoefficientOverride: {2688      readonly coeff: Option<u64>;2689    } & Struct;2690    readonly isSetMinGasPriceOverride: boolean;2691    readonly asSetMinGasPriceOverride: {2692      readonly coeff: Option<u64>;2693    } & Struct;2694    readonly isSetXcmAllowedLocations: boolean;2695    readonly asSetXcmAllowedLocations: {2696      readonly locations: Option<Vec<XcmV1MultiLocation>>;2697    } & Struct;2698    readonly isSetAppPromotionConfigurationOverride: boolean;2699    readonly asSetAppPromotionConfigurationOverride: {2700      readonly configuration: PalletConfigurationAppPromotionConfiguration;2701    } & Struct;2702    readonly isSetCollatorSelectionDesiredCollators: boolean;2703    readonly asSetCollatorSelectionDesiredCollators: {2704      readonly max: Option<u32>;2705    } & Struct;2706    readonly isSetCollatorSelectionLicenseBond: boolean;2707    readonly asSetCollatorSelectionLicenseBond: {2708      readonly amount: Option<u128>;2709    } & Struct;2710    readonly isSetCollatorSelectionKickThreshold: boolean;2711    readonly asSetCollatorSelectionKickThreshold: {2712      readonly threshold: Option<u32>;2713    } & Struct;2714    readonly type: 'SetWeightToFeeCoefficientOverride' | 'SetMinGasPriceOverride' | 'SetXcmAllowedLocations' | 'SetAppPromotionConfigurationOverride' | 'SetCollatorSelectionDesiredCollators' | 'SetCollatorSelectionLicenseBond' | 'SetCollatorSelectionKickThreshold';2715  }27162717  /** @name PalletConfigurationAppPromotionConfiguration (285) */2718  interface PalletConfigurationAppPromotionConfiguration extends Struct {2719    readonly recalculationInterval: Option<u32>;2720    readonly pendingInterval: Option<u32>;2721    readonly intervalIncome: Option<Perbill>;2722    readonly maxStakersPerCalculation: Option<u8>;2723  }27242725  /** @name PalletTemplateTransactionPaymentCall (289) */2726  type PalletTemplateTransactionPaymentCall = Null;27272728  /** @name PalletStructureCall (290) */2729  type PalletStructureCall = Null;27302731  /** @name PalletRmrkCoreCall (291) */2732  interface PalletRmrkCoreCall extends Enum {2733    readonly isCreateCollection: boolean;2734    readonly asCreateCollection: {2735      readonly metadata: Bytes;2736      readonly max: Option<u32>;2737      readonly symbol: Bytes;2738    } & Struct;2739    readonly isDestroyCollection: boolean;2740    readonly asDestroyCollection: {2741      readonly collectionId: u32;2742    } & Struct;2743    readonly isChangeCollectionIssuer: boolean;2744    readonly asChangeCollectionIssuer: {2745      readonly collectionId: u32;2746      readonly newIssuer: MultiAddress;2747    } & Struct;2748    readonly isLockCollection: boolean;2749    readonly asLockCollection: {2750      readonly collectionId: u32;2751    } & Struct;2752    readonly isMintNft: boolean;2753    readonly asMintNft: {2754      readonly owner: Option<AccountId32>;2755      readonly collectionId: u32;2756      readonly recipient: Option<AccountId32>;2757      readonly royaltyAmount: Option<Permill>;2758      readonly metadata: Bytes;2759      readonly transferable: bool;2760      readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;2761    } & Struct;2762    readonly isBurnNft: boolean;2763    readonly asBurnNft: {2764      readonly collectionId: u32;2765      readonly nftId: u32;2766      readonly maxBurns: u32;2767    } & Struct;2768    readonly isSend: boolean;2769    readonly asSend: {2770      readonly rmrkCollectionId: u32;2771      readonly rmrkNftId: u32;2772      readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2773    } & Struct;2774    readonly isAcceptNft: boolean;2775    readonly asAcceptNft: {2776      readonly rmrkCollectionId: u32;2777      readonly rmrkNftId: u32;2778      readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2779    } & Struct;2780    readonly isRejectNft: boolean;2781    readonly asRejectNft: {2782      readonly rmrkCollectionId: u32;2783      readonly rmrkNftId: u32;2784    } & Struct;2785    readonly isAcceptResource: boolean;2786    readonly asAcceptResource: {2787      readonly rmrkCollectionId: u32;2788      readonly rmrkNftId: u32;2789      readonly resourceId: u32;2790    } & Struct;2791    readonly isAcceptResourceRemoval: boolean;2792    readonly asAcceptResourceRemoval: {2793      readonly rmrkCollectionId: u32;2794      readonly rmrkNftId: u32;2795      readonly resourceId: u32;2796    } & Struct;2797    readonly isSetProperty: boolean;2798    readonly asSetProperty: {2799      readonly rmrkCollectionId: Compact<u32>;2800      readonly maybeNftId: Option<u32>;2801      readonly key: Bytes;2802      readonly value: Bytes;2803    } & Struct;2804    readonly isSetPriority: boolean;2805    readonly asSetPriority: {2806      readonly rmrkCollectionId: u32;2807      readonly rmrkNftId: u32;2808      readonly priorities: Vec<u32>;2809    } & Struct;2810    readonly isAddBasicResource: boolean;2811    readonly asAddBasicResource: {2812      readonly rmrkCollectionId: u32;2813      readonly nftId: u32;2814      readonly resource: RmrkTraitsResourceBasicResource;2815    } & Struct;2816    readonly isAddComposableResource: boolean;2817    readonly asAddComposableResource: {2818      readonly rmrkCollectionId: u32;2819      readonly nftId: u32;2820      readonly resource: RmrkTraitsResourceComposableResource;2821    } & Struct;2822    readonly isAddSlotResource: boolean;2823    readonly asAddSlotResource: {2824      readonly rmrkCollectionId: u32;2825      readonly nftId: u32;2826      readonly resource: RmrkTraitsResourceSlotResource;2827    } & Struct;2828    readonly isRemoveResource: boolean;2829    readonly asRemoveResource: {2830      readonly rmrkCollectionId: u32;2831      readonly nftId: u32;2832      readonly resourceId: u32;2833    } & Struct;2834    readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';2835  }28362837  /** @name RmrkTraitsResourceResourceTypes (297) */2838  interface RmrkTraitsResourceResourceTypes extends Enum {2839    readonly isBasic: boolean;2840    readonly asBasic: RmrkTraitsResourceBasicResource;2841    readonly isComposable: boolean;2842    readonly asComposable: RmrkTraitsResourceComposableResource;2843    readonly isSlot: boolean;2844    readonly asSlot: RmrkTraitsResourceSlotResource;2845    readonly type: 'Basic' | 'Composable' | 'Slot';2846  }28472848  /** @name RmrkTraitsResourceBasicResource (299) */2849  interface RmrkTraitsResourceBasicResource extends Struct {2850    readonly src: Option<Bytes>;2851    readonly metadata: Option<Bytes>;2852    readonly license: Option<Bytes>;2853    readonly thumb: Option<Bytes>;2854  }28552856  /** @name RmrkTraitsResourceComposableResource (301) */2857  interface RmrkTraitsResourceComposableResource extends Struct {2858    readonly parts: Vec<u32>;2859    readonly base: u32;2860    readonly src: Option<Bytes>;2861    readonly metadata: Option<Bytes>;2862    readonly license: Option<Bytes>;2863    readonly thumb: Option<Bytes>;2864  }28652866  /** @name RmrkTraitsResourceSlotResource (302) */2867  interface RmrkTraitsResourceSlotResource extends Struct {2868    readonly base: u32;2869    readonly src: Option<Bytes>;2870    readonly metadata: Option<Bytes>;2871    readonly slot: u32;2872    readonly license: Option<Bytes>;2873    readonly thumb: Option<Bytes>;2874  }28752876  /** @name PalletRmrkEquipCall (305) */2877  interface PalletRmrkEquipCall extends Enum {2878    readonly isCreateBase: boolean;2879    readonly asCreateBase: {2880      readonly baseType: Bytes;2881      readonly symbol: Bytes;2882      readonly parts: Vec<RmrkTraitsPartPartType>;2883    } & Struct;2884    readonly isThemeAdd: boolean;2885    readonly asThemeAdd: {2886      readonly baseId: u32;2887      readonly theme: RmrkTraitsTheme;2888    } & Struct;2889    readonly isEquippable: boolean;2890    readonly asEquippable: {2891      readonly baseId: u32;2892      readonly slotId: u32;2893      readonly equippables: RmrkTraitsPartEquippableList;2894    } & Struct;2895    readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';2896  }28972898  /** @name RmrkTraitsPartPartType (308) */2899  interface RmrkTraitsPartPartType extends Enum {2900    readonly isFixedPart: boolean;2901    readonly asFixedPart: RmrkTraitsPartFixedPart;2902    readonly isSlotPart: boolean;2903    readonly asSlotPart: RmrkTraitsPartSlotPart;2904    readonly type: 'FixedPart' | 'SlotPart';2905  }29062907  /** @name RmrkTraitsPartFixedPart (310) */2908  interface RmrkTraitsPartFixedPart extends Struct {2909    readonly id: u32;2910    readonly z: u32;2911    readonly src: Bytes;2912  }29132914  /** @name RmrkTraitsPartSlotPart (311) */2915  interface RmrkTraitsPartSlotPart extends Struct {2916    readonly id: u32;2917    readonly equippable: RmrkTraitsPartEquippableList;2918    readonly src: Bytes;2919    readonly z: u32;2920  }29212922  /** @name RmrkTraitsPartEquippableList (312) */2923  interface RmrkTraitsPartEquippableList extends Enum {2924    readonly isAll: boolean;2925    readonly isEmpty: boolean;2926    readonly isCustom: boolean;2927    readonly asCustom: Vec<u32>;2928    readonly type: 'All' | 'Empty' | 'Custom';2929  }29302931  /** @name RmrkTraitsTheme (314) */2932  interface RmrkTraitsTheme extends Struct {2933    readonly name: Bytes;2934    readonly properties: Vec<RmrkTraitsThemeThemeProperty>;2935    readonly inherit: bool;2936  }29372938  /** @name RmrkTraitsThemeThemeProperty (316) */2939  interface RmrkTraitsThemeThemeProperty extends Struct {2940    readonly key: Bytes;2941    readonly value: Bytes;2942  }29432944  /** @name PalletAppPromotionCall (318) */2945  interface PalletAppPromotionCall extends Enum {2946    readonly isSetAdminAddress: boolean;2947    readonly asSetAdminAddress: {2948      readonly admin: PalletEvmAccountBasicCrossAccountIdRepr;2949    } & Struct;2950    readonly isStake: boolean;2951    readonly asStake: {2952      readonly amount: u128;2953    } & Struct;2954    readonly isUnstake: boolean;2955    readonly isSponsorCollection: boolean;2956    readonly asSponsorCollection: {2957      readonly collectionId: u32;2958    } & Struct;2959    readonly isStopSponsoringCollection: boolean;2960    readonly asStopSponsoringCollection: {2961      readonly collectionId: u32;2962    } & Struct;2963    readonly isSponsorContract: boolean;2964    readonly asSponsorContract: {2965      readonly contractId: H160;2966    } & Struct;2967    readonly isStopSponsoringContract: boolean;2968    readonly asStopSponsoringContract: {2969      readonly contractId: H160;2970    } & Struct;2971    readonly isPayoutStakers: boolean;2972    readonly asPayoutStakers: {2973      readonly stakersNumber: Option<u8>;2974    } & Struct;2975    readonly type: 'SetAdminAddress' | 'Stake' | 'Unstake' | 'SponsorCollection' | 'StopSponsoringCollection' | 'SponsorContract' | 'StopSponsoringContract' | 'PayoutStakers';2976  }29772978  /** @name PalletForeignAssetsModuleCall (319) */2979  interface PalletForeignAssetsModuleCall extends Enum {2980    readonly isRegisterForeignAsset: boolean;2981    readonly asRegisterForeignAsset: {2982      readonly owner: AccountId32;2983      readonly location: XcmVersionedMultiLocation;2984      readonly metadata: PalletForeignAssetsModuleAssetMetadata;2985    } & Struct;2986    readonly isUpdateForeignAsset: boolean;2987    readonly asUpdateForeignAsset: {2988      readonly foreignAssetId: u32;2989      readonly location: XcmVersionedMultiLocation;2990      readonly metadata: PalletForeignAssetsModuleAssetMetadata;2991    } & Struct;2992    readonly type: 'RegisterForeignAsset' | 'UpdateForeignAsset';2993  }29942995  /** @name PalletEvmCall (320) */2996  interface PalletEvmCall extends Enum {2997    readonly isWithdraw: boolean;2998    readonly asWithdraw: {2999      readonly address: H160;3000      readonly value: u128;3001    } & Struct;3002    readonly isCall: boolean;3003    readonly asCall: {3004      readonly source: H160;3005      readonly target: H160;3006      readonly input: Bytes;3007      readonly value: U256;3008      readonly gasLimit: u64;3009      readonly maxFeePerGas: U256;3010      readonly maxPriorityFeePerGas: Option<U256>;3011      readonly nonce: Option<U256>;3012      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;3013    } & Struct;3014    readonly isCreate: boolean;3015    readonly asCreate: {3016      readonly source: H160;3017      readonly init: Bytes;3018      readonly value: U256;3019      readonly gasLimit: u64;3020      readonly maxFeePerGas: U256;3021      readonly maxPriorityFeePerGas: Option<U256>;3022      readonly nonce: Option<U256>;3023      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;3024    } & Struct;3025    readonly isCreate2: boolean;3026    readonly asCreate2: {3027      readonly source: H160;3028      readonly init: Bytes;3029      readonly salt: H256;3030      readonly value: U256;3031      readonly gasLimit: u64;3032      readonly maxFeePerGas: U256;3033      readonly maxPriorityFeePerGas: Option<U256>;3034      readonly nonce: Option<U256>;3035      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;3036    } & Struct;3037    readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';3038  }30393040  /** @name PalletEthereumCall (326) */3041  interface PalletEthereumCall extends Enum {3042    readonly isTransact: boolean;3043    readonly asTransact: {3044      readonly transaction: EthereumTransactionTransactionV2;3045    } & Struct;3046    readonly type: 'Transact';3047  }30483049  /** @name EthereumTransactionTransactionV2 (327) */3050  interface EthereumTransactionTransactionV2 extends Enum {3051    readonly isLegacy: boolean;3052    readonly asLegacy: EthereumTransactionLegacyTransaction;3053    readonly isEip2930: boolean;3054    readonly asEip2930: EthereumTransactionEip2930Transaction;3055    readonly isEip1559: boolean;3056    readonly asEip1559: EthereumTransactionEip1559Transaction;3057    readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';3058  }30593060  /** @name EthereumTransactionLegacyTransaction (328) */3061  interface EthereumTransactionLegacyTransaction extends Struct {3062    readonly nonce: U256;3063    readonly gasPrice: U256;3064    readonly gasLimit: U256;3065    readonly action: EthereumTransactionTransactionAction;3066    readonly value: U256;3067    readonly input: Bytes;3068    readonly signature: EthereumTransactionTransactionSignature;3069  }30703071  /** @name EthereumTransactionTransactionAction (329) */3072  interface EthereumTransactionTransactionAction extends Enum {3073    readonly isCall: boolean;3074    readonly asCall: H160;3075    readonly isCreate: boolean;3076    readonly type: 'Call' | 'Create';3077  }30783079  /** @name EthereumTransactionTransactionSignature (330) */3080  interface EthereumTransactionTransactionSignature extends Struct {3081    readonly v: u64;3082    readonly r: H256;3083    readonly s: H256;3084  }30853086  /** @name EthereumTransactionEip2930Transaction (332) */3087  interface EthereumTransactionEip2930Transaction extends Struct {3088    readonly chainId: u64;3089    readonly nonce: U256;3090    readonly gasPrice: U256;3091    readonly gasLimit: U256;3092    readonly action: EthereumTransactionTransactionAction;3093    readonly value: U256;3094    readonly input: Bytes;3095    readonly accessList: Vec<EthereumTransactionAccessListItem>;3096    readonly oddYParity: bool;3097    readonly r: H256;3098    readonly s: H256;3099  }31003101  /** @name EthereumTransactionAccessListItem (334) */3102  interface EthereumTransactionAccessListItem extends Struct {3103    readonly address: H160;3104    readonly storageKeys: Vec<H256>;3105  }31063107  /** @name EthereumTransactionEip1559Transaction (335) */3108  interface EthereumTransactionEip1559Transaction extends Struct {3109    readonly chainId: u64;3110    readonly nonce: U256;3111    readonly maxPriorityFeePerGas: U256;3112    readonly maxFeePerGas: U256;3113    readonly gasLimit: U256;3114    readonly action: EthereumTransactionTransactionAction;3115    readonly value: U256;3116    readonly input: Bytes;3117    readonly accessList: Vec<EthereumTransactionAccessListItem>;3118    readonly oddYParity: bool;3119    readonly r: H256;3120    readonly s: H256;3121  }31223123  /** @name PalletEvmMigrationCall (336) */3124  interface PalletEvmMigrationCall extends Enum {3125    readonly isBegin: boolean;3126    readonly asBegin: {3127      readonly address: H160;3128    } & Struct;3129    readonly isSetData: boolean;3130    readonly asSetData: {3131      readonly address: H160;3132      readonly data: Vec<ITuple<[H256, H256]>>;3133    } & Struct;3134    readonly isFinish: boolean;3135    readonly asFinish: {3136      readonly address: H160;3137      readonly code: Bytes;3138    } & Struct;3139    readonly isInsertEthLogs: boolean;3140    readonly asInsertEthLogs: {3141      readonly logs: Vec<EthereumLog>;3142    } & Struct;3143    readonly isInsertEvents: boolean;3144    readonly asInsertEvents: {3145      readonly events: Vec<Bytes>;3146    } & Struct;3147    readonly type: 'Begin' | 'SetData' | 'Finish' | 'InsertEthLogs' | 'InsertEvents';3148  }31493150  /** @name PalletMaintenanceCall (340) */3151  interface PalletMaintenanceCall extends Enum {3152    readonly isEnable: boolean;3153    readonly isDisable: boolean;3154    readonly type: 'Enable' | 'Disable';3155  }31563157  /** @name PalletTestUtilsCall (341) */3158  interface PalletTestUtilsCall extends Enum {3159    readonly isEnable: boolean;3160    readonly isSetTestValue: boolean;3161    readonly asSetTestValue: {3162      readonly value: u32;3163    } & Struct;3164    readonly isSetTestValueAndRollback: boolean;3165    readonly asSetTestValueAndRollback: {3166      readonly value: u32;3167    } & Struct;3168    readonly isIncTestValue: boolean;3169    readonly isJustTakeFee: boolean;3170    readonly isBatchAll: boolean;3171    readonly asBatchAll: {3172      readonly calls: Vec<Call>;3173    } & Struct;3174    readonly type: 'Enable' | 'SetTestValue' | 'SetTestValueAndRollback' | 'IncTestValue' | 'JustTakeFee' | 'BatchAll';3175  }31763177  /** @name PalletSudoError (343) */3178  interface PalletSudoError extends Enum {3179    readonly isRequireSudo: boolean;3180    readonly type: 'RequireSudo';3181  }31823183  /** @name OrmlVestingModuleError (345) */3184  interface OrmlVestingModuleError extends Enum {3185    readonly isZeroVestingPeriod: boolean;3186    readonly isZeroVestingPeriodCount: boolean;3187    readonly isInsufficientBalanceToLock: boolean;3188    readonly isTooManyVestingSchedules: boolean;3189    readonly isAmountLow: boolean;3190    readonly isMaxVestingSchedulesExceeded: boolean;3191    readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';3192  }31933194  /** @name OrmlXtokensModuleError (346) */3195  interface OrmlXtokensModuleError extends Enum {3196    readonly isAssetHasNoReserve: boolean;3197    readonly isNotCrossChainTransfer: boolean;3198    readonly isInvalidDest: boolean;3199    readonly isNotCrossChainTransferableCurrency: boolean;3200    readonly isUnweighableMessage: boolean;3201    readonly isXcmExecutionFailed: boolean;3202    readonly isCannotReanchor: boolean;3203    readonly isInvalidAncestry: boolean;3204    readonly isInvalidAsset: boolean;3205    readonly isDestinationNotInvertible: boolean;3206    readonly isBadVersion: boolean;3207    readonly isDistinctReserveForAssetAndFee: boolean;3208    readonly isZeroFee: boolean;3209    readonly isZeroAmount: boolean;3210    readonly isTooManyAssetsBeingSent: boolean;3211    readonly isAssetIndexNonExistent: boolean;3212    readonly isFeeNotEnough: boolean;3213    readonly isNotSupportedMultiLocation: boolean;3214    readonly isMinXcmFeeNotDefined: boolean;3215    readonly type: 'AssetHasNoReserve' | 'NotCrossChainTransfer' | 'InvalidDest' | 'NotCrossChainTransferableCurrency' | 'UnweighableMessage' | 'XcmExecutionFailed' | 'CannotReanchor' | 'InvalidAncestry' | 'InvalidAsset' | 'DestinationNotInvertible' | 'BadVersion' | 'DistinctReserveForAssetAndFee' | 'ZeroFee' | 'ZeroAmount' | 'TooManyAssetsBeingSent' | 'AssetIndexNonExistent' | 'FeeNotEnough' | 'NotSupportedMultiLocation' | 'MinXcmFeeNotDefined';3216  }32173218  /** @name OrmlTokensBalanceLock (349) */3219  interface OrmlTokensBalanceLock extends Struct {3220    readonly id: U8aFixed;3221    readonly amount: u128;3222  }32233224  /** @name OrmlTokensAccountData (351) */3225  interface OrmlTokensAccountData extends Struct {3226    readonly free: u128;3227    readonly reserved: u128;3228    readonly frozen: u128;3229  }32303231  /** @name OrmlTokensReserveData (353) */3232  interface OrmlTokensReserveData extends Struct {3233    readonly id: Null;3234    readonly amount: u128;3235  }32363237  /** @name OrmlTokensModuleError (355) */3238  interface OrmlTokensModuleError extends Enum {3239    readonly isBalanceTooLow: boolean;3240    readonly isAmountIntoBalanceFailed: boolean;3241    readonly isLiquidityRestrictions: boolean;3242    readonly isMaxLocksExceeded: boolean;3243    readonly isKeepAlive: boolean;3244    readonly isExistentialDeposit: boolean;3245    readonly isDeadAccount: boolean;3246    readonly isTooManyReserves: boolean;3247    readonly type: 'BalanceTooLow' | 'AmountIntoBalanceFailed' | 'LiquidityRestrictions' | 'MaxLocksExceeded' | 'KeepAlive' | 'ExistentialDeposit' | 'DeadAccount' | 'TooManyReserves';3248  }32493250  /** @name CumulusPalletXcmpQueueInboundChannelDetails (357) */3251  interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {3252    readonly sender: u32;3253    readonly state: CumulusPalletXcmpQueueInboundState;3254    readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;3255  }32563257  /** @name CumulusPalletXcmpQueueInboundState (358) */3258  interface CumulusPalletXcmpQueueInboundState extends Enum {3259    readonly isOk: boolean;3260    readonly isSuspended: boolean;3261    readonly type: 'Ok' | 'Suspended';3262  }32633264  /** @name PolkadotParachainPrimitivesXcmpMessageFormat (361) */3265  interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {3266    readonly isConcatenatedVersionedXcm: boolean;3267    readonly isConcatenatedEncodedBlob: boolean;3268    readonly isSignals: boolean;3269    readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';3270  }32713272  /** @name CumulusPalletXcmpQueueOutboundChannelDetails (364) */3273  interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {3274    readonly recipient: u32;3275    readonly state: CumulusPalletXcmpQueueOutboundState;3276    readonly signalsExist: bool;3277    readonly firstIndex: u16;3278    readonly lastIndex: u16;3279  }32803281  /** @name CumulusPalletXcmpQueueOutboundState (365) */3282  interface CumulusPalletXcmpQueueOutboundState extends Enum {3283    readonly isOk: boolean;3284    readonly isSuspended: boolean;3285    readonly type: 'Ok' | 'Suspended';3286  }32873288  /** @name CumulusPalletXcmpQueueQueueConfigData (367) */3289  interface CumulusPalletXcmpQueueQueueConfigData extends Struct {3290    readonly suspendThreshold: u32;3291    readonly dropThreshold: u32;3292    readonly resumeThreshold: u32;3293    readonly thresholdWeight: SpWeightsWeightV2Weight;3294    readonly weightRestrictDecay: SpWeightsWeightV2Weight;3295    readonly xcmpMaxIndividualWeight: SpWeightsWeightV2Weight;3296  }32973298  /** @name CumulusPalletXcmpQueueError (369) */3299  interface CumulusPalletXcmpQueueError extends Enum {3300    readonly isFailedToSend: boolean;3301    readonly isBadXcmOrigin: boolean;3302    readonly isBadXcm: boolean;3303    readonly isBadOverweightIndex: boolean;3304    readonly isWeightOverLimit: boolean;3305    readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';3306  }33073308  /** @name PalletXcmError (370) */3309  interface PalletXcmError extends Enum {3310    readonly isUnreachable: boolean;3311    readonly isSendFailure: boolean;3312    readonly isFiltered: boolean;3313    readonly isUnweighableMessage: boolean;3314    readonly isDestinationNotInvertible: boolean;3315    readonly isEmpty: boolean;3316    readonly isCannotReanchor: boolean;3317    readonly isTooManyAssets: boolean;3318    readonly isInvalidOrigin: boolean;3319    readonly isBadVersion: boolean;3320    readonly isBadLocation: boolean;3321    readonly isNoSubscription: boolean;3322    readonly isAlreadySubscribed: boolean;3323    readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';3324  }33253326  /** @name CumulusPalletXcmError (371) */3327  type CumulusPalletXcmError = Null;33283329  /** @name CumulusPalletDmpQueueConfigData (372) */3330  interface CumulusPalletDmpQueueConfigData extends Struct {3331    readonly maxIndividual: SpWeightsWeightV2Weight;3332  }33333334  /** @name CumulusPalletDmpQueuePageIndexData (373) */3335  interface CumulusPalletDmpQueuePageIndexData extends Struct {3336    readonly beginUsed: u32;3337    readonly endUsed: u32;3338    readonly overweightCount: u64;3339  }33403341  /** @name CumulusPalletDmpQueueError (376) */3342  interface CumulusPalletDmpQueueError extends Enum {3343    readonly isUnknown: boolean;3344    readonly isOverLimit: boolean;3345    readonly type: 'Unknown' | 'OverLimit';3346  }33473348  /** @name PalletUniqueError (380) */3349  interface PalletUniqueError extends Enum {3350    readonly isCollectionDecimalPointLimitExceeded: boolean;3351    readonly isEmptyArgument: boolean;3352    readonly isRepartitionCalledOnNonRefungibleCollection: boolean;3353    readonly type: 'CollectionDecimalPointLimitExceeded' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';3354  }33553356  /** @name PalletConfigurationError (381) */3357  interface PalletConfigurationError extends Enum {3358    readonly isInconsistentConfiguration: boolean;3359    readonly type: 'InconsistentConfiguration';3360  }33613362  /** @name UpDataStructsCollection (382) */3363  interface UpDataStructsCollection extends Struct {3364    readonly owner: AccountId32;3365    readonly mode: UpDataStructsCollectionMode;3366    readonly name: Vec<u16>;3367    readonly description: Vec<u16>;3368    readonly tokenPrefix: Bytes;3369    readonly sponsorship: UpDataStructsSponsorshipStateAccountId32;3370    readonly limits: UpDataStructsCollectionLimits;3371    readonly permissions: UpDataStructsCollectionPermissions;3372    readonly flags: U8aFixed;3373  }33743375  /** @name UpDataStructsSponsorshipStateAccountId32 (383) */3376  interface UpDataStructsSponsorshipStateAccountId32 extends Enum {3377    readonly isDisabled: boolean;3378    readonly isUnconfirmed: boolean;3379    readonly asUnconfirmed: AccountId32;3380    readonly isConfirmed: boolean;3381    readonly asConfirmed: AccountId32;3382    readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';3383  }33843385  /** @name UpDataStructsProperties (385) */3386  interface UpDataStructsProperties extends Struct {3387    readonly map: UpDataStructsPropertiesMapBoundedVec;3388    readonly consumedSpace: u32;3389    readonly spaceLimit: u32;3390  }33913392  /** @name UpDataStructsPropertiesMapBoundedVec (386) */3393  interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}33943395  /** @name UpDataStructsPropertiesMapPropertyPermission (391) */3396  interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}33973398  /** @name UpDataStructsCollectionStats (398) */3399  interface UpDataStructsCollectionStats extends Struct {3400    readonly created: u32;3401    readonly destroyed: u32;3402    readonly alive: u32;3403  }34043405  /** @name UpDataStructsTokenChild (399) */3406  interface UpDataStructsTokenChild extends Struct {3407    readonly token: u32;3408    readonly collection: u32;3409  }34103411  /** @name PhantomTypeUpDataStructs (400) */3412  interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild, UpPovEstimateRpcPovInfo]>> {}34133414  /** @name UpDataStructsTokenData (402) */3415  interface UpDataStructsTokenData extends Struct {3416    readonly properties: Vec<UpDataStructsProperty>;3417    readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;3418    readonly pieces: u128;3419  }34203421  /** @name UpDataStructsRpcCollection (404) */3422  interface UpDataStructsRpcCollection extends Struct {3423    readonly owner: AccountId32;3424    readonly mode: UpDataStructsCollectionMode;3425    readonly name: Vec<u16>;3426    readonly description: Vec<u16>;3427    readonly tokenPrefix: Bytes;3428    readonly sponsorship: UpDataStructsSponsorshipStateAccountId32;3429    readonly limits: UpDataStructsCollectionLimits;3430    readonly permissions: UpDataStructsCollectionPermissions;3431    readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;3432    readonly properties: Vec<UpDataStructsProperty>;3433    readonly readOnly: bool;3434    readonly flags: UpDataStructsRpcCollectionFlags;3435  }34363437  /** @name UpDataStructsRpcCollectionFlags (405) */3438  interface UpDataStructsRpcCollectionFlags extends Struct {3439    readonly foreign: bool;3440    readonly erc721metadata: bool;3441  }34423443  /** @name RmrkTraitsCollectionCollectionInfo (406) */3444  interface RmrkTraitsCollectionCollectionInfo extends Struct {3445    readonly issuer: AccountId32;3446    readonly metadata: Bytes;3447    readonly max: Option<u32>;3448    readonly symbol: Bytes;3449    readonly nftsCount: u32;3450  }34513452  /** @name RmrkTraitsNftNftInfo (407) */3453  interface RmrkTraitsNftNftInfo extends Struct {3454    readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;3455    readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;3456    readonly metadata: Bytes;3457    readonly equipped: bool;3458    readonly pending: bool;3459  }34603461  /** @name RmrkTraitsNftRoyaltyInfo (409) */3462  interface RmrkTraitsNftRoyaltyInfo extends Struct {3463    readonly recipient: AccountId32;3464    readonly amount: Permill;3465  }34663467  /** @name RmrkTraitsResourceResourceInfo (410) */3468  interface RmrkTraitsResourceResourceInfo extends Struct {3469    readonly id: u32;3470    readonly resource: RmrkTraitsResourceResourceTypes;3471    readonly pending: bool;3472    readonly pendingRemoval: bool;3473  }34743475  /** @name RmrkTraitsPropertyPropertyInfo (411) */3476  interface RmrkTraitsPropertyPropertyInfo extends Struct {3477    readonly key: Bytes;3478    readonly value: Bytes;3479  }34803481  /** @name RmrkTraitsBaseBaseInfo (412) */3482  interface RmrkTraitsBaseBaseInfo extends Struct {3483    readonly issuer: AccountId32;3484    readonly baseType: Bytes;3485    readonly symbol: Bytes;3486  }34873488  /** @name RmrkTraitsNftNftChild (413) */3489  interface RmrkTraitsNftNftChild extends Struct {3490    readonly collectionId: u32;3491    readonly nftId: u32;3492  }34933494  /** @name UpPovEstimateRpcPovInfo (414) */3495  interface UpPovEstimateRpcPovInfo extends Struct {3496    readonly proofSize: u64;3497    readonly compactProofSize: u64;3498    readonly compressedProofSize: u64;3499    readonly results: Vec<Result<Result<Null, SpRuntimeDispatchError>, SpRuntimeTransactionValidityTransactionValidityError>>;3500    readonly keyValues: Vec<UpPovEstimateRpcTrieKeyValue>;3501  }35023503  /** @name SpRuntimeTransactionValidityTransactionValidityError (417) */3504  interface SpRuntimeTransactionValidityTransactionValidityError extends Enum {3505    readonly isInvalid: boolean;3506    readonly asInvalid: SpRuntimeTransactionValidityInvalidTransaction;3507    readonly isUnknown: boolean;3508    readonly asUnknown: SpRuntimeTransactionValidityUnknownTransaction;3509    readonly type: 'Invalid' | 'Unknown';3510  }35113512  /** @name SpRuntimeTransactionValidityInvalidTransaction (418) */3513  interface SpRuntimeTransactionValidityInvalidTransaction extends Enum {3514    readonly isCall: boolean;3515    readonly isPayment: boolean;3516    readonly isFuture: boolean;3517    readonly isStale: boolean;3518    readonly isBadProof: boolean;3519    readonly isAncientBirthBlock: boolean;3520    readonly isExhaustsResources: boolean;3521    readonly isCustom: boolean;3522    readonly asCustom: u8;3523    readonly isBadMandatory: boolean;3524    readonly isMandatoryValidation: boolean;3525    readonly isBadSigner: boolean;3526    readonly type: 'Call' | 'Payment' | 'Future' | 'Stale' | 'BadProof' | 'AncientBirthBlock' | 'ExhaustsResources' | 'Custom' | 'BadMandatory' | 'MandatoryValidation' | 'BadSigner';3527  }35283529  /** @name SpRuntimeTransactionValidityUnknownTransaction (419) */3530  interface SpRuntimeTransactionValidityUnknownTransaction extends Enum {3531    readonly isCannotLookup: boolean;3532    readonly isNoUnsignedValidator: boolean;3533    readonly isCustom: boolean;3534    readonly asCustom: u8;3535    readonly type: 'CannotLookup' | 'NoUnsignedValidator' | 'Custom';3536  }35373538  /** @name UpPovEstimateRpcTrieKeyValue (421) */3539  interface UpPovEstimateRpcTrieKeyValue extends Struct {3540    readonly key: Bytes;3541    readonly value: Bytes;3542  }35433544  /** @name PalletCommonError (423) */3545  interface PalletCommonError extends Enum {3546    readonly isCollectionNotFound: boolean;3547    readonly isMustBeTokenOwner: boolean;3548    readonly isNoPermission: boolean;3549    readonly isCantDestroyNotEmptyCollection: boolean;3550    readonly isPublicMintingNotAllowed: boolean;3551    readonly isAddressNotInAllowlist: boolean;3552    readonly isCollectionNameLimitExceeded: boolean;3553    readonly isCollectionDescriptionLimitExceeded: boolean;3554    readonly isCollectionTokenPrefixLimitExceeded: boolean;3555    readonly isTotalCollectionsLimitExceeded: boolean;3556    readonly isCollectionAdminCountExceeded: boolean;3557    readonly isCollectionLimitBoundsExceeded: boolean;3558    readonly isOwnerPermissionsCantBeReverted: boolean;3559    readonly isTransferNotAllowed: boolean;3560    readonly isAccountTokenLimitExceeded: boolean;3561    readonly isCollectionTokenLimitExceeded: boolean;3562    readonly isMetadataFlagFrozen: boolean;3563    readonly isTokenNotFound: boolean;3564    readonly isTokenValueTooLow: boolean;3565    readonly isApprovedValueTooLow: boolean;3566    readonly isCantApproveMoreThanOwned: boolean;3567    readonly isAddressIsZero: boolean;3568    readonly isUnsupportedOperation: boolean;3569    readonly isNotSufficientFounds: boolean;3570    readonly isUserIsNotAllowedToNest: boolean;3571    readonly isSourceCollectionIsNotAllowedToNest: boolean;3572    readonly isCollectionFieldSizeExceeded: boolean;3573    readonly isNoSpaceForProperty: boolean;3574    readonly isPropertyLimitReached: boolean;3575    readonly isPropertyKeyIsTooLong: boolean;3576    readonly isInvalidCharacterInPropertyKey: boolean;3577    readonly isEmptyPropertyKey: boolean;3578    readonly isCollectionIsExternal: boolean;3579    readonly isCollectionIsInternal: boolean;3580    readonly isConfirmSponsorshipFail: boolean;3581    readonly isUserIsNotCollectionAdmin: boolean;3582    readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal' | 'ConfirmSponsorshipFail' | 'UserIsNotCollectionAdmin';3583  }35843585  /** @name PalletFungibleError (425) */3586  interface PalletFungibleError extends Enum {3587    readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;3588    readonly isFungibleItemsHaveNoId: boolean;3589    readonly isFungibleItemsDontHaveData: boolean;3590    readonly isFungibleDisallowsNesting: boolean;3591    readonly isSettingPropertiesNotAllowed: boolean;3592    readonly isSettingAllowanceForAllNotAllowed: boolean;3593    readonly isFungibleTokensAreAlwaysValid: boolean;3594    readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed' | 'SettingAllowanceForAllNotAllowed' | 'FungibleTokensAreAlwaysValid';3595  }35963597  /** @name PalletRefungibleError (429) */3598  interface PalletRefungibleError extends Enum {3599    readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;3600    readonly isWrongRefungiblePieces: boolean;3601    readonly isRepartitionWhileNotOwningAllPieces: boolean;3602    readonly isRefungibleDisallowsNesting: boolean;3603    readonly isSettingPropertiesNotAllowed: boolean;3604    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3605  }36063607  /** @name PalletNonfungibleItemData (430) */3608  interface PalletNonfungibleItemData extends Struct {3609    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;3610  }36113612  /** @name UpDataStructsPropertyScope (432) */3613  interface UpDataStructsPropertyScope extends Enum {3614    readonly isNone: boolean;3615    readonly isRmrk: boolean;3616    readonly type: 'None' | 'Rmrk';3617  }36183619  /** @name PalletNonfungibleError (435) */3620  interface PalletNonfungibleError extends Enum {3621    readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;3622    readonly isNonfungibleItemsHaveNoAmount: boolean;3623    readonly isCantBurnNftWithChildren: boolean;3624    readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';3625  }36263627  /** @name PalletStructureError (436) */3628  interface PalletStructureError extends Enum {3629    readonly isOuroborosDetected: boolean;3630    readonly isDepthLimit: boolean;3631    readonly isBreadthLimit: boolean;3632    readonly isTokenNotFound: boolean;3633    readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';3634  }36353636  /** @name PalletRmrkCoreError (437) */3637  interface PalletRmrkCoreError extends Enum {3638    readonly isCorruptedCollectionType: boolean;3639    readonly isRmrkPropertyKeyIsTooLong: boolean;3640    readonly isRmrkPropertyValueIsTooLong: boolean;3641    readonly isRmrkPropertyIsNotFound: boolean;3642    readonly isUnableToDecodeRmrkData: boolean;3643    readonly isCollectionNotEmpty: boolean;3644    readonly isNoAvailableCollectionId: boolean;3645    readonly isNoAvailableNftId: boolean;3646    readonly isCollectionUnknown: boolean;3647    readonly isNoPermission: boolean;3648    readonly isNonTransferable: boolean;3649    readonly isCollectionFullOrLocked: boolean;3650    readonly isResourceDoesntExist: boolean;3651    readonly isCannotSendToDescendentOrSelf: boolean;3652    readonly isCannotAcceptNonOwnedNft: boolean;3653    readonly isCannotRejectNonOwnedNft: boolean;3654    readonly isCannotRejectNonPendingNft: boolean;3655    readonly isResourceNotPending: boolean;3656    readonly isNoAvailableResourceId: boolean;3657    readonly type: 'CorruptedCollectionType' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';3658  }36593660  /** @name PalletRmrkEquipError (439) */3661  interface PalletRmrkEquipError extends Enum {3662    readonly isPermissionError: boolean;3663    readonly isNoAvailableBaseId: boolean;3664    readonly isNoAvailablePartId: boolean;3665    readonly isBaseDoesntExist: boolean;3666    readonly isNeedsDefaultThemeFirst: boolean;3667    readonly isPartDoesntExist: boolean;3668    readonly isNoEquippableOnFixedPart: boolean;3669    readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';3670  }36713672  /** @name PalletAppPromotionError (445) */3673  interface PalletAppPromotionError extends Enum {3674    readonly isAdminNotSet: boolean;3675    readonly isNoPermission: boolean;3676    readonly isNotSufficientFunds: boolean;3677    readonly isPendingForBlockOverflow: boolean;3678    readonly isSponsorNotSet: boolean;3679    readonly isIncorrectLockedBalanceOperation: boolean;3680    readonly type: 'AdminNotSet' | 'NoPermission' | 'NotSufficientFunds' | 'PendingForBlockOverflow' | 'SponsorNotSet' | 'IncorrectLockedBalanceOperation';3681  }36823683  /** @name PalletForeignAssetsModuleError (446) */3684  interface PalletForeignAssetsModuleError extends Enum {3685    readonly isBadLocation: boolean;3686    readonly isMultiLocationExisted: boolean;3687    readonly isAssetIdNotExists: boolean;3688    readonly isAssetIdExisted: boolean;3689    readonly type: 'BadLocation' | 'MultiLocationExisted' | 'AssetIdNotExists' | 'AssetIdExisted';3690  }36913692  /** @name PalletEvmError (448) */3693  interface PalletEvmError extends Enum {3694    readonly isBalanceLow: boolean;3695    readonly isFeeOverflow: boolean;3696    readonly isPaymentOverflow: boolean;3697    readonly isWithdrawFailed: boolean;3698    readonly isGasPriceTooLow: boolean;3699    readonly isInvalidNonce: boolean;3700    readonly isGasLimitTooLow: boolean;3701    readonly isGasLimitTooHigh: boolean;3702    readonly isUndefined: boolean;3703    readonly isReentrancy: boolean;3704    readonly isTransactionMustComeFromEOA: boolean;3705    readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce' | 'GasLimitTooLow' | 'GasLimitTooHigh' | 'Undefined' | 'Reentrancy' | 'TransactionMustComeFromEOA';3706  }37073708  /** @name FpRpcTransactionStatus (451) */3709  interface FpRpcTransactionStatus extends Struct {3710    readonly transactionHash: H256;3711    readonly transactionIndex: u32;3712    readonly from: H160;3713    readonly to: Option<H160>;3714    readonly contractAddress: Option<H160>;3715    readonly logs: Vec<EthereumLog>;3716    readonly logsBloom: EthbloomBloom;3717  }37183719  /** @name EthbloomBloom (453) */3720  interface EthbloomBloom extends U8aFixed {}37213722  /** @name EthereumReceiptReceiptV3 (455) */3723  interface EthereumReceiptReceiptV3 extends Enum {3724    readonly isLegacy: boolean;3725    readonly asLegacy: EthereumReceiptEip658ReceiptData;3726    readonly isEip2930: boolean;3727    readonly asEip2930: EthereumReceiptEip658ReceiptData;3728    readonly isEip1559: boolean;3729    readonly asEip1559: EthereumReceiptEip658ReceiptData;3730    readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';3731  }37323733  /** @name EthereumReceiptEip658ReceiptData (456) */3734  interface EthereumReceiptEip658ReceiptData extends Struct {3735    readonly statusCode: u8;3736    readonly usedGas: U256;3737    readonly logsBloom: EthbloomBloom;3738    readonly logs: Vec<EthereumLog>;3739  }37403741  /** @name EthereumBlock (457) */3742  interface EthereumBlock extends Struct {3743    readonly header: EthereumHeader;3744    readonly transactions: Vec<EthereumTransactionTransactionV2>;3745    readonly ommers: Vec<EthereumHeader>;3746  }37473748  /** @name EthereumHeader (458) */3749  interface EthereumHeader extends Struct {3750    readonly parentHash: H256;3751    readonly ommersHash: H256;3752    readonly beneficiary: H160;3753    readonly stateRoot: H256;3754    readonly transactionsRoot: H256;3755    readonly receiptsRoot: H256;3756    readonly logsBloom: EthbloomBloom;3757    readonly difficulty: U256;3758    readonly number: U256;3759    readonly gasLimit: U256;3760    readonly gasUsed: U256;3761    readonly timestamp: u64;3762    readonly extraData: Bytes;3763    readonly mixHash: H256;3764    readonly nonce: EthereumTypesHashH64;3765  }37663767  /** @name EthereumTypesHashH64 (459) */3768  interface EthereumTypesHashH64 extends U8aFixed {}37693770  /** @name PalletEthereumError (464) */3771  interface PalletEthereumError extends Enum {3772    readonly isInvalidSignature: boolean;3773    readonly isPreLogExists: boolean;3774    readonly type: 'InvalidSignature' | 'PreLogExists';3775  }37763777  /** @name PalletEvmCoderSubstrateError (465) */3778  interface PalletEvmCoderSubstrateError extends Enum {3779    readonly isOutOfGas: boolean;3780    readonly isOutOfFund: boolean;3781    readonly type: 'OutOfGas' | 'OutOfFund';3782  }37833784  /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (466) */3785  interface UpDataStructsSponsorshipStateBasicCrossAccountIdRepr extends Enum {3786    readonly isDisabled: boolean;3787    readonly isUnconfirmed: boolean;3788    readonly asUnconfirmed: PalletEvmAccountBasicCrossAccountIdRepr;3789    readonly isConfirmed: boolean;3790    readonly asConfirmed: PalletEvmAccountBasicCrossAccountIdRepr;3791    readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';3792  }37933794  /** @name PalletEvmContractHelpersSponsoringModeT (467) */3795  interface PalletEvmContractHelpersSponsoringModeT extends Enum {3796    readonly isDisabled: boolean;3797    readonly isAllowlisted: boolean;3798    readonly isGenerous: boolean;3799    readonly type: 'Disabled' | 'Allowlisted' | 'Generous';3800  }38013802  /** @name PalletEvmContractHelpersError (473) */3803  interface PalletEvmContractHelpersError extends Enum {3804    readonly isNoPermission: boolean;3805    readonly isNoPendingSponsor: boolean;3806    readonly isTooManyMethodsHaveSponsoredLimit: boolean;3807    readonly type: 'NoPermission' | 'NoPendingSponsor' | 'TooManyMethodsHaveSponsoredLimit';3808  }38093810  /** @name PalletEvmMigrationError (474) */3811  interface PalletEvmMigrationError extends Enum {3812    readonly isAccountNotEmpty: boolean;3813    readonly isAccountIsNotMigrating: boolean;3814    readonly isBadEvent: boolean;3815    readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating' | 'BadEvent';3816  }38173818  /** @name PalletMaintenanceError (475) */3819  type PalletMaintenanceError = Null;38203821  /** @name PalletTestUtilsError (476) */3822  interface PalletTestUtilsError extends Enum {3823    readonly isTestPalletDisabled: boolean;3824    readonly isTriggerRollback: boolean;3825    readonly type: 'TestPalletDisabled' | 'TriggerRollback';3826  }38273828  /** @name SpRuntimeMultiSignature (478) */3829  interface SpRuntimeMultiSignature extends Enum {3830    readonly isEd25519: boolean;3831    readonly asEd25519: SpCoreEd25519Signature;3832    readonly isSr25519: boolean;3833    readonly asSr25519: SpCoreSr25519Signature;3834    readonly isEcdsa: boolean;3835    readonly asEcdsa: SpCoreEcdsaSignature;3836    readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';3837  }38383839  /** @name SpCoreEd25519Signature (479) */3840  interface SpCoreEd25519Signature extends U8aFixed {}38413842  /** @name SpCoreSr25519Signature (481) */3843  interface SpCoreSr25519Signature extends U8aFixed {}38443845  /** @name SpCoreEcdsaSignature (482) */3846  interface SpCoreEcdsaSignature extends U8aFixed {}38473848  /** @name FrameSystemExtensionsCheckSpecVersion (485) */3849  type FrameSystemExtensionsCheckSpecVersion = Null;38503851  /** @name FrameSystemExtensionsCheckTxVersion (486) */3852  type FrameSystemExtensionsCheckTxVersion = Null;38533854  /** @name FrameSystemExtensionsCheckGenesis (487) */3855  type FrameSystemExtensionsCheckGenesis = Null;38563857  /** @name FrameSystemExtensionsCheckNonce (490) */3858  interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}38593860  /** @name FrameSystemExtensionsCheckWeight (491) */3861  type FrameSystemExtensionsCheckWeight = Null;38623863  /** @name OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance (492) */3864  type OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance = Null;38653866  /** @name OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls (493) */3867  type OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls = Null;38683869  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (494) */3870  interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}38713872  /** @name OpalRuntimeRuntime (495) */3873  type OpalRuntimeRuntime = Null;38743875  /** @name PalletEthereumFakeTransactionFinalizer (496) */3876  type PalletEthereumFakeTransactionFinalizer = Null;38773878} // declare module
modifiedtests/src/util/playgrounds/unique.tsdiffbeforeafterboth
--- a/tests/src/util/playgrounds/unique.ts
+++ b/tests/src/util/playgrounds/unique.ts
@@ -633,6 +633,10 @@
     let call = this.getApi() as any;
     for(const part of apiCall.slice(4).split('.')) {
       call = call[part];
+      if (!call) {
+        const advice = part.includes('_') ? ' Looks like it needs to be converted to camel case.' : '';
+        throw Error(`Function ${part} of api call ${apiCall} not found.${advice}`);
+      }
     }
     return call(...params);
   }
@@ -1259,6 +1263,42 @@
   }
 
   /**
+   * Set, change, or remove approved address to transfer the ownership of the NFT from eth mirror.
+   *
+   * @param signer keyring of signer
+   * @param collectionId ID of collection
+   * @param tokenId ID of token
+   * @param fromAddressObj Signer's Ethereum address containing her tokens
+   * @param toAddressObj Substrate or Ethereum address which gets approved use of the signer's tokens
+   * @param amount amount of token to be approved. For NFT must be set to 1n
+   * @returns ```true``` if extrinsic success, otherwise ```false```
+   */
+  async approveTokenFrom(signer: IKeyringPair, collectionId: number, tokenId: number, fromAddressObj: ICrossAccountId, toAddressObj: ICrossAccountId, amount=1n) {
+    const approveResult = await this.helper.executeExtrinsic(
+      signer,
+      'api.tx.unique.approveFrom', [fromAddressObj, toAddressObj, collectionId, tokenId, amount],
+      true, // `Unable to approve token for ${label}`,
+    );
+
+    return this.helper.util.findCollectionInEvents(approveResult.result.events, collectionId, 'common', 'Approved');
+  }
+
+  /**
+   * Set, change, or remove approved address to transfer the ownership of the NFT from eth mirror.
+   *
+   * @param signer keyring of signer
+   * @param collectionId ID of collection
+   * @param tokenId ID of token
+   * @param toAddressObj Substrate or Ethereum address which gets approved use of the signer's tokens
+   * @param amount amount of token to be approved. For NFT must be set to 1n
+   * @returns ```true``` if extrinsic success, otherwise ```false```
+   */
+  async approveTokenFromEth(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount=1n) {
+    const ethMirror = CrossAccountId.fromKeyring(signer).toEthereum();
+    return await this.approveTokenFrom(signer, collectionId, tokenId, ethMirror, toAddressObj, amount);
+  }
+
+  /**
    * Get the amount of token pieces approved to transfer or burn. Normally 0.
    *
    * @param collectionId ID of collection
@@ -1756,8 +1796,8 @@
    * @example approveToken(aliceKeyring, 10, 5, {Substrate: "5DyN4Y92vZCjv38fg..."})
    * @returns ```true``` if extrinsic success, otherwise ```false```
    */
-  approveToken(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId) {
-    return super.approveToken(signer, collectionId, tokenId, toAddressObj, 1n);
+  approveToken(signer: IKeyringPair, collectionId: number, tokenId: number, toAddressObj: ICrossAccountId, amount=1n) {
+    return super.approveToken(signer, collectionId, tokenId, toAddressObj, amount);
   }
 }