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
after · tests/src/interfaces/default/types.ts
1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';5import type { ITuple } from '@polkadot/types-codec/types';6import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';7import type { Event } from '@polkadot/types/interfaces/system';89/** @name CumulusPalletDmpQueueCall */10export interface CumulusPalletDmpQueueCall extends Enum {11  readonly isServiceOverweight: boolean;12  readonly asServiceOverweight: {13    readonly index: u64;14    readonly weightLimit: u64;15  } & Struct;16  readonly type: 'ServiceOverweight';17}1819/** @name CumulusPalletDmpQueueConfigData */20export interface CumulusPalletDmpQueueConfigData extends Struct {21  readonly maxIndividual: SpWeightsWeightV2Weight;22}2324/** @name CumulusPalletDmpQueueError */25export interface CumulusPalletDmpQueueError extends Enum {26  readonly isUnknown: boolean;27  readonly isOverLimit: boolean;28  readonly type: 'Unknown' | 'OverLimit';29}3031/** @name CumulusPalletDmpQueueEvent */32export interface CumulusPalletDmpQueueEvent extends Enum {33  readonly isInvalidFormat: boolean;34  readonly asInvalidFormat: {35    readonly messageId: U8aFixed;36  } & Struct;37  readonly isUnsupportedVersion: boolean;38  readonly asUnsupportedVersion: {39    readonly messageId: U8aFixed;40  } & Struct;41  readonly isExecutedDownward: boolean;42  readonly asExecutedDownward: {43    readonly messageId: U8aFixed;44    readonly outcome: XcmV2TraitsOutcome;45  } & Struct;46  readonly isWeightExhausted: boolean;47  readonly asWeightExhausted: {48    readonly messageId: U8aFixed;49    readonly remainingWeight: SpWeightsWeightV2Weight;50    readonly requiredWeight: SpWeightsWeightV2Weight;51  } & Struct;52  readonly isOverweightEnqueued: boolean;53  readonly asOverweightEnqueued: {54    readonly messageId: U8aFixed;55    readonly overweightIndex: u64;56    readonly requiredWeight: SpWeightsWeightV2Weight;57  } & Struct;58  readonly isOverweightServiced: boolean;59  readonly asOverweightServiced: {60    readonly overweightIndex: u64;61    readonly weightUsed: SpWeightsWeightV2Weight;62  } & Struct;63  readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';64}6566/** @name CumulusPalletDmpQueuePageIndexData */67export interface CumulusPalletDmpQueuePageIndexData extends Struct {68  readonly beginUsed: u32;69  readonly endUsed: u32;70  readonly overweightCount: u64;71}7273/** @name CumulusPalletParachainSystemCall */74export interface CumulusPalletParachainSystemCall extends Enum {75  readonly isSetValidationData: boolean;76  readonly asSetValidationData: {77    readonly data: CumulusPrimitivesParachainInherentParachainInherentData;78  } & Struct;79  readonly isSudoSendUpwardMessage: boolean;80  readonly asSudoSendUpwardMessage: {81    readonly message: Bytes;82  } & Struct;83  readonly isAuthorizeUpgrade: boolean;84  readonly asAuthorizeUpgrade: {85    readonly codeHash: H256;86  } & Struct;87  readonly isEnactAuthorizedUpgrade: boolean;88  readonly asEnactAuthorizedUpgrade: {89    readonly code: Bytes;90  } & Struct;91  readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';92}9394/** @name CumulusPalletParachainSystemError */95export interface CumulusPalletParachainSystemError extends Enum {96  readonly isOverlappingUpgrades: boolean;97  readonly isProhibitedByPolkadot: boolean;98  readonly isTooBig: boolean;99  readonly isValidationDataNotAvailable: boolean;100  readonly isHostConfigurationNotAvailable: boolean;101  readonly isNotScheduled: boolean;102  readonly isNothingAuthorized: boolean;103  readonly isUnauthorized: boolean;104  readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';105}106107/** @name CumulusPalletParachainSystemEvent */108export interface CumulusPalletParachainSystemEvent extends Enum {109  readonly isValidationFunctionStored: boolean;110  readonly isValidationFunctionApplied: boolean;111  readonly asValidationFunctionApplied: {112    readonly relayChainBlockNum: u32;113  } & Struct;114  readonly isValidationFunctionDiscarded: boolean;115  readonly isUpgradeAuthorized: boolean;116  readonly asUpgradeAuthorized: {117    readonly codeHash: H256;118  } & Struct;119  readonly isDownwardMessagesReceived: boolean;120  readonly asDownwardMessagesReceived: {121    readonly count: u32;122  } & Struct;123  readonly isDownwardMessagesProcessed: boolean;124  readonly asDownwardMessagesProcessed: {125    readonly weightUsed: SpWeightsWeightV2Weight;126    readonly dmqHead: H256;127  } & Struct;128  readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';129}130131/** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot */132export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {133  readonly dmqMqcHead: H256;134  readonly relayDispatchQueueSize: ITuple<[u32, u32]>;135  readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;136  readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;137}138139/** @name CumulusPalletXcmCall */140export interface CumulusPalletXcmCall extends Null {}141142/** @name CumulusPalletXcmError */143export interface CumulusPalletXcmError extends Null {}144145/** @name CumulusPalletXcmEvent */146export interface CumulusPalletXcmEvent extends Enum {147  readonly isInvalidFormat: boolean;148  readonly asInvalidFormat: U8aFixed;149  readonly isUnsupportedVersion: boolean;150  readonly asUnsupportedVersion: U8aFixed;151  readonly isExecutedDownward: boolean;152  readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;153  readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';154}155156/** @name CumulusPalletXcmpQueueCall */157export interface CumulusPalletXcmpQueueCall extends Enum {158  readonly isServiceOverweight: boolean;159  readonly asServiceOverweight: {160    readonly index: u64;161    readonly weightLimit: u64;162  } & Struct;163  readonly isSuspendXcmExecution: boolean;164  readonly isResumeXcmExecution: boolean;165  readonly isUpdateSuspendThreshold: boolean;166  readonly asUpdateSuspendThreshold: {167    readonly new_: u32;168  } & Struct;169  readonly isUpdateDropThreshold: boolean;170  readonly asUpdateDropThreshold: {171    readonly new_: u32;172  } & Struct;173  readonly isUpdateResumeThreshold: boolean;174  readonly asUpdateResumeThreshold: {175    readonly new_: u32;176  } & Struct;177  readonly isUpdateThresholdWeight: boolean;178  readonly asUpdateThresholdWeight: {179    readonly new_: u64;180  } & Struct;181  readonly isUpdateWeightRestrictDecay: boolean;182  readonly asUpdateWeightRestrictDecay: {183    readonly new_: u64;184  } & Struct;185  readonly isUpdateXcmpMaxIndividualWeight: boolean;186  readonly asUpdateXcmpMaxIndividualWeight: {187    readonly new_: u64;188  } & Struct;189  readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';190}191192/** @name CumulusPalletXcmpQueueError */193export interface CumulusPalletXcmpQueueError extends Enum {194  readonly isFailedToSend: boolean;195  readonly isBadXcmOrigin: boolean;196  readonly isBadXcm: boolean;197  readonly isBadOverweightIndex: boolean;198  readonly isWeightOverLimit: boolean;199  readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';200}201202/** @name CumulusPalletXcmpQueueEvent */203export interface CumulusPalletXcmpQueueEvent extends Enum {204  readonly isSuccess: boolean;205  readonly asSuccess: {206    readonly messageHash: Option<H256>;207    readonly weight: SpWeightsWeightV2Weight;208  } & Struct;209  readonly isFail: boolean;210  readonly asFail: {211    readonly messageHash: Option<H256>;212    readonly error: XcmV2TraitsError;213    readonly weight: SpWeightsWeightV2Weight;214  } & Struct;215  readonly isBadVersion: boolean;216  readonly asBadVersion: {217    readonly messageHash: Option<H256>;218  } & Struct;219  readonly isBadFormat: boolean;220  readonly asBadFormat: {221    readonly messageHash: Option<H256>;222  } & Struct;223  readonly isUpwardMessageSent: boolean;224  readonly asUpwardMessageSent: {225    readonly messageHash: Option<H256>;226  } & Struct;227  readonly isXcmpMessageSent: boolean;228  readonly asXcmpMessageSent: {229    readonly messageHash: Option<H256>;230  } & Struct;231  readonly isOverweightEnqueued: boolean;232  readonly asOverweightEnqueued: {233    readonly sender: u32;234    readonly sentAt: u32;235    readonly index: u64;236    readonly required: SpWeightsWeightV2Weight;237  } & Struct;238  readonly isOverweightServiced: boolean;239  readonly asOverweightServiced: {240    readonly index: u64;241    readonly used: SpWeightsWeightV2Weight;242  } & Struct;243  readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';244}245246/** @name CumulusPalletXcmpQueueInboundChannelDetails */247export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {248  readonly sender: u32;249  readonly state: CumulusPalletXcmpQueueInboundState;250  readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;251}252253/** @name CumulusPalletXcmpQueueInboundState */254export interface CumulusPalletXcmpQueueInboundState extends Enum {255  readonly isOk: boolean;256  readonly isSuspended: boolean;257  readonly type: 'Ok' | 'Suspended';258}259260/** @name CumulusPalletXcmpQueueOutboundChannelDetails */261export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {262  readonly recipient: u32;263  readonly state: CumulusPalletXcmpQueueOutboundState;264  readonly signalsExist: bool;265  readonly firstIndex: u16;266  readonly lastIndex: u16;267}268269/** @name CumulusPalletXcmpQueueOutboundState */270export interface CumulusPalletXcmpQueueOutboundState extends Enum {271  readonly isOk: boolean;272  readonly isSuspended: boolean;273  readonly type: 'Ok' | 'Suspended';274}275276/** @name CumulusPalletXcmpQueueQueueConfigData */277export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {278  readonly suspendThreshold: u32;279  readonly dropThreshold: u32;280  readonly resumeThreshold: u32;281  readonly thresholdWeight: SpWeightsWeightV2Weight;282  readonly weightRestrictDecay: SpWeightsWeightV2Weight;283  readonly xcmpMaxIndividualWeight: SpWeightsWeightV2Weight;284}285286/** @name CumulusPrimitivesParachainInherentParachainInherentData */287export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {288  readonly validationData: PolkadotPrimitivesV2PersistedValidationData;289  readonly relayChainState: SpTrieStorageProof;290  readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;291  readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;292}293294/** @name EthbloomBloom */295export interface EthbloomBloom extends U8aFixed {}296297/** @name EthereumBlock */298export interface EthereumBlock extends Struct {299  readonly header: EthereumHeader;300  readonly transactions: Vec<EthereumTransactionTransactionV2>;301  readonly ommers: Vec<EthereumHeader>;302}303304/** @name EthereumHeader */305export interface EthereumHeader extends Struct {306  readonly parentHash: H256;307  readonly ommersHash: H256;308  readonly beneficiary: H160;309  readonly stateRoot: H256;310  readonly transactionsRoot: H256;311  readonly receiptsRoot: H256;312  readonly logsBloom: EthbloomBloom;313  readonly difficulty: U256;314  readonly number: U256;315  readonly gasLimit: U256;316  readonly gasUsed: U256;317  readonly timestamp: u64;318  readonly extraData: Bytes;319  readonly mixHash: H256;320  readonly nonce: EthereumTypesHashH64;321}322323/** @name EthereumLog */324export interface EthereumLog extends Struct {325  readonly address: H160;326  readonly topics: Vec<H256>;327  readonly data: Bytes;328}329330/** @name EthereumReceiptEip658ReceiptData */331export interface EthereumReceiptEip658ReceiptData extends Struct {332  readonly statusCode: u8;333  readonly usedGas: U256;334  readonly logsBloom: EthbloomBloom;335  readonly logs: Vec<EthereumLog>;336}337338/** @name EthereumReceiptReceiptV3 */339export interface EthereumReceiptReceiptV3 extends Enum {340  readonly isLegacy: boolean;341  readonly asLegacy: EthereumReceiptEip658ReceiptData;342  readonly isEip2930: boolean;343  readonly asEip2930: EthereumReceiptEip658ReceiptData;344  readonly isEip1559: boolean;345  readonly asEip1559: EthereumReceiptEip658ReceiptData;346  readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';347}348349/** @name EthereumTransactionAccessListItem */350export interface EthereumTransactionAccessListItem extends Struct {351  readonly address: H160;352  readonly storageKeys: Vec<H256>;353}354355/** @name EthereumTransactionEip1559Transaction */356export interface EthereumTransactionEip1559Transaction extends Struct {357  readonly chainId: u64;358  readonly nonce: U256;359  readonly maxPriorityFeePerGas: U256;360  readonly maxFeePerGas: U256;361  readonly gasLimit: U256;362  readonly action: EthereumTransactionTransactionAction;363  readonly value: U256;364  readonly input: Bytes;365  readonly accessList: Vec<EthereumTransactionAccessListItem>;366  readonly oddYParity: bool;367  readonly r: H256;368  readonly s: H256;369}370371/** @name EthereumTransactionEip2930Transaction */372export interface EthereumTransactionEip2930Transaction extends Struct {373  readonly chainId: u64;374  readonly nonce: U256;375  readonly gasPrice: U256;376  readonly gasLimit: U256;377  readonly action: EthereumTransactionTransactionAction;378  readonly value: U256;379  readonly input: Bytes;380  readonly accessList: Vec<EthereumTransactionAccessListItem>;381  readonly oddYParity: bool;382  readonly r: H256;383  readonly s: H256;384}385386/** @name EthereumTransactionLegacyTransaction */387export interface EthereumTransactionLegacyTransaction extends Struct {388  readonly nonce: U256;389  readonly gasPrice: U256;390  readonly gasLimit: U256;391  readonly action: EthereumTransactionTransactionAction;392  readonly value: U256;393  readonly input: Bytes;394  readonly signature: EthereumTransactionTransactionSignature;395}396397/** @name EthereumTransactionTransactionAction */398export interface EthereumTransactionTransactionAction extends Enum {399  readonly isCall: boolean;400  readonly asCall: H160;401  readonly isCreate: boolean;402  readonly type: 'Call' | 'Create';403}404405/** @name EthereumTransactionTransactionSignature */406export interface EthereumTransactionTransactionSignature extends Struct {407  readonly v: u64;408  readonly r: H256;409  readonly s: H256;410}411412/** @name EthereumTransactionTransactionV2 */413export interface EthereumTransactionTransactionV2 extends Enum {414  readonly isLegacy: boolean;415  readonly asLegacy: EthereumTransactionLegacyTransaction;416  readonly isEip2930: boolean;417  readonly asEip2930: EthereumTransactionEip2930Transaction;418  readonly isEip1559: boolean;419  readonly asEip1559: EthereumTransactionEip1559Transaction;420  readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';421}422423/** @name EthereumTypesHashH64 */424export interface EthereumTypesHashH64 extends U8aFixed {}425426/** @name EvmCoreErrorExitError */427export interface EvmCoreErrorExitError extends Enum {428  readonly isStackUnderflow: boolean;429  readonly isStackOverflow: boolean;430  readonly isInvalidJump: boolean;431  readonly isInvalidRange: boolean;432  readonly isDesignatedInvalid: boolean;433  readonly isCallTooDeep: boolean;434  readonly isCreateCollision: boolean;435  readonly isCreateContractLimit: boolean;436  readonly isOutOfOffset: boolean;437  readonly isOutOfGas: boolean;438  readonly isOutOfFund: boolean;439  readonly isPcUnderflow: boolean;440  readonly isCreateEmpty: boolean;441  readonly isOther: boolean;442  readonly asOther: Text;443  readonly isInvalidCode: boolean;444  readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';445}446447/** @name EvmCoreErrorExitFatal */448export interface EvmCoreErrorExitFatal extends Enum {449  readonly isNotSupported: boolean;450  readonly isUnhandledInterrupt: boolean;451  readonly isCallErrorAsFatal: boolean;452  readonly asCallErrorAsFatal: EvmCoreErrorExitError;453  readonly isOther: boolean;454  readonly asOther: Text;455  readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';456}457458/** @name EvmCoreErrorExitReason */459export interface EvmCoreErrorExitReason extends Enum {460  readonly isSucceed: boolean;461  readonly asSucceed: EvmCoreErrorExitSucceed;462  readonly isError: boolean;463  readonly asError: EvmCoreErrorExitError;464  readonly isRevert: boolean;465  readonly asRevert: EvmCoreErrorExitRevert;466  readonly isFatal: boolean;467  readonly asFatal: EvmCoreErrorExitFatal;468  readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';469}470471/** @name EvmCoreErrorExitRevert */472export interface EvmCoreErrorExitRevert extends Enum {473  readonly isReverted: boolean;474  readonly type: 'Reverted';475}476477/** @name EvmCoreErrorExitSucceed */478export interface EvmCoreErrorExitSucceed extends Enum {479  readonly isStopped: boolean;480  readonly isReturned: boolean;481  readonly isSuicided: boolean;482  readonly type: 'Stopped' | 'Returned' | 'Suicided';483}484485/** @name FpRpcTransactionStatus */486export interface FpRpcTransactionStatus extends Struct {487  readonly transactionHash: H256;488  readonly transactionIndex: u32;489  readonly from: H160;490  readonly to: Option<H160>;491  readonly contractAddress: Option<H160>;492  readonly logs: Vec<EthereumLog>;493  readonly logsBloom: EthbloomBloom;494}495496/** @name FrameSupportDispatchDispatchClass */497export interface FrameSupportDispatchDispatchClass extends Enum {498  readonly isNormal: boolean;499  readonly isOperational: boolean;500  readonly isMandatory: boolean;501  readonly type: 'Normal' | 'Operational' | 'Mandatory';502}503504/** @name FrameSupportDispatchDispatchInfo */505export interface FrameSupportDispatchDispatchInfo extends Struct {506  readonly weight: SpWeightsWeightV2Weight;507  readonly class: FrameSupportDispatchDispatchClass;508  readonly paysFee: FrameSupportDispatchPays;509}510511/** @name FrameSupportDispatchPays */512export interface FrameSupportDispatchPays extends Enum {513  readonly isYes: boolean;514  readonly isNo: boolean;515  readonly type: 'Yes' | 'No';516}517518/** @name FrameSupportDispatchPerDispatchClassU32 */519export interface FrameSupportDispatchPerDispatchClassU32 extends Struct {520  readonly normal: u32;521  readonly operational: u32;522  readonly mandatory: u32;523}524525/** @name FrameSupportDispatchPerDispatchClassWeight */526export interface FrameSupportDispatchPerDispatchClassWeight extends Struct {527  readonly normal: SpWeightsWeightV2Weight;528  readonly operational: SpWeightsWeightV2Weight;529  readonly mandatory: SpWeightsWeightV2Weight;530}531532/** @name FrameSupportDispatchPerDispatchClassWeightsPerClass */533export interface FrameSupportDispatchPerDispatchClassWeightsPerClass extends Struct {534  readonly normal: FrameSystemLimitsWeightsPerClass;535  readonly operational: FrameSystemLimitsWeightsPerClass;536  readonly mandatory: FrameSystemLimitsWeightsPerClass;537}538539/** @name FrameSupportPalletId */540export interface FrameSupportPalletId extends U8aFixed {}541542/** @name FrameSupportTokensMiscBalanceStatus */543export interface FrameSupportTokensMiscBalanceStatus extends Enum {544  readonly isFree: boolean;545  readonly isReserved: boolean;546  readonly type: 'Free' | 'Reserved';547}548549/** @name FrameSystemAccountInfo */550export interface FrameSystemAccountInfo extends Struct {551  readonly nonce: u32;552  readonly consumers: u32;553  readonly providers: u32;554  readonly sufficients: u32;555  readonly data: PalletBalancesAccountData;556}557558/** @name FrameSystemCall */559export interface FrameSystemCall extends Enum {560  readonly isRemark: boolean;561  readonly asRemark: {562    readonly remark: Bytes;563  } & Struct;564  readonly isSetHeapPages: boolean;565  readonly asSetHeapPages: {566    readonly pages: u64;567  } & Struct;568  readonly isSetCode: boolean;569  readonly asSetCode: {570    readonly code: Bytes;571  } & Struct;572  readonly isSetCodeWithoutChecks: boolean;573  readonly asSetCodeWithoutChecks: {574    readonly code: Bytes;575  } & Struct;576  readonly isSetStorage: boolean;577  readonly asSetStorage: {578    readonly items: Vec<ITuple<[Bytes, Bytes]>>;579  } & Struct;580  readonly isKillStorage: boolean;581  readonly asKillStorage: {582    readonly keys_: Vec<Bytes>;583  } & Struct;584  readonly isKillPrefix: boolean;585  readonly asKillPrefix: {586    readonly prefix: Bytes;587    readonly subkeys: u32;588  } & Struct;589  readonly isRemarkWithEvent: boolean;590  readonly asRemarkWithEvent: {591    readonly remark: Bytes;592  } & Struct;593  readonly type: 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';594}595596/** @name FrameSystemError */597export interface FrameSystemError extends Enum {598  readonly isInvalidSpecName: boolean;599  readonly isSpecVersionNeedsToIncrease: boolean;600  readonly isFailedToExtractRuntimeVersion: boolean;601  readonly isNonDefaultComposite: boolean;602  readonly isNonZeroRefCount: boolean;603  readonly isCallFiltered: boolean;604  readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';605}606607/** @name FrameSystemEvent */608export interface FrameSystemEvent extends Enum {609  readonly isExtrinsicSuccess: boolean;610  readonly asExtrinsicSuccess: {611    readonly dispatchInfo: FrameSupportDispatchDispatchInfo;612  } & Struct;613  readonly isExtrinsicFailed: boolean;614  readonly asExtrinsicFailed: {615    readonly dispatchError: SpRuntimeDispatchError;616    readonly dispatchInfo: FrameSupportDispatchDispatchInfo;617  } & Struct;618  readonly isCodeUpdated: boolean;619  readonly isNewAccount: boolean;620  readonly asNewAccount: {621    readonly account: AccountId32;622  } & Struct;623  readonly isKilledAccount: boolean;624  readonly asKilledAccount: {625    readonly account: AccountId32;626  } & Struct;627  readonly isRemarked: boolean;628  readonly asRemarked: {629    readonly sender: AccountId32;630    readonly hash_: H256;631  } & Struct;632  readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';633}634635/** @name FrameSystemEventRecord */636export interface FrameSystemEventRecord extends Struct {637  readonly phase: FrameSystemPhase;638  readonly event: Event;639  readonly topics: Vec<H256>;640}641642/** @name FrameSystemExtensionsCheckGenesis */643export interface FrameSystemExtensionsCheckGenesis extends Null {}644645/** @name FrameSystemExtensionsCheckNonce */646export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}647648/** @name FrameSystemExtensionsCheckSpecVersion */649export interface FrameSystemExtensionsCheckSpecVersion extends Null {}650651/** @name FrameSystemExtensionsCheckTxVersion */652export interface FrameSystemExtensionsCheckTxVersion extends Null {}653654/** @name FrameSystemExtensionsCheckWeight */655export interface FrameSystemExtensionsCheckWeight extends Null {}656657/** @name FrameSystemLastRuntimeUpgradeInfo */658export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {659  readonly specVersion: Compact<u32>;660  readonly specName: Text;661}662663/** @name FrameSystemLimitsBlockLength */664export interface FrameSystemLimitsBlockLength extends Struct {665  readonly max: FrameSupportDispatchPerDispatchClassU32;666}667668/** @name FrameSystemLimitsBlockWeights */669export interface FrameSystemLimitsBlockWeights extends Struct {670  readonly baseBlock: SpWeightsWeightV2Weight;671  readonly maxBlock: SpWeightsWeightV2Weight;672  readonly perClass: FrameSupportDispatchPerDispatchClassWeightsPerClass;673}674675/** @name FrameSystemLimitsWeightsPerClass */676export interface FrameSystemLimitsWeightsPerClass extends Struct {677  readonly baseExtrinsic: SpWeightsWeightV2Weight;678  readonly maxExtrinsic: Option<SpWeightsWeightV2Weight>;679  readonly maxTotal: Option<SpWeightsWeightV2Weight>;680  readonly reserved: Option<SpWeightsWeightV2Weight>;681}682683/** @name FrameSystemPhase */684export interface FrameSystemPhase extends Enum {685  readonly isApplyExtrinsic: boolean;686  readonly asApplyExtrinsic: u32;687  readonly isFinalization: boolean;688  readonly isInitialization: boolean;689  readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';690}691692/** @name OpalRuntimeRuntime */693export interface OpalRuntimeRuntime extends Null {}694695/** @name OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls */696export interface OpalRuntimeRuntimeCommonIdentityDisableIdentityCalls extends Null {}697698/** @name OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance */699export interface OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance extends Null {}700701/** @name OrmlTokensAccountData */702export interface OrmlTokensAccountData extends Struct {703  readonly free: u128;704  readonly reserved: u128;705  readonly frozen: u128;706}707708/** @name OrmlTokensBalanceLock */709export interface OrmlTokensBalanceLock extends Struct {710  readonly id: U8aFixed;711  readonly amount: u128;712}713714/** @name OrmlTokensModuleCall */715export interface OrmlTokensModuleCall extends Enum {716  readonly isTransfer: boolean;717  readonly asTransfer: {718    readonly dest: MultiAddress;719    readonly currencyId: PalletForeignAssetsAssetIds;720    readonly amount: Compact<u128>;721  } & Struct;722  readonly isTransferAll: boolean;723  readonly asTransferAll: {724    readonly dest: MultiAddress;725    readonly currencyId: PalletForeignAssetsAssetIds;726    readonly keepAlive: bool;727  } & Struct;728  readonly isTransferKeepAlive: boolean;729  readonly asTransferKeepAlive: {730    readonly dest: MultiAddress;731    readonly currencyId: PalletForeignAssetsAssetIds;732    readonly amount: Compact<u128>;733  } & Struct;734  readonly isForceTransfer: boolean;735  readonly asForceTransfer: {736    readonly source: MultiAddress;737    readonly dest: MultiAddress;738    readonly currencyId: PalletForeignAssetsAssetIds;739    readonly amount: Compact<u128>;740  } & Struct;741  readonly isSetBalance: boolean;742  readonly asSetBalance: {743    readonly who: MultiAddress;744    readonly currencyId: PalletForeignAssetsAssetIds;745    readonly newFree: Compact<u128>;746    readonly newReserved: Compact<u128>;747  } & Struct;748  readonly type: 'Transfer' | 'TransferAll' | 'TransferKeepAlive' | 'ForceTransfer' | 'SetBalance';749}750751/** @name OrmlTokensModuleError */752export interface OrmlTokensModuleError extends Enum {753  readonly isBalanceTooLow: boolean;754  readonly isAmountIntoBalanceFailed: boolean;755  readonly isLiquidityRestrictions: boolean;756  readonly isMaxLocksExceeded: boolean;757  readonly isKeepAlive: boolean;758  readonly isExistentialDeposit: boolean;759  readonly isDeadAccount: boolean;760  readonly isTooManyReserves: boolean;761  readonly type: 'BalanceTooLow' | 'AmountIntoBalanceFailed' | 'LiquidityRestrictions' | 'MaxLocksExceeded' | 'KeepAlive' | 'ExistentialDeposit' | 'DeadAccount' | 'TooManyReserves';762}763764/** @name OrmlTokensModuleEvent */765export interface OrmlTokensModuleEvent extends Enum {766  readonly isEndowed: boolean;767  readonly asEndowed: {768    readonly currencyId: PalletForeignAssetsAssetIds;769    readonly who: AccountId32;770    readonly amount: u128;771  } & Struct;772  readonly isDustLost: boolean;773  readonly asDustLost: {774    readonly currencyId: PalletForeignAssetsAssetIds;775    readonly who: AccountId32;776    readonly amount: u128;777  } & Struct;778  readonly isTransfer: boolean;779  readonly asTransfer: {780    readonly currencyId: PalletForeignAssetsAssetIds;781    readonly from: AccountId32;782    readonly to: AccountId32;783    readonly amount: u128;784  } & Struct;785  readonly isReserved: boolean;786  readonly asReserved: {787    readonly currencyId: PalletForeignAssetsAssetIds;788    readonly who: AccountId32;789    readonly amount: u128;790  } & Struct;791  readonly isUnreserved: boolean;792  readonly asUnreserved: {793    readonly currencyId: PalletForeignAssetsAssetIds;794    readonly who: AccountId32;795    readonly amount: u128;796  } & Struct;797  readonly isReserveRepatriated: boolean;798  readonly asReserveRepatriated: {799    readonly currencyId: PalletForeignAssetsAssetIds;800    readonly from: AccountId32;801    readonly to: AccountId32;802    readonly amount: u128;803    readonly status: FrameSupportTokensMiscBalanceStatus;804  } & Struct;805  readonly isBalanceSet: boolean;806  readonly asBalanceSet: {807    readonly currencyId: PalletForeignAssetsAssetIds;808    readonly who: AccountId32;809    readonly free: u128;810    readonly reserved: u128;811  } & Struct;812  readonly isTotalIssuanceSet: boolean;813  readonly asTotalIssuanceSet: {814    readonly currencyId: PalletForeignAssetsAssetIds;815    readonly amount: u128;816  } & Struct;817  readonly isWithdrawn: boolean;818  readonly asWithdrawn: {819    readonly currencyId: PalletForeignAssetsAssetIds;820    readonly who: AccountId32;821    readonly amount: u128;822  } & Struct;823  readonly isSlashed: boolean;824  readonly asSlashed: {825    readonly currencyId: PalletForeignAssetsAssetIds;826    readonly who: AccountId32;827    readonly freeAmount: u128;828    readonly reservedAmount: u128;829  } & Struct;830  readonly isDeposited: boolean;831  readonly asDeposited: {832    readonly currencyId: PalletForeignAssetsAssetIds;833    readonly who: AccountId32;834    readonly amount: u128;835  } & Struct;836  readonly isLockSet: boolean;837  readonly asLockSet: {838    readonly lockId: U8aFixed;839    readonly currencyId: PalletForeignAssetsAssetIds;840    readonly who: AccountId32;841    readonly amount: u128;842  } & Struct;843  readonly isLockRemoved: boolean;844  readonly asLockRemoved: {845    readonly lockId: U8aFixed;846    readonly currencyId: PalletForeignAssetsAssetIds;847    readonly who: AccountId32;848  } & Struct;849  readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'BalanceSet' | 'TotalIssuanceSet' | 'Withdrawn' | 'Slashed' | 'Deposited' | 'LockSet' | 'LockRemoved';850}851852/** @name OrmlTokensReserveData */853export interface OrmlTokensReserveData extends Struct {854  readonly id: Null;855  readonly amount: u128;856}857858/** @name OrmlVestingModuleCall */859export interface OrmlVestingModuleCall extends Enum {860  readonly isClaim: boolean;861  readonly isVestedTransfer: boolean;862  readonly asVestedTransfer: {863    readonly dest: MultiAddress;864    readonly schedule: OrmlVestingVestingSchedule;865  } & Struct;866  readonly isUpdateVestingSchedules: boolean;867  readonly asUpdateVestingSchedules: {868    readonly who: MultiAddress;869    readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;870  } & Struct;871  readonly isClaimFor: boolean;872  readonly asClaimFor: {873    readonly dest: MultiAddress;874  } & Struct;875  readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';876}877878/** @name OrmlVestingModuleError */879export interface OrmlVestingModuleError extends Enum {880  readonly isZeroVestingPeriod: boolean;881  readonly isZeroVestingPeriodCount: boolean;882  readonly isInsufficientBalanceToLock: boolean;883  readonly isTooManyVestingSchedules: boolean;884  readonly isAmountLow: boolean;885  readonly isMaxVestingSchedulesExceeded: boolean;886  readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';887}888889/** @name OrmlVestingModuleEvent */890export interface OrmlVestingModuleEvent extends Enum {891  readonly isVestingScheduleAdded: boolean;892  readonly asVestingScheduleAdded: {893    readonly from: AccountId32;894    readonly to: AccountId32;895    readonly vestingSchedule: OrmlVestingVestingSchedule;896  } & Struct;897  readonly isClaimed: boolean;898  readonly asClaimed: {899    readonly who: AccountId32;900    readonly amount: u128;901  } & Struct;902  readonly isVestingSchedulesUpdated: boolean;903  readonly asVestingSchedulesUpdated: {904    readonly who: AccountId32;905  } & Struct;906  readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';907}908909/** @name OrmlVestingVestingSchedule */910export interface OrmlVestingVestingSchedule extends Struct {911  readonly start: u32;912  readonly period: u32;913  readonly periodCount: u32;914  readonly perPeriod: Compact<u128>;915}916917/** @name OrmlXtokensModuleCall */918export interface OrmlXtokensModuleCall extends Enum {919  readonly isTransfer: boolean;920  readonly asTransfer: {921    readonly currencyId: PalletForeignAssetsAssetIds;922    readonly amount: u128;923    readonly dest: XcmVersionedMultiLocation;924    readonly destWeightLimit: XcmV2WeightLimit;925  } & Struct;926  readonly isTransferMultiasset: boolean;927  readonly asTransferMultiasset: {928    readonly asset: XcmVersionedMultiAsset;929    readonly dest: XcmVersionedMultiLocation;930    readonly destWeightLimit: XcmV2WeightLimit;931  } & Struct;932  readonly isTransferWithFee: boolean;933  readonly asTransferWithFee: {934    readonly currencyId: PalletForeignAssetsAssetIds;935    readonly amount: u128;936    readonly fee: u128;937    readonly dest: XcmVersionedMultiLocation;938    readonly destWeightLimit: XcmV2WeightLimit;939  } & Struct;940  readonly isTransferMultiassetWithFee: boolean;941  readonly asTransferMultiassetWithFee: {942    readonly asset: XcmVersionedMultiAsset;943    readonly fee: XcmVersionedMultiAsset;944    readonly dest: XcmVersionedMultiLocation;945    readonly destWeightLimit: XcmV2WeightLimit;946  } & Struct;947  readonly isTransferMulticurrencies: boolean;948  readonly asTransferMulticurrencies: {949    readonly currencies: Vec<ITuple<[PalletForeignAssetsAssetIds, u128]>>;950    readonly feeItem: u32;951    readonly dest: XcmVersionedMultiLocation;952    readonly destWeightLimit: XcmV2WeightLimit;953  } & Struct;954  readonly isTransferMultiassets: boolean;955  readonly asTransferMultiassets: {956    readonly assets: XcmVersionedMultiAssets;957    readonly feeItem: u32;958    readonly dest: XcmVersionedMultiLocation;959    readonly destWeightLimit: XcmV2WeightLimit;960  } & Struct;961  readonly type: 'Transfer' | 'TransferMultiasset' | 'TransferWithFee' | 'TransferMultiassetWithFee' | 'TransferMulticurrencies' | 'TransferMultiassets';962}963964/** @name OrmlXtokensModuleError */965export interface OrmlXtokensModuleError extends Enum {966  readonly isAssetHasNoReserve: boolean;967  readonly isNotCrossChainTransfer: boolean;968  readonly isInvalidDest: boolean;969  readonly isNotCrossChainTransferableCurrency: boolean;970  readonly isUnweighableMessage: boolean;971  readonly isXcmExecutionFailed: boolean;972  readonly isCannotReanchor: boolean;973  readonly isInvalidAncestry: boolean;974  readonly isInvalidAsset: boolean;975  readonly isDestinationNotInvertible: boolean;976  readonly isBadVersion: boolean;977  readonly isDistinctReserveForAssetAndFee: boolean;978  readonly isZeroFee: boolean;979  readonly isZeroAmount: boolean;980  readonly isTooManyAssetsBeingSent: boolean;981  readonly isAssetIndexNonExistent: boolean;982  readonly isFeeNotEnough: boolean;983  readonly isNotSupportedMultiLocation: boolean;984  readonly isMinXcmFeeNotDefined: boolean;985  readonly type: 'AssetHasNoReserve' | 'NotCrossChainTransfer' | 'InvalidDest' | 'NotCrossChainTransferableCurrency' | 'UnweighableMessage' | 'XcmExecutionFailed' | 'CannotReanchor' | 'InvalidAncestry' | 'InvalidAsset' | 'DestinationNotInvertible' | 'BadVersion' | 'DistinctReserveForAssetAndFee' | 'ZeroFee' | 'ZeroAmount' | 'TooManyAssetsBeingSent' | 'AssetIndexNonExistent' | 'FeeNotEnough' | 'NotSupportedMultiLocation' | 'MinXcmFeeNotDefined';986}987988/** @name OrmlXtokensModuleEvent */989export interface OrmlXtokensModuleEvent extends Enum {990  readonly isTransferredMultiAssets: boolean;991  readonly asTransferredMultiAssets: {992    readonly sender: AccountId32;993    readonly assets: XcmV1MultiassetMultiAssets;994    readonly fee: XcmV1MultiAsset;995    readonly dest: XcmV1MultiLocation;996  } & Struct;997  readonly type: 'TransferredMultiAssets';998}9991000/** @name PalletAppPromotionCall */1001export interface PalletAppPromotionCall extends Enum {1002  readonly isSetAdminAddress: boolean;1003  readonly asSetAdminAddress: {1004    readonly admin: PalletEvmAccountBasicCrossAccountIdRepr;1005  } & Struct;1006  readonly isStake: boolean;1007  readonly asStake: {1008    readonly amount: u128;1009  } & Struct;1010  readonly isUnstake: boolean;1011  readonly isSponsorCollection: boolean;1012  readonly asSponsorCollection: {1013    readonly collectionId: u32;1014  } & Struct;1015  readonly isStopSponsoringCollection: boolean;1016  readonly asStopSponsoringCollection: {1017    readonly collectionId: u32;1018  } & Struct;1019  readonly isSponsorContract: boolean;1020  readonly asSponsorContract: {1021    readonly contractId: H160;1022  } & Struct;1023  readonly isStopSponsoringContract: boolean;1024  readonly asStopSponsoringContract: {1025    readonly contractId: H160;1026  } & Struct;1027  readonly isPayoutStakers: boolean;1028  readonly asPayoutStakers: {1029    readonly stakersNumber: Option<u8>;1030  } & Struct;1031  readonly type: 'SetAdminAddress' | 'Stake' | 'Unstake' | 'SponsorCollection' | 'StopSponsoringCollection' | 'SponsorContract' | 'StopSponsoringContract' | 'PayoutStakers';1032}10331034/** @name PalletAppPromotionError */1035export interface PalletAppPromotionError extends Enum {1036  readonly isAdminNotSet: boolean;1037  readonly isNoPermission: boolean;1038  readonly isNotSufficientFunds: boolean;1039  readonly isPendingForBlockOverflow: boolean;1040  readonly isSponsorNotSet: boolean;1041  readonly isIncorrectLockedBalanceOperation: boolean;1042  readonly type: 'AdminNotSet' | 'NoPermission' | 'NotSufficientFunds' | 'PendingForBlockOverflow' | 'SponsorNotSet' | 'IncorrectLockedBalanceOperation';1043}10441045/** @name PalletAppPromotionEvent */1046export interface PalletAppPromotionEvent extends Enum {1047  readonly isStakingRecalculation: boolean;1048  readonly asStakingRecalculation: ITuple<[AccountId32, u128, u128]>;1049  readonly isStake: boolean;1050  readonly asStake: ITuple<[AccountId32, u128]>;1051  readonly isUnstake: boolean;1052  readonly asUnstake: ITuple<[AccountId32, u128]>;1053  readonly isSetAdmin: boolean;1054  readonly asSetAdmin: AccountId32;1055  readonly type: 'StakingRecalculation' | 'Stake' | 'Unstake' | 'SetAdmin';1056}10571058/** @name PalletBalancesAccountData */1059export interface PalletBalancesAccountData extends Struct {1060  readonly free: u128;1061  readonly reserved: u128;1062  readonly miscFrozen: u128;1063  readonly feeFrozen: u128;1064}10651066/** @name PalletBalancesBalanceLock */1067export interface PalletBalancesBalanceLock extends Struct {1068  readonly id: U8aFixed;1069  readonly amount: u128;1070  readonly reasons: PalletBalancesReasons;1071}10721073/** @name PalletBalancesCall */1074export interface PalletBalancesCall extends Enum {1075  readonly isTransfer: boolean;1076  readonly asTransfer: {1077    readonly dest: MultiAddress;1078    readonly value: Compact<u128>;1079  } & Struct;1080  readonly isSetBalance: boolean;1081  readonly asSetBalance: {1082    readonly who: MultiAddress;1083    readonly newFree: Compact<u128>;1084    readonly newReserved: Compact<u128>;1085  } & Struct;1086  readonly isForceTransfer: boolean;1087  readonly asForceTransfer: {1088    readonly source: MultiAddress;1089    readonly dest: MultiAddress;1090    readonly value: Compact<u128>;1091  } & Struct;1092  readonly isTransferKeepAlive: boolean;1093  readonly asTransferKeepAlive: {1094    readonly dest: MultiAddress;1095    readonly value: Compact<u128>;1096  } & Struct;1097  readonly isTransferAll: boolean;1098  readonly asTransferAll: {1099    readonly dest: MultiAddress;1100    readonly keepAlive: bool;1101  } & Struct;1102  readonly isForceUnreserve: boolean;1103  readonly asForceUnreserve: {1104    readonly who: MultiAddress;1105    readonly amount: u128;1106  } & Struct;1107  readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';1108}11091110/** @name PalletBalancesError */1111export interface PalletBalancesError extends Enum {1112  readonly isVestingBalance: boolean;1113  readonly isLiquidityRestrictions: boolean;1114  readonly isInsufficientBalance: boolean;1115  readonly isExistentialDeposit: boolean;1116  readonly isKeepAlive: boolean;1117  readonly isExistingVestingSchedule: boolean;1118  readonly isDeadAccount: boolean;1119  readonly isTooManyReserves: boolean;1120  readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';1121}11221123/** @name PalletBalancesEvent */1124export interface PalletBalancesEvent extends Enum {1125  readonly isEndowed: boolean;1126  readonly asEndowed: {1127    readonly account: AccountId32;1128    readonly freeBalance: u128;1129  } & Struct;1130  readonly isDustLost: boolean;1131  readonly asDustLost: {1132    readonly account: AccountId32;1133    readonly amount: u128;1134  } & Struct;1135  readonly isTransfer: boolean;1136  readonly asTransfer: {1137    readonly from: AccountId32;1138    readonly to: AccountId32;1139    readonly amount: u128;1140  } & Struct;1141  readonly isBalanceSet: boolean;1142  readonly asBalanceSet: {1143    readonly who: AccountId32;1144    readonly free: u128;1145    readonly reserved: u128;1146  } & Struct;1147  readonly isReserved: boolean;1148  readonly asReserved: {1149    readonly who: AccountId32;1150    readonly amount: u128;1151  } & Struct;1152  readonly isUnreserved: boolean;1153  readonly asUnreserved: {1154    readonly who: AccountId32;1155    readonly amount: u128;1156  } & Struct;1157  readonly isReserveRepatriated: boolean;1158  readonly asReserveRepatriated: {1159    readonly from: AccountId32;1160    readonly to: AccountId32;1161    readonly amount: u128;1162    readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;1163  } & Struct;1164  readonly isDeposit: boolean;1165  readonly asDeposit: {1166    readonly who: AccountId32;1167    readonly amount: u128;1168  } & Struct;1169  readonly isWithdraw: boolean;1170  readonly asWithdraw: {1171    readonly who: AccountId32;1172    readonly amount: u128;1173  } & Struct;1174  readonly isSlashed: boolean;1175  readonly asSlashed: {1176    readonly who: AccountId32;1177    readonly amount: u128;1178  } & Struct;1179  readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';1180}11811182/** @name PalletBalancesReasons */1183export interface PalletBalancesReasons extends Enum {1184  readonly isFee: boolean;1185  readonly isMisc: boolean;1186  readonly isAll: boolean;1187  readonly type: 'Fee' | 'Misc' | 'All';1188}11891190/** @name PalletBalancesReserveData */1191export interface PalletBalancesReserveData extends Struct {1192  readonly id: U8aFixed;1193  readonly amount: u128;1194}11951196/** @name PalletCommonError */1197export interface PalletCommonError extends Enum {1198  readonly isCollectionNotFound: boolean;1199  readonly isMustBeTokenOwner: boolean;1200  readonly isNoPermission: boolean;1201  readonly isCantDestroyNotEmptyCollection: boolean;1202  readonly isPublicMintingNotAllowed: boolean;1203  readonly isAddressNotInAllowlist: boolean;1204  readonly isCollectionNameLimitExceeded: boolean;1205  readonly isCollectionDescriptionLimitExceeded: boolean;1206  readonly isCollectionTokenPrefixLimitExceeded: boolean;1207  readonly isTotalCollectionsLimitExceeded: boolean;1208  readonly isCollectionAdminCountExceeded: boolean;1209  readonly isCollectionLimitBoundsExceeded: boolean;1210  readonly isOwnerPermissionsCantBeReverted: boolean;1211  readonly isTransferNotAllowed: boolean;1212  readonly isAccountTokenLimitExceeded: boolean;1213  readonly isCollectionTokenLimitExceeded: boolean;1214  readonly isMetadataFlagFrozen: boolean;1215  readonly isTokenNotFound: boolean;1216  readonly isTokenValueTooLow: boolean;1217  readonly isApprovedValueTooLow: boolean;1218  readonly isCantApproveMoreThanOwned: boolean;1219  readonly isAddressIsNotEthMirror: boolean;1220  readonly isAddressIsZero: boolean;1221  readonly isUnsupportedOperation: boolean;1222  readonly isNotSufficientFounds: boolean;1223  readonly isUserIsNotAllowedToNest: boolean;1224  readonly isSourceCollectionIsNotAllowedToNest: boolean;1225  readonly isCollectionFieldSizeExceeded: boolean;1226  readonly isNoSpaceForProperty: boolean;1227  readonly isPropertyLimitReached: boolean;1228  readonly isPropertyKeyIsTooLong: boolean;1229  readonly isInvalidCharacterInPropertyKey: boolean;1230  readonly isEmptyPropertyKey: boolean;1231  readonly isCollectionIsExternal: boolean;1232  readonly isCollectionIsInternal: boolean;1233  readonly isConfirmSponsorshipFail: boolean;1234  readonly isUserIsNotCollectionAdmin: boolean;1235  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';1236}12371238/** @name PalletCommonEvent */1239export interface PalletCommonEvent extends Enum {1240  readonly isCollectionCreated: boolean;1241  readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;1242  readonly isCollectionDestroyed: boolean;1243  readonly asCollectionDestroyed: u32;1244  readonly isItemCreated: boolean;1245  readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1246  readonly isItemDestroyed: boolean;1247  readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1248  readonly isTransfer: boolean;1249  readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1250  readonly isApproved: boolean;1251  readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;1252  readonly isApprovedForAll: boolean;1253  readonly asApprovedForAll: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, bool]>;1254  readonly isCollectionPropertySet: boolean;1255  readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;1256  readonly isCollectionPropertyDeleted: boolean;1257  readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;1258  readonly isTokenPropertySet: boolean;1259  readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;1260  readonly isTokenPropertyDeleted: boolean;1261  readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;1262  readonly isPropertyPermissionSet: boolean;1263  readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;1264  readonly isAllowListAddressAdded: boolean;1265  readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1266  readonly isAllowListAddressRemoved: boolean;1267  readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1268  readonly isCollectionAdminAdded: boolean;1269  readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1270  readonly isCollectionAdminRemoved: boolean;1271  readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1272  readonly isCollectionLimitSet: boolean;1273  readonly asCollectionLimitSet: u32;1274  readonly isCollectionOwnerChanged: boolean;1275  readonly asCollectionOwnerChanged: ITuple<[u32, AccountId32]>;1276  readonly isCollectionPermissionSet: boolean;1277  readonly asCollectionPermissionSet: u32;1278  readonly isCollectionSponsorSet: boolean;1279  readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;1280  readonly isSponsorshipConfirmed: boolean;1281  readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;1282  readonly isCollectionSponsorRemoved: boolean;1283  readonly asCollectionSponsorRemoved: u32;1284  readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'ApprovedForAll' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet' | 'AllowListAddressAdded' | 'AllowListAddressRemoved' | 'CollectionAdminAdded' | 'CollectionAdminRemoved' | 'CollectionLimitSet' | 'CollectionOwnerChanged' | 'CollectionPermissionSet' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionSponsorRemoved';1285}12861287/** @name PalletConfigurationAppPromotionConfiguration */1288export interface PalletConfigurationAppPromotionConfiguration extends Struct {1289  readonly recalculationInterval: Option<u32>;1290  readonly pendingInterval: Option<u32>;1291  readonly intervalIncome: Option<Perbill>;1292  readonly maxStakersPerCalculation: Option<u8>;1293}12941295/** @name PalletConfigurationCall */1296export interface PalletConfigurationCall extends Enum {1297  readonly isSetWeightToFeeCoefficientOverride: boolean;1298  readonly asSetWeightToFeeCoefficientOverride: {1299    readonly coeff: Option<u64>;1300  } & Struct;1301  readonly isSetMinGasPriceOverride: boolean;1302  readonly asSetMinGasPriceOverride: {1303    readonly coeff: Option<u64>;1304  } & Struct;1305  readonly isSetXcmAllowedLocations: boolean;1306  readonly asSetXcmAllowedLocations: {1307    readonly locations: Option<Vec<XcmV1MultiLocation>>;1308  } & Struct;1309  readonly isSetAppPromotionConfigurationOverride: boolean;1310  readonly asSetAppPromotionConfigurationOverride: {1311    readonly configuration: PalletConfigurationAppPromotionConfiguration;1312  } & Struct;1313  readonly isSetCollatorSelectionDesiredCollators: boolean;1314  readonly asSetCollatorSelectionDesiredCollators: {1315    readonly max: Option<u32>;1316  } & Struct;1317  readonly isSetCollatorSelectionLicenseBond: boolean;1318  readonly asSetCollatorSelectionLicenseBond: {1319    readonly amount: Option<u128>;1320  } & Struct;1321  readonly isSetCollatorSelectionKickThreshold: boolean;1322  readonly asSetCollatorSelectionKickThreshold: {1323    readonly threshold: Option<u32>;1324  } & Struct;1325  readonly type: 'SetWeightToFeeCoefficientOverride' | 'SetMinGasPriceOverride' | 'SetXcmAllowedLocations' | 'SetAppPromotionConfigurationOverride' | 'SetCollatorSelectionDesiredCollators' | 'SetCollatorSelectionLicenseBond' | 'SetCollatorSelectionKickThreshold';1326}13271328/** @name PalletConfigurationError */1329export interface PalletConfigurationError extends Enum {1330  readonly isInconsistentConfiguration: boolean;1331  readonly type: 'InconsistentConfiguration';1332}13331334/** @name PalletConfigurationEvent */1335export interface PalletConfigurationEvent extends Enum {1336  readonly isNewDesiredCollators: boolean;1337  readonly asNewDesiredCollators: {1338    readonly desiredCollators: Option<u32>;1339  } & Struct;1340  readonly isNewCollatorLicenseBond: boolean;1341  readonly asNewCollatorLicenseBond: {1342    readonly bondCost: Option<u128>;1343  } & Struct;1344  readonly isNewCollatorKickThreshold: boolean;1345  readonly asNewCollatorKickThreshold: {1346    readonly lengthInBlocks: Option<u32>;1347  } & Struct;1348  readonly type: 'NewDesiredCollators' | 'NewCollatorLicenseBond' | 'NewCollatorKickThreshold';1349}13501351/** @name PalletEthereumCall */1352export interface PalletEthereumCall extends Enum {1353  readonly isTransact: boolean;1354  readonly asTransact: {1355    readonly transaction: EthereumTransactionTransactionV2;1356  } & Struct;1357  readonly type: 'Transact';1358}13591360/** @name PalletEthereumError */1361export interface PalletEthereumError extends Enum {1362  readonly isInvalidSignature: boolean;1363  readonly isPreLogExists: boolean;1364  readonly type: 'InvalidSignature' | 'PreLogExists';1365}13661367/** @name PalletEthereumEvent */1368export interface PalletEthereumEvent extends Enum {1369  readonly isExecuted: boolean;1370  readonly asExecuted: {1371    readonly from: H160;1372    readonly to: H160;1373    readonly transactionHash: H256;1374    readonly exitReason: EvmCoreErrorExitReason;1375  } & Struct;1376  readonly type: 'Executed';1377}13781379/** @name PalletEthereumFakeTransactionFinalizer */1380export interface PalletEthereumFakeTransactionFinalizer extends Null {}13811382/** @name PalletEvmAccountBasicCrossAccountIdRepr */1383export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1384  readonly isSubstrate: boolean;1385  readonly asSubstrate: AccountId32;1386  readonly isEthereum: boolean;1387  readonly asEthereum: H160;1388  readonly type: 'Substrate' | 'Ethereum';1389}13901391/** @name PalletEvmCall */1392export interface PalletEvmCall extends Enum {1393  readonly isWithdraw: boolean;1394  readonly asWithdraw: {1395    readonly address: H160;1396    readonly value: u128;1397  } & Struct;1398  readonly isCall: boolean;1399  readonly asCall: {1400    readonly source: H160;1401    readonly target: H160;1402    readonly input: Bytes;1403    readonly value: U256;1404    readonly gasLimit: u64;1405    readonly maxFeePerGas: U256;1406    readonly maxPriorityFeePerGas: Option<U256>;1407    readonly nonce: Option<U256>;1408    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1409  } & Struct;1410  readonly isCreate: boolean;1411  readonly asCreate: {1412    readonly source: H160;1413    readonly init: Bytes;1414    readonly value: U256;1415    readonly gasLimit: u64;1416    readonly maxFeePerGas: U256;1417    readonly maxPriorityFeePerGas: Option<U256>;1418    readonly nonce: Option<U256>;1419    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1420  } & Struct;1421  readonly isCreate2: boolean;1422  readonly asCreate2: {1423    readonly source: H160;1424    readonly init: Bytes;1425    readonly salt: H256;1426    readonly value: U256;1427    readonly gasLimit: u64;1428    readonly maxFeePerGas: U256;1429    readonly maxPriorityFeePerGas: Option<U256>;1430    readonly nonce: Option<U256>;1431    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1432  } & Struct;1433  readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1434}14351436/** @name PalletEvmCoderSubstrateError */1437export interface PalletEvmCoderSubstrateError extends Enum {1438  readonly isOutOfGas: boolean;1439  readonly isOutOfFund: boolean;1440  readonly type: 'OutOfGas' | 'OutOfFund';1441}14421443/** @name PalletEvmContractHelpersError */1444export interface PalletEvmContractHelpersError extends Enum {1445  readonly isNoPermission: boolean;1446  readonly isNoPendingSponsor: boolean;1447  readonly isTooManyMethodsHaveSponsoredLimit: boolean;1448  readonly type: 'NoPermission' | 'NoPendingSponsor' | 'TooManyMethodsHaveSponsoredLimit';1449}14501451/** @name PalletEvmContractHelpersEvent */1452export interface PalletEvmContractHelpersEvent extends Enum {1453  readonly isContractSponsorSet: boolean;1454  readonly asContractSponsorSet: ITuple<[H160, AccountId32]>;1455  readonly isContractSponsorshipConfirmed: boolean;1456  readonly asContractSponsorshipConfirmed: ITuple<[H160, AccountId32]>;1457  readonly isContractSponsorRemoved: boolean;1458  readonly asContractSponsorRemoved: H160;1459  readonly type: 'ContractSponsorSet' | 'ContractSponsorshipConfirmed' | 'ContractSponsorRemoved';1460}14611462/** @name PalletEvmContractHelpersSponsoringModeT */1463export interface PalletEvmContractHelpersSponsoringModeT extends Enum {1464  readonly isDisabled: boolean;1465  readonly isAllowlisted: boolean;1466  readonly isGenerous: boolean;1467  readonly type: 'Disabled' | 'Allowlisted' | 'Generous';1468}14691470/** @name PalletEvmError */1471export interface PalletEvmError extends Enum {1472  readonly isBalanceLow: boolean;1473  readonly isFeeOverflow: boolean;1474  readonly isPaymentOverflow: boolean;1475  readonly isWithdrawFailed: boolean;1476  readonly isGasPriceTooLow: boolean;1477  readonly isInvalidNonce: boolean;1478  readonly isGasLimitTooLow: boolean;1479  readonly isGasLimitTooHigh: boolean;1480  readonly isUndefined: boolean;1481  readonly isReentrancy: boolean;1482  readonly isTransactionMustComeFromEOA: boolean;1483  readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce' | 'GasLimitTooLow' | 'GasLimitTooHigh' | 'Undefined' | 'Reentrancy' | 'TransactionMustComeFromEOA';1484}14851486/** @name PalletEvmEvent */1487export interface PalletEvmEvent extends Enum {1488  readonly isLog: boolean;1489  readonly asLog: {1490    readonly log: EthereumLog;1491  } & Struct;1492  readonly isCreated: boolean;1493  readonly asCreated: {1494    readonly address: H160;1495  } & Struct;1496  readonly isCreatedFailed: boolean;1497  readonly asCreatedFailed: {1498    readonly address: H160;1499  } & Struct;1500  readonly isExecuted: boolean;1501  readonly asExecuted: {1502    readonly address: H160;1503  } & Struct;1504  readonly isExecutedFailed: boolean;1505  readonly asExecutedFailed: {1506    readonly address: H160;1507  } & Struct;1508  readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed';1509}15101511/** @name PalletEvmMigrationCall */1512export interface PalletEvmMigrationCall extends Enum {1513  readonly isBegin: boolean;1514  readonly asBegin: {1515    readonly address: H160;1516  } & Struct;1517  readonly isSetData: boolean;1518  readonly asSetData: {1519    readonly address: H160;1520    readonly data: Vec<ITuple<[H256, H256]>>;1521  } & Struct;1522  readonly isFinish: boolean;1523  readonly asFinish: {1524    readonly address: H160;1525    readonly code: Bytes;1526  } & Struct;1527  readonly isInsertEthLogs: boolean;1528  readonly asInsertEthLogs: {1529    readonly logs: Vec<EthereumLog>;1530  } & Struct;1531  readonly isInsertEvents: boolean;1532  readonly asInsertEvents: {1533    readonly events: Vec<Bytes>;1534  } & Struct;1535  readonly type: 'Begin' | 'SetData' | 'Finish' | 'InsertEthLogs' | 'InsertEvents';1536}15371538/** @name PalletEvmMigrationError */1539export interface PalletEvmMigrationError extends Enum {1540  readonly isAccountNotEmpty: boolean;1541  readonly isAccountIsNotMigrating: boolean;1542  readonly isBadEvent: boolean;1543  readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating' | 'BadEvent';1544}15451546/** @name PalletEvmMigrationEvent */1547export interface PalletEvmMigrationEvent extends Enum {1548  readonly isTestEvent: boolean;1549  readonly type: 'TestEvent';1550}15511552/** @name PalletForeignAssetsAssetIds */1553export interface PalletForeignAssetsAssetIds extends Enum {1554  readonly isForeignAssetId: boolean;1555  readonly asForeignAssetId: u32;1556  readonly isNativeAssetId: boolean;1557  readonly asNativeAssetId: PalletForeignAssetsNativeCurrency;1558  readonly type: 'ForeignAssetId' | 'NativeAssetId';1559}15601561/** @name PalletForeignAssetsModuleAssetMetadata */1562export interface PalletForeignAssetsModuleAssetMetadata extends Struct {1563  readonly name: Bytes;1564  readonly symbol: Bytes;1565  readonly decimals: u8;1566  readonly minimalBalance: u128;1567}15681569/** @name PalletForeignAssetsModuleCall */1570export interface PalletForeignAssetsModuleCall extends Enum {1571  readonly isRegisterForeignAsset: boolean;1572  readonly asRegisterForeignAsset: {1573    readonly owner: AccountId32;1574    readonly location: XcmVersionedMultiLocation;1575    readonly metadata: PalletForeignAssetsModuleAssetMetadata;1576  } & Struct;1577  readonly isUpdateForeignAsset: boolean;1578  readonly asUpdateForeignAsset: {1579    readonly foreignAssetId: u32;1580    readonly location: XcmVersionedMultiLocation;1581    readonly metadata: PalletForeignAssetsModuleAssetMetadata;1582  } & Struct;1583  readonly type: 'RegisterForeignAsset' | 'UpdateForeignAsset';1584}15851586/** @name PalletForeignAssetsModuleError */1587export interface PalletForeignAssetsModuleError extends Enum {1588  readonly isBadLocation: boolean;1589  readonly isMultiLocationExisted: boolean;1590  readonly isAssetIdNotExists: boolean;1591  readonly isAssetIdExisted: boolean;1592  readonly type: 'BadLocation' | 'MultiLocationExisted' | 'AssetIdNotExists' | 'AssetIdExisted';1593}15941595/** @name PalletForeignAssetsModuleEvent */1596export interface PalletForeignAssetsModuleEvent extends Enum {1597  readonly isForeignAssetRegistered: boolean;1598  readonly asForeignAssetRegistered: {1599    readonly assetId: u32;1600    readonly assetAddress: XcmV1MultiLocation;1601    readonly metadata: PalletForeignAssetsModuleAssetMetadata;1602  } & Struct;1603  readonly isForeignAssetUpdated: boolean;1604  readonly asForeignAssetUpdated: {1605    readonly assetId: u32;1606    readonly assetAddress: XcmV1MultiLocation;1607    readonly metadata: PalletForeignAssetsModuleAssetMetadata;1608  } & Struct;1609  readonly isAssetRegistered: boolean;1610  readonly asAssetRegistered: {1611    readonly assetId: PalletForeignAssetsAssetIds;1612    readonly metadata: PalletForeignAssetsModuleAssetMetadata;1613  } & Struct;1614  readonly isAssetUpdated: boolean;1615  readonly asAssetUpdated: {1616    readonly assetId: PalletForeignAssetsAssetIds;1617    readonly metadata: PalletForeignAssetsModuleAssetMetadata;1618  } & Struct;1619  readonly type: 'ForeignAssetRegistered' | 'ForeignAssetUpdated' | 'AssetRegistered' | 'AssetUpdated';1620}16211622/** @name PalletForeignAssetsNativeCurrency */1623export interface PalletForeignAssetsNativeCurrency extends Enum {1624  readonly isHere: boolean;1625  readonly isParent: boolean;1626  readonly type: 'Here' | 'Parent';1627}16281629/** @name PalletFungibleError */1630export interface PalletFungibleError extends Enum {1631  readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;1632  readonly isFungibleItemsHaveNoId: boolean;1633  readonly isFungibleItemsDontHaveData: boolean;1634  readonly isFungibleDisallowsNesting: boolean;1635  readonly isSettingPropertiesNotAllowed: boolean;1636  readonly isSettingAllowanceForAllNotAllowed: boolean;1637  readonly isFungibleTokensAreAlwaysValid: boolean;1638  readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed' | 'SettingAllowanceForAllNotAllowed' | 'FungibleTokensAreAlwaysValid';1639}16401641/** @name PalletInflationCall */1642export interface PalletInflationCall extends Enum {1643  readonly isStartInflation: boolean;1644  readonly asStartInflation: {1645    readonly inflationStartRelayBlock: u32;1646  } & Struct;1647  readonly type: 'StartInflation';1648}16491650/** @name PalletMaintenanceCall */1651export interface PalletMaintenanceCall extends Enum {1652  readonly isEnable: boolean;1653  readonly isDisable: boolean;1654  readonly type: 'Enable' | 'Disable';1655}16561657/** @name PalletMaintenanceError */1658export interface PalletMaintenanceError extends Null {}16591660/** @name PalletMaintenanceEvent */1661export interface PalletMaintenanceEvent extends Enum {1662  readonly isMaintenanceEnabled: boolean;1663  readonly isMaintenanceDisabled: boolean;1664  readonly type: 'MaintenanceEnabled' | 'MaintenanceDisabled';1665}16661667/** @name PalletNonfungibleError */1668export interface PalletNonfungibleError extends Enum {1669  readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;1670  readonly isNonfungibleItemsHaveNoAmount: boolean;1671  readonly isCantBurnNftWithChildren: boolean;1672  readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';1673}16741675/** @name PalletNonfungibleItemData */1676export interface PalletNonfungibleItemData extends Struct {1677  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1678}16791680/** @name PalletRefungibleError */1681export interface PalletRefungibleError extends Enum {1682  readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;1683  readonly isWrongRefungiblePieces: boolean;1684  readonly isRepartitionWhileNotOwningAllPieces: boolean;1685  readonly isRefungibleDisallowsNesting: boolean;1686  readonly isSettingPropertiesNotAllowed: boolean;1687  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1688}16891690/** @name PalletRmrkCoreCall */1691export interface PalletRmrkCoreCall extends Enum {1692  readonly isCreateCollection: boolean;1693  readonly asCreateCollection: {1694    readonly metadata: Bytes;1695    readonly max: Option<u32>;1696    readonly symbol: Bytes;1697  } & Struct;1698  readonly isDestroyCollection: boolean;1699  readonly asDestroyCollection: {1700    readonly collectionId: u32;1701  } & Struct;1702  readonly isChangeCollectionIssuer: boolean;1703  readonly asChangeCollectionIssuer: {1704    readonly collectionId: u32;1705    readonly newIssuer: MultiAddress;1706  } & Struct;1707  readonly isLockCollection: boolean;1708  readonly asLockCollection: {1709    readonly collectionId: u32;1710  } & Struct;1711  readonly isMintNft: boolean;1712  readonly asMintNft: {1713    readonly owner: Option<AccountId32>;1714    readonly collectionId: u32;1715    readonly recipient: Option<AccountId32>;1716    readonly royaltyAmount: Option<Permill>;1717    readonly metadata: Bytes;1718    readonly transferable: bool;1719    readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1720  } & Struct;1721  readonly isBurnNft: boolean;1722  readonly asBurnNft: {1723    readonly collectionId: u32;1724    readonly nftId: u32;1725    readonly maxBurns: u32;1726  } & Struct;1727  readonly isSend: boolean;1728  readonly asSend: {1729    readonly rmrkCollectionId: u32;1730    readonly rmrkNftId: u32;1731    readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1732  } & Struct;1733  readonly isAcceptNft: boolean;1734  readonly asAcceptNft: {1735    readonly rmrkCollectionId: u32;1736    readonly rmrkNftId: u32;1737    readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1738  } & Struct;1739  readonly isRejectNft: boolean;1740  readonly asRejectNft: {1741    readonly rmrkCollectionId: u32;1742    readonly rmrkNftId: u32;1743  } & Struct;1744  readonly isAcceptResource: boolean;1745  readonly asAcceptResource: {1746    readonly rmrkCollectionId: u32;1747    readonly rmrkNftId: u32;1748    readonly resourceId: u32;1749  } & Struct;1750  readonly isAcceptResourceRemoval: boolean;1751  readonly asAcceptResourceRemoval: {1752    readonly rmrkCollectionId: u32;1753    readonly rmrkNftId: u32;1754    readonly resourceId: u32;1755  } & Struct;1756  readonly isSetProperty: boolean;1757  readonly asSetProperty: {1758    readonly rmrkCollectionId: Compact<u32>;1759    readonly maybeNftId: Option<u32>;1760    readonly key: Bytes;1761    readonly value: Bytes;1762  } & Struct;1763  readonly isSetPriority: boolean;1764  readonly asSetPriority: {1765    readonly rmrkCollectionId: u32;1766    readonly rmrkNftId: u32;1767    readonly priorities: Vec<u32>;1768  } & Struct;1769  readonly isAddBasicResource: boolean;1770  readonly asAddBasicResource: {1771    readonly rmrkCollectionId: u32;1772    readonly nftId: u32;1773    readonly resource: RmrkTraitsResourceBasicResource;1774  } & Struct;1775  readonly isAddComposableResource: boolean;1776  readonly asAddComposableResource: {1777    readonly rmrkCollectionId: u32;1778    readonly nftId: u32;1779    readonly resource: RmrkTraitsResourceComposableResource;1780  } & Struct;1781  readonly isAddSlotResource: boolean;1782  readonly asAddSlotResource: {1783    readonly rmrkCollectionId: u32;1784    readonly nftId: u32;1785    readonly resource: RmrkTraitsResourceSlotResource;1786  } & Struct;1787  readonly isRemoveResource: boolean;1788  readonly asRemoveResource: {1789    readonly rmrkCollectionId: u32;1790    readonly nftId: u32;1791    readonly resourceId: u32;1792  } & Struct;1793  readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1794}17951796/** @name PalletRmrkCoreError */1797export interface PalletRmrkCoreError extends Enum {1798  readonly isCorruptedCollectionType: boolean;1799  readonly isRmrkPropertyKeyIsTooLong: boolean;1800  readonly isRmrkPropertyValueIsTooLong: boolean;1801  readonly isRmrkPropertyIsNotFound: boolean;1802  readonly isUnableToDecodeRmrkData: boolean;1803  readonly isCollectionNotEmpty: boolean;1804  readonly isNoAvailableCollectionId: boolean;1805  readonly isNoAvailableNftId: boolean;1806  readonly isCollectionUnknown: boolean;1807  readonly isNoPermission: boolean;1808  readonly isNonTransferable: boolean;1809  readonly isCollectionFullOrLocked: boolean;1810  readonly isResourceDoesntExist: boolean;1811  readonly isCannotSendToDescendentOrSelf: boolean;1812  readonly isCannotAcceptNonOwnedNft: boolean;1813  readonly isCannotRejectNonOwnedNft: boolean;1814  readonly isCannotRejectNonPendingNft: boolean;1815  readonly isResourceNotPending: boolean;1816  readonly isNoAvailableResourceId: boolean;1817  readonly type: 'CorruptedCollectionType' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';1818}18191820/** @name PalletRmrkCoreEvent */1821export interface PalletRmrkCoreEvent extends Enum {1822  readonly isCollectionCreated: boolean;1823  readonly asCollectionCreated: {1824    readonly issuer: AccountId32;1825    readonly collectionId: u32;1826  } & Struct;1827  readonly isCollectionDestroyed: boolean;1828  readonly asCollectionDestroyed: {1829    readonly issuer: AccountId32;1830    readonly collectionId: u32;1831  } & Struct;1832  readonly isIssuerChanged: boolean;1833  readonly asIssuerChanged: {1834    readonly oldIssuer: AccountId32;1835    readonly newIssuer: AccountId32;1836    readonly collectionId: u32;1837  } & Struct;1838  readonly isCollectionLocked: boolean;1839  readonly asCollectionLocked: {1840    readonly issuer: AccountId32;1841    readonly collectionId: u32;1842  } & Struct;1843  readonly isNftMinted: boolean;1844  readonly asNftMinted: {1845    readonly owner: AccountId32;1846    readonly collectionId: u32;1847    readonly nftId: u32;1848  } & Struct;1849  readonly isNftBurned: boolean;1850  readonly asNftBurned: {1851    readonly owner: AccountId32;1852    readonly nftId: u32;1853  } & Struct;1854  readonly isNftSent: boolean;1855  readonly asNftSent: {1856    readonly sender: AccountId32;1857    readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1858    readonly collectionId: u32;1859    readonly nftId: u32;1860    readonly approvalRequired: bool;1861  } & Struct;1862  readonly isNftAccepted: boolean;1863  readonly asNftAccepted: {1864    readonly sender: AccountId32;1865    readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1866    readonly collectionId: u32;1867    readonly nftId: u32;1868  } & Struct;1869  readonly isNftRejected: boolean;1870  readonly asNftRejected: {1871    readonly sender: AccountId32;1872    readonly collectionId: u32;1873    readonly nftId: u32;1874  } & Struct;1875  readonly isPropertySet: boolean;1876  readonly asPropertySet: {1877    readonly collectionId: u32;1878    readonly maybeNftId: Option<u32>;1879    readonly key: Bytes;1880    readonly value: Bytes;1881  } & Struct;1882  readonly isResourceAdded: boolean;1883  readonly asResourceAdded: {1884    readonly nftId: u32;1885    readonly resourceId: u32;1886  } & Struct;1887  readonly isResourceRemoval: boolean;1888  readonly asResourceRemoval: {1889    readonly nftId: u32;1890    readonly resourceId: u32;1891  } & Struct;1892  readonly isResourceAccepted: boolean;1893  readonly asResourceAccepted: {1894    readonly nftId: u32;1895    readonly resourceId: u32;1896  } & Struct;1897  readonly isResourceRemovalAccepted: boolean;1898  readonly asResourceRemovalAccepted: {1899    readonly nftId: u32;1900    readonly resourceId: u32;1901  } & Struct;1902  readonly isPrioritySet: boolean;1903  readonly asPrioritySet: {1904    readonly collectionId: u32;1905    readonly nftId: u32;1906  } & Struct;1907  readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';1908}19091910/** @name PalletRmrkEquipCall */1911export interface PalletRmrkEquipCall extends Enum {1912  readonly isCreateBase: boolean;1913  readonly asCreateBase: {1914    readonly baseType: Bytes;1915    readonly symbol: Bytes;1916    readonly parts: Vec<RmrkTraitsPartPartType>;1917  } & Struct;1918  readonly isThemeAdd: boolean;1919  readonly asThemeAdd: {1920    readonly baseId: u32;1921    readonly theme: RmrkTraitsTheme;1922  } & Struct;1923  readonly isEquippable: boolean;1924  readonly asEquippable: {1925    readonly baseId: u32;1926    readonly slotId: u32;1927    readonly equippables: RmrkTraitsPartEquippableList;1928  } & Struct;1929  readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1930}19311932/** @name PalletRmrkEquipError */1933export interface PalletRmrkEquipError extends Enum {1934  readonly isPermissionError: boolean;1935  readonly isNoAvailableBaseId: boolean;1936  readonly isNoAvailablePartId: boolean;1937  readonly isBaseDoesntExist: boolean;1938  readonly isNeedsDefaultThemeFirst: boolean;1939  readonly isPartDoesntExist: boolean;1940  readonly isNoEquippableOnFixedPart: boolean;1941  readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';1942}19431944/** @name PalletRmrkEquipEvent */1945export interface PalletRmrkEquipEvent extends Enum {1946  readonly isBaseCreated: boolean;1947  readonly asBaseCreated: {1948    readonly issuer: AccountId32;1949    readonly baseId: u32;1950  } & Struct;1951  readonly isEquippablesUpdated: boolean;1952  readonly asEquippablesUpdated: {1953    readonly baseId: u32;1954    readonly slotId: u32;1955  } & Struct;1956  readonly type: 'BaseCreated' | 'EquippablesUpdated';1957}19581959/** @name PalletStructureCall */1960export interface PalletStructureCall extends Null {}19611962/** @name PalletStructureError */1963export interface PalletStructureError extends Enum {1964  readonly isOuroborosDetected: boolean;1965  readonly isDepthLimit: boolean;1966  readonly isBreadthLimit: boolean;1967  readonly isTokenNotFound: boolean;1968  readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';1969}19701971/** @name PalletStructureEvent */1972export interface PalletStructureEvent extends Enum {1973  readonly isExecuted: boolean;1974  readonly asExecuted: Result<Null, SpRuntimeDispatchError>;1975  readonly type: 'Executed';1976}19771978/** @name PalletSudoCall */1979export interface PalletSudoCall extends Enum {1980  readonly isSudo: boolean;1981  readonly asSudo: {1982    readonly call: Call;1983  } & Struct;1984  readonly isSudoUncheckedWeight: boolean;1985  readonly asSudoUncheckedWeight: {1986    readonly call: Call;1987    readonly weight: SpWeightsWeightV2Weight;1988  } & Struct;1989  readonly isSetKey: boolean;1990  readonly asSetKey: {1991    readonly new_: MultiAddress;1992  } & Struct;1993  readonly isSudoAs: boolean;1994  readonly asSudoAs: {1995    readonly who: MultiAddress;1996    readonly call: Call;1997  } & Struct;1998  readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';1999}20002001/** @name PalletSudoError */2002export interface PalletSudoError extends Enum {2003  readonly isRequireSudo: boolean;2004  readonly type: 'RequireSudo';2005}20062007/** @name PalletSudoEvent */2008export interface PalletSudoEvent extends Enum {2009  readonly isSudid: boolean;2010  readonly asSudid: {2011    readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2012  } & Struct;2013  readonly isKeyChanged: boolean;2014  readonly asKeyChanged: {2015    readonly oldSudoer: Option<AccountId32>;2016  } & Struct;2017  readonly isSudoAsDone: boolean;2018  readonly asSudoAsDone: {2019    readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2020  } & Struct;2021  readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';2022}20232024/** @name PalletTemplateTransactionPaymentCall */2025export interface PalletTemplateTransactionPaymentCall extends Null {}20262027/** @name PalletTemplateTransactionPaymentChargeTransactionPayment */2028export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}20292030/** @name PalletTestUtilsCall */2031export interface PalletTestUtilsCall extends Enum {2032  readonly isEnable: boolean;2033  readonly isSetTestValue: boolean;2034  readonly asSetTestValue: {2035    readonly value: u32;2036  } & Struct;2037  readonly isSetTestValueAndRollback: boolean;2038  readonly asSetTestValueAndRollback: {2039    readonly value: u32;2040  } & Struct;2041  readonly isIncTestValue: boolean;2042  readonly isJustTakeFee: boolean;2043  readonly isBatchAll: boolean;2044  readonly asBatchAll: {2045    readonly calls: Vec<Call>;2046  } & Struct;2047  readonly type: 'Enable' | 'SetTestValue' | 'SetTestValueAndRollback' | 'IncTestValue' | 'JustTakeFee' | 'BatchAll';2048}20492050/** @name PalletTestUtilsError */2051export interface PalletTestUtilsError extends Enum {2052  readonly isTestPalletDisabled: boolean;2053  readonly isTriggerRollback: boolean;2054  readonly type: 'TestPalletDisabled' | 'TriggerRollback';2055}20562057/** @name PalletTestUtilsEvent */2058export interface PalletTestUtilsEvent extends Enum {2059  readonly isValueIsSet: boolean;2060  readonly isShouldRollback: boolean;2061  readonly isBatchCompleted: boolean;2062  readonly type: 'ValueIsSet' | 'ShouldRollback' | 'BatchCompleted';2063}20642065/** @name PalletTimestampCall */2066export interface PalletTimestampCall extends Enum {2067  readonly isSet: boolean;2068  readonly asSet: {2069    readonly now: Compact<u64>;2070  } & Struct;2071  readonly type: 'Set';2072}20732074/** @name PalletTransactionPaymentEvent */2075export interface PalletTransactionPaymentEvent extends Enum {2076  readonly isTransactionFeePaid: boolean;2077  readonly asTransactionFeePaid: {2078    readonly who: AccountId32;2079    readonly actualFee: u128;2080    readonly tip: u128;2081  } & Struct;2082  readonly type: 'TransactionFeePaid';2083}20842085/** @name PalletTransactionPaymentReleases */2086export interface PalletTransactionPaymentReleases extends Enum {2087  readonly isV1Ancient: boolean;2088  readonly isV2: boolean;2089  readonly type: 'V1Ancient' | 'V2';2090}20912092/** @name PalletTreasuryCall */2093export interface PalletTreasuryCall extends Enum {2094  readonly isProposeSpend: boolean;2095  readonly asProposeSpend: {2096    readonly value: Compact<u128>;2097    readonly beneficiary: MultiAddress;2098  } & Struct;2099  readonly isRejectProposal: boolean;2100  readonly asRejectProposal: {2101    readonly proposalId: Compact<u32>;2102  } & Struct;2103  readonly isApproveProposal: boolean;2104  readonly asApproveProposal: {2105    readonly proposalId: Compact<u32>;2106  } & Struct;2107  readonly isSpend: boolean;2108  readonly asSpend: {2109    readonly amount: Compact<u128>;2110    readonly beneficiary: MultiAddress;2111  } & Struct;2112  readonly isRemoveApproval: boolean;2113  readonly asRemoveApproval: {2114    readonly proposalId: Compact<u32>;2115  } & Struct;2116  readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'Spend' | 'RemoveApproval';2117}21182119/** @name PalletTreasuryError */2120export interface PalletTreasuryError extends Enum {2121  readonly isInsufficientProposersBalance: boolean;2122  readonly isInvalidIndex: boolean;2123  readonly isTooManyApprovals: boolean;2124  readonly isInsufficientPermission: boolean;2125  readonly isProposalNotApproved: boolean;2126  readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'InsufficientPermission' | 'ProposalNotApproved';2127}21282129/** @name PalletTreasuryEvent */2130export interface PalletTreasuryEvent extends Enum {2131  readonly isProposed: boolean;2132  readonly asProposed: {2133    readonly proposalIndex: u32;2134  } & Struct;2135  readonly isSpending: boolean;2136  readonly asSpending: {2137    readonly budgetRemaining: u128;2138  } & Struct;2139  readonly isAwarded: boolean;2140  readonly asAwarded: {2141    readonly proposalIndex: u32;2142    readonly award: u128;2143    readonly account: AccountId32;2144  } & Struct;2145  readonly isRejected: boolean;2146  readonly asRejected: {2147    readonly proposalIndex: u32;2148    readonly slashed: u128;2149  } & Struct;2150  readonly isBurnt: boolean;2151  readonly asBurnt: {2152    readonly burntFunds: u128;2153  } & Struct;2154  readonly isRollover: boolean;2155  readonly asRollover: {2156    readonly rolloverBalance: u128;2157  } & Struct;2158  readonly isDeposit: boolean;2159  readonly asDeposit: {2160    readonly value: u128;2161  } & Struct;2162  readonly isSpendApproved: boolean;2163  readonly asSpendApproved: {2164    readonly proposalIndex: u32;2165    readonly amount: u128;2166    readonly beneficiary: AccountId32;2167  } & Struct;2168  readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit' | 'SpendApproved';2169}21702171/** @name PalletTreasuryProposal */2172export interface PalletTreasuryProposal extends Struct {2173  readonly proposer: AccountId32;2174  readonly value: u128;2175  readonly beneficiary: AccountId32;2176  readonly bond: u128;2177}21782179/** @name PalletUniqueCall */2180export interface PalletUniqueCall extends Enum {2181  readonly isCreateCollection: boolean;2182  readonly asCreateCollection: {2183    readonly collectionName: Vec<u16>;2184    readonly collectionDescription: Vec<u16>;2185    readonly tokenPrefix: Bytes;2186    readonly mode: UpDataStructsCollectionMode;2187  } & Struct;2188  readonly isCreateCollectionEx: boolean;2189  readonly asCreateCollectionEx: {2190    readonly data: UpDataStructsCreateCollectionData;2191  } & Struct;2192  readonly isDestroyCollection: boolean;2193  readonly asDestroyCollection: {2194    readonly collectionId: u32;2195  } & Struct;2196  readonly isAddToAllowList: boolean;2197  readonly asAddToAllowList: {2198    readonly collectionId: u32;2199    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;2200  } & Struct;2201  readonly isRemoveFromAllowList: boolean;2202  readonly asRemoveFromAllowList: {2203    readonly collectionId: u32;2204    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;2205  } & Struct;2206  readonly isChangeCollectionOwner: boolean;2207  readonly asChangeCollectionOwner: {2208    readonly collectionId: u32;2209    readonly newOwner: AccountId32;2210  } & Struct;2211  readonly isAddCollectionAdmin: boolean;2212  readonly asAddCollectionAdmin: {2213    readonly collectionId: u32;2214    readonly newAdminId: PalletEvmAccountBasicCrossAccountIdRepr;2215  } & Struct;2216  readonly isRemoveCollectionAdmin: boolean;2217  readonly asRemoveCollectionAdmin: {2218    readonly collectionId: u32;2219    readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;2220  } & Struct;2221  readonly isSetCollectionSponsor: boolean;2222  readonly asSetCollectionSponsor: {2223    readonly collectionId: u32;2224    readonly newSponsor: AccountId32;2225  } & Struct;2226  readonly isConfirmSponsorship: boolean;2227  readonly asConfirmSponsorship: {2228    readonly collectionId: u32;2229  } & Struct;2230  readonly isRemoveCollectionSponsor: boolean;2231  readonly asRemoveCollectionSponsor: {2232    readonly collectionId: u32;2233  } & Struct;2234  readonly isCreateItem: boolean;2235  readonly asCreateItem: {2236    readonly collectionId: u32;2237    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2238    readonly data: UpDataStructsCreateItemData;2239  } & Struct;2240  readonly isCreateMultipleItems: boolean;2241  readonly asCreateMultipleItems: {2242    readonly collectionId: u32;2243    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2244    readonly itemsData: Vec<UpDataStructsCreateItemData>;2245  } & Struct;2246  readonly isSetCollectionProperties: boolean;2247  readonly asSetCollectionProperties: {2248    readonly collectionId: u32;2249    readonly properties: Vec<UpDataStructsProperty>;2250  } & Struct;2251  readonly isDeleteCollectionProperties: boolean;2252  readonly asDeleteCollectionProperties: {2253    readonly collectionId: u32;2254    readonly propertyKeys: Vec<Bytes>;2255  } & Struct;2256  readonly isSetTokenProperties: boolean;2257  readonly asSetTokenProperties: {2258    readonly collectionId: u32;2259    readonly tokenId: u32;2260    readonly properties: Vec<UpDataStructsProperty>;2261  } & Struct;2262  readonly isDeleteTokenProperties: boolean;2263  readonly asDeleteTokenProperties: {2264    readonly collectionId: u32;2265    readonly tokenId: u32;2266    readonly propertyKeys: Vec<Bytes>;2267  } & Struct;2268  readonly isSetTokenPropertyPermissions: boolean;2269  readonly asSetTokenPropertyPermissions: {2270    readonly collectionId: u32;2271    readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2272  } & Struct;2273  readonly isCreateMultipleItemsEx: boolean;2274  readonly asCreateMultipleItemsEx: {2275    readonly collectionId: u32;2276    readonly data: UpDataStructsCreateItemExData;2277  } & Struct;2278  readonly isSetTransfersEnabledFlag: boolean;2279  readonly asSetTransfersEnabledFlag: {2280    readonly collectionId: u32;2281    readonly value: bool;2282  } & Struct;2283  readonly isBurnItem: boolean;2284  readonly asBurnItem: {2285    readonly collectionId: u32;2286    readonly itemId: u32;2287    readonly value: u128;2288  } & Struct;2289  readonly isBurnFrom: boolean;2290  readonly asBurnFrom: {2291    readonly collectionId: u32;2292    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;2293    readonly itemId: u32;2294    readonly value: u128;2295  } & Struct;2296  readonly isTransfer: boolean;2297  readonly asTransfer: {2298    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;2299    readonly collectionId: u32;2300    readonly itemId: u32;2301    readonly value: u128;2302  } & Struct;2303  readonly isApprove: boolean;2304  readonly asApprove: {2305    readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;2306    readonly collectionId: u32;2307    readonly itemId: u32;2308    readonly amount: u128;2309  } & Struct;2310  readonly isApproveFrom: boolean;2311  readonly asApproveFrom: {2312    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;2313    readonly to: PalletEvmAccountBasicCrossAccountIdRepr;2314    readonly collectionId: u32;2315    readonly itemId: u32;2316    readonly amount: u128;2317  } & Struct;2318  readonly isTransferFrom: boolean;2319  readonly asTransferFrom: {2320    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;2321    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;2322    readonly collectionId: u32;2323    readonly itemId: u32;2324    readonly value: u128;2325  } & Struct;2326  readonly isSetCollectionLimits: boolean;2327  readonly asSetCollectionLimits: {2328    readonly collectionId: u32;2329    readonly newLimit: UpDataStructsCollectionLimits;2330  } & Struct;2331  readonly isSetCollectionPermissions: boolean;2332  readonly asSetCollectionPermissions: {2333    readonly collectionId: u32;2334    readonly newPermission: UpDataStructsCollectionPermissions;2335  } & Struct;2336  readonly isRepartition: boolean;2337  readonly asRepartition: {2338    readonly collectionId: u32;2339    readonly tokenId: u32;2340    readonly amount: u128;2341  } & Struct;2342  readonly isSetAllowanceForAll: boolean;2343  readonly asSetAllowanceForAll: {2344    readonly collectionId: u32;2345    readonly operator: PalletEvmAccountBasicCrossAccountIdRepr;2346    readonly approve: bool;2347  } & Struct;2348  readonly isForceRepairCollection: boolean;2349  readonly asForceRepairCollection: {2350    readonly collectionId: u32;2351  } & Struct;2352  readonly isForceRepairItem: boolean;2353  readonly asForceRepairItem: {2354    readonly collectionId: u32;2355    readonly itemId: u32;2356  } & Struct;2357  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';2358}23592360/** @name PalletUniqueError */2361export interface PalletUniqueError extends Enum {2362  readonly isCollectionDecimalPointLimitExceeded: boolean;2363  readonly isEmptyArgument: boolean;2364  readonly isRepartitionCalledOnNonRefungibleCollection: boolean;2365  readonly type: 'CollectionDecimalPointLimitExceeded' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';2366}23672368/** @name PalletXcmCall */2369export interface PalletXcmCall extends Enum {2370  readonly isSend: boolean;2371  readonly asSend: {2372    readonly dest: XcmVersionedMultiLocation;2373    readonly message: XcmVersionedXcm;2374  } & Struct;2375  readonly isTeleportAssets: boolean;2376  readonly asTeleportAssets: {2377    readonly dest: XcmVersionedMultiLocation;2378    readonly beneficiary: XcmVersionedMultiLocation;2379    readonly assets: XcmVersionedMultiAssets;2380    readonly feeAssetItem: u32;2381  } & Struct;2382  readonly isReserveTransferAssets: boolean;2383  readonly asReserveTransferAssets: {2384    readonly dest: XcmVersionedMultiLocation;2385    readonly beneficiary: XcmVersionedMultiLocation;2386    readonly assets: XcmVersionedMultiAssets;2387    readonly feeAssetItem: u32;2388  } & Struct;2389  readonly isExecute: boolean;2390  readonly asExecute: {2391    readonly message: XcmVersionedXcm;2392    readonly maxWeight: u64;2393  } & Struct;2394  readonly isForceXcmVersion: boolean;2395  readonly asForceXcmVersion: {2396    readonly location: XcmV1MultiLocation;2397    readonly xcmVersion: u32;2398  } & Struct;2399  readonly isForceDefaultXcmVersion: boolean;2400  readonly asForceDefaultXcmVersion: {2401    readonly maybeXcmVersion: Option<u32>;2402  } & Struct;2403  readonly isForceSubscribeVersionNotify: boolean;2404  readonly asForceSubscribeVersionNotify: {2405    readonly location: XcmVersionedMultiLocation;2406  } & Struct;2407  readonly isForceUnsubscribeVersionNotify: boolean;2408  readonly asForceUnsubscribeVersionNotify: {2409    readonly location: XcmVersionedMultiLocation;2410  } & Struct;2411  readonly isLimitedReserveTransferAssets: boolean;2412  readonly asLimitedReserveTransferAssets: {2413    readonly dest: XcmVersionedMultiLocation;2414    readonly beneficiary: XcmVersionedMultiLocation;2415    readonly assets: XcmVersionedMultiAssets;2416    readonly feeAssetItem: u32;2417    readonly weightLimit: XcmV2WeightLimit;2418  } & Struct;2419  readonly isLimitedTeleportAssets: boolean;2420  readonly asLimitedTeleportAssets: {2421    readonly dest: XcmVersionedMultiLocation;2422    readonly beneficiary: XcmVersionedMultiLocation;2423    readonly assets: XcmVersionedMultiAssets;2424    readonly feeAssetItem: u32;2425    readonly weightLimit: XcmV2WeightLimit;2426  } & Struct;2427  readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';2428}24292430/** @name PalletXcmError */2431export interface PalletXcmError extends Enum {2432  readonly isUnreachable: boolean;2433  readonly isSendFailure: boolean;2434  readonly isFiltered: boolean;2435  readonly isUnweighableMessage: boolean;2436  readonly isDestinationNotInvertible: boolean;2437  readonly isEmpty: boolean;2438  readonly isCannotReanchor: boolean;2439  readonly isTooManyAssets: boolean;2440  readonly isInvalidOrigin: boolean;2441  readonly isBadVersion: boolean;2442  readonly isBadLocation: boolean;2443  readonly isNoSubscription: boolean;2444  readonly isAlreadySubscribed: boolean;2445  readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';2446}24472448/** @name PalletXcmEvent */2449export interface PalletXcmEvent extends Enum {2450  readonly isAttempted: boolean;2451  readonly asAttempted: XcmV2TraitsOutcome;2452  readonly isSent: boolean;2453  readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;2454  readonly isUnexpectedResponse: boolean;2455  readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;2456  readonly isResponseReady: boolean;2457  readonly asResponseReady: ITuple<[u64, XcmV2Response]>;2458  readonly isNotified: boolean;2459  readonly asNotified: ITuple<[u64, u8, u8]>;2460  readonly isNotifyOverweight: boolean;2461  readonly asNotifyOverweight: ITuple<[u64, u8, u8, SpWeightsWeightV2Weight, SpWeightsWeightV2Weight]>;2462  readonly isNotifyDispatchError: boolean;2463  readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;2464  readonly isNotifyDecodeFailed: boolean;2465  readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2466  readonly isInvalidResponder: boolean;2467  readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2468  readonly isInvalidResponderVersion: boolean;2469  readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2470  readonly isResponseTaken: boolean;2471  readonly asResponseTaken: u64;2472  readonly isAssetsTrapped: boolean;2473  readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2474  readonly isVersionChangeNotified: boolean;2475  readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2476  readonly isSupportedVersionChanged: boolean;2477  readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2478  readonly isNotifyTargetSendFail: boolean;2479  readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2480  readonly isNotifyTargetMigrationFail: boolean;2481  readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2482  readonly isAssetsClaimed: boolean;2483  readonly asAssetsClaimed: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2484  readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail' | 'AssetsClaimed';2485}24862487/** @name PhantomTypeUpDataStructs */2488export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild, UpPovEstimateRpcPovInfo]>> {}24892490/** @name PolkadotCorePrimitivesInboundDownwardMessage */2491export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {2492  readonly sentAt: u32;2493  readonly msg: Bytes;2494}24952496/** @name PolkadotCorePrimitivesInboundHrmpMessage */2497export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {2498  readonly sentAt: u32;2499  readonly data: Bytes;2500}25012502/** @name PolkadotCorePrimitivesOutboundHrmpMessage */2503export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {2504  readonly recipient: u32;2505  readonly data: Bytes;2506}25072508/** @name PolkadotParachainPrimitivesXcmpMessageFormat */2509export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2510  readonly isConcatenatedVersionedXcm: boolean;2511  readonly isConcatenatedEncodedBlob: boolean;2512  readonly isSignals: boolean;2513  readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2514}25152516/** @name PolkadotPrimitivesV2AbridgedHostConfiguration */2517export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {2518  readonly maxCodeSize: u32;2519  readonly maxHeadDataSize: u32;2520  readonly maxUpwardQueueCount: u32;2521  readonly maxUpwardQueueSize: u32;2522  readonly maxUpwardMessageSize: u32;2523  readonly maxUpwardMessageNumPerCandidate: u32;2524  readonly hrmpMaxMessageNumPerCandidate: u32;2525  readonly validationUpgradeCooldown: u32;2526  readonly validationUpgradeDelay: u32;2527}25282529/** @name PolkadotPrimitivesV2AbridgedHrmpChannel */2530export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {2531  readonly maxCapacity: u32;2532  readonly maxTotalSize: u32;2533  readonly maxMessageSize: u32;2534  readonly msgCount: u32;2535  readonly totalSize: u32;2536  readonly mqcHead: Option<H256>;2537}25382539/** @name PolkadotPrimitivesV2PersistedValidationData */2540export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {2541  readonly parentHead: Bytes;2542  readonly relayParentNumber: u32;2543  readonly relayParentStorageRoot: H256;2544  readonly maxPovSize: u32;2545}25462547/** @name PolkadotPrimitivesV2UpgradeRestriction */2548export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {2549  readonly isPresent: boolean;2550  readonly type: 'Present';2551}25522553/** @name RmrkTraitsBaseBaseInfo */2554export interface RmrkTraitsBaseBaseInfo extends Struct {2555  readonly issuer: AccountId32;2556  readonly baseType: Bytes;2557  readonly symbol: Bytes;2558}25592560/** @name RmrkTraitsCollectionCollectionInfo */2561export interface RmrkTraitsCollectionCollectionInfo extends Struct {2562  readonly issuer: AccountId32;2563  readonly metadata: Bytes;2564  readonly max: Option<u32>;2565  readonly symbol: Bytes;2566  readonly nftsCount: u32;2567}25682569/** @name RmrkTraitsNftAccountIdOrCollectionNftTuple */2570export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {2571  readonly isAccountId: boolean;2572  readonly asAccountId: AccountId32;2573  readonly isCollectionAndNftTuple: boolean;2574  readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;2575  readonly type: 'AccountId' | 'CollectionAndNftTuple';2576}25772578/** @name RmrkTraitsNftNftChild */2579export interface RmrkTraitsNftNftChild extends Struct {2580  readonly collectionId: u32;2581  readonly nftId: u32;2582}25832584/** @name RmrkTraitsNftNftInfo */2585export interface RmrkTraitsNftNftInfo extends Struct {2586  readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2587  readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;2588  readonly metadata: Bytes;2589  readonly equipped: bool;2590  readonly pending: bool;2591}25922593/** @name RmrkTraitsNftRoyaltyInfo */2594export interface RmrkTraitsNftRoyaltyInfo extends Struct {2595  readonly recipient: AccountId32;2596  readonly amount: Permill;2597}25982599/** @name RmrkTraitsPartEquippableList */2600export interface RmrkTraitsPartEquippableList extends Enum {2601  readonly isAll: boolean;2602  readonly isEmpty: boolean;2603  readonly isCustom: boolean;2604  readonly asCustom: Vec<u32>;2605  readonly type: 'All' | 'Empty' | 'Custom';2606}26072608/** @name RmrkTraitsPartFixedPart */2609export interface RmrkTraitsPartFixedPart extends Struct {2610  readonly id: u32;2611  readonly z: u32;2612  readonly src: Bytes;2613}26142615/** @name RmrkTraitsPartPartType */2616export interface RmrkTraitsPartPartType extends Enum {2617  readonly isFixedPart: boolean;2618  readonly asFixedPart: RmrkTraitsPartFixedPart;2619  readonly isSlotPart: boolean;2620  readonly asSlotPart: RmrkTraitsPartSlotPart;2621  readonly type: 'FixedPart' | 'SlotPart';2622}26232624/** @name RmrkTraitsPartSlotPart */2625export interface RmrkTraitsPartSlotPart extends Struct {2626  readonly id: u32;2627  readonly equippable: RmrkTraitsPartEquippableList;2628  readonly src: Bytes;2629  readonly z: u32;2630}26312632/** @name RmrkTraitsPropertyPropertyInfo */2633export interface RmrkTraitsPropertyPropertyInfo extends Struct {2634  readonly key: Bytes;2635  readonly value: Bytes;2636}26372638/** @name RmrkTraitsResourceBasicResource */2639export interface RmrkTraitsResourceBasicResource extends Struct {2640  readonly src: Option<Bytes>;2641  readonly metadata: Option<Bytes>;2642  readonly license: Option<Bytes>;2643  readonly thumb: Option<Bytes>;2644}26452646/** @name RmrkTraitsResourceComposableResource */2647export interface RmrkTraitsResourceComposableResource extends Struct {2648  readonly parts: Vec<u32>;2649  readonly base: u32;2650  readonly src: Option<Bytes>;2651  readonly metadata: Option<Bytes>;2652  readonly license: Option<Bytes>;2653  readonly thumb: Option<Bytes>;2654}26552656/** @name RmrkTraitsResourceResourceInfo */2657export interface RmrkTraitsResourceResourceInfo extends Struct {2658  readonly id: u32;2659  readonly resource: RmrkTraitsResourceResourceTypes;2660  readonly pending: bool;2661  readonly pendingRemoval: bool;2662}26632664/** @name RmrkTraitsResourceResourceTypes */2665export interface RmrkTraitsResourceResourceTypes extends Enum {2666  readonly isBasic: boolean;2667  readonly asBasic: RmrkTraitsResourceBasicResource;2668  readonly isComposable: boolean;2669  readonly asComposable: RmrkTraitsResourceComposableResource;2670  readonly isSlot: boolean;2671  readonly asSlot: RmrkTraitsResourceSlotResource;2672  readonly type: 'Basic' | 'Composable' | 'Slot';2673}26742675/** @name RmrkTraitsResourceSlotResource */2676export interface RmrkTraitsResourceSlotResource extends Struct {2677  readonly base: u32;2678  readonly src: Option<Bytes>;2679  readonly metadata: Option<Bytes>;2680  readonly slot: u32;2681  readonly license: Option<Bytes>;2682  readonly thumb: Option<Bytes>;2683}26842685/** @name RmrkTraitsTheme */2686export interface RmrkTraitsTheme extends Struct {2687  readonly name: Bytes;2688  readonly properties: Vec<RmrkTraitsThemeThemeProperty>;2689  readonly inherit: bool;2690}26912692/** @name RmrkTraitsThemeThemeProperty */2693export interface RmrkTraitsThemeThemeProperty extends Struct {2694  readonly key: Bytes;2695  readonly value: Bytes;2696}26972698/** @name SpCoreEcdsaSignature */2699export interface SpCoreEcdsaSignature extends U8aFixed {}27002701/** @name SpCoreEd25519Signature */2702export interface SpCoreEd25519Signature extends U8aFixed {}27032704/** @name SpCoreSr25519Signature */2705export interface SpCoreSr25519Signature extends U8aFixed {}27062707/** @name SpRuntimeArithmeticError */2708export interface SpRuntimeArithmeticError extends Enum {2709  readonly isUnderflow: boolean;2710  readonly isOverflow: boolean;2711  readonly isDivisionByZero: boolean;2712  readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2713}27142715/** @name SpRuntimeDigest */2716export interface SpRuntimeDigest extends Struct {2717  readonly logs: Vec<SpRuntimeDigestDigestItem>;2718}27192720/** @name SpRuntimeDigestDigestItem */2721export interface SpRuntimeDigestDigestItem extends Enum {2722  readonly isOther: boolean;2723  readonly asOther: Bytes;2724  readonly isConsensus: boolean;2725  readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2726  readonly isSeal: boolean;2727  readonly asSeal: ITuple<[U8aFixed, Bytes]>;2728  readonly isPreRuntime: boolean;2729  readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2730  readonly isRuntimeEnvironmentUpdated: boolean;2731  readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2732}27332734/** @name SpRuntimeDispatchError */2735export interface SpRuntimeDispatchError extends Enum {2736  readonly isOther: boolean;2737  readonly isCannotLookup: boolean;2738  readonly isBadOrigin: boolean;2739  readonly isModule: boolean;2740  readonly asModule: SpRuntimeModuleError;2741  readonly isConsumerRemaining: boolean;2742  readonly isNoProviders: boolean;2743  readonly isTooManyConsumers: boolean;2744  readonly isToken: boolean;2745  readonly asToken: SpRuntimeTokenError;2746  readonly isArithmetic: boolean;2747  readonly asArithmetic: SpRuntimeArithmeticError;2748  readonly isTransactional: boolean;2749  readonly asTransactional: SpRuntimeTransactionalError;2750  readonly isExhausted: boolean;2751  readonly isCorruption: boolean;2752  readonly isUnavailable: boolean;2753  readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional' | 'Exhausted' | 'Corruption' | 'Unavailable';2754}27552756/** @name SpRuntimeModuleError */2757export interface SpRuntimeModuleError extends Struct {2758  readonly index: u8;2759  readonly error: U8aFixed;2760}27612762/** @name SpRuntimeMultiSignature */2763export interface SpRuntimeMultiSignature extends Enum {2764  readonly isEd25519: boolean;2765  readonly asEd25519: SpCoreEd25519Signature;2766  readonly isSr25519: boolean;2767  readonly asSr25519: SpCoreSr25519Signature;2768  readonly isEcdsa: boolean;2769  readonly asEcdsa: SpCoreEcdsaSignature;2770  readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';2771}27722773/** @name SpRuntimeTokenError */2774export interface SpRuntimeTokenError extends Enum {2775  readonly isNoFunds: boolean;2776  readonly isWouldDie: boolean;2777  readonly isBelowMinimum: boolean;2778  readonly isCannotCreate: boolean;2779  readonly isUnknownAsset: boolean;2780  readonly isFrozen: boolean;2781  readonly isUnsupported: boolean;2782  readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2783}27842785/** @name SpRuntimeTransactionalError */2786export interface SpRuntimeTransactionalError extends Enum {2787  readonly isLimitReached: boolean;2788  readonly isNoLayer: boolean;2789  readonly type: 'LimitReached' | 'NoLayer';2790}27912792/** @name SpRuntimeTransactionValidityInvalidTransaction */2793export interface SpRuntimeTransactionValidityInvalidTransaction extends Enum {2794  readonly isCall: boolean;2795  readonly isPayment: boolean;2796  readonly isFuture: boolean;2797  readonly isStale: boolean;2798  readonly isBadProof: boolean;2799  readonly isAncientBirthBlock: boolean;2800  readonly isExhaustsResources: boolean;2801  readonly isCustom: boolean;2802  readonly asCustom: u8;2803  readonly isBadMandatory: boolean;2804  readonly isMandatoryValidation: boolean;2805  readonly isBadSigner: boolean;2806  readonly type: 'Call' | 'Payment' | 'Future' | 'Stale' | 'BadProof' | 'AncientBirthBlock' | 'ExhaustsResources' | 'Custom' | 'BadMandatory' | 'MandatoryValidation' | 'BadSigner';2807}28082809/** @name SpRuntimeTransactionValidityTransactionValidityError */2810export interface SpRuntimeTransactionValidityTransactionValidityError extends Enum {2811  readonly isInvalid: boolean;2812  readonly asInvalid: SpRuntimeTransactionValidityInvalidTransaction;2813  readonly isUnknown: boolean;2814  readonly asUnknown: SpRuntimeTransactionValidityUnknownTransaction;2815  readonly type: 'Invalid' | 'Unknown';2816}28172818/** @name SpRuntimeTransactionValidityUnknownTransaction */2819export interface SpRuntimeTransactionValidityUnknownTransaction extends Enum {2820  readonly isCannotLookup: boolean;2821  readonly isNoUnsignedValidator: boolean;2822  readonly isCustom: boolean;2823  readonly asCustom: u8;2824  readonly type: 'CannotLookup' | 'NoUnsignedValidator' | 'Custom';2825}28262827/** @name SpTrieStorageProof */2828export interface SpTrieStorageProof extends Struct {2829  readonly trieNodes: BTreeSet<Bytes>;2830}28312832/** @name SpVersionRuntimeVersion */2833export interface SpVersionRuntimeVersion extends Struct {2834  readonly specName: Text;2835  readonly implName: Text;2836  readonly authoringVersion: u32;2837  readonly specVersion: u32;2838  readonly implVersion: u32;2839  readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2840  readonly transactionVersion: u32;2841  readonly stateVersion: u8;2842}28432844/** @name SpWeightsRuntimeDbWeight */2845export interface SpWeightsRuntimeDbWeight extends Struct {2846  readonly read: u64;2847  readonly write: u64;2848}28492850/** @name SpWeightsWeightV2Weight */2851export interface SpWeightsWeightV2Weight extends Struct {2852  readonly refTime: Compact<u64>;2853  readonly proofSize: Compact<u64>;2854}28552856/** @name UpDataStructsAccessMode */2857export interface UpDataStructsAccessMode extends Enum {2858  readonly isNormal: boolean;2859  readonly isAllowList: boolean;2860  readonly type: 'Normal' | 'AllowList';2861}28622863/** @name UpDataStructsCollection */2864export interface UpDataStructsCollection extends Struct {2865  readonly owner: AccountId32;2866  readonly mode: UpDataStructsCollectionMode;2867  readonly name: Vec<u16>;2868  readonly description: Vec<u16>;2869  readonly tokenPrefix: Bytes;2870  readonly sponsorship: UpDataStructsSponsorshipStateAccountId32;2871  readonly limits: UpDataStructsCollectionLimits;2872  readonly permissions: UpDataStructsCollectionPermissions;2873  readonly flags: U8aFixed;2874}28752876/** @name UpDataStructsCollectionLimits */2877export interface UpDataStructsCollectionLimits extends Struct {2878  readonly accountTokenOwnershipLimit: Option<u32>;2879  readonly sponsoredDataSize: Option<u32>;2880  readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;2881  readonly tokenLimit: Option<u32>;2882  readonly sponsorTransferTimeout: Option<u32>;2883  readonly sponsorApproveTimeout: Option<u32>;2884  readonly ownerCanTransfer: Option<bool>;2885  readonly ownerCanDestroy: Option<bool>;2886  readonly transfersEnabled: Option<bool>;2887}28882889/** @name UpDataStructsCollectionMode */2890export interface UpDataStructsCollectionMode extends Enum {2891  readonly isNft: boolean;2892  readonly isFungible: boolean;2893  readonly asFungible: u8;2894  readonly isReFungible: boolean;2895  readonly type: 'Nft' | 'Fungible' | 'ReFungible';2896}28972898/** @name UpDataStructsCollectionPermissions */2899export interface UpDataStructsCollectionPermissions extends Struct {2900  readonly access: Option<UpDataStructsAccessMode>;2901  readonly mintMode: Option<bool>;2902  readonly nesting: Option<UpDataStructsNestingPermissions>;2903}29042905/** @name UpDataStructsCollectionStats */2906export interface UpDataStructsCollectionStats extends Struct {2907  readonly created: u32;2908  readonly destroyed: u32;2909  readonly alive: u32;2910}29112912/** @name UpDataStructsCreateCollectionData */2913export interface UpDataStructsCreateCollectionData extends Struct {2914  readonly mode: UpDataStructsCollectionMode;2915  readonly access: Option<UpDataStructsAccessMode>;2916  readonly name: Vec<u16>;2917  readonly description: Vec<u16>;2918  readonly tokenPrefix: Bytes;2919  readonly pendingSponsor: Option<AccountId32>;2920  readonly limits: Option<UpDataStructsCollectionLimits>;2921  readonly permissions: Option<UpDataStructsCollectionPermissions>;2922  readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2923  readonly properties: Vec<UpDataStructsProperty>;2924}29252926/** @name UpDataStructsCreateFungibleData */2927export interface UpDataStructsCreateFungibleData extends Struct {2928  readonly value: u128;2929}29302931/** @name UpDataStructsCreateItemData */2932export interface UpDataStructsCreateItemData extends Enum {2933  readonly isNft: boolean;2934  readonly asNft: UpDataStructsCreateNftData;2935  readonly isFungible: boolean;2936  readonly asFungible: UpDataStructsCreateFungibleData;2937  readonly isReFungible: boolean;2938  readonly asReFungible: UpDataStructsCreateReFungibleData;2939  readonly type: 'Nft' | 'Fungible' | 'ReFungible';2940}29412942/** @name UpDataStructsCreateItemExData */2943export interface UpDataStructsCreateItemExData extends Enum {2944  readonly isNft: boolean;2945  readonly asNft: Vec<UpDataStructsCreateNftExData>;2946  readonly isFungible: boolean;2947  readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr,u128>;2948  readonly isRefungibleMultipleItems: boolean;2949  readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExSingleOwner>;2950  readonly isRefungibleMultipleOwners: boolean;2951  readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExMultipleOwners;2952  readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';2953}29542955/** @name UpDataStructsCreateNftData */2956export interface UpDataStructsCreateNftData extends Struct {2957  readonly properties: Vec<UpDataStructsProperty>;2958}29592960/** @name UpDataStructsCreateNftExData */2961export interface UpDataStructsCreateNftExData extends Struct {2962  readonly properties: Vec<UpDataStructsProperty>;2963  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2964}29652966/** @name UpDataStructsCreateReFungibleData */2967export interface UpDataStructsCreateReFungibleData extends Struct {2968  readonly pieces: u128;2969  readonly properties: Vec<UpDataStructsProperty>;2970}29712972/** @name UpDataStructsCreateRefungibleExMultipleOwners */2973export interface UpDataStructsCreateRefungibleExMultipleOwners extends Struct {2974  readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2975  readonly properties: Vec<UpDataStructsProperty>;2976}29772978/** @name UpDataStructsCreateRefungibleExSingleOwner */2979export interface UpDataStructsCreateRefungibleExSingleOwner extends Struct {2980  readonly user: PalletEvmAccountBasicCrossAccountIdRepr;2981  readonly pieces: u128;2982  readonly properties: Vec<UpDataStructsProperty>;2983}29842985/** @name UpDataStructsNestingPermissions */2986export interface UpDataStructsNestingPermissions extends Struct {2987  readonly tokenOwner: bool;2988  readonly collectionAdmin: bool;2989  readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;2990}29912992/** @name UpDataStructsOwnerRestrictedSet */2993export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}29942995/** @name UpDataStructsProperties */2996export interface UpDataStructsProperties extends Struct {2997  readonly map: UpDataStructsPropertiesMapBoundedVec;2998  readonly consumedSpace: u32;2999  readonly spaceLimit: u32;3000}30013002/** @name UpDataStructsPropertiesMapBoundedVec */3003export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}30043005/** @name UpDataStructsPropertiesMapPropertyPermission */3006export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}30073008/** @name UpDataStructsProperty */3009export interface UpDataStructsProperty extends Struct {3010  readonly key: Bytes;3011  readonly value: Bytes;3012}30133014/** @name UpDataStructsPropertyKeyPermission */3015export interface UpDataStructsPropertyKeyPermission extends Struct {3016  readonly key: Bytes;3017  readonly permission: UpDataStructsPropertyPermission;3018}30193020/** @name UpDataStructsPropertyPermission */3021export interface UpDataStructsPropertyPermission extends Struct {3022  readonly mutable: bool;3023  readonly collectionAdmin: bool;3024  readonly tokenOwner: bool;3025}30263027/** @name UpDataStructsPropertyScope */3028export interface UpDataStructsPropertyScope extends Enum {3029  readonly isNone: boolean;3030  readonly isRmrk: boolean;3031  readonly type: 'None' | 'Rmrk';3032}30333034/** @name UpDataStructsRpcCollection */3035export interface UpDataStructsRpcCollection extends Struct {3036  readonly owner: AccountId32;3037  readonly mode: UpDataStructsCollectionMode;3038  readonly name: Vec<u16>;3039  readonly description: Vec<u16>;3040  readonly tokenPrefix: Bytes;3041  readonly sponsorship: UpDataStructsSponsorshipStateAccountId32;3042  readonly limits: UpDataStructsCollectionLimits;3043  readonly permissions: UpDataStructsCollectionPermissions;3044  readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;3045  readonly properties: Vec<UpDataStructsProperty>;3046  readonly readOnly: bool;3047  readonly flags: UpDataStructsRpcCollectionFlags;3048}30493050/** @name UpDataStructsRpcCollectionFlags */3051export interface UpDataStructsRpcCollectionFlags extends Struct {3052  readonly foreign: bool;3053  readonly erc721metadata: bool;3054}30553056/** @name UpDataStructsSponsoringRateLimit */3057export interface UpDataStructsSponsoringRateLimit extends Enum {3058  readonly isSponsoringDisabled: boolean;3059  readonly isBlocks: boolean;3060  readonly asBlocks: u32;3061  readonly type: 'SponsoringDisabled' | 'Blocks';3062}30633064/** @name UpDataStructsSponsorshipStateAccountId32 */3065export interface UpDataStructsSponsorshipStateAccountId32 extends Enum {3066  readonly isDisabled: boolean;3067  readonly isUnconfirmed: boolean;3068  readonly asUnconfirmed: AccountId32;3069  readonly isConfirmed: boolean;3070  readonly asConfirmed: AccountId32;3071  readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';3072}30733074/** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr */3075export interface UpDataStructsSponsorshipStateBasicCrossAccountIdRepr extends Enum {3076  readonly isDisabled: boolean;3077  readonly isUnconfirmed: boolean;3078  readonly asUnconfirmed: PalletEvmAccountBasicCrossAccountIdRepr;3079  readonly isConfirmed: boolean;3080  readonly asConfirmed: PalletEvmAccountBasicCrossAccountIdRepr;3081  readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';3082}30833084/** @name UpDataStructsTokenChild */3085export interface UpDataStructsTokenChild extends Struct {3086  readonly token: u32;3087  readonly collection: u32;3088}30893090/** @name UpDataStructsTokenData */3091export interface UpDataStructsTokenData extends Struct {3092  readonly properties: Vec<UpDataStructsProperty>;3093  readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;3094  readonly pieces: u128;3095}30963097/** @name UpPovEstimateRpcPovInfo */3098export interface UpPovEstimateRpcPovInfo extends Struct {3099  readonly proofSize: u64;3100  readonly compactProofSize: u64;3101  readonly compressedProofSize: u64;3102  readonly results: Vec<Result<Result<Null, SpRuntimeDispatchError>, SpRuntimeTransactionValidityTransactionValidityError>>;3103  readonly keyValues: Vec<UpPovEstimateRpcTrieKeyValue>;3104}31053106/** @name UpPovEstimateRpcTrieKeyValue */3107export interface UpPovEstimateRpcTrieKeyValue extends Struct {3108  readonly key: Bytes;3109  readonly value: Bytes;3110}31113112/** @name XcmDoubleEncoded */3113export interface XcmDoubleEncoded extends Struct {3114  readonly encoded: Bytes;3115}31163117/** @name XcmV0Junction */3118export interface XcmV0Junction extends Enum {3119  readonly isParent: boolean;3120  readonly isParachain: boolean;3121  readonly asParachain: Compact<u32>;3122  readonly isAccountId32: boolean;3123  readonly asAccountId32: {3124    readonly network: XcmV0JunctionNetworkId;3125    readonly id: U8aFixed;3126  } & Struct;3127  readonly isAccountIndex64: boolean;3128  readonly asAccountIndex64: {3129    readonly network: XcmV0JunctionNetworkId;3130    readonly index: Compact<u64>;3131  } & Struct;3132  readonly isAccountKey20: boolean;3133  readonly asAccountKey20: {3134    readonly network: XcmV0JunctionNetworkId;3135    readonly key: U8aFixed;3136  } & Struct;3137  readonly isPalletInstance: boolean;3138  readonly asPalletInstance: u8;3139  readonly isGeneralIndex: boolean;3140  readonly asGeneralIndex: Compact<u128>;3141  readonly isGeneralKey: boolean;3142  readonly asGeneralKey: Bytes;3143  readonly isOnlyChild: boolean;3144  readonly isPlurality: boolean;3145  readonly asPlurality: {3146    readonly id: XcmV0JunctionBodyId;3147    readonly part: XcmV0JunctionBodyPart;3148  } & Struct;3149  readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';3150}31513152/** @name XcmV0JunctionBodyId */3153export interface XcmV0JunctionBodyId extends Enum {3154  readonly isUnit: boolean;3155  readonly isNamed: boolean;3156  readonly asNamed: Bytes;3157  readonly isIndex: boolean;3158  readonly asIndex: Compact<u32>;3159  readonly isExecutive: boolean;3160  readonly isTechnical: boolean;3161  readonly isLegislative: boolean;3162  readonly isJudicial: boolean;3163  readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';3164}31653166/** @name XcmV0JunctionBodyPart */3167export interface XcmV0JunctionBodyPart extends Enum {3168  readonly isVoice: boolean;3169  readonly isMembers: boolean;3170  readonly asMembers: {3171    readonly count: Compact<u32>;3172  } & Struct;3173  readonly isFraction: boolean;3174  readonly asFraction: {3175    readonly nom: Compact<u32>;3176    readonly denom: Compact<u32>;3177  } & Struct;3178  readonly isAtLeastProportion: boolean;3179  readonly asAtLeastProportion: {3180    readonly nom: Compact<u32>;3181    readonly denom: Compact<u32>;3182  } & Struct;3183  readonly isMoreThanProportion: boolean;3184  readonly asMoreThanProportion: {3185    readonly nom: Compact<u32>;3186    readonly denom: Compact<u32>;3187  } & Struct;3188  readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';3189}31903191/** @name XcmV0JunctionNetworkId */3192export interface XcmV0JunctionNetworkId extends Enum {3193  readonly isAny: boolean;3194  readonly isNamed: boolean;3195  readonly asNamed: Bytes;3196  readonly isPolkadot: boolean;3197  readonly isKusama: boolean;3198  readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';3199}32003201/** @name XcmV0MultiAsset */3202export interface XcmV0MultiAsset extends Enum {3203  readonly isNone: boolean;3204  readonly isAll: boolean;3205  readonly isAllFungible: boolean;3206  readonly isAllNonFungible: boolean;3207  readonly isAllAbstractFungible: boolean;3208  readonly asAllAbstractFungible: {3209    readonly id: Bytes;3210  } & Struct;3211  readonly isAllAbstractNonFungible: boolean;3212  readonly asAllAbstractNonFungible: {3213    readonly class: Bytes;3214  } & Struct;3215  readonly isAllConcreteFungible: boolean;3216  readonly asAllConcreteFungible: {3217    readonly id: XcmV0MultiLocation;3218  } & Struct;3219  readonly isAllConcreteNonFungible: boolean;3220  readonly asAllConcreteNonFungible: {3221    readonly class: XcmV0MultiLocation;3222  } & Struct;3223  readonly isAbstractFungible: boolean;3224  readonly asAbstractFungible: {3225    readonly id: Bytes;3226    readonly amount: Compact<u128>;3227  } & Struct;3228  readonly isAbstractNonFungible: boolean;3229  readonly asAbstractNonFungible: {3230    readonly class: Bytes;3231    readonly instance: XcmV1MultiassetAssetInstance;3232  } & Struct;3233  readonly isConcreteFungible: boolean;3234  readonly asConcreteFungible: {3235    readonly id: XcmV0MultiLocation;3236    readonly amount: Compact<u128>;3237  } & Struct;3238  readonly isConcreteNonFungible: boolean;3239  readonly asConcreteNonFungible: {3240    readonly class: XcmV0MultiLocation;3241    readonly instance: XcmV1MultiassetAssetInstance;3242  } & Struct;3243  readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';3244}32453246/** @name XcmV0MultiLocation */3247export interface XcmV0MultiLocation extends Enum {3248  readonly isNull: boolean;3249  readonly isX1: boolean;3250  readonly asX1: XcmV0Junction;3251  readonly isX2: boolean;3252  readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;3253  readonly isX3: boolean;3254  readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;3255  readonly isX4: boolean;3256  readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;3257  readonly isX5: boolean;3258  readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;3259  readonly isX6: boolean;3260  readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;3261  readonly isX7: boolean;3262  readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;3263  readonly isX8: boolean;3264  readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;3265  readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';3266}32673268/** @name XcmV0Order */3269export interface XcmV0Order extends Enum {3270  readonly isNull: boolean;3271  readonly isDepositAsset: boolean;3272  readonly asDepositAsset: {3273    readonly assets: Vec<XcmV0MultiAsset>;3274    readonly dest: XcmV0MultiLocation;3275  } & Struct;3276  readonly isDepositReserveAsset: boolean;3277  readonly asDepositReserveAsset: {3278    readonly assets: Vec<XcmV0MultiAsset>;3279    readonly dest: XcmV0MultiLocation;3280    readonly effects: Vec<XcmV0Order>;3281  } & Struct;3282  readonly isExchangeAsset: boolean;3283  readonly asExchangeAsset: {3284    readonly give: Vec<XcmV0MultiAsset>;3285    readonly receive: Vec<XcmV0MultiAsset>;3286  } & Struct;3287  readonly isInitiateReserveWithdraw: boolean;3288  readonly asInitiateReserveWithdraw: {3289    readonly assets: Vec<XcmV0MultiAsset>;3290    readonly reserve: XcmV0MultiLocation;3291    readonly effects: Vec<XcmV0Order>;3292  } & Struct;3293  readonly isInitiateTeleport: boolean;3294  readonly asInitiateTeleport: {3295    readonly assets: Vec<XcmV0MultiAsset>;3296    readonly dest: XcmV0MultiLocation;3297    readonly effects: Vec<XcmV0Order>;3298  } & Struct;3299  readonly isQueryHolding: boolean;3300  readonly asQueryHolding: {3301    readonly queryId: Compact<u64>;3302    readonly dest: XcmV0MultiLocation;3303    readonly assets: Vec<XcmV0MultiAsset>;3304  } & Struct;3305  readonly isBuyExecution: boolean;3306  readonly asBuyExecution: {3307    readonly fees: XcmV0MultiAsset;3308    readonly weight: u64;3309    readonly debt: u64;3310    readonly haltOnError: bool;3311    readonly xcm: Vec<XcmV0Xcm>;3312  } & Struct;3313  readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';3314}33153316/** @name XcmV0OriginKind */3317export interface XcmV0OriginKind extends Enum {3318  readonly isNative: boolean;3319  readonly isSovereignAccount: boolean;3320  readonly isSuperuser: boolean;3321  readonly isXcm: boolean;3322  readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';3323}33243325/** @name XcmV0Response */3326export interface XcmV0Response extends Enum {3327  readonly isAssets: boolean;3328  readonly asAssets: Vec<XcmV0MultiAsset>;3329  readonly type: 'Assets';3330}33313332/** @name XcmV0Xcm */3333export interface XcmV0Xcm extends Enum {3334  readonly isWithdrawAsset: boolean;3335  readonly asWithdrawAsset: {3336    readonly assets: Vec<XcmV0MultiAsset>;3337    readonly effects: Vec<XcmV0Order>;3338  } & Struct;3339  readonly isReserveAssetDeposit: boolean;3340  readonly asReserveAssetDeposit: {3341    readonly assets: Vec<XcmV0MultiAsset>;3342    readonly effects: Vec<XcmV0Order>;3343  } & Struct;3344  readonly isTeleportAsset: boolean;3345  readonly asTeleportAsset: {3346    readonly assets: Vec<XcmV0MultiAsset>;3347    readonly effects: Vec<XcmV0Order>;3348  } & Struct;3349  readonly isQueryResponse: boolean;3350  readonly asQueryResponse: {3351    readonly queryId: Compact<u64>;3352    readonly response: XcmV0Response;3353  } & Struct;3354  readonly isTransferAsset: boolean;3355  readonly asTransferAsset: {3356    readonly assets: Vec<XcmV0MultiAsset>;3357    readonly dest: XcmV0MultiLocation;3358  } & Struct;3359  readonly isTransferReserveAsset: boolean;3360  readonly asTransferReserveAsset: {3361    readonly assets: Vec<XcmV0MultiAsset>;3362    readonly dest: XcmV0MultiLocation;3363    readonly effects: Vec<XcmV0Order>;3364  } & Struct;3365  readonly isTransact: boolean;3366  readonly asTransact: {3367    readonly originType: XcmV0OriginKind;3368    readonly requireWeightAtMost: u64;3369    readonly call: XcmDoubleEncoded;3370  } & Struct;3371  readonly isHrmpNewChannelOpenRequest: boolean;3372  readonly asHrmpNewChannelOpenRequest: {3373    readonly sender: Compact<u32>;3374    readonly maxMessageSize: Compact<u32>;3375    readonly maxCapacity: Compact<u32>;3376  } & Struct;3377  readonly isHrmpChannelAccepted: boolean;3378  readonly asHrmpChannelAccepted: {3379    readonly recipient: Compact<u32>;3380  } & Struct;3381  readonly isHrmpChannelClosing: boolean;3382  readonly asHrmpChannelClosing: {3383    readonly initiator: Compact<u32>;3384    readonly sender: Compact<u32>;3385    readonly recipient: Compact<u32>;3386  } & Struct;3387  readonly isRelayedFrom: boolean;3388  readonly asRelayedFrom: {3389    readonly who: XcmV0MultiLocation;3390    readonly message: XcmV0Xcm;3391  } & Struct;3392  readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';3393}33943395/** @name XcmV1Junction */3396export interface XcmV1Junction extends Enum {3397  readonly isParachain: boolean;3398  readonly asParachain: Compact<u32>;3399  readonly isAccountId32: boolean;3400  readonly asAccountId32: {3401    readonly network: XcmV0JunctionNetworkId;3402    readonly id: U8aFixed;3403  } & Struct;3404  readonly isAccountIndex64: boolean;3405  readonly asAccountIndex64: {3406    readonly network: XcmV0JunctionNetworkId;3407    readonly index: Compact<u64>;3408  } & Struct;3409  readonly isAccountKey20: boolean;3410  readonly asAccountKey20: {3411    readonly network: XcmV0JunctionNetworkId;3412    readonly key: U8aFixed;3413  } & Struct;3414  readonly isPalletInstance: boolean;3415  readonly asPalletInstance: u8;3416  readonly isGeneralIndex: boolean;3417  readonly asGeneralIndex: Compact<u128>;3418  readonly isGeneralKey: boolean;3419  readonly asGeneralKey: Bytes;3420  readonly isOnlyChild: boolean;3421  readonly isPlurality: boolean;3422  readonly asPlurality: {3423    readonly id: XcmV0JunctionBodyId;3424    readonly part: XcmV0JunctionBodyPart;3425  } & Struct;3426  readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';3427}34283429/** @name XcmV1MultiAsset */3430export interface XcmV1MultiAsset extends Struct {3431  readonly id: XcmV1MultiassetAssetId;3432  readonly fun: XcmV1MultiassetFungibility;3433}34343435/** @name XcmV1MultiassetAssetId */3436export interface XcmV1MultiassetAssetId extends Enum {3437  readonly isConcrete: boolean;3438  readonly asConcrete: XcmV1MultiLocation;3439  readonly isAbstract: boolean;3440  readonly asAbstract: Bytes;3441  readonly type: 'Concrete' | 'Abstract';3442}34433444/** @name XcmV1MultiassetAssetInstance */3445export interface XcmV1MultiassetAssetInstance extends Enum {3446  readonly isUndefined: boolean;3447  readonly isIndex: boolean;3448  readonly asIndex: Compact<u128>;3449  readonly isArray4: boolean;3450  readonly asArray4: U8aFixed;3451  readonly isArray8: boolean;3452  readonly asArray8: U8aFixed;3453  readonly isArray16: boolean;3454  readonly asArray16: U8aFixed;3455  readonly isArray32: boolean;3456  readonly asArray32: U8aFixed;3457  readonly isBlob: boolean;3458  readonly asBlob: Bytes;3459  readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';3460}34613462/** @name XcmV1MultiassetFungibility */3463export interface XcmV1MultiassetFungibility extends Enum {3464  readonly isFungible: boolean;3465  readonly asFungible: Compact<u128>;3466  readonly isNonFungible: boolean;3467  readonly asNonFungible: XcmV1MultiassetAssetInstance;3468  readonly type: 'Fungible' | 'NonFungible';3469}34703471/** @name XcmV1MultiassetMultiAssetFilter */3472export interface XcmV1MultiassetMultiAssetFilter extends Enum {3473  readonly isDefinite: boolean;3474  readonly asDefinite: XcmV1MultiassetMultiAssets;3475  readonly isWild: boolean;3476  readonly asWild: XcmV1MultiassetWildMultiAsset;3477  readonly type: 'Definite' | 'Wild';3478}34793480/** @name XcmV1MultiassetMultiAssets */3481export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}34823483/** @name XcmV1MultiassetWildFungibility */3484export interface XcmV1MultiassetWildFungibility extends Enum {3485  readonly isFungible: boolean;3486  readonly isNonFungible: boolean;3487  readonly type: 'Fungible' | 'NonFungible';3488}34893490/** @name XcmV1MultiassetWildMultiAsset */3491export interface XcmV1MultiassetWildMultiAsset extends Enum {3492  readonly isAll: boolean;3493  readonly isAllOf: boolean;3494  readonly asAllOf: {3495    readonly id: XcmV1MultiassetAssetId;3496    readonly fun: XcmV1MultiassetWildFungibility;3497  } & Struct;3498  readonly type: 'All' | 'AllOf';3499}35003501/** @name XcmV1MultiLocation */3502export interface XcmV1MultiLocation extends Struct {3503  readonly parents: u8;3504  readonly interior: XcmV1MultilocationJunctions;3505}35063507/** @name XcmV1MultilocationJunctions */3508export interface XcmV1MultilocationJunctions extends Enum {3509  readonly isHere: boolean;3510  readonly isX1: boolean;3511  readonly asX1: XcmV1Junction;3512  readonly isX2: boolean;3513  readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;3514  readonly isX3: boolean;3515  readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;3516  readonly isX4: boolean;3517  readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;3518  readonly isX5: boolean;3519  readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;3520  readonly isX6: boolean;3521  readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;3522  readonly isX7: boolean;3523  readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;3524  readonly isX8: boolean;3525  readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;3526  readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';3527}35283529/** @name XcmV1Order */3530export interface XcmV1Order extends Enum {3531  readonly isNoop: boolean;3532  readonly isDepositAsset: boolean;3533  readonly asDepositAsset: {3534    readonly assets: XcmV1MultiassetMultiAssetFilter;3535    readonly maxAssets: u32;3536    readonly beneficiary: XcmV1MultiLocation;3537  } & Struct;3538  readonly isDepositReserveAsset: boolean;3539  readonly asDepositReserveAsset: {3540    readonly assets: XcmV1MultiassetMultiAssetFilter;3541    readonly maxAssets: u32;3542    readonly dest: XcmV1MultiLocation;3543    readonly effects: Vec<XcmV1Order>;3544  } & Struct;3545  readonly isExchangeAsset: boolean;3546  readonly asExchangeAsset: {3547    readonly give: XcmV1MultiassetMultiAssetFilter;3548    readonly receive: XcmV1MultiassetMultiAssets;3549  } & Struct;3550  readonly isInitiateReserveWithdraw: boolean;3551  readonly asInitiateReserveWithdraw: {3552    readonly assets: XcmV1MultiassetMultiAssetFilter;3553    readonly reserve: XcmV1MultiLocation;3554    readonly effects: Vec<XcmV1Order>;3555  } & Struct;3556  readonly isInitiateTeleport: boolean;3557  readonly asInitiateTeleport: {3558    readonly assets: XcmV1MultiassetMultiAssetFilter;3559    readonly dest: XcmV1MultiLocation;3560    readonly effects: Vec<XcmV1Order>;3561  } & Struct;3562  readonly isQueryHolding: boolean;3563  readonly asQueryHolding: {3564    readonly queryId: Compact<u64>;3565    readonly dest: XcmV1MultiLocation;3566    readonly assets: XcmV1MultiassetMultiAssetFilter;3567  } & Struct;3568  readonly isBuyExecution: boolean;3569  readonly asBuyExecution: {3570    readonly fees: XcmV1MultiAsset;3571    readonly weight: u64;3572    readonly debt: u64;3573    readonly haltOnError: bool;3574    readonly instructions: Vec<XcmV1Xcm>;3575  } & Struct;3576  readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';3577}35783579/** @name XcmV1Response */3580export interface XcmV1Response extends Enum {3581  readonly isAssets: boolean;3582  readonly asAssets: XcmV1MultiassetMultiAssets;3583  readonly isVersion: boolean;3584  readonly asVersion: u32;3585  readonly type: 'Assets' | 'Version';3586}35873588/** @name XcmV1Xcm */3589export interface XcmV1Xcm extends Enum {3590  readonly isWithdrawAsset: boolean;3591  readonly asWithdrawAsset: {3592    readonly assets: XcmV1MultiassetMultiAssets;3593    readonly effects: Vec<XcmV1Order>;3594  } & Struct;3595  readonly isReserveAssetDeposited: boolean;3596  readonly asReserveAssetDeposited: {3597    readonly assets: XcmV1MultiassetMultiAssets;3598    readonly effects: Vec<XcmV1Order>;3599  } & Struct;3600  readonly isReceiveTeleportedAsset: boolean;3601  readonly asReceiveTeleportedAsset: {3602    readonly assets: XcmV1MultiassetMultiAssets;3603    readonly effects: Vec<XcmV1Order>;3604  } & Struct;3605  readonly isQueryResponse: boolean;3606  readonly asQueryResponse: {3607    readonly queryId: Compact<u64>;3608    readonly response: XcmV1Response;3609  } & Struct;3610  readonly isTransferAsset: boolean;3611  readonly asTransferAsset: {3612    readonly assets: XcmV1MultiassetMultiAssets;3613    readonly beneficiary: XcmV1MultiLocation;3614  } & Struct;3615  readonly isTransferReserveAsset: boolean;3616  readonly asTransferReserveAsset: {3617    readonly assets: XcmV1MultiassetMultiAssets;3618    readonly dest: XcmV1MultiLocation;3619    readonly effects: Vec<XcmV1Order>;3620  } & Struct;3621  readonly isTransact: boolean;3622  readonly asTransact: {3623    readonly originType: XcmV0OriginKind;3624    readonly requireWeightAtMost: u64;3625    readonly call: XcmDoubleEncoded;3626  } & Struct;3627  readonly isHrmpNewChannelOpenRequest: boolean;3628  readonly asHrmpNewChannelOpenRequest: {3629    readonly sender: Compact<u32>;3630    readonly maxMessageSize: Compact<u32>;3631    readonly maxCapacity: Compact<u32>;3632  } & Struct;3633  readonly isHrmpChannelAccepted: boolean;3634  readonly asHrmpChannelAccepted: {3635    readonly recipient: Compact<u32>;3636  } & Struct;3637  readonly isHrmpChannelClosing: boolean;3638  readonly asHrmpChannelClosing: {3639    readonly initiator: Compact<u32>;3640    readonly sender: Compact<u32>;3641    readonly recipient: Compact<u32>;3642  } & Struct;3643  readonly isRelayedFrom: boolean;3644  readonly asRelayedFrom: {3645    readonly who: XcmV1MultilocationJunctions;3646    readonly message: XcmV1Xcm;3647  } & Struct;3648  readonly isSubscribeVersion: boolean;3649  readonly asSubscribeVersion: {3650    readonly queryId: Compact<u64>;3651    readonly maxResponseWeight: Compact<u64>;3652  } & Struct;3653  readonly isUnsubscribeVersion: boolean;3654  readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';3655}36563657/** @name XcmV2Instruction */3658export interface XcmV2Instruction extends Enum {3659  readonly isWithdrawAsset: boolean;3660  readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;3661  readonly isReserveAssetDeposited: boolean;3662  readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;3663  readonly isReceiveTeleportedAsset: boolean;3664  readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;3665  readonly isQueryResponse: boolean;3666  readonly asQueryResponse: {3667    readonly queryId: Compact<u64>;3668    readonly response: XcmV2Response;3669    readonly maxWeight: Compact<u64>;3670  } & Struct;3671  readonly isTransferAsset: boolean;3672  readonly asTransferAsset: {3673    readonly assets: XcmV1MultiassetMultiAssets;3674    readonly beneficiary: XcmV1MultiLocation;3675  } & Struct;3676  readonly isTransferReserveAsset: boolean;3677  readonly asTransferReserveAsset: {3678    readonly assets: XcmV1MultiassetMultiAssets;3679    readonly dest: XcmV1MultiLocation;3680    readonly xcm: XcmV2Xcm;3681  } & Struct;3682  readonly isTransact: boolean;3683  readonly asTransact: {3684    readonly originType: XcmV0OriginKind;3685    readonly requireWeightAtMost: Compact<u64>;3686    readonly call: XcmDoubleEncoded;3687  } & Struct;3688  readonly isHrmpNewChannelOpenRequest: boolean;3689  readonly asHrmpNewChannelOpenRequest: {3690    readonly sender: Compact<u32>;3691    readonly maxMessageSize: Compact<u32>;3692    readonly maxCapacity: Compact<u32>;3693  } & Struct;3694  readonly isHrmpChannelAccepted: boolean;3695  readonly asHrmpChannelAccepted: {3696    readonly recipient: Compact<u32>;3697  } & Struct;3698  readonly isHrmpChannelClosing: boolean;3699  readonly asHrmpChannelClosing: {3700    readonly initiator: Compact<u32>;3701    readonly sender: Compact<u32>;3702    readonly recipient: Compact<u32>;3703  } & Struct;3704  readonly isClearOrigin: boolean;3705  readonly isDescendOrigin: boolean;3706  readonly asDescendOrigin: XcmV1MultilocationJunctions;3707  readonly isReportError: boolean;3708  readonly asReportError: {3709    readonly queryId: Compact<u64>;3710    readonly dest: XcmV1MultiLocation;3711    readonly maxResponseWeight: Compact<u64>;3712  } & Struct;3713  readonly isDepositAsset: boolean;3714  readonly asDepositAsset: {3715    readonly assets: XcmV1MultiassetMultiAssetFilter;3716    readonly maxAssets: Compact<u32>;3717    readonly beneficiary: XcmV1MultiLocation;3718  } & Struct;3719  readonly isDepositReserveAsset: boolean;3720  readonly asDepositReserveAsset: {3721    readonly assets: XcmV1MultiassetMultiAssetFilter;3722    readonly maxAssets: Compact<u32>;3723    readonly dest: XcmV1MultiLocation;3724    readonly xcm: XcmV2Xcm;3725  } & Struct;3726  readonly isExchangeAsset: boolean;3727  readonly asExchangeAsset: {3728    readonly give: XcmV1MultiassetMultiAssetFilter;3729    readonly receive: XcmV1MultiassetMultiAssets;3730  } & Struct;3731  readonly isInitiateReserveWithdraw: boolean;3732  readonly asInitiateReserveWithdraw: {3733    readonly assets: XcmV1MultiassetMultiAssetFilter;3734    readonly reserve: XcmV1MultiLocation;3735    readonly xcm: XcmV2Xcm;3736  } & Struct;3737  readonly isInitiateTeleport: boolean;3738  readonly asInitiateTeleport: {3739    readonly assets: XcmV1MultiassetMultiAssetFilter;3740    readonly dest: XcmV1MultiLocation;3741    readonly xcm: XcmV2Xcm;3742  } & Struct;3743  readonly isQueryHolding: boolean;3744  readonly asQueryHolding: {3745    readonly queryId: Compact<u64>;3746    readonly dest: XcmV1MultiLocation;3747    readonly assets: XcmV1MultiassetMultiAssetFilter;3748    readonly maxResponseWeight: Compact<u64>;3749  } & Struct;3750  readonly isBuyExecution: boolean;3751  readonly asBuyExecution: {3752    readonly fees: XcmV1MultiAsset;3753    readonly weightLimit: XcmV2WeightLimit;3754  } & Struct;3755  readonly isRefundSurplus: boolean;3756  readonly isSetErrorHandler: boolean;3757  readonly asSetErrorHandler: XcmV2Xcm;3758  readonly isSetAppendix: boolean;3759  readonly asSetAppendix: XcmV2Xcm;3760  readonly isClearError: boolean;3761  readonly isClaimAsset: boolean;3762  readonly asClaimAsset: {3763    readonly assets: XcmV1MultiassetMultiAssets;3764    readonly ticket: XcmV1MultiLocation;3765  } & Struct;3766  readonly isTrap: boolean;3767  readonly asTrap: Compact<u64>;3768  readonly isSubscribeVersion: boolean;3769  readonly asSubscribeVersion: {3770    readonly queryId: Compact<u64>;3771    readonly maxResponseWeight: Compact<u64>;3772  } & Struct;3773  readonly isUnsubscribeVersion: boolean;3774  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';3775}37763777/** @name XcmV2Response */3778export interface XcmV2Response extends Enum {3779  readonly isNull: boolean;3780  readonly isAssets: boolean;3781  readonly asAssets: XcmV1MultiassetMultiAssets;3782  readonly isExecutionResult: boolean;3783  readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;3784  readonly isVersion: boolean;3785  readonly asVersion: u32;3786  readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';3787}37883789/** @name XcmV2TraitsError */3790export interface XcmV2TraitsError extends Enum {3791  readonly isOverflow: boolean;3792  readonly isUnimplemented: boolean;3793  readonly isUntrustedReserveLocation: boolean;3794  readonly isUntrustedTeleportLocation: boolean;3795  readonly isMultiLocationFull: boolean;3796  readonly isMultiLocationNotInvertible: boolean;3797  readonly isBadOrigin: boolean;3798  readonly isInvalidLocation: boolean;3799  readonly isAssetNotFound: boolean;3800  readonly isFailedToTransactAsset: boolean;3801  readonly isNotWithdrawable: boolean;3802  readonly isLocationCannotHold: boolean;3803  readonly isExceedsMaxMessageSize: boolean;3804  readonly isDestinationUnsupported: boolean;3805  readonly isTransport: boolean;3806  readonly isUnroutable: boolean;3807  readonly isUnknownClaim: boolean;3808  readonly isFailedToDecode: boolean;3809  readonly isMaxWeightInvalid: boolean;3810  readonly isNotHoldingFees: boolean;3811  readonly isTooExpensive: boolean;3812  readonly isTrap: boolean;3813  readonly asTrap: u64;3814  readonly isUnhandledXcmVersion: boolean;3815  readonly isWeightLimitReached: boolean;3816  readonly asWeightLimitReached: u64;3817  readonly isBarrier: boolean;3818  readonly isWeightNotComputable: boolean;3819  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';3820}38213822/** @name XcmV2TraitsOutcome */3823export interface XcmV2TraitsOutcome extends Enum {3824  readonly isComplete: boolean;3825  readonly asComplete: u64;3826  readonly isIncomplete: boolean;3827  readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;3828  readonly isError: boolean;3829  readonly asError: XcmV2TraitsError;3830  readonly type: 'Complete' | 'Incomplete' | 'Error';3831}38323833/** @name XcmV2WeightLimit */3834export interface XcmV2WeightLimit extends Enum {3835  readonly isUnlimited: boolean;3836  readonly isLimited: boolean;3837  readonly asLimited: Compact<u64>;3838  readonly type: 'Unlimited' | 'Limited';3839}38403841/** @name XcmV2Xcm */3842export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}38433844/** @name XcmVersionedMultiAsset */3845export interface XcmVersionedMultiAsset extends Enum {3846  readonly isV0: boolean;3847  readonly asV0: XcmV0MultiAsset;3848  readonly isV1: boolean;3849  readonly asV1: XcmV1MultiAsset;3850  readonly type: 'V0' | 'V1';3851}38523853/** @name XcmVersionedMultiAssets */3854export interface XcmVersionedMultiAssets extends Enum {3855  readonly isV0: boolean;3856  readonly asV0: Vec<XcmV0MultiAsset>;3857  readonly isV1: boolean;3858  readonly asV1: XcmV1MultiassetMultiAssets;3859  readonly type: 'V0' | 'V1';3860}38613862/** @name XcmVersionedMultiLocation */3863export interface XcmVersionedMultiLocation extends Enum {3864  readonly isV0: boolean;3865  readonly asV0: XcmV0MultiLocation;3866  readonly isV1: boolean;3867  readonly asV1: XcmV1MultiLocation;3868  readonly type: 'V0' | 'V1';3869}38703871/** @name XcmVersionedXcm */3872export interface XcmVersionedXcm extends Enum {3873  readonly isV0: boolean;3874  readonly asV0: XcmV0Xcm;3875  readonly isV1: boolean;3876  readonly asV1: XcmV1Xcm;3877  readonly isV2: boolean;3878  readonly asV2: XcmV2Xcm;3879  readonly type: 'V0' | 'V1' | 'V2';3880}38813882export type PHANTOM_DEFAULT = 'default';
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
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -2493,6 +2493,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;
@@ -2532,7 +2540,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 UpDataStructsCollectionMode (236) */
@@ -3564,6 +3572,7 @@
     readonly isTokenValueTooLow: boolean;
     readonly isApprovedValueTooLow: boolean;
     readonly isCantApproveMoreThanOwned: boolean;
+    readonly isAddressIsNotEthMirror: boolean;
     readonly isAddressIsZero: boolean;
     readonly isUnsupportedOperation: boolean;
     readonly isNotSufficientFounds: boolean;
@@ -3579,7 +3588,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 PalletFungibleError (425) */
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);
   }
 }