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

difftreelog

Merge branch 'develop' into doc/architectural-changes

Farhad Hakimov2022-07-22parents: #5b3cd06 #26e74f7.patch.diff
in: master

80 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5731,7 +5731,7 @@
 
 [[package]]
 name = "pallet-common"
-version = "0.1.0"
+version = "0.1.2"
 dependencies = [
  "ethereum",
  "evm-coder",
@@ -5953,7 +5953,7 @@
 
 [[package]]
 name = "pallet-fungible"
-version = "0.1.0"
+version = "0.1.1"
 dependencies = [
  "ethereum",
  "evm-coder",
@@ -6198,7 +6198,7 @@
 
 [[package]]
 name = "pallet-nonfungible"
-version = "0.1.0"
+version = "0.1.1"
 dependencies = [
  "ethereum",
  "evm-coder",
@@ -6320,13 +6320,16 @@
 
 [[package]]
 name = "pallet-refungible"
-version = "0.1.0"
+version = "0.1.2"
 dependencies = [
+ "ethereum",
+ "evm-coder",
  "frame-benchmarking",
  "frame-support",
  "frame-system",
  "pallet-common",
  "pallet-evm",
+ "pallet-evm-coder-substrate",
  "pallet-structure",
  "parity-scale-codec 3.1.5",
  "scale-info",
@@ -12374,7 +12377,7 @@
 
 [[package]]
 name = "uc-rpc"
-version = "0.1.0"
+version = "0.1.1"
 dependencies = [
  "anyhow",
  "jsonrpsee",
@@ -12733,7 +12736,7 @@
 
 [[package]]
 name = "up-data-structs"
-version = "0.1.0"
+version = "0.1.1"
 dependencies = [
  "derivative",
  "frame-support",
@@ -12751,7 +12754,7 @@
 
 [[package]]
 name = "up-rpc"
-version = "0.1.0"
+version = "0.1.1"
 dependencies = [
  "pallet-common",
  "pallet-evm",
modifiedMakefilediffbeforeafterboth
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,10 @@
 NONFUNGIBLE_EVM_STUBS=./pallets/nonfungible/src/stubs
 NONFUNGIBLE_EVM_ABI=./tests/src/eth/nonFungibleAbi.json
 
+REFUNGIBLE_EVM_STUBS=./pallets/refungible/src/stubs
+RENFUNGIBLE_EVM_ABI=./tests/src/eth/reFungibleAbi.json
+RENFUNGIBLE_TOKEN_EVM_ABI=./tests/src/eth/reFungibleTokenAbi.json
+
 CONTRACT_HELPERS_STUBS=./pallets/evm-contract-helpers/src/stubs/
 CONTRACT_HELPERS_ABI=./tests/src/eth/util/contractHelpersAbi.json
 
@@ -21,7 +25,7 @@
 TESTS_API=./tests/src/eth/api/
 
 .PHONY: regenerate_solidity
-regenerate_solidity: UniqueFungible.sol UniqueNFT.sol ContractHelpers.sol CollectionHelpers.sol
+regenerate_solidity: UniqueFungible.sol UniqueNFT.sol UniqueRefungibleToken.sol ContractHelpers.sol CollectionHelpers.sol
 
 UniqueFungible.sol:
 	PACKAGE=pallet-fungible NAME=erc::gen_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
@@ -30,6 +34,10 @@
 UniqueNFT.sol:
 	PACKAGE=pallet-nonfungible NAME=erc::gen_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
 	PACKAGE=pallet-nonfungible NAME=erc::gen_impl OUTPUT=$(NONFUNGIBLE_EVM_STUBS)/$@ ./.maintain/scripts/generate_sol.sh
+	
+UniqueRefungibleToken.sol:
+	PACKAGE=pallet-refungible NAME=erc_token::gen_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
+	PACKAGE=pallet-refungible NAME=erc_token::gen_impl OUTPUT=$(REFUNGIBLE_EVM_STUBS)/$@ ./.maintain/scripts/generate_sol.sh
 
 ContractHelpers.sol:
 	PACKAGE=pallet-evm-contract-helpers NAME=eth::contract_helpers_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
@@ -47,6 +55,10 @@
 	INPUT=$(NONFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(NONFUNGIBLE_EVM_STUBS)/UniqueNFT.raw ./.maintain/scripts/compile_stub.sh
 	INPUT=$(NONFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(NONFUNGIBLE_EVM_ABI) ./.maintain/scripts/generate_abi.sh
 
+UniqueRefungibleToken: UniqueRefungibleToken.sol
+	INPUT=$(REFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(REFUNGIBLE_EVM_STUBS)/UniqueRefungibleToken.raw ./.maintain/scripts/compile_stub.sh
+	INPUT=$(REFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(RENFUNGIBLE_TOKEN_EVM_ABI) ./.maintain/scripts/generate_abi.sh
+
 ContractHelpers: ContractHelpers.sol
 	INPUT=$(CONTRACT_HELPERS_STUBS)/$< OUTPUT=$(CONTRACT_HELPERS_STUBS)/ContractHelpers.raw ./.maintain/scripts/compile_stub.sh
 	INPUT=$(CONTRACT_HELPERS_STUBS)/$< OUTPUT=$(CONTRACT_HELPERS_ABI) ./.maintain/scripts/generate_abi.sh
@@ -55,7 +67,7 @@
 	INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_STUBS)/CollectionHelpers.raw ./.maintain/scripts/compile_stub.sh
 	INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_ABI) ./.maintain/scripts/generate_abi.sh
 
-evm_stubs: UniqueFungible UniqueNFT ContractHelpers CollectionHelpers
+evm_stubs: UniqueFungible UniqueNFT UniqueRefungibleToken ContractHelpers CollectionHelpers
 
 .PHONY: _bench
 _bench:
addedclient/rpc/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/client/rpc/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+    This was an internal request to improve the web interface and support fractionalization event. 
+ 
\ No newline at end of file
modifiedclient/rpc/Cargo.tomldiffbeforeafterboth
--- a/client/rpc/Cargo.toml
+++ b/client/rpc/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "uc-rpc"
-version = "0.1.0"
+version = "0.1.1"
 license = "GPLv3"
 edition = "2021"
 
modifiedclient/rpc/src/lib.rsdiffbeforeafterboth
--- a/client/rpc/src/lib.rs
+++ b/client/rpc/src/lib.rs
@@ -77,6 +77,15 @@
 		at: Option<BlockHash>,
 	) -> Result<Option<CrossAccountId>>;
 
+	/// Returns 10 tokens owners in no particular order.
+	#[method(name = "unique_tokenOwners")]
+	fn token_owners(
+		&self,
+		collection: CollectionId,
+		token: TokenId,
+		at: Option<BlockHash>,
+	) -> Result<Vec<CrossAccountId>>;
+
 	/// Get the topmost token owner in the hierarchy of a possibly nested token.
 	#[method(name = "unique_topmostTokenOwner")]
 	fn topmost_token_owner(
@@ -510,6 +519,7 @@
 	pass_method!(next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Option<u64>, unique_api);
 	pass_method!(effective_collection_limits(collection_id: CollectionId) -> Option<CollectionLimits>, unique_api);
 	pass_method!(total_pieces(collection_id: CollectionId, token_id: TokenId) -> Option<u128>, unique_api);
+	pass_method!(token_owners(collection: CollectionId, token: TokenId) -> Vec<CrossAccountId>, unique_api);
 }
 
 #[allow(deprecated)]
addedpallets/common/CHANGELOG.MDdiffbeforeafterboth
--- /dev/null
+++ b/pallets/common/CHANGELOG.MD
@@ -0,0 +1,10 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.2] - 2022-07-20
+
+### Fixed
+
+-   Some methods in `#[solidity_interface]` for `CollectionHandle` had invalid
+    mutability modifiers, causing invalid stub/abi generation.
addedpallets/common/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/pallets/common/CHANGELOG.md
@@ -0,0 +1,12 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+    This was an internal request to improve the web interface and support fractionalization event. 
+
+ 
\ No newline at end of file
modifiedpallets/common/Cargo.tomldiffbeforeafterboth
--- a/pallets/common/Cargo.toml
+++ b/pallets/common/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "pallet-common"
-version = "0.1.0"
+version = "0.1.2"
 license = "GPLv3"
 edition = "2021"
 
modifiedpallets/common/src/dispatch.rsdiffbeforeafterboth
--- a/pallets/common/src/dispatch.rs
+++ b/pallets/common/src/dispatch.rs
@@ -1,3 +1,5 @@
+//! Module with interfaces for dispatching collections.
+
 use frame_support::{
 	dispatch::{
 		DispatchResultWithPostInfo, PostDispatchInfo, Weight, DispatchErrorWithPostInfo,
@@ -20,7 +22,10 @@
 	// submit_logs is measured as part of collection pallets
 }
 
-/// Helper function to implement substrate calls for common collection methods
+/// Helper function to implement substrate calls for common collection methods.
+///
+/// * `collection` - The collection on which to call the method.
+/// * `call` - The function in which to call the corresponding method from [`CommonCollectionOperations`].
 pub fn dispatch_tx<
 	T: Config,
 	C: FnOnce(&dyn CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,
@@ -64,15 +69,31 @@
 	result
 }
 
+/// Interface for working with different collections through the dispatcher.
 pub trait CollectionDispatch<T: Config> {
+	/// Create a collection. The collection will be created according to the value of [`data.mode`](CreateCollectionData::mode).
+	///
+	/// * `sender` - The user who will become the owner of the collection.
+	/// * `data` - Description of the created collection.
 	fn create(
 		sender: T::CrossAccountId,
 		data: CreateCollectionData<T::AccountId>,
 	) -> DispatchResult;
+
+	/// Delete the collection.
+	///
+	/// * `sender` - The owner of the collection.
+	/// * `handle` - Collection handle.
 	fn destroy(sender: T::CrossAccountId, handle: CollectionHandle<T>) -> DispatchResult;
 
+	/// Get a specialized collection from the handle.
+	///
+	/// * `handle` - Collection handle.
 	fn dispatch(handle: CollectionHandle<T>) -> Self;
+
+	/// Get the collection handle for the corresponding implementation.
 	fn into_inner(self) -> CollectionHandle<T>;
 
+	/// Get the implementation of [`CommonCollectionOperations`].
 	fn as_dyn(&self) -> &dyn CommonCollectionOperations<T>;
 }
modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -14,6 +14,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! This module contains the implementation of pallet methods for evm.
+
 use evm_coder::{
 	solidity_interface, solidity, ToLog,
 	types::*,
@@ -29,29 +31,40 @@
 
 use crate::{Pallet, CollectionHandle, Config, CollectionProperties};
 
+/// Events for ethereum collection helper.
 #[derive(ToLog)]
 pub enum CollectionHelpersEvents {
+	/// The collection has been created.
 	CollectionCreated {
+		/// Collection owner.
 		#[indexed]
 		owner: address,
+
+		/// Collection ID.
 		#[indexed]
 		collection_id: address,
 	},
 }
 
 /// Does not always represent a full collection, for RFT it is either
-/// collection (Implementing ERC721), or specific collection token (Implementing ERC20)
+/// collection (Implementing ERC721), or specific collection token (Implementing ERC20).
 pub trait CommonEvmHandler {
 	const CODE: &'static [u8];
 
+	/// Call precompiled handle.
 	fn call(self, handle: &mut impl PrecompileHandle) -> Option<PrecompileResult>;
 }
 
+/// @title A contract that allows you to work with collections.
 #[solidity_interface(name = "Collection")]
 impl<T: Config> CollectionHandle<T>
 where
 	T::AccountId: From<[u8; 32]>,
 {
+	/// Set collection property.
+	///
+	/// @param key Property key.
+	/// @param value Propery value.
 	fn set_collection_property(
 		&mut self,
 		caller: caller,
@@ -68,6 +81,9 @@
 			.map_err(dispatch_to_evm::<T>)
 	}
 
+	/// Delete collection property.
+	///
+	/// @param key Property key.
 	fn delete_collection_property(&mut self, caller: caller, key: string) -> Result<()> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let key = <Vec<u8>>::from(key)
@@ -77,7 +93,12 @@
 		<Pallet<T>>::delete_collection_property(self, &caller, key).map_err(dispatch_to_evm::<T>)
 	}
 
-	/// Throws error if key not found
+	/// Get collection property.
+	///
+	/// @dev Throws error if key not found.
+	///
+	/// @param key Property key.
+	/// @return bytes The property corresponding to the key.
 	fn collection_property(&self, key: string) -> Result<bytes> {
 		let key = <Vec<u8>>::from(key)
 			.try_into()
@@ -89,6 +110,11 @@
 		Ok(prop.to_vec())
 	}
 
+	/// Set the sponsor of the collection.
+	///
+	/// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+	///
+	/// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
 	fn set_collection_sponsor(&mut self, caller: caller, sponsor: address) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
 
@@ -98,6 +124,9 @@
 		save(self)
 	}
 
+	/// Collection sponsorship confirmation.
+	///
+	/// @dev After setting the sponsor for the collection, it must be confirmed with this function.
 	fn confirm_collection_sponsorship(&mut self, caller: caller) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		if !self
@@ -109,6 +138,16 @@
 		save(self)
 	}
 
+	/// Set limits for the collection.
+	/// @dev Throws error if limit not found.
+	/// @param limit Name of the limit. Valid names:
+	/// 	"accountTokenOwnershipLimit",
+	/// 	"sponsoredDataSize",
+	/// 	"sponsoredDataRateLimit",
+	/// 	"tokenLimit",
+	/// 	"sponsorTransferTimeout",
+	/// 	"sponsorApproveTimeout"
+	/// @param value Value of the limit.
 	#[solidity(rename_selector = "setCollectionLimit")]
 	fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
@@ -145,6 +184,13 @@
 		save(self)
 	}
 
+	/// Set limits for the collection.
+	/// @dev Throws error if limit not found.
+	/// @param limit Name of the limit. Valid names:
+	/// 	"ownerCanTransfer",
+	/// 	"ownerCanDestroy",
+	/// 	"transfersEnabled"
+	/// @param value Value of the limit.
 	#[solidity(rename_selector = "setCollectionLimit")]
 	fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
@@ -172,11 +218,18 @@
 		save(self)
 	}
 
+	/// Get contract address.
 	fn contract_address(&self, _caller: caller) -> Result<address> {
 		Ok(crate::eth::collection_id_to_address(self.id))
 	}
 
-	fn add_collection_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result<void> {
+	/// Add collection admin by substrate address.
+	/// @param new_admin Substrate administrator address.
+	fn add_collection_admin_substrate(
+		&mut self,
+		caller: caller,
+		new_admin: uint256,
+	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let mut new_admin_arr: [u8; 32] = Default::default();
 		new_admin.to_big_endian(&mut new_admin_arr);
@@ -186,35 +239,44 @@
 		Ok(())
 	}
 
+	/// Remove collection admin by substrate address.
+	/// @param admin Substrate administrator address.
 	fn remove_collection_admin_substrate(
-		&self,
+		&mut self,
 		caller: caller,
-		new_admin: uint256,
+		admin: uint256,
 	) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
-		let mut new_admin_arr: [u8; 32] = Default::default();
-		new_admin.to_big_endian(&mut new_admin_arr);
-		let account_id = T::AccountId::from(new_admin_arr);
-		let new_admin = T::CrossAccountId::from_sub(account_id);
-		<Pallet<T>>::toggle_admin(self, &caller, &new_admin, false)
-			.map_err(dispatch_to_evm::<T>)?;
+		let mut admin_arr: [u8; 32] = Default::default();
+		admin.to_big_endian(&mut admin_arr);
+		let account_id = T::AccountId::from(admin_arr);
+		let admin = T::CrossAccountId::from_sub(account_id);
+		<Pallet<T>>::toggle_admin(self, &caller, &admin, false).map_err(dispatch_to_evm::<T>)?;
 		Ok(())
 	}
 
-	fn add_collection_admin(&self, caller: caller, new_admin: address) -> Result<void> {
+	/// Add collection admin.
+	/// @param new_admin Address of the added administrator.
+	fn add_collection_admin(&mut self, caller: caller, new_admin: address) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let new_admin = T::CrossAccountId::from_eth(new_admin);
 		<Pallet<T>>::toggle_admin(self, &caller, &new_admin, true).map_err(dispatch_to_evm::<T>)?;
 		Ok(())
 	}
 
-	fn remove_collection_admin(&self, caller: caller, admin: address) -> Result<void> {
+	/// Remove collection admin.
+	///
+	/// @param new_admin Address of the removed administrator.
+	fn remove_collection_admin(&mut self, caller: caller, admin: address) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let admin = T::CrossAccountId::from_eth(admin);
 		<Pallet<T>>::toggle_admin(self, &caller, &admin, false).map_err(dispatch_to_evm::<T>)?;
 		Ok(())
 	}
 
+	/// Toggle accessibility of collection nesting.
+	///
+	/// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
 	#[solidity(rename_selector = "setCollectionNesting")]
 	fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
@@ -235,6 +297,10 @@
 		save(self)
 	}
 
+	/// Toggle accessibility of collection nesting.
+	///
+	/// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+	/// @param collections Addresses of collections that will be available for nesting.
 	#[solidity(rename_selector = "setCollectionNesting")]
 	fn set_nesting(
 		&mut self,
@@ -280,6 +346,10 @@
 		save(self)
 	}
 
+	/// Set the collection access method.
+	/// @param mode Access mode
+	/// 	0 for Normal
+	/// 	1 for AllowList
 	fn set_collection_access(&mut self, caller: caller, mode: uint8) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
 		let permissions = CollectionPermissions {
@@ -300,20 +370,29 @@
 		save(self)
 	}
 
-	fn add_to_collection_allow_list(&self, caller: caller, user: address) -> Result<void> {
+	/// Add the user to the allowed list.
+	///
+	/// @param user Address of a trusted user.
+	fn add_to_collection_allow_list(&mut self, caller: caller, user: address) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let user = T::CrossAccountId::from_eth(user);
 		<Pallet<T>>::toggle_allowlist(self, &caller, &user, true).map_err(dispatch_to_evm::<T>)?;
 		Ok(())
 	}
 
-	fn remove_from_collection_allow_list(&self, caller: caller, user: address) -> Result<void> {
+	/// Remove the user from the allowed list.
+	///
+	/// @param user Address of a removed user.
+	fn remove_from_collection_allow_list(&mut self, caller: caller, user: address) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let user = T::CrossAccountId::from_eth(user);
 		<Pallet<T>>::toggle_allowlist(self, &caller, &user, false).map_err(dispatch_to_evm::<T>)?;
 		Ok(())
 	}
 
+	/// Switch permission for minting.
+	///
+	/// @param mode Enable if "true".
 	fn set_collection_mint_mode(&mut self, caller: caller, mode: bool) -> Result<void> {
 		check_is_owner_or_admin(caller, self)?;
 		let permissions = CollectionPermissions {
@@ -351,6 +430,7 @@
 	Ok(())
 }
 
+/// Get the "tokenURI" key as [PropertyKey](up_data_structs::PropertyKey).
 pub fn token_uri_key() -> up_data_structs::PropertyKey {
 	b"tokenURI"
 		.to_vec()
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -14,6 +14,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! The module contains a number of functions for converting and checking ethereum identifiers.
+
 use up_data_structs::CollectionId;
 use sp_core::H160;
 
@@ -23,6 +25,7 @@
 	0x17, 0xc4, 0xe6, 0x45, 0x3c, 0xc4, 0x9a, 0xaa, 0xae, 0xac, 0xa8, 0x94, 0xe6, 0xd9, 0x68, 0x3e,
 ];
 
+/// Maps the ethereum address of the collection in substrate.
 pub fn map_eth_to_id(eth: &H160) -> Option<CollectionId> {
 	if eth[0..16] != ETH_COLLECTION_PREFIX {
 		return None;
@@ -31,6 +34,8 @@
 	id_bytes.copy_from_slice(&eth[16..20]);
 	Some(CollectionId(u32::from_be_bytes(id_bytes)))
 }
+
+/// Maps the substrate collection id in ethereum.
 pub fn collection_id_to_address(id: CollectionId) -> H160 {
 	let mut out = [0; 20];
 	out[0..16].copy_from_slice(&ETH_COLLECTION_PREFIX);
@@ -38,6 +43,7 @@
 	H160(out)
 }
 
+/// Check if the ethereum address is a collection.
 pub fn is_collection(address: &H160) -> bool {
 	address[0..16] == ETH_COLLECTION_PREFIX
 }
modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -14,8 +14,43 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! # Common pallet
+//!
+//! The Common pallet provides functionality for handling collections.
+//!
+//! ## Overview
+//!
+//! The Common pallet provides an interface for common collection operations for different collection types
+//! (see [CommonCollectionOperations]), as well as a generic dispatcher for these, see [dispatch] module.
+//! It also provides this functionality to EVM, see [erc] and [eth] modules.
+//!
+//! The Common pallet provides functions for:
+//!
+//! - Setting and approving collection sponsor.
+//! - Get\set\delete allow list.
+//! - Get\set\delete collection properties.
+//! - Get\set\delete collection property permissions.
+//! - Get\set\delete token property permissions.
+//! - Get\set\delete collection administrators.
+//! - Checking access permissions.
+//!
+//! ### Terminology
+//! **Collection sponsor** - For the collection, you can set a sponsor, at whose expense it will
+//! be possible to mint tokens.
+//!
+//! **Allow list** - List of users who have the right to minting tokens.
+//!
+//! **Collection properties** - Collection properties are simply key-value stores where various
+//! metadata can be placed.
+//!
+//! **Permissions on token properties** - For each property in the token can be set permission
+//! to change, see [`PropertyPermission`].
+//!
+//! **Collection administrator** - For a collection, you can set administrators who have the right
+//! to most actions on the collection.
+
+#![warn(missing_docs)]
 #![cfg_attr(not(feature = "std"), no_std)]
-
 extern crate alloc;
 
 use core::ops::{Deref, DerefMut};
@@ -90,14 +125,24 @@
 pub mod eth;
 pub mod weights;
 
+/// Weight info.
 pub type SelfWeightOf<T> = <T as Config>::WeightInfo;
 
+/// Collection handle contains information about collection data and id.
+/// Also provides functionality to count consumed gas.
+///
+/// CollectionHandle is used as a generic wrapper for collections of all types.
+/// It allows to perform common operations and queries on any collection type,
+/// both completely general for all, as well as their respective implementations of [`CommonCollectionOperations`].
 #[must_use = "Should call submit_logs or save, otherwise some data will be lost for evm side"]
 pub struct CollectionHandle<T: Config> {
+	/// Collection id
 	pub id: CollectionId,
 	collection: Collection<T::AccountId>,
+	/// Substrate recorder for counting consumed gas
 	pub recorder: SubstrateRecorder<T>,
 }
+
 impl<T: Config> WithRecorder<T> for CollectionHandle<T> {
 	fn recorder(&self) -> &SubstrateRecorder<T> {
 		&self.recorder
@@ -106,7 +151,9 @@
 		self.recorder
 	}
 }
+
 impl<T: Config> CollectionHandle<T> {
+	/// Same as [CollectionHandle::new] but with an explicit gas limit.
 	pub fn new_with_gas_limit(id: CollectionId, gas_limit: u64) -> Option<Self> {
 		<CollectionById<T>>::get(id).map(|collection| Self {
 			id,
@@ -115,6 +162,7 @@
 		})
 	}
 
+	/// Same as [CollectionHandle::new] but with an existed [`SubstrateRecorder`].
 	pub fn new_with_recorder(id: CollectionId, recorder: SubstrateRecorder<T>) -> Option<Self> {
 		<CollectionById<T>>::get(id).map(|collection| Self {
 			id,
@@ -123,14 +171,18 @@
 		})
 	}
 
+	/// Retrives collection data from storage and creates collection handle with default parameters.
+	/// If collection not found return `None`
 	pub fn new(id: CollectionId) -> Option<Self> {
 		Self::new_with_gas_limit(id, u64::MAX)
 	}
 
+	/// Same as [`CollectionHandle::new`] but if collection not found [CollectionNotFound](Error::CollectionNotFound) returned.
 	pub fn try_get(id: CollectionId) -> Result<Self, DispatchError> {
 		Ok(Self::new(id).ok_or(<Error<T>>::CollectionNotFound)?)
 	}
 
+	/// Consume gas for reading.
 	pub fn consume_store_reads(&self, reads: u64) -> evm_coder::execution::Result<()> {
 		self.recorder
 			.consume_gas(T::GasWeightMapping::weight_to_gas(
@@ -140,6 +192,7 @@
 			))
 	}
 
+	/// Consume gas for writing.
 	pub fn consume_store_writes(&self, writes: u64) -> evm_coder::execution::Result<()> {
 		self.recorder
 			.consume_gas(T::GasWeightMapping::weight_to_gas(
@@ -148,16 +201,27 @@
 					.saturating_mul(writes),
 			))
 	}
+
+	/// Save collection to storage.
 	pub fn save(self) -> DispatchResult {
 		<CollectionById<T>>::insert(self.id, self.collection);
 		Ok(())
 	}
 
+	/// Set collection sponsor.
+	///
+	/// Unique collections allows sponsoring for certain actions.
+	/// This method allows you to set the sponsor of the collection.
+	/// In order for sponsorship to become active, it must be confirmed through [`Self::confirm_sponsorship`].
 	pub fn set_sponsor(&mut self, sponsor: T::AccountId) -> DispatchResult {
 		self.collection.sponsorship = SponsorshipState::Unconfirmed(sponsor);
 		Ok(())
 	}
 
+	/// Confirm sponsorship
+	///
+	/// In order for the sponsorship to become active, the user set as the sponsor must confirm their participation.
+	/// Before confirming sponsorship, the user must be specified as the sponsor of the collection via [`Self::set_sponsor`].
 	pub fn confirm_sponsorship(&mut self, sender: &T::AccountId) -> Result<bool, DispatchError> {
 		if self.collection.sponsorship.pending_sponsor() != Some(sender) {
 			return Ok(false);
@@ -168,7 +232,7 @@
 	}
 
 	/// Checks that the collection was created with, and must be operated upon through **Unique API**.
-	/// Now check only the `external_collection` flag and if it's **true**, then return `CollectionIsExternal` error.
+	/// Now check only the `external_collection` flag and if it's **true**, then return [`Error::CollectionIsExternal`] error.
 	pub fn check_is_internal(&self) -> DispatchResult {
 		if self.external_collection {
 			return Err(<Error<T>>::CollectionIsExternal)?;
@@ -178,7 +242,7 @@
 	}
 
 	/// Checks that the collection was created with, and must be operated upon through an **assimilated API**.
-	/// Now check only the `external_collection` flag and if it's **false**, then return `CollectionIsInternal` error.
+	/// Now check only the `external_collection` flag and if it's **false**, then return [`Error::CollectionIsInternal`] error.
 	pub fn check_is_external(&self) -> DispatchResult {
 		if !self.external_collection {
 			return Err(<Error<T>>::CollectionIsInternal)?;
@@ -203,23 +267,34 @@
 }
 
 impl<T: Config> CollectionHandle<T> {
-	pub fn check_is_owner(&self, subject: &T::CrossAccountId) -> DispatchResult {
-		ensure!(*subject.as_sub() == self.owner, <Error<T>>::NoPermission);
+	/// Checks if the `user` is the owner of the collection.
+	pub fn check_is_owner(&self, user: &T::CrossAccountId) -> DispatchResult {
+		ensure!(*user.as_sub() == self.owner, <Error<T>>::NoPermission);
 		Ok(())
 	}
-	pub fn is_owner_or_admin(&self, subject: &T::CrossAccountId) -> bool {
-		*subject.as_sub() == self.owner || <IsAdmin<T>>::get((self.id, subject))
+
+	/// Returns **true** if the `user` is the owner or administrator of the collection.
+	pub fn is_owner_or_admin(&self, user: &T::CrossAccountId) -> bool {
+		*user.as_sub() == self.owner || <IsAdmin<T>>::get((self.id, user))
 	}
-	pub fn check_is_owner_or_admin(&self, subject: &T::CrossAccountId) -> DispatchResult {
-		ensure!(self.is_owner_or_admin(subject), <Error<T>>::NoPermission);
+
+	/// Checks if the `user` is the owner or administrator of the collection.
+	pub fn check_is_owner_or_admin(&self, user: &T::CrossAccountId) -> DispatchResult {
+		ensure!(self.is_owner_or_admin(user), <Error<T>>::NoPermission);
 		Ok(())
 	}
+
+	/// Return **true** if `user` was not allowed to have tokens, and he can ignore such restrictions.
 	pub fn ignores_allowance(&self, user: &T::CrossAccountId) -> bool {
 		self.limits.owner_can_transfer() && self.is_owner_or_admin(user)
 	}
+
+	/// Return **true** if `user` does not have enough token parts, and he can ignore such restrictions.
 	pub fn ignores_owned_amount(&self, user: &T::CrossAccountId) -> bool {
 		self.limits.owner_can_transfer() && self.is_owner_or_admin(user)
 	}
+
+	/// Checks if the user is in the allow list. If not [Error::AddressNotInAllowlist] returns.
 	pub fn check_allowlist(&self, user: &T::CrossAccountId) -> DispatchResult {
 		ensure!(
 			<Allowlist<T>>::get((self.id, user)),
@@ -249,21 +324,34 @@
 		+ TypeInfo
 		+ account::Config
 	{
+		/// Weight information for functions of this pallet.
 		type WeightInfo: WeightInfo;
+
+		/// Events compatible with [`frame_system::Config::Event`].
 		type Event: IsType<<Self as frame_system::Config>::Event> + From<Event<Self>>;
 
+		/// Handler of accounts and payment.
 		type Currency: Currency<Self::AccountId>;
 
+		/// Set price to create a collection.
 		#[pallet::constant]
 		type CollectionCreationPrice: Get<
 			<<Self as Config>::Currency as Currency<Self::AccountId>>::Balance,
 		>;
+
+		/// Dispatcher of operations on collections.
 		type CollectionDispatch: CollectionDispatch<Self>;
 
+		/// Account which holds the chain's treasury.
 		type TreasuryAccountId: Get<Self::AccountId>;
+
+		/// Address under which the CollectionHelper contract would be available.
 		type ContractAddress: Get<H160>;
 
+		/// Mapper for token addresses to Ethereum addresses.
 		type EvmTokenAddressMapping: TokenAddressMapping<H160>;
+
+		/// Mapper for token addresses to [`CrossAccountId`].
 		type CrossTokenAddressMapping: TokenAddressMapping<Self::CrossAccountId>;
 	}
 
@@ -276,6 +364,7 @@
 
 	#[pallet::extra_constants]
 	impl<T: Config> Pallet<T> {
+		/// Maximum admins per collection.
 		pub fn collection_admins_limit() -> u32 {
 			COLLECTION_ADMINS_LIMIT
 		}
@@ -285,116 +374,116 @@
 	#[pallet::generate_deposit(pub fn deposit_event)]
 	pub enum Event<T: Config> {
 		/// New collection was created
-		///
-		/// # Arguments
-		///
-		/// * collection_id - Globally unique identifier of newly created collection.
-		/// * mode - [CollectionMode] converted into u8.
-		/// * account_id - Collection owner.
-		CollectionCreated(CollectionId, u8, T::AccountId),
+		CollectionCreated(
+			/// Globally unique identifier of newly created collection.
+			CollectionId,
+			/// [`CollectionMode`] converted into _u8_.
+			u8,
+			/// Collection owner.
+			T::AccountId,
+		),
 
 		/// New collection was destroyed
-		///
-		/// # Arguments
-		///
-		/// * collection_id - Globally unique identifier of collection that has been destroyed.
-		CollectionDestroyed(CollectionId),
+		CollectionDestroyed(
+			/// Globally unique identifier of collection.
+			CollectionId,
+		),
 
 		/// New item was created.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection where the item was created.
-		/// * item_id - ID of the item. Unique within the collection.
-		/// * recipient - Owner of the newly created item.
-		/// * amount - The amount of tokens that were created (always 1 for NFT).
-		ItemCreated(CollectionId, TokenId, T::CrossAccountId, u128),
+		ItemCreated(
+			/// Id of the collection where item was created.
+			CollectionId,
+			/// Id of an item. Unique within the collection.
+			TokenId,
+			/// Owner of newly created item
+			T::CrossAccountId,
+			/// Always 1 for NFT
+			u128,
+		),
 
 		/// Collection item was burned.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - Identifier of the collection to which the burned NFT belonged.
-		/// * item_id - Identifier of burned NFT.
-		/// * owner - Which user has destroyed their tokens.
-		/// * amount - Amount of tokens that were destroyed (always 1 for NFT).
-		ItemDestroyed(CollectionId, TokenId, T::CrossAccountId, u128),
+		ItemDestroyed(
+			/// Id of the collection where item was destroyed.
+			CollectionId,
+			/// Identifier of burned NFT.
+			TokenId,
+			/// Which user has destroyed its tokens.
+			T::CrossAccountId,
+			/// Amount of token pieces destroed. Always 1 for NFT.
+			u128,
+		),
 
-		/// Item was transferred.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection to which the item belongs.
-		/// * item_id - ID of the item transferred.
-		/// * sender - Original owner of the item.
-		/// * recipient - New owner of the item.
-		/// * amount - Amount of tokens that were transferred (always 1 for NFT).
+		/// Item was transferred
 		Transfer(
+			/// Id of collection to which item is belong.
 			CollectionId,
+			/// Id of an item.
 			TokenId,
+			/// Original owner of item.
 			T::CrossAccountId,
+			/// New owner of item.
 			T::CrossAccountId,
+			/// Amount of token pieces transfered. Always 1 for NFT.
 			u128,
 		),
 
-		/// Sponsoring allowance was approved.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - todo:doc flesh out
-		/// * item_id
-		/// * sender
-		/// * spender
-		/// * amount
+		/// Amount pieces of token owned by `sender` was approved for `spender`.
 		Approved(
+			/// Id of collection to which item is belong.
 			CollectionId,
+			/// Id of an item.
 			TokenId,
+			/// Original owner of item.
 			T::CrossAccountId,
+			/// Id for which the approval was granted.
 			T::CrossAccountId,
+			/// Amount of token pieces transfered. Always 1 for NFT.
 			u128,
 		),
 
-		/// Collection property was added or edited.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection, whose property was just set.
-		/// * property_key - Key of the property that was just set.
-		CollectionPropertySet(CollectionId, PropertyKey),
+		/// The colletion property has been added or edited.
+		CollectionPropertySet(
+			/// Id of collection to which property has been set.
+			CollectionId,
+			/// The property that was set.
+			PropertyKey,
+		),
 
-		/// Collection property was deleted.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection, whose property was just deleted.
-		/// * property_key - Key of the property that was just deleted.
-		CollectionPropertyDeleted(CollectionId, PropertyKey),
+		/// The property has been deleted.
+		CollectionPropertyDeleted(
+			/// Id of collection to which property has been deleted.
+			CollectionId,
+			/// The property that was deleted.
+			PropertyKey,
+		),
 
-		/// Item property was added or edited.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection, whose token's property was just set.
-		/// * item_id - ID of the item, whose property was just set.
-		/// * property_key - Key of the property that was just set.
-		TokenPropertySet(CollectionId, TokenId, PropertyKey),
+		/// The token property has been added or edited.
+		TokenPropertySet(
+			/// Identifier of the collection whose token has the property set.
+			CollectionId,
+			/// The token for which the property was set.
+			TokenId,
+			/// The property that was set.
+			PropertyKey,
+		),
 
-		/// Item property was deleted.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection, whose token's property was just deleted.
-		/// * item_id - ID of the item, whose property was just deleted.
-		/// * property_key - Key of the property that was just deleted.
-		TokenPropertyDeleted(CollectionId, TokenId, PropertyKey),
+		/// The token property has been deleted.
+		TokenPropertyDeleted(
+			/// Identifier of the collection whose token has the property deleted.
+			CollectionId,
+			/// The token for which the property was deleted.
+			TokenId,
+			/// The property that was deleted.
+			PropertyKey,
+		),
 
-		/// Token property permission was added or updated for a collection.
-		///
-		/// # Arguments
-		///
-		/// * collection_id - ID of the collection, whose permissions were just set/updated.
-		/// * property_key - Key of the property of the set/updated permission.
-		PropertyPermissionSet(CollectionId, PropertyKey),
+		/// The token property permission of a collection has been set.
+		PropertyPermissionSet(
+			/// ID of collection to which property permission has been set.
+			CollectionId,
+			/// The property permission that was set.
+			PropertyKey,
+		),
 	}
 
 	#[pallet::error]
@@ -482,16 +571,16 @@
 		CollectionIsInternal,
 	}
 
-	/// The number of created collections. Essentially contains the last collection ID.
+	/// Storage of the count of created collections. Essentially contains the last collection ID.
 	#[pallet::storage]
 	pub type CreatedCollectionCount<T> = StorageValue<Value = CollectionId, QueryKind = ValueQuery>;
 
-	/// The number of destroyed collections
+	/// Storage of the count of deleted collections.
 	#[pallet::storage]
 	pub type DestroyedCollectionCount<T> =
 		StorageValue<Value = CollectionId, QueryKind = ValueQuery>;
 
-	/// Collection info
+	/// Storage of collection info.
 	#[pallet::storage]
 	pub type CollectionById<T> = StorageMap<
 		Hasher = Blake2_128Concat,
@@ -500,7 +589,7 @@
 		QueryKind = OptionQuery,
 	>;
 
-	/// Collection properties
+	/// Storage of collection properties.
 	#[pallet::storage]
 	#[pallet::getter(fn collection_properties)]
 	pub type CollectionProperties<T> = StorageMap<
@@ -511,7 +600,7 @@
 		OnEmpty = up_data_structs::CollectionProperties,
 	>;
 
-	/// Token permissions of a collection
+	/// Storage of token property permissions of a collection.
 	#[pallet::storage]
 	#[pallet::getter(fn property_permissions)]
 	pub type CollectionPropertyPermissions<T> = StorageMap<
@@ -521,7 +610,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// Amount of collection admins
+	/// Storage of the amount of collection admins.
 	#[pallet::storage]
 	pub type AdminAmount<T> = StorageMap<
 		Hasher = Blake2_128Concat,
@@ -530,7 +619,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// List of collection admins
+	/// List of collection admins.
 	#[pallet::storage]
 	pub type IsAdmin<T: Config> = StorageNMap<
 		Key = (
@@ -541,7 +630,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// Allowlisted collection users
+	/// Allowlisted collection users.
 	#[pallet::storage]
 	pub type Allowlist<T: Config> = StorageNMap<
 		Key = (
@@ -552,7 +641,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// Not used by code, exists only to provide some types to metadata
+	/// Not used by code, exists only to provide some types to metadata.
 	#[pallet::storage]
 	pub type DummyStorageValue<T: Config> = StorageValue<
 		Value = (
@@ -646,7 +735,9 @@
 }
 
 impl<T: Config> Pallet<T> {
-	/// Ethereum receiver 0x0000000000000000000000000000000000000000 is reserved, and shouldn't own tokens
+	/// Enshure that receiver address is correct.
+	///
+	/// Ethereum receiver 0x0000000000000000000000000000000000000000 is reserved, and shouldn't own tokens.
 	pub fn ensure_correct_receiver(receiver: &T::CrossAccountId) -> DispatchResult {
 		ensure!(
 			&T::CrossAccountId::from_eth(H160([0; 20])) != receiver,
@@ -654,19 +745,27 @@
 		);
 		Ok(())
 	}
+
+	/// Get a vector of collection admins.
 	pub fn adminlist(collection: CollectionId) -> Vec<T::CrossAccountId> {
 		<IsAdmin<T>>::iter_prefix((collection,))
 			.map(|(a, _)| a)
 			.collect()
 	}
+
+	/// Get a vector of users allowed to mint tokens.
 	pub fn allowlist(collection: CollectionId) -> Vec<T::CrossAccountId> {
 		<Allowlist<T>>::iter_prefix((collection,))
 			.map(|(a, _)| a)
 			.collect()
 	}
+
+	/// Is `user` allowed to mint token in `collection`.
 	pub fn allowed(collection: CollectionId, user: T::CrossAccountId) -> bool {
 		<Allowlist<T>>::get((collection, user))
 	}
+
+	/// Get statistics of collections.
 	pub fn collection_stats() -> CollectionStats {
 		let created = <CreatedCollectionCount<T>>::get();
 		let destroyed = <DestroyedCollectionCount<T>>::get();
@@ -677,6 +776,7 @@
 		}
 	}
 
+	/// Get the effective limits for the collection.
 	pub fn effective_collection_limits(collection: CollectionId) -> Option<CollectionLimits> {
 		let collection = <CollectionById<T>>::get(collection);
 		if collection.is_none() {
@@ -710,6 +810,7 @@
 		Some(effective_limits)
 	}
 
+	/// Returns information about the `collection` adapted for rpc.
 	pub fn rpc_collection(collection: CollectionId) -> Option<RpcCollection<T::AccountId>> {
 		let Collection {
 			name,
@@ -785,6 +886,11 @@
 }
 
 impl<T: Config> Pallet<T> {
+	/// Create new collection.
+	///
+	/// * `owner` - The owner of the collection.
+	/// * `data` - Description of the created collection.
+	/// * `is_external` - Marks that collection managet by not "Unique network".
 	pub fn init_collection(
 		owner: T::CrossAccountId,
 		data: CreateCollectionData<T::AccountId>,
@@ -860,7 +966,7 @@
 				),
 			);
 			<T as Config>::Currency::settle(
-				&owner.as_sub(),
+				owner.as_sub(),
 				imbalance,
 				WithdrawReasons::TRANSFER,
 				ExistenceRequirement::KeepAlive,
@@ -885,6 +991,10 @@
 		Ok(id)
 	}
 
+	/// Destroy collection.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
 	pub fn destroy_collection(
 		collection: CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -913,6 +1023,11 @@
 		Ok(())
 	}
 
+	/// Set collection property.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
+	/// * `property` - The property to set.
 	pub fn set_collection_property(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -931,6 +1046,11 @@
 		Ok(())
 	}
 
+	/// Set scouped collection property.
+	///
+	/// * `collection_id` - ID of the collection for which the property is being set.
+	/// * `scope` - Property scope.
+	/// * `property` - The property to set.
 	pub fn set_scoped_collection_property(
 		collection_id: CollectionId,
 		scope: PropertyScope,
@@ -944,6 +1064,11 @@
 		Ok(())
 	}
 
+	/// Set scouped collection properties.
+	///
+	/// * `collection_id` - ID of the collection for which the properties is being set.
+	/// * `scope` - Property scope.
+	/// * `properties` - The properties to set.
 	pub fn set_scoped_collection_properties(
 		collection_id: CollectionId,
 		scope: PropertyScope,
@@ -957,6 +1082,11 @@
 		Ok(())
 	}
 
+	/// Set collection properties.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
+	/// * `properties` - The properties to set.
 	#[transactional]
 	pub fn set_collection_properties(
 		collection: &CollectionHandle<T>,
@@ -970,6 +1100,11 @@
 		Ok(())
 	}
 
+	/// Delete collection property.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
+	/// * `property` - The property to delete.
 	pub fn delete_collection_property(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -990,6 +1125,11 @@
 		Ok(())
 	}
 
+	/// Delete collection properties.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
+	/// * `properties` - The properties to delete.
 	#[transactional]
 	pub fn delete_collection_properties(
 		collection: &CollectionHandle<T>,
@@ -1003,7 +1143,12 @@
 		Ok(())
 	}
 
-	// For migrations
+	/// Set collection propetry permission without any checks.
+	///
+	/// Used for migrations.
+	///
+	/// * `collection` - Collection handler.
+	/// * `property_permissions` - Property permissions.
 	pub fn set_property_permission_unchecked(
 		collection: CollectionId,
 		property_permission: PropertyKeyPermission,
@@ -1015,6 +1160,11 @@
 		Ok(())
 	}
 
+	/// Set collection property permission.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
+	/// * `property_permission` - Property permission.
 	pub fn set_property_permission(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -1045,6 +1195,11 @@
 		Ok(())
 	}
 
+	/// Set token property permission.
+	///
+	/// * `collection` - Collection handler.
+	/// * `sender` - The owner or administrator of the collection.
+	/// * `property_permissions` - Property permissions.
 	#[transactional]
 	pub fn set_token_property_permissions(
 		collection: &CollectionHandle<T>,
@@ -1058,6 +1213,7 @@
 		Ok(())
 	}
 
+	/// Get collection property.
 	pub fn get_collection_property(
 		collection_id: CollectionId,
 		key: &PropertyKey,
@@ -1065,6 +1221,7 @@
 		Self::collection_properties(collection_id).get(key).cloned()
 	}
 
+	/// Convert byte vector to property key vector.
 	pub fn bytes_keys_to_property_keys(
 		keys: Vec<Vec<u8>>,
 	) -> Result<Vec<PropertyKey>, DispatchError> {
@@ -1076,6 +1233,7 @@
 			.collect::<Result<Vec<PropertyKey>, DispatchError>>()
 	}
 
+	/// Get properties according to given keys.
 	pub fn filter_collection_properties(
 		collection_id: CollectionId,
 		keys: Option<Vec<PropertyKey>>,
@@ -1103,6 +1261,7 @@
 		Ok(properties)
 	}
 
+	/// Get property permissions according to given keys.
 	pub fn filter_property_permissions(
 		collection_id: CollectionId,
 		keys: Option<Vec<PropertyKey>>,
@@ -1132,6 +1291,7 @@
 		Ok(key_permissions)
 	}
 
+	/// Toggle `user` participation in the `collection`'s allow list.
 	pub fn toggle_allowlist(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -1151,6 +1311,7 @@
 		Ok(())
 	}
 
+	/// Toggle `user` participation in the `collection`'s admin list.
 	pub fn toggle_admin(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -1186,6 +1347,7 @@
 		Ok(())
 	}
 
+	/// Merge set fields from `new_limit` to `old_limit`.
 	pub fn clamp_limits(
 		mode: CollectionMode,
 		old_limit: &CollectionLimits,
@@ -1231,20 +1393,22 @@
 		Ok(new_limit)
 	}
 
+	/// Merge set fields from `new_permission` to `old_permission`.
 	pub fn clamp_permissions(
 		_mode: CollectionMode,
-		old_limit: &CollectionPermissions,
-		mut new_limit: CollectionPermissions,
+		old_permission: &CollectionPermissions,
+		mut new_permission: CollectionPermissions,
 	) -> Result<CollectionPermissions, DispatchError> {
-		limit_default_clone!(old_limit, new_limit,
+		limit_default_clone!(old_permission, new_permission,
 			access => {},
 			mint_mode => {},
 			nesting => { /* todo check for permissive, if only it gets out of benchmarks */ },
 		);
-		Ok(new_limit)
+		Ok(new_permission)
 	}
 }
 
+/// Indicates unsupported methods by returning [Error::UnsupportedOperation].
 #[macro_export]
 macro_rules! unsupported {
 	() => {
@@ -1252,32 +1416,72 @@
 	};
 }
 
-/// Worst cases
+/// Return weights for various worst-case operations.
 pub trait CommonWeightInfo<CrossAccountId> {
+	/// Weight of item creation.
 	fn create_item() -> Weight;
+
+	/// Weight of items creation.
 	fn create_multiple_items(amount: &[CreateItemData]) -> Weight;
+
+	/// Weight of items creation.
 	fn create_multiple_items_ex(cost: &CreateItemExData<CrossAccountId>) -> Weight;
+
+	/// The weight of the burning item.
 	fn burn_item() -> Weight;
+
+	/// Property setting weight.
+	///
+	/// * `amount`- The number of properties to set.
 	fn set_collection_properties(amount: u32) -> Weight;
+
+	/// Collection property deletion weight.
+	///
+	/// * `amount`- The number of properties to set.
 	fn delete_collection_properties(amount: u32) -> Weight;
+
+	/// Token property setting weight.
+	///
+	/// * `amount`- The number of properties to set.
 	fn set_token_properties(amount: u32) -> Weight;
+
+	/// Token property deletion weight.
+	///
+	/// * `amount`- The number of properties to delete.
 	fn delete_token_properties(amount: u32) -> Weight;
+
+	/// Token property permissions set weight.
+	///
+	/// * `amount`- The number of property permissions to set.
 	fn set_token_property_permissions(amount: u32) -> Weight;
+
+	/// Transfer price of the token or its parts.
 	fn transfer() -> Weight;
+
+	/// The price of setting the permission of the operation from another user.
 	fn approve() -> Weight;
+
+	/// Transfer price from another user.
 	fn transfer_from() -> Weight;
+
+	/// The price of burning a token from another user.
 	fn burn_from() -> Weight;
 
 	/// Differs from burn_item in case of Fungible and Refungible, as it should burn
-	/// whole users's balance
+	/// whole users's balance.
 	///
-	/// This method shouldn't be used directly, as it doesn't count breadth price, use `burn_recursively` instead
+	/// This method shouldn't be used directly, as it doesn't count breadth price, use [burn_recursively](CommonWeightInfo::burn_recursively) instead
 	fn burn_recursively_self_raw() -> Weight;
-	/// Cost of iterating over `amount` children while burning, without counting child burning itself
+
+	/// Cost of iterating over `amount` children while burning, without counting child burning itself.
 	///
-	/// This method shouldn't be used directly, as it doesn't count depth price, use `burn_recursively` instead
+	/// This method shouldn't be used directly, as it doesn't count depth price, use [burn_recursively](CommonWeightInfo::burn_recursively) instead
 	fn burn_recursively_breadth_raw(amount: u32) -> Weight;
 
+	/// The price of recursive burning a token.
+	///
+	/// `max_selfs` - The maximum burning weight of the token itself.
+	/// `max_breadth` - The maximum number of nested tokens to burn.
 	fn burn_recursively(max_selfs: u32, max_breadth: u32) -> Weight {
 		Self::burn_recursively_self_raw()
 			.saturating_mul(max_selfs.max(1) as u64)
@@ -1285,11 +1489,23 @@
 	}
 }
 
+/// Weight info extension trait for refungible pallet.
 pub trait RefungibleExtensionsWeightInfo {
+	/// Weight of token repartition.
 	fn repartition() -> Weight;
 }
 
+/// Common collection operations.
+///
+/// It wraps methods in Fungible, Nonfungible and Refungible pallets
+/// and adds weight info.
 pub trait CommonCollectionOperations<T: Config> {
+	/// Create token.
+	///
+	/// * `sender` - The user who mint the token and pays for the transaction.
+	/// * `to` - The user who will own the token.
+	/// * `data` - Token data.
+	/// * `nesting_budget` - A budget that can be spent on nesting tokens.
 	fn create_item(
 		&self,
 		sender: T::CrossAccountId,
@@ -1297,6 +1513,13 @@
 		data: CreateItemData,
 		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Create multiple tokens.
+	///
+	/// * `sender` - The user who mint the token and pays for the transaction.
+	/// * `to` - The user who will own the token.
+	/// * `data` - Token data.
+	/// * `nesting_budget` - A budget that can be spent on nesting tokens.
 	fn create_multiple_items(
 		&self,
 		sender: T::CrossAccountId,
@@ -1304,18 +1527,38 @@
 		data: Vec<CreateItemData>,
 		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Create multiple tokens.
+	///
+	/// * `sender` - The user who mint the token and pays for the transaction.
+	/// * `to` - The user who will own the token.
+	/// * `data` - Token data.
+	/// * `nesting_budget` - A budget that can be spent on nesting tokens.
 	fn create_multiple_items_ex(
 		&self,
 		sender: T::CrossAccountId,
 		data: CreateItemExData<T::CrossAccountId>,
 		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Burn token.
+	///
+	/// * `sender` - The user who owns the token.
+	/// * `token` - Token id that will burned.
+	/// * `amount` - The number of parts of the token that will be burned.
 	fn burn_item(
 		&self,
 		sender: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
 	) -> DispatchResultWithPostInfo;
+
+	/// Burn token and all nested tokens recursievly.
+	///
+	/// * `sender` - The user who owns the token.
+	/// * `token` - Token id that will burned.
+	/// * `self_budget` - The budget that can be spent on burning tokens.
+	/// * `breadth_budget` - The budget that can be spent on burning nested tokens.
 	fn burn_item_recursively(
 		&self,
 		sender: T::CrossAccountId,
@@ -1323,43 +1566,95 @@
 		self_budget: &dyn Budget,
 		breadth_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Set collection properties.
+	///
+	/// * `sender` - Must be either the owner of the collection or its admin.
+	/// * `properties` - Properties to be set.
 	fn set_collection_properties(
 		&self,
 		sender: T::CrossAccountId,
 		properties: Vec<Property>,
 	) -> DispatchResultWithPostInfo;
+
+	/// Delete collection properties.
+	///
+	/// * `sender` - Must be either the owner of the collection or its admin.
+	/// * `properties` - The properties to be removed.
 	fn delete_collection_properties(
 		&self,
 		sender: &T::CrossAccountId,
 		property_keys: Vec<PropertyKey>,
 	) -> DispatchResultWithPostInfo;
+
+	/// Set token properties.
+	///
+	/// The appropriate [`PropertyPermission`] for the token property
+	/// must be set with [`Self::set_token_property_permissions`].
+	///
+	/// * `sender` - Must be either the owner of the token or its admin.
+	/// * `token_id` - The token for which the properties are being set.
+	/// * `properties` - Properties to be set.
+	/// * `budget` - Budget for setting properties.
 	fn set_token_properties(
 		&self,
 		sender: T::CrossAccountId,
 		token_id: TokenId,
-		property: Vec<Property>,
-		nesting_budget: &dyn Budget,
+		properties: Vec<Property>,
+		budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Remove token properties.
+	///
+	/// The appropriate [`PropertyPermission`] for the token property
+	/// must be set with [`Self::set_token_property_permissions`].
+	///
+	/// * `sender` - Must be either the owner of the token or its admin.
+	/// * `token_id` - The token for which the properties are being remove.
+	/// * `property_keys` - Keys to remove corresponding properties.
+	/// * `budget` - Budget for removing properties.
 	fn delete_token_properties(
 		&self,
 		sender: T::CrossAccountId,
 		token_id: TokenId,
 		property_keys: Vec<PropertyKey>,
-		nesting_budget: &dyn Budget,
+		budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Set token property permissions.
+	///
+	/// * `sender` - Must be either the owner of the token or its admin.
+	/// * `token_id` - The token for which the properties are being set.
+	/// * `properties` - Properties to be set.
+	/// * `budget` - Budget for setting properties.
 	fn set_token_property_permissions(
 		&self,
 		sender: &T::CrossAccountId,
 		property_permissions: Vec<PropertyKeyPermission>,
 	) -> DispatchResultWithPostInfo;
+
+	/// Transfer amount of token pieces.
+	///
+	/// * `sender` - Donor user.
+	/// * `to` - Recepient user.
+	/// * `token` - The token of which parts are being sent.
+	/// * `amount` - The number of parts of the token that will be transferred.
+	/// * `budget` - The maximum budget that can be spent on the transfer.
 	fn transfer(
 		&self,
 		sender: T::CrossAccountId,
 		to: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
-		nesting_budget: &dyn Budget,
+		budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Grant access to another account to transfer parts of the token owned by the calling user via [Self::transfer_from].
+	///
+	/// * `sender` - The user who grants access to the token.
+	/// * `spender` - 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(
 		&self,
 		sender: T::CrossAccountId,
@@ -1367,6 +1662,17 @@
 		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`].
+	///
+	/// * `sender` - The user who must have access to the token (see [`Self::approve`]).
+	/// * `from` - The user who owns the token.
+	/// * `to` - Recepient user.
+	/// * `token` - The token of which parts are being sent.
+	/// * `amount` - The number of parts of the token that will be transferred.
+	/// * `budget` - The maximum budget that can be spent on the transfer.
 	fn transfer_from(
 		&self,
 		sender: T::CrossAccountId,
@@ -1374,67 +1680,145 @@
 		to: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
-		nesting_budget: &dyn Budget,
+		budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
+
+	/// Burn parts of a token owned by another user.
+	///
+	/// Before calling this method, you must grant rights to the calling user via [`Self::approve`].
+	///
+	/// * `sender` - The user who must have access to the token (see [`Self::approve`]).
+	/// * `from` - The user who owns the token.
+	/// * `token` - The token of which parts are being sent.
+	/// * `amount` - The number of parts of the token that will be transferred.
+	/// * `budget` - The maximum budget that can be spent on the burn.
 	fn burn_from(
 		&self,
 		sender: T::CrossAccountId,
 		from: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
-		nesting_budget: &dyn Budget,
+		budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
 
+	/// Check permission to nest token.
+	///
+	/// * `sender` - The user who initiated the check.
+	/// * `from` - The token that is checked for embedding.
+	/// * `under` - Token under which to check.
+	/// * `budget` - The maximum budget that can be spent on the check.
 	fn check_nesting(
 		&self,
 		sender: T::CrossAccountId,
 		from: (CollectionId, TokenId),
 		under: TokenId,
-		nesting_budget: &dyn Budget,
+		budget: &dyn Budget,
 	) -> DispatchResult;
 
+	/// Nest one token into another.
+	///
+	/// * `under` - Token holder.
+	/// * `to_nest` - Nested token.
 	fn nest(&self, under: TokenId, to_nest: (CollectionId, TokenId));
 
+	/// Unnest token.
+	///
+	/// * `under` - Token holder.
+	/// * `to_nest` - Token to unnest.
 	fn unnest(&self, under: TokenId, to_nest: (CollectionId, TokenId));
 
+	/// Get all user tokens.
+	///
+	/// * `account` - Account for which you need to get tokens.
 	fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId>;
+
+	/// Get all the tokens in the collection.
 	fn collection_tokens(&self) -> Vec<TokenId>;
+
+	/// Check if the token exists.
+	///
+	/// * `token` - Id token to check.
 	fn token_exists(&self, token: TokenId) -> bool;
+
+	/// Get the id of the last minted token.
 	fn last_token_id(&self) -> TokenId;
 
+	/// Get the owner of the token.
+	///
+	/// * `token` - The token for which you need to find out the owner.
 	fn token_owner(&self, token: TokenId) -> Option<T::CrossAccountId>;
+
+	/// Returns 10 tokens owners in no particular order.
+	///
+	/// * `token` - The token for which you need to find out the owners.
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId>;
+
+	/// Get the value of the token property by key.
+	///
+	/// * `token` - Token with the property to get.
+	/// * `key` - Property name.
 	fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue>;
-	fn token_properties(&self, token_id: TokenId, keys: Option<Vec<PropertyKey>>) -> Vec<Property>;
+
+	/// Get a set of token properties by key vector.
+	///
+	/// * `token` - Token with the property to get.
+	/// * `keys` - Vector of property keys. If this parameter is [None](sp_std::result::Result),
+	/// then all properties are returned.
+	fn token_properties(&self, token: TokenId, keys: Option<Vec<PropertyKey>>) -> Vec<Property>;
+
 	/// Amount of unique collection tokens
 	fn total_supply(&self) -> u32;
-	/// Amount of different tokens account has (Applicable to nonfungible/refungible)
+
+	/// Amount of different tokens account has.
+	///
+	/// * `account` - The account for which need to get the balance.
 	fn account_balance(&self, account: T::CrossAccountId) -> u32;
-	/// Amount of specific token account have (Applicable to fungible/refungible)
+
+	/// Amount of specific token account have.
 	fn balance(&self, account: T::CrossAccountId, token: TokenId) -> u128;
+
 	/// Amount of token pieces
 	fn total_pieces(&self, token: TokenId) -> Option<u128>;
+
+	/// Get the number of parts of the token that a trusted user can manage.
+	///
+	/// * `sender` - Trusted user.
+	/// * `spender` - Owner of the token.
+	/// * `token` - The token for which to get the value.
 	fn allowance(
 		&self,
 		sender: T::CrossAccountId,
 		spender: T::CrossAccountId,
 		token: TokenId,
 	) -> u128;
+
+	/// Get extension for RFT collection.
 	fn refungible_extensions(&self) -> Option<&dyn RefungibleExtensions<T>>;
 }
 
+/// Extension for RFT collection.
 pub trait RefungibleExtensions<T>
 where
 	T: Config,
 {
+	/// Change the number of parts of the token.
+	///
+	/// When the value changes down, this function is equivalent to burning parts of the token.
+	///
+	/// * `sender` - The user calling the repartition operation. Must be the owner of the token.
+	/// * `token` - The token for which you want to change the number of parts.
+	/// * `amount` - The new value of the parts of the token.
 	fn repartition(
 		&self,
-		owner: &T::CrossAccountId,
+		sender: &T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
 	) -> DispatchResultWithPostInfo;
 }
 
-// Flexible enough for implementing CommonCollectionOperations
+/// Merge [`DispatchResult`] with [`Weight`] into [`DispatchResultWithPostInfo`].
+///
+/// Used for [`CommonCollectionOperations`] implementations and flexible enough to do so.
 pub fn with_weight(res: DispatchResult, weight: Weight) -> DispatchResultWithPostInfo {
 	let post_info = PostDispatchInfo {
 		actual_weight: Some(weight),
modifiedpallets/evm-contract-helpers/src/stubs/ContractHelpers.rawdiffbeforeafterboth

binary blob — no preview

addedpallets/fungible/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/pallets/fungible/CHANGELOG.md
@@ -0,0 +1,13 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+    This was an internal request to improve the web interface and support fractionalization event. 
+    
+ 
+ 
\ No newline at end of file
modifiedpallets/fungible/Cargo.tomldiffbeforeafterboth
--- a/pallets/fungible/Cargo.toml
+++ b/pallets/fungible/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "pallet-fungible"
-version = "0.1.0"
+version = "0.1.1"
 license = "GPLv3"
 edition = "2021"
 
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -105,6 +105,8 @@
 	}
 }
 
+/// Implementation of `CommonCollectionOperations` for `FungibleHandle`. It wraps FungibleHandle Pallete
+/// methods and adds weight info.
 impl<T: Config> CommonCollectionOperations<T> for FungibleHandle<T> {
 	fn create_item(
 		&self,
@@ -360,6 +362,11 @@
 		None
 	}
 
+	/// Returns 10 tokens owners in no particular order.
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+		<Pallet<T>>::token_owners(self.id, token).unwrap_or_default()
+	}
+
 	fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
 		None
 	}
modifiedpallets/fungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -14,6 +14,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! ERC-20 standart support implementation.
+
 use core::char::{REPLACEMENT_CHARACTER, decode_utf16};
 use core::convert::TryInto;
 use evm_coder::{ToLog, execution::*, generate_stubgen, solidity_interface, types::*, weight};
modifiedpallets/fungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -14,6 +14,68 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! # Fungible Pallet
+//!
+//! The Fungible pallet provides functionality for dealing with fungible assets.
+//!
+//! - [`CreateItemData`]
+//! - [`Config`]
+//! - [`FungibleHandle`]
+//! - [`Pallet`]
+//! - [`TotalSupply`]
+//! - [`Balance`]
+//! - [`Allowance`]
+//! - [`Error`]
+//!
+//! ## Fungible tokens
+//!
+//! Fungible tokens or assets are divisible and non-unique. For instance,
+//! fiat currencies like the dollar are fungible: A $1 bill
+//! in New York City has the same value as a $1 bill in Miami.
+//! A fungible token can also be a cryptocurrency like Bitcoin: 1 BTC is worth 1 BTC,
+//! no matter where it is issued. Thus, the fungibility refers to a specific currency’s
+//! ability to maintain one standard value. As well, it needs to have uniform acceptance.
+//! This means that a currency’s history should not be able to affect its value,
+//! and this is due to the fact that each piece that is a part of the currency is equal
+//! in value when compared to every other piece of that exact same currency.
+//! In the world of cryptocurrencies, this is essentially a coin or a token
+//! that can be replaced by another identical coin or token, and they are
+//! both mutually interchangeable. A popular implementation of fungible tokens is
+//! the ERC-20 token standard.
+//!
+//! ### ERC-20
+//!
+//! The [ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) (Ethereum Request for Comments 20), proposed by Fabian Vogelsteller in November 2015,
+//! is a Token Standard that implements an API for tokens within Smart Contracts.
+//!
+//! Example functionalities ERC-20 provides:
+//!
+//! * transfer tokens from one account to another
+//! * get the current token balance of an account
+//! * get the total supply of the token available on the network
+//! * approve whether an amount of token from an account can be spent by a third-party account
+//!
+//! ## Overview
+//!
+//! The module provides functionality for asset management of fungible asset, supports ERC-20 standart, includes:
+//!
+//! * Asset Issuance
+//! * Asset Transferal
+//! * Asset Destruction
+//! * Delegated Asset Transfers
+//!
+//! **NOTE:** The created fungible asset always has `token_id` = 0.
+//! So `tokenA` and `tokenB` will have different `collection_id`.
+//!
+//! ### Implementations
+//!
+//! The Fungible pallet provides implementations for the following traits.
+//!
+//! - [`WithRecorder`](pallet_evm_coder_substrate::WithRecorder): Trait for EVM support
+//! - [`CommonCollectionOperations`](pallet_common::CommonCollectionOperations): Functions for dealing with collections
+//!	- [`CommonWeightInfo`](pallet_common::CommonWeightInfo): Functions for retrieval of transaction weight
+//! - [`CommonEvmHandler`](pallet_common::erc::CommonEvmHandler): Function for handling EVM runtime calls
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 use core::ops::Deref;
@@ -33,7 +95,7 @@
 use pallet_evm_coder_substrate::WithRecorder;
 use sp_core::H160;
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
-use sp_std::{collections::btree_map::BTreeMap};
+use sp_std::{collections::btree_map::BTreeMap, vec::Vec};
 
 pub use pallet::*;
 
@@ -44,7 +106,6 @@
 pub mod erc;
 pub mod weights;
 
-/// todo:doc?
 pub type CreateItemData<T> = (<T as pallet_evm::account::Config>::CrossAccountId, u128);
 pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
 
@@ -58,7 +119,7 @@
 	pub enum Error<T> {
 		/// Not Fungible item data used to mint in Fungible collection.
 		NotFungibleDataUsedToMintFungibleCollectionToken,
-		/// Not default id passed as TokenId argument.
+		/// Fungible tokens hold no ID, and the default value of TokenId for Fungible collection is 0.
 		FungibleItemsHaveNoId,
 		/// Tried to set data for fungible item.
 		FungibleItemsDontHaveData,
@@ -95,7 +156,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// todo:doc
+	/// Storage for assets delegated to a limited extent to other users.
 	#[pallet::storage]
 	pub type Allowance<T: Config> = StorageNMap<
 		Key = (
@@ -108,14 +169,22 @@
 	>;
 }
 
+/// Wrapper around untyped collection handle, asserting inner collection is of fungible type.
+/// Required for interaction with Fungible collections, type safety and implementation [`solidity_interface`][`evm_coder::solidity_interface`].
 pub struct FungibleHandle<T: Config>(pallet_common::CollectionHandle<T>);
+
+/// Implementation of methods required for dispatching during runtime.
 impl<T: Config> FungibleHandle<T> {
+	/// Casts [`CollectionHandle`][`pallet_common::CollectionHandle`] into [`FungibleHandle`].
 	pub fn cast(inner: pallet_common::CollectionHandle<T>) -> Self {
 		Self(inner)
 	}
+
+	/// Casts [`FungibleHandle`] into [`CollectionHandle`][`pallet_common::CollectionHandle`].
 	pub fn into_inner(self) -> pallet_common::CollectionHandle<T> {
 		self.0
 	}
+	/// Returns a mutable reference to the internal [`CollectionHandle`][`pallet_common::CollectionHandle`].
 	pub fn common_mut(&mut self) -> &mut pallet_common::CollectionHandle<T> {
 		&mut self.0
 	}
@@ -136,13 +205,17 @@
 	}
 }
 
+/// Pallet implementation for fungible assets
 impl<T: Config> Pallet<T> {
+	/// Initializes the collection. Returns [CollectionId] on success, [DispatchError] otherwise.
 	pub fn init_collection(
 		owner: T::CrossAccountId,
 		data: CreateCollectionData<T::AccountId>,
 	) -> Result<CollectionId, DispatchError> {
 		<PalletCommon<T>>::init_collection(owner, data, false)
 	}
+
+	/// Destroys a collection.
 	pub fn destroy_collection(
 		collection: FungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -163,10 +236,14 @@
 		Ok(())
 	}
 
+	///Checks if collection has tokens. Return `true` if it has.
 	fn collection_has_tokens(collection_id: CollectionId) -> bool {
 		<TotalSupply<T>>::get(collection_id) != 0
 	}
 
+	/// Burns the specified amount of the token. If the token balance
+	/// or total supply is less than the given value,
+	/// it will return [DispatchError].
 	pub fn burn(
 		collection: &FungibleHandle<T>,
 		owner: &T::CrossAccountId,
@@ -211,6 +288,13 @@
 		Ok(())
 	}
 
+	/// Transfers the specified amount of tokens. Will check that
+	/// the transfer is allowed for the token.
+	///
+	/// - `from`: Owner of tokens to transfer.
+	/// - `to`: Recepient of transfered tokens.
+	/// - `amount`: Amount of tokens to transfer.
+	/// - `collection`: Collection that contains the token
 	pub fn transfer(
 		collection: &FungibleHandle<T>,
 		from: &T::CrossAccountId,
@@ -281,6 +365,8 @@
 		Ok(())
 	}
 
+	/// Minting tokens for multiple IDs.
+	/// See [`create_item`][`Pallet::create_item`] for more details.
 	pub fn create_multiple_items(
 		collection: &FungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -382,6 +468,12 @@
 		));
 	}
 
+	/// Set allowance for the spender to `transfer` or `burn` owner's tokens.
+	///
+	/// - `collection`: Collection that contains the token
+	/// - `owner`: Owner of tokens that sets the allowance.
+	/// - `spender`: Recipient of the allowance rights.
+	/// - `amount`: Amount of tokens the spender is allowed to `transfer` or `burn`.
 	pub fn set_allowance(
 		collection: &FungibleHandle<T>,
 		owner: &T::CrossAccountId,
@@ -406,6 +498,13 @@
 		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.
+	///
+	/// - `collection`: Collection that contains the token.
+	/// - `spender`: CrossAccountId who has the allowance rights.
+	/// - `from`: The owner of the tokens who sets the allowance.
+	/// - `amount`: Amount of tokens by which the allowance sholud be reduced.
 	fn check_allowed(
 		collection: &FungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -445,6 +544,11 @@
 		Ok(allowance)
 	}
 
+	/// Transfer fungible tokens from one account to another.
+	/// Same as the [`transfer`][`Pallet::transfer`] but spender doesn't needs to be an owner of the token pieces.
+	/// The owner should set allowance for the spender to transfer pieces.
+	///	See [`set_allowance`][`Pallet::set_allowance`] for more details.
+
 	pub fn transfer_from(
 		collection: &FungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -464,6 +568,11 @@
 		Ok(())
 	}
 
+	/// Burn fungible tokens from the account.
+	///
+	/// Same as the [`burn`][`Pallet::burn`] but spender doesn't need to be an owner of the tokens. The `from` should
+	/// set allowance for the spender to burn tokens.
+	/// See [`set_allowance`][`Pallet::set_allowance`] for more details.
 	pub fn burn_from(
 		collection: &FungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -482,7 +591,13 @@
 		Ok(())
 	}
 
-	/// Delegated to `create_multiple_items`
+	///	Creates fungible token.
+	///
+	/// The sender should be the owner/admin of the collection or collection should be configured
+	/// to allow public minting.
+	///
+	/// - `data`: Contains user who will become the owners of the tokens and amount
+	///   of tokens he will receive.
 	pub fn create_item(
 		collection: &FungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -496,4 +611,26 @@
 			nesting_budget,
 		)
 	}
+
+	/// Returns 10 tokens owners in no particular order
+	///
+	/// There is no direct way to get token holders in ascending order,
+	/// since `iter_prefix` returns values in no particular order.
+	/// Therefore, getting the 10 largest holders with a large value of holders
+	/// can lead to impact memory allocation + sorting with  `n * log (n)`.
+	pub fn token_owners(
+		collection: CollectionId,
+		_token: TokenId,
+	) -> Option<Vec<T::CrossAccountId>> {
+		let res: Vec<T::CrossAccountId> = <Balance<T>>::iter_prefix((collection,))
+			.map(|(owner, _amount)| owner)
+			.take(10)
+			.collect();
+
+		if res.is_empty() {
+			None
+		} else {
+			Some(res)
+		}
+	}
 }
modifiedpallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth
--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -43,6 +43,233 @@
 	}
 }
 
+// Selector: 7d9262e6
+contract Collection is Dummy, ERC165 {
+	// Set collection property.
+	//
+	// @param key Property key.
+	// @param value Propery value.
+	//
+	// Selector: setCollectionProperty(string,bytes) 2f073f66
+	function setCollectionProperty(string memory key, bytes memory value)
+		public
+	{
+		require(false, stub_error);
+		key;
+		value;
+		dummy = 0;
+	}
+
+	// Delete collection property.
+	//
+	// @param key Property key.
+	//
+	// Selector: deleteCollectionProperty(string) 7b7debce
+	function deleteCollectionProperty(string memory key) public {
+		require(false, stub_error);
+		key;
+		dummy = 0;
+	}
+
+	// Get collection property.
+	//
+	// @dev Throws error if key not found.
+	//
+	// @param key Property key.
+	// @return bytes The property corresponding to the key.
+	//
+	// Selector: collectionProperty(string) cf24fd6d
+	function collectionProperty(string memory key)
+		public
+		view
+		returns (bytes memory)
+	{
+		require(false, stub_error);
+		key;
+		dummy;
+		return hex"";
+	}
+
+	// Set the sponsor of the collection.
+	//
+	// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+	//
+	// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+	//
+	// Selector: setCollectionSponsor(address) 7623402e
+	function setCollectionSponsor(address sponsor) public {
+		require(false, stub_error);
+		sponsor;
+		dummy = 0;
+	}
+
+	// Collection sponsorship confirmation.
+	//
+	// @dev After setting the sponsor for the collection, it must be confirmed with this function.
+	//
+	// Selector: confirmCollectionSponsorship() 3c50e97a
+	function confirmCollectionSponsorship() public {
+		require(false, stub_error);
+		dummy = 0;
+	}
+
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"accountTokenOwnershipLimit",
+	// 	"sponsoredDataSize",
+	// 	"sponsoredDataRateLimit",
+	// 	"tokenLimit",
+	// 	"sponsorTransferTimeout",
+	// 	"sponsorApproveTimeout"
+	// @param value Value of the limit.
+	//
+	// Selector: setCollectionLimit(string,uint32) 6a3841db
+	function setCollectionLimit(string memory limit, uint32 value) public {
+		require(false, stub_error);
+		limit;
+		value;
+		dummy = 0;
+	}
+
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"ownerCanTransfer",
+	// 	"ownerCanDestroy",
+	// 	"transfersEnabled"
+	// @param value Value of the limit.
+	//
+	// Selector: setCollectionLimit(string,bool) 993b7fba
+	function setCollectionLimit(string memory limit, bool value) public {
+		require(false, stub_error);
+		limit;
+		value;
+		dummy = 0;
+	}
+
+	// Get contract address.
+	//
+	// Selector: contractAddress() f6b4dfb4
+	function contractAddress() public view returns (address) {
+		require(false, stub_error);
+		dummy;
+		return 0x0000000000000000000000000000000000000000;
+	}
+
+	// Add collection admin by substrate address.
+	// @param new_admin Substrate administrator address.
+	//
+	// Selector: addCollectionAdminSubstrate(uint256) 5730062b
+	function addCollectionAdminSubstrate(uint256 newAdmin) public {
+		require(false, stub_error);
+		newAdmin;
+		dummy = 0;
+	}
+
+	// Remove collection admin by substrate address.
+	// @param admin Substrate administrator address.
+	//
+	// Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
+	function removeCollectionAdminSubstrate(uint256 admin) public {
+		require(false, stub_error);
+		admin;
+		dummy = 0;
+	}
+
+	// Add collection admin.
+	// @param new_admin Address of the added administrator.
+	//
+	// Selector: addCollectionAdmin(address) 92e462c7
+	function addCollectionAdmin(address newAdmin) public {
+		require(false, stub_error);
+		newAdmin;
+		dummy = 0;
+	}
+
+	// Remove collection admin.
+	//
+	// @param new_admin Address of the removed administrator.
+	//
+	// Selector: removeCollectionAdmin(address) fafd7b42
+	function removeCollectionAdmin(address admin) public {
+		require(false, stub_error);
+		admin;
+		dummy = 0;
+	}
+
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+	//
+	// Selector: setCollectionNesting(bool) 112d4586
+	function setCollectionNesting(bool enable) public {
+		require(false, stub_error);
+		enable;
+		dummy = 0;
+	}
+
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+	// @param collections Addresses of collections that will be available for nesting.
+	//
+	// Selector: setCollectionNesting(bool,address[]) 64872396
+	function setCollectionNesting(bool enable, address[] memory collections)
+		public
+	{
+		require(false, stub_error);
+		enable;
+		collections;
+		dummy = 0;
+	}
+
+	// Set the collection access method.
+	// @param mode Access mode
+	// 	0 for Normal
+	// 	1 for AllowList
+	//
+	// Selector: setCollectionAccess(uint8) 41835d4c
+	function setCollectionAccess(uint8 mode) public {
+		require(false, stub_error);
+		mode;
+		dummy = 0;
+	}
+
+	// Add the user to the allowed list.
+	//
+	// @param user Address of a trusted user.
+	//
+	// Selector: addToCollectionAllowList(address) 67844fe6
+	function addToCollectionAllowList(address user) public {
+		require(false, stub_error);
+		user;
+		dummy = 0;
+	}
+
+	// Remove the user from the allowed list.
+	//
+	// @param user Address of a removed user.
+	//
+	// Selector: removeFromCollectionAllowList(address) 85c51acb
+	function removeFromCollectionAllowList(address user) public {
+		require(false, stub_error);
+		user;
+		dummy = 0;
+	}
+
+	// Switch permission for minting.
+	//
+	// @param mode Enable if "true".
+	//
+	// Selector: setCollectionMintMode(bool) 00018e84
+	function setCollectionMintMode(bool mode) public {
+		require(false, stub_error);
+		mode;
+		dummy = 0;
+	}
+}
+
 // Selector: 942e8b22
 contract ERC20 is Dummy, ERC165, ERC20Events {
 	// Selector: name() 06fdde03
@@ -124,76 +351,6 @@
 		spender;
 		dummy;
 		return 0;
-	}
-}
-
-// Selector: c894dc35
-contract Collection is Dummy, ERC165 {
-	// Selector: setCollectionProperty(string,bytes) 2f073f66
-	function setCollectionProperty(string memory key, bytes memory value)
-		public
-	{
-		require(false, stub_error);
-		key;
-		value;
-		dummy = 0;
-	}
-
-	// Selector: deleteCollectionProperty(string) 7b7debce
-	function deleteCollectionProperty(string memory key) public {
-		require(false, stub_error);
-		key;
-		dummy = 0;
-	}
-
-	// Throws error if key not found
-	//
-	// Selector: collectionProperty(string) cf24fd6d
-	function collectionProperty(string memory key)
-		public
-		view
-		returns (bytes memory)
-	{
-		require(false, stub_error);
-		key;
-		dummy;
-		return hex"";
-	}
-
-	// Selector: ethSetSponsor(address) 8f9af356
-	function ethSetSponsor(address sponsor) public {
-		require(false, stub_error);
-		sponsor;
-		dummy = 0;
-	}
-
-	// Selector: ethConfirmSponsorship() a8580d1a
-	function ethConfirmSponsorship() public {
-		require(false, stub_error);
-		dummy = 0;
-	}
-
-	// Selector: setLimit(string,uint32) 68db30ca
-	function setLimit(string memory limit, uint32 value) public {
-		require(false, stub_error);
-		limit;
-		value;
-		dummy = 0;
-	}
-
-	// Selector: setLimit(string,bool) ea67e4c2
-	function setLimit(string memory limit, bool value) public {
-		require(false, stub_error);
-		limit;
-		value;
-		dummy = 0;
-	}
-
-	// Selector: contractAddress() f6b4dfb4
-	function contractAddress() public view returns (address) {
-		require(false, stub_error);
-		dummy;
-		return 0x0000000000000000000000000000000000000000;
 	}
 }
 
modifiedpallets/inflation/src/lib.rsdiffbeforeafterboth
--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -14,6 +14,20 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! # Inflation
+//!
+//! The inflation pallet is designed to increase the number of tokens at certain intervals.
+//! With each iteration, increases the `total_issuance` value for the native token.
+//! Executing an `on_initialize` hook at the beginning of each block, causing inflation to begin.
+//!
+//! ## Interface
+//!
+//! ### Dispatchable Functions
+//!
+//! * `start_inflation` - This method sets the inflation start date. Can be only called once.
+//! Inflation start block can be backdated and will catch up. The method will create Treasury
+//!	account if it does not exist and perform the first inflation deposit.
+
 // #![recursion_limit = "1024"]
 #![cfg_attr(not(feature = "std"), no_std)]
 
addedpallets/nonfungible/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/pallets/nonfungible/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+- Implementation of RPC method `token_owners`.
+   For reasons of compatibility with this pallet, returns only one owner if token exists.
+   This was an internal request to improve the web interface and support fractionalization event. 
\ No newline at end of file
modifiedpallets/nonfungible/Cargo.tomldiffbeforeafterboth
--- a/pallets/nonfungible/Cargo.toml
+++ b/pallets/nonfungible/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "pallet-nonfungible"
-version = "0.1.0"
+version = "0.1.1"
 license = "GPLv3"
 edition = "2021"
 
modifiedpallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/benchmarking.rs
+++ b/pallets/nonfungible/src/benchmarking.rs
@@ -183,7 +183,7 @@
 			value: property_value(),
 		}).collect::<Vec<_>>();
 		let item = create_max_item(&collection, &owner, owner.clone())?;
-	}: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props, false, &Unlimited)?}
+	}: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}
 
 	delete_token_properties {
 		let b in 0..MAX_PROPERTIES_PER_ITEM;
@@ -205,7 +205,7 @@
 			value: property_value(),
 		}).collect::<Vec<_>>();
 		let item = create_max_item(&collection, &owner, owner.clone())?;
-		<Pallet<T>>::set_token_properties(&collection, &owner, item, props, false, &Unlimited)?;
+		<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;
 		let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();
-	}: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete, &Unlimited)?}
+	}: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}
 }
modifiedpallets/nonfungible/src/common.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -26,7 +26,7 @@
 	weights::WeightInfo as _,
 };
 use sp_runtime::DispatchError;
-use sp_std::vec::Vec;
+use sp_std::{vec::Vec, vec};
 
 use crate::{
 	AccountBalance, Allowance, Config, CreateItemData, Error, NonfungibleHandle, Owned, Pallet,
@@ -133,6 +133,8 @@
 	}
 }
 
+/// Implementation of `CommonCollectionOperations` for `NonfungibleHandle`. It wraps Nonfungible Pallete
+/// methods and adds weight info.
 impl<T: Config> CommonCollectionOperations<T> for NonfungibleHandle<T> {
 	fn create_item(
 		&self,
@@ -420,6 +422,11 @@
 		<TokenData<T>>::get((self.id, token)).map(|t| t.owner)
 	}
 
+	/// Returns token owners.
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+		self.token_owner(token).map_or_else(|| vec![], |t| vec![t])
+	}
+
 	fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue> {
 		<Pallet<T>>::token_properties((self.id, token_id))
 			.get(key)
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -14,6 +14,11 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! # Nonfungible Pallet EVM API
+//!
+//! Provides ERC-721 standart support implementation and EVM API for unique extensions for Nonfungible Pallet.
+//! Method implementations are mostly doing parameter conversion and calling Nonfungible Pallet methods.
+
 extern crate alloc;
 use core::{
 	char::{REPLACEMENT_CHARACTER, decode_utf16},
@@ -40,8 +45,15 @@
 	SelfWeightOf, weights::WeightInfo, TokenProperties,
 };
 
+/// @title A contract that allows to set and delete token properties and change token property permissions.
 #[solidity_interface(name = "TokenProperties")]
 impl<T: Config> NonfungibleHandle<T> {
+	/// @notice Set permissions for token property.
+	/// @dev Throws error if `msg.sender` is not admin or owner of the collection.
+	/// @param key Property key.
+	/// @param is_mutable Permission to mutate property.
+	/// @param collection_admin Permission to mutate property by collection admin if property is mutable.
+	/// @param token_owner Permission to mutate property by token owner if property is mutable.
 	fn set_token_property_permission(
 		&mut self,
 		caller: caller,
@@ -68,6 +80,11 @@
 		.map_err(dispatch_to_evm::<T>)
 	}
 
+	/// @notice Set token property value.
+	/// @dev Throws error if `msg.sender` has no permission to edit the property.
+	/// @param tokenId ID of the token.
+	/// @param key Property key.
+	/// @param value Property value.
 	fn set_property(
 		&mut self,
 		caller: caller,
@@ -96,6 +113,10 @@
 		.map_err(dispatch_to_evm::<T>)
 	}
 
+	/// @notice Delete token property value.
+	/// @dev Throws error if `msg.sender` has no permission to edit the property.
+	/// @param tokenId ID of the token.
+	/// @param key Property key.
 	fn delete_property(&mut self, token_id: uint256, caller: caller, key: string) -> Result<()> {
 		let caller = T::CrossAccountId::from_eth(caller);
 		let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -111,7 +132,11 @@
 			.map_err(dispatch_to_evm::<T>)
 	}
 
-	/// Throws error if key not found
+	/// @notice Get token property value.
+	/// @dev Throws error if key not found
+	/// @param tokenId ID of the token.
+	/// @param key Property key.
+	/// @return Property value bytes
 	fn property(&self, token_id: uint256, key: string) -> Result<bytes> {
 		let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
 		let key = <Vec<u8>>::from(key)
@@ -127,6 +152,11 @@
 
 #[derive(ToLog)]
 pub enum ERC721Events {
+	/// @dev This emits when ownership of any NFT changes by any mechanism.
+	///  This event emits when NFTs are created (`from` == 0) and destroyed
+	///  (`to` == 0). Exception: during contract creation, any number of NFTs
+	///  may be created and assigned without emitting Transfer. At the time of
+	///  any transfer, the approved address for that NFT (if any) is reset to none.
 	Transfer {
 		#[indexed]
 		from: address,
@@ -135,6 +165,10 @@
 		#[indexed]
 		token_id: uint256,
 	},
+	/// @dev This emits when the approved address for an NFT is changed or
+	///  reaffirmed. The zero address indicates there is no approved address.
+	///  When a Transfer event emits, this also indicates that the approved
+	///  address for that NFT (if any) is reset to none.
 	Approval {
 		#[indexed]
 		owner: address,
@@ -143,6 +177,8 @@
 		#[indexed]
 		token_id: uint256,
 	},
+	/// @dev This emits when an operator is enabled or disabled for an owner.
+	///  The operator can manage all NFTs of the owner.
 	#[allow(dead_code)]
 	ApprovalForAll {
 		#[indexed]
@@ -159,19 +195,27 @@
 	MintingFinished {},
 }
 
+/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
 #[solidity_interface(name = "ERC721Metadata")]
 impl<T: Config> NonfungibleHandle<T> {
+	/// @notice A descriptive name for a collection of NFTs in this contract
 	fn name(&self) -> Result<string> {
 		Ok(decode_utf16(self.name.iter().copied())
 			.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
 			.collect::<string>())
 	}
 
+	/// @notice An abbreviated name for NFTs in this contract
 	fn symbol(&self) -> Result<string> {
 		Ok(string::from_utf8_lossy(&self.token_prefix).into())
 	}
 
-	/// Returns token's const_metadata
+	/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+	/// @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
+	///  3986. The URI may point to a JSON file that conforms to the "ERC721
+	///  Metadata JSON Schema".
+	/// @return token's const_metadata
 	#[solidity(rename_selector = "tokenURI")]
 	fn token_uri(&self, token_id: uint256) -> Result<string> {
 		let key = token_uri_key();
@@ -192,32 +236,53 @@
 	}
 }
 
+/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
 #[solidity_interface(name = "ERC721Enumerable")]
 impl<T: Config> NonfungibleHandle<T> {
+	/// @notice Enumerate valid NFTs
+	/// @param index A counter less than `totalSupply()`
+	/// @return The token identifier for the `index`th NFT,
+	///  (sort order not specified)
 	fn token_by_index(&self, index: uint256) -> Result<uint256> {
 		Ok(index)
 	}
 
-	/// Not implemented
+	/// @dev Not implemented
 	fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {
 		// TODO: Not implemetable
 		Err("not implemented".into())
 	}
 
+	/// @notice Count NFTs tracked by this contract
+	/// @return A count of valid NFTs tracked by this contract, where each one of
+	///  them has an assigned and queryable owner not equal to the zero address
 	fn total_supply(&self) -> Result<uint256> {
 		self.consume_store_reads(1)?;
 		Ok(<Pallet<T>>::total_supply(self).into())
 	}
 }
 
+/// @title ERC-721 Non-Fungible Token Standard
+/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 #[solidity_interface(name = "ERC721", events(ERC721Events))]
 impl<T: Config> NonfungibleHandle<T> {
+	/// @notice Count all NFTs assigned to an owner
+	/// @dev NFTs assigned to the zero address are considered invalid, and this
+	///  function throws for queries about the zero address.
+	/// @param owner An address for whom to query the balance
+	/// @return The number of NFTs owned by `owner`, possibly zero
 	fn balance_of(&self, owner: address) -> Result<uint256> {
 		self.consume_store_reads(1)?;
 		let owner = T::CrossAccountId::from_eth(owner);
 		let balance = <AccountBalance<T>>::get((self.id, owner));
 		Ok(balance.into())
 	}
+	/// @notice Find the owner of an NFT
+	/// @dev NFTs assigned to zero address are considered invalid, and queries
+	///  about them do throw.
+	/// @param tokenId The identifier for an NFT
+	/// @return The address of the owner of the NFT
 	fn owner_of(&self, token_id: uint256) -> Result<address> {
 		self.consume_store_reads(1)?;
 		let token: TokenId = token_id.try_into()?;
@@ -226,7 +291,7 @@
 			.owner
 			.as_eth())
 	}
-	/// Not implemented
+	/// @dev Not implemented
 	fn safe_transfer_from_with_data(
 		&mut self,
 		_from: address,
@@ -238,7 +303,7 @@
 		// TODO: Not implemetable
 		Err("not implemented".into())
 	}
-	/// Not implemented
+	/// @dev Not implemented
 	fn safe_transfer_from(
 		&mut self,
 		_from: address,
@@ -250,6 +315,16 @@
 		Err("not implemented".into())
 	}
 
+	/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+	///  TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+	///  THEY MAY BE PERMANENTLY LOST
+	/// @dev Throws unless `msg.sender` is the current owner or an authorized
+	///  operator for this NFT. Throws if `from` is not the current owner. Throws
+	///  if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+	/// @param from The current owner of the NFT
+	/// @param to The new owner
+	/// @param tokenId The NFT to transfer
+	/// @param _value Not used for an NFT
 	#[weight(<SelfWeightOf<T>>::transfer_from())]
 	fn transfer_from(
 		&mut self,
@@ -272,6 +347,12 @@
 		Ok(())
 	}
 
+	/// @notice Set or reaffirm the approved address for an NFT
+	/// @dev The zero address indicates there is no approved address.
+	/// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+	///  operator of the current owner.
+	/// @param approved The new approved NFT controller
+	/// @param tokenId The NFT to approve
 	#[weight(<SelfWeightOf<T>>::approve())]
 	fn approve(
 		&mut self,
@@ -289,7 +370,7 @@
 		Ok(())
 	}
 
-	/// Not implemented
+	/// @dev Not implemented
 	fn set_approval_for_all(
 		&mut self,
 		_caller: caller,
@@ -300,21 +381,26 @@
 		Err("not implemented".into())
 	}
 
-	/// Not implemented
+	/// @dev Not implemented
 	fn get_approved(&self, _token_id: uint256) -> Result<address> {
 		// TODO: Not implemetable
 		Err("not implemented".into())
 	}
 
-	/// Not implemented
+	/// @dev Not implemented
 	fn is_approved_for_all(&self, _owner: address, _operator: address) -> Result<address> {
 		// TODO: Not implemetable
 		Err("not implemented".into())
 	}
 }
 
+/// @title ERC721 Token that can be irreversibly burned (destroyed).
 #[solidity_interface(name = "ERC721Burnable")]
 impl<T: Config> NonfungibleHandle<T> {
+	/// @notice Burns a specific ERC721 token.
+	/// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+	///  operator of the current owner.
+	/// @param tokenId The NFT to approve
 	#[weight(<SelfWeightOf<T>>::burn_item())]
 	fn burn(&mut self, caller: caller, token_id: uint256) -> Result<void> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -325,14 +411,18 @@
 	}
 }
 
+/// @title ERC721 minting logic.
 #[solidity_interface(name = "ERC721Mintable", events(ERC721MintableEvents))]
 impl<T: Config> NonfungibleHandle<T> {
 	fn minting_finished(&self) -> Result<bool> {
 		Ok(false)
 	}
 
-	/// `token_id` should be obtained with `next_token_id` method,
-	/// unlike standard, you can't specify it manually
+	/// @notice Function to mint token.
+	/// @dev `tokenId` should be obtained with `nextTokenId` method,
+	///  unlike standard, you can't specify it manually
+	/// @param to The new owner
+	/// @param tokenId ID of the minted NFT
 	#[weight(<SelfWeightOf<T>>::create_item())]
 	fn mint(&mut self, caller: caller, to: address, token_id: uint256) -> Result<bool> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -364,8 +454,12 @@
 		Ok(true)
 	}
 
-	/// `token_id` should be obtained with `next_token_id` method,
-	/// unlike standard, you can't specify it manually
+	/// @notice Function to mint token with the given tokenUri.
+	/// @dev `tokenId` should be obtained with `nextTokenId` method,
+	///  unlike standard, you can't specify it manually
+	/// @param to The new owner
+	/// @param tokenId ID of the minted NFT
+	/// @param tokenUri Token URI that would be stored in the NFT properties
 	#[solidity(rename_selector = "mintWithTokenURI")]
 	#[weight(<SelfWeightOf<T>>::create_item())]
 	fn mint_with_token_uri(
@@ -420,7 +514,7 @@
 		Ok(true)
 	}
 
-	/// Not implemented
+	/// @dev Not implemented
 	fn finish_minting(&mut self, _caller: caller) -> Result<bool> {
 		Err("not implementable".into())
 	}
@@ -449,8 +543,15 @@
 	false
 }
 
+/// @title Unique extensions for ERC721.
 #[solidity_interface(name = "ERC721UniqueExtensions")]
 impl<T: Config> NonfungibleHandle<T> {
+	/// @notice Transfer ownership of an NFT
+	/// @dev Throws unless `msg.sender` is the current owner. Throws if `to`
+	///  is the zero address. Throws if `tokenId` is not a valid NFT.
+	/// @param to The new owner
+	/// @param tokenId The NFT to transfer
+	/// @param _value Not used for an NFT
 	#[weight(<SelfWeightOf<T>>::transfer())]
 	fn transfer(
 		&mut self,
@@ -470,6 +571,13 @@
 		Ok(())
 	}
 
+	/// @notice Burns a specific ERC721 token.
+	/// @dev Throws unless `msg.sender` is the current owner or an authorized
+	///  operator for this NFT. Throws if `from` is not the current owner. Throws
+	///  if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+	/// @param from The current owner of the NFT
+	/// @param tokenId The NFT to transfer
+	/// @param _value Not used for an NFT
 	#[weight(<SelfWeightOf<T>>::burn_from())]
 	fn burn_from(
 		&mut self,
@@ -490,6 +598,7 @@
 		Ok(())
 	}
 
+	/// @notice Returns next free NFT ID.
 	fn next_token_id(&self) -> Result<uint256> {
 		self.consume_store_reads(1)?;
 		Ok(<TokensMinted<T>>::get(self.id)
@@ -498,6 +607,11 @@
 			.into())
 	}
 
+	/// @notice Function to mint multiple tokens.
+	/// @dev `tokenIds` should be an array of consecutive numbers and first number
+	///  should be obtained with `nextTokenId` method
+	/// @param to The new owner
+	/// @param tokenIds IDs of the minted NFTs
 	#[weight(<SelfWeightOf<T>>::create_multiple_items(token_ids.len() as u32))]
 	fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {
 		let caller = T::CrossAccountId::from_eth(caller);
@@ -529,6 +643,11 @@
 		Ok(true)
 	}
 
+	/// @notice Function to mint multiple tokens with the given tokenUris.
+	/// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+	///  numbers and first number should be obtained with `nextTokenId` method
+	/// @param to The new owner
+	/// @param tokens array of pairs of token ID and token URI for minted tokens
 	#[solidity(rename_selector = "mintBulkWithTokenURI")]
 	#[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]
 	fn mint_bulk_with_token_uri(
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -14,6 +14,80 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! # Nonfungible Pallet
+//!
+//! The Nonfungible pallet provides functionality for handling nonfungible collections and tokens.
+//!
+//! - [`Config`]
+//! - [`NonfungibleHandle`]
+//! - [`Pallet`]
+//! - [`CommonWeights`](common::CommonWeights)
+//!
+//! ## Overview
+//!
+//! The Nonfungible pallet provides functions for:
+//!
+//! - NFT collection creation and removal
+//! - Minting and burning of NFT tokens
+//! - Retrieving account balances
+//! - Transfering NFT tokens
+//! - Setting and checking allowance for NFT tokens
+//! - Setting properties and permissions for NFT collections and tokens
+//! - Nesting and unnesting tokens
+//!
+//! ### Terminology
+//!
+//! - **NFT token:** Non fungible token.
+//!
+//! - **NFT Collection:** A collection of NFT tokens. All NFT tokens are part of a collection.
+//!   Each collection can define it's own properties, properties for it's tokens and set of permissions.
+//!
+//! - **Balance:** Number of NFT tokens owned by an account
+//!
+//! - **Allowance:** NFT tokens owned by one account that another account is allowed to make operations on
+//!
+//! - **Burning:** The process of “deleting” a token from a collection and from
+//!   an account balance of the owner.
+//!
+//! - **Nesting:** Setting up parent-child relationship between tokens. Nested tokens are inhereting
+//!   owner from their parent. There could be multiple levels of nesting. Token couldn't be nested in
+//!   it's child token i.e. parent-child relationship graph shouldn't have cycles.
+//!
+//! - **Properties:** Key-Values pairs. Token properties are attached to a token. Collection properties are
+//!   attached to a collection. Set of permissions could be defined for each property.
+//!
+//! ### Implementations
+//!
+//! The Nonfungible pallet provides implementations for the following traits. If these traits provide
+//! the functionality that you need, then you can avoid coupling with the Nonfungible pallet.
+//!
+//! - [`CommonWeightInfo`](pallet_common::CommonWeightInfo): Functions for retrieval of transaction weight
+//! - [`CommonCollectionOperations`](pallet_common::CommonCollectionOperations): Functions for dealing
+//!   with collections
+//!
+//! ## Interface
+//!
+//! ### Dispatchable Functions
+//!
+//! - `init_collection` - Create NFT collection. NFT collection can be configured to allow or deny access for
+//!   some accounts.
+//! - `destroy_collection` - Destroy exising NFT collection. There should be no tokens in the collection.
+//! - `burn` - Burn NFT token owned by account.
+//! - `transfer` - Transfer NFT token. Transfers should be enabled for NFT collection.
+//!   Nests the NFT token if it is sent to another token.
+//! - `create_item` - Mint NFT token in collection. Sender should have permission to mint tokens.
+//! - `set_allowance` - Set allowance for another account.
+//! - `set_token_property` - Set token property value.
+//! - `delete_token_property` - Remove property from the token.
+//! - `set_collection_properties` - Set collection properties.
+//! - `delete_collection_properties` - Remove properties from the collection.
+//! - `set_property_permission` - Set collection property permission.
+//! - `set_token_property_permissions` - Set token property permissions.
+//!
+//! ## Assumptions
+//!
+//! * To perform operations on tokens sender should be in collection's allow list if collection access mode is `AllowList`.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 use erc::ERC721Events;
@@ -56,8 +130,8 @@
 pub type CreateItemData<T> = CreateNftExData<<T as pallet_evm::account::Config>::CrossAccountId>;
 pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
 
-/// Token data, stored independently from other data used to describe it.
-/// Notably contains the owner account address.
+/// Token data, stored independently from other data used to describe it
+/// for the convenience of database access. Notably contains the owner account address.
 #[struct_versioning::versioned(version = 2, upper)]
 #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)]
 pub struct ItemData<CrossAccountId> {
@@ -122,7 +196,7 @@
 		QueryKind = OptionQuery,
 	>;
 
-	/// Key-value pairs, describing the metadata of a token.
+	/// Map of key-value pairs, describing the metadata of a token.
 	#[pallet::storage]
 	#[pallet::getter(fn token_properties)]
 	pub type TokenProperties<T: Config> = StorageNMap<
@@ -132,7 +206,15 @@
 		OnEmpty = up_data_structs::TokenProperties,
 	>;
 
-	/// Scoped, auxiliary properties of a token, primarily used for on-chain operations.
+	/// Custom data of a token that is serialized to bytes, 
+	/// primarily reserved for on-chain operations, 
+	/// normally obscured from the external users.
+	/// 
+	/// Auxiliary properties are slightly different from 
+	/// usual [`TokenProperties`] due to an unlimited number 
+	/// and separately stored and written-to key-value pairs.
+	/// 
+	/// Currently used to store RMRK data.
 	#[pallet::storage]
 	#[pallet::getter(fn token_aux_property)]
 	pub type TokenAuxProperties<T: Config> = StorageNMap<
@@ -171,7 +253,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// Amount of tokens owned in a collection.
+	/// Amount of tokens owned by an account in a collection.
 	#[pallet::storage]
 	pub type AccountBalance<T: Config> = StorageNMap<
 		Key = (
@@ -182,7 +264,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// todo:doc
+	/// Allowance set by a token owner for another user to perform one of certain transactions on a token.
 	#[pallet::storage]
 	pub type Allowance<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
@@ -284,13 +366,21 @@
 }
 
 impl<T: Config> Pallet<T> {
+	/// Get number of NFT tokens in collection.
 	pub fn total_supply(collection: &NonfungibleHandle<T>) -> u32 {
 		<TokensMinted<T>>::get(collection.id) - <TokensBurnt<T>>::get(collection.id)
 	}
+
+	/// Check that NFT token exists.
+	///
+	/// - `token`: Token ID.
 	pub fn token_exists(collection: &NonfungibleHandle<T>, token: TokenId) -> bool {
 		<TokenData<T>>::contains_key((collection.id, token))
 	}
 
+	/// Set the token property with the scope.
+	///
+	/// - `property`: Contains key-value pair.
 	pub fn set_scoped_token_property(
 		collection_id: CollectionId,
 		token_id: TokenId,
@@ -305,6 +395,7 @@
 		Ok(())
 	}
 
+	/// Batch operation to set multiple properties with the same scope.
 	pub fn set_scoped_token_properties(
 		collection_id: CollectionId,
 		token_id: TokenId,
@@ -319,6 +410,9 @@
 		Ok(())
 	}
 
+	/// Add or edit auxiliary data for the property.
+	///
+	/// - `f`: function that adds or edits auxiliary data.
 	pub fn try_mutate_token_aux_property<R, E>(
 		collection_id: CollectionId,
 		token_id: TokenId,
@@ -329,6 +423,7 @@
 		<TokenAuxProperties<T>>::try_mutate((collection_id, token_id, scope, key), f)
 	}
 
+	/// Remove auxiliary data for the property.
 	pub fn remove_token_aux_property(
 		collection_id: CollectionId,
 		token_id: TokenId,
@@ -338,6 +433,9 @@
 		<TokenAuxProperties<T>>::remove((collection_id, token_id, scope, key));
 	}
 
+	/// Get all auxiliary data in a given scope.
+	///
+	/// Returns iterator over Property Key - Data pairs.
 	pub fn iterate_token_aux_properties(
 		collection_id: CollectionId,
 		token_id: TokenId,
@@ -346,6 +444,7 @@
 		<TokenAuxProperties<T>>::iter_prefix((collection_id, token_id, scope))
 	}
 
+	/// Get ID of the last minted token
 	pub fn current_token_id(collection_id: CollectionId) -> TokenId {
 		TokenId(<TokensMinted<T>>::get(collection_id))
 	}
@@ -353,6 +452,11 @@
 
 // unchecked calls skips any permission checks
 impl<T: Config> Pallet<T> {
+	/// Create NFT collection
+	///
+	/// `init_collection` will take non-refundable deposit for collection creation.
+	///
+	/// - `data`: Contains settings for collection limits and permissions.
 	pub fn init_collection(
 		owner: T::CrossAccountId,
 		data: CreateCollectionData<T::AccountId>,
@@ -360,6 +464,11 @@
 	) -> Result<CollectionId, DispatchError> {
 		<PalletCommon<T>>::init_collection(owner, data, is_external)
 	}
+
+	/// Destroy NFT collection
+	///
+	/// `destroy_collection` will throw error if collection contains any tokens.
+	/// Only owner can destroy collection.
 	pub fn destroy_collection(
 		collection: NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -384,6 +493,15 @@
 		Ok(())
 	}
 
+	/// Burn NFT token
+	///
+	/// `burn` removes `token` from the `collection`, from it's owner and from the parent token
+	/// if the token is nested.
+	/// Only the owner can `burn` the token. The `token` shouldn't have any nested tokens.
+	/// Also removes all corresponding properties and auxiliary properties.
+	///
+	/// - `token`: Token that should be burned
+	/// - `collection`: Collection that contains the token
 	pub fn burn(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -453,6 +571,12 @@
 		Ok(())
 	}
 
+	/// Same as [`burn`] but burns all the tokens that are nested in the token first
+	///
+	/// - `self_budget`: Limit for searching children in depth.
+	/// - `breadth_budget`: Limit of breadth of searching children.
+	///
+	/// [`burn`]: struct.Pallet.html#method.burn
 	#[transactional]
 	pub fn burn_recursively(
 		collection: &NonfungibleHandle<T>,
@@ -492,6 +616,14 @@
 		})
 	}
 
+	/// Batch operation to add, edit or remove properties for the token
+	///
+	/// All affected properties should have mutable permission and sender should have
+	/// permission to edit those properties.
+	///
+	/// - `nesting_budget`: Limit for searching parents in depth to check ownership.
+	/// - `is_token_create`: Indicates that method is called during token initialization.
+	///   Allows to bypass ownership check.
 	#[transactional]
 	fn modify_token_properties(
 		collection: &NonfungibleHandle<T>,
@@ -585,6 +717,11 @@
 		Ok(())
 	}
 
+	/// Batch operation to add or edit properties for the token
+	///
+	/// Same as [`modify_token_properties`] but doesn't allow to remove properties
+	///
+	/// [`modify_token_properties`]: struct.Pallet.html#method.modify_token_properties
 	pub fn set_token_properties(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -603,6 +740,11 @@
 		)
 	}
 
+	/// Add or edit single property for the token
+	///
+	/// Calls [`set_token_properties`] internally
+	///
+	/// [`set_token_properties`]: struct.Pallet.html#method.set_token_properties
 	pub fn set_token_property(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -622,6 +764,11 @@
 		)
 	}
 
+	/// Batch operation to remove properties from the token
+	///
+	/// Same as [`modify_token_properties`] but doesn't allow to add or edit properties
+	///
+	/// [`modify_token_properties`]: struct.Pallet.html#method.modify_token_properties
 	pub fn delete_token_properties(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -641,6 +788,11 @@
 		)
 	}
 
+	/// Remove single property from the token
+	///
+	/// Calls [`delete_token_properties`] internally
+	///
+	/// [`delete_token_properties`]: struct.Pallet.html#method.delete_token_properties
 	pub fn delete_token_property(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -657,6 +809,7 @@
 		)
 	}
 
+	/// Add or edit properties for the collection
 	pub fn set_collection_properties(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -665,6 +818,7 @@
 		<PalletCommon<T>>::set_collection_properties(collection, sender, properties)
 	}
 
+	/// Remove properties from the collection
 	pub fn delete_collection_properties(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -673,6 +827,9 @@
 		<PalletCommon<T>>::delete_collection_properties(collection, sender, property_keys)
 	}
 
+	/// Set property permissions for the token.
+	///
+	/// Sender should be the owner or admin of token's collection.
 	pub fn set_token_property_permissions(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -681,6 +838,9 @@
 		<PalletCommon<T>>::set_token_property_permissions(collection, sender, property_permissions)
 	}
 
+	/// Set property permissions for the collection.
+	///
+	/// Sender should be the owner or admin of the collection.
 	pub fn set_property_permission(
 		collection: &CollectionHandle<T>,
 		sender: &T::CrossAccountId,
@@ -689,6 +849,15 @@
 		<PalletCommon<T>>::set_property_permission(collection, sender, permission)
 	}
 
+	/// Transfer NFT token from one account to another.
+	///
+	/// `from` account stops being the owner and `to` account becomes the owner of the token.
+	/// If `to` is token than `to` becomes owner of the token and the token become nested.
+	/// Unnests token from previous parent if it was nested before.
+	/// Removes allowance for the token if there was any.
+	/// Throws if transfers aren't allowed for collection or if receiver reached token ownership limit.
+	///
+	/// - `nesting_budget`: Limit for token nesting depth
 	pub fn transfer(
 		collection: &NonfungibleHandle<T>,
 		from: &T::CrossAccountId,
@@ -780,6 +949,16 @@
 		Ok(())
 	}
 
+	/// Batch operation to mint multiple NFT tokens.
+	///
+	/// The sender should be the owner/admin of the collection or collection should be configured
+	/// to allow public minting.
+	/// Throws if amount of tokens reached it's limit for the collection or if caller reached
+	/// token ownership limit.
+	///
+	/// - `data`: Contains list of token properties and users who will become the owners of the
+	///   corresponging tokens.
+	/// - `nesting_budget`: Limit for token nesting depth
 	pub fn create_multiple_items(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -964,6 +1143,9 @@
 		}
 	}
 
+	/// Set allowance for the spender to `transfer` or `burn` sender's token.
+	///
+	/// - `token`: Token the spender is allowed to `transfer` or `burn`.
 	pub fn set_allowance(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -996,6 +1178,7 @@
 		Ok(())
 	}
 
+	/// Checks allowance for the spender to use the token.
 	fn check_allowed(
 		collection: &NonfungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -1038,6 +1221,12 @@
 		Ok(())
 	}
 
+	/// Transfer NFT token from one account to another.
+	///
+	/// Same as the [`transfer`] but spender doesn't needs to be the owner of the token.
+	/// The owner should set allowance for the spender to transfer token.
+	///
+	/// [`transfer`]: struct.Pallet.html#method.transfer
 	pub fn transfer_from(
 		collection: &NonfungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -1054,6 +1243,12 @@
 		Self::transfer(collection, from, to, token, nesting_budget)
 	}
 
+	/// Burn NFT token for `from` account.
+	///
+	/// Same as the [`burn`] but spender doesn't need to be an owner of the token. The owner should
+	/// set allowance for the spender to burn token.
+	///
+	/// [`burn`]: struct.Pallet.html#method.burn
 	pub fn burn_from(
 		collection: &NonfungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -1068,6 +1263,8 @@
 		Self::burn(collection, from, token)
 	}
 
+	/// Check that `from` token could be nested in `under` token.
+	///
 	pub fn check_nesting(
 		handle: &NonfungibleHandle<T>,
 		sender: T::CrossAccountId,
@@ -1137,7 +1334,11 @@
 			.collect()
 	}
 
-	/// Delegated to `create_multiple_items`
+	/// Mint single NFT token.
+	///
+	/// Delegated to [`create_multiple_items`]
+	///
+	/// [`create_multiple_items`]: struct.Pallet.html#method.create_multiple_items
 	pub fn create_item(
 		collection: &NonfungibleHandle<T>,
 		sender: &T::CrossAccountId,
modifiedpallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -53,6 +53,13 @@
 
 // Selector: 41369377
 contract TokenProperties is Dummy, ERC165 {
+	// @notice Set permissions for token property.
+	// @dev Throws error if `msg.sender` is not admin or owner of the collection.
+	// @param key Property key.
+	// @param is_mutable Permission to mutate property.
+	// @param collection_admin Permission to mutate property by collection admin if property is mutable.
+	// @param token_owner Permission to mutate property by token owner if property is mutable.
+	//
 	// Selector: setTokenPropertyPermission(string,bool,bool,bool) 222d97fa
 	function setTokenPropertyPermission(
 		string memory key,
@@ -68,6 +75,12 @@
 		dummy = 0;
 	}
 
+	// @notice Set token property value.
+	// @dev Throws error if `msg.sender` has no permission to edit the property.
+	// @param tokenId ID of the token.
+	// @param key Property key.
+	// @param value Property value.
+	//
 	// Selector: setProperty(uint256,string,bytes) 1752d67b
 	function setProperty(
 		uint256 tokenId,
@@ -81,6 +94,11 @@
 		dummy = 0;
 	}
 
+	// @notice Delete token property value.
+	// @dev Throws error if `msg.sender` has no permission to edit the property.
+	// @param tokenId ID of the token.
+	// @param key Property key.
+	//
 	// Selector: deleteProperty(uint256,string) 066111d1
 	function deleteProperty(uint256 tokenId, string memory key) public {
 		require(false, stub_error);
@@ -89,7 +107,11 @@
 		dummy = 0;
 	}
 
-	// Throws error if key not found
+	// @notice Get token property value.
+	// @dev Throws error if key not found
+	// @param tokenId ID of the token.
+	// @param key Property key.
+	// @return Property value bytes
 	//
 	// Selector: property(uint256,string) 7228c327
 	function property(uint256 tokenId, string memory key)
@@ -107,6 +129,11 @@
 
 // Selector: 42966c68
 contract ERC721Burnable is Dummy, ERC165 {
+	// @notice Burns a specific ERC721 token.
+	// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+	//  operator of the current owner.
+	// @param tokenId The NFT to approve
+	//
 	// Selector: burn(uint256) 42966c68
 	function burn(uint256 tokenId) public {
 		require(false, stub_error);
@@ -117,6 +144,12 @@
 
 // Selector: 58800161
 contract ERC721 is Dummy, ERC165, ERC721Events {
+	// @notice Count all NFTs assigned to an owner
+	// @dev NFTs assigned to the zero address are considered invalid, and this
+	//  function throws for queries about the zero address.
+	// @param owner An address for whom to query the balance
+	// @return The number of NFTs owned by `owner`, possibly zero
+	//
 	// Selector: balanceOf(address) 70a08231
 	function balanceOf(address owner) public view returns (uint256) {
 		require(false, stub_error);
@@ -125,6 +158,12 @@
 		return 0;
 	}
 
+	// @notice Find the owner of an NFT
+	// @dev NFTs assigned to zero address are considered invalid, and queries
+	//  about them do throw.
+	// @param tokenId The identifier for an NFT
+	// @return The address of the owner of the NFT
+	//
 	// Selector: ownerOf(uint256) 6352211e
 	function ownerOf(uint256 tokenId) public view returns (address) {
 		require(false, stub_error);
@@ -133,7 +172,7 @@
 		return 0x0000000000000000000000000000000000000000;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: safeTransferFromWithData(address,address,uint256,bytes) 60a11672
 	function safeTransferFromWithData(
@@ -150,7 +189,7 @@
 		dummy = 0;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: safeTransferFrom(address,address,uint256) 42842e0e
 	function safeTransferFrom(
@@ -165,6 +204,17 @@
 		dummy = 0;
 	}
 
+	// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+	//  TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+	//  THEY MAY BE PERMANENTLY LOST
+	// @dev Throws unless `msg.sender` is the current owner or an authorized
+	//  operator for this NFT. Throws if `from` is not the current owner. Throws
+	//  if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+	// @param from The current owner of the NFT
+	// @param to The new owner
+	// @param tokenId The NFT to transfer
+	// @param _value Not used for an NFT
+	//
 	// Selector: transferFrom(address,address,uint256) 23b872dd
 	function transferFrom(
 		address from,
@@ -178,6 +228,13 @@
 		dummy = 0;
 	}
 
+	// @notice Set or reaffirm the approved address for an NFT
+	// @dev The zero address indicates there is no approved address.
+	// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+	//  operator of the current owner.
+	// @param approved The new approved NFT controller
+	// @param tokenId The NFT to approve
+	//
 	// Selector: approve(address,uint256) 095ea7b3
 	function approve(address approved, uint256 tokenId) public {
 		require(false, stub_error);
@@ -186,7 +243,7 @@
 		dummy = 0;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: setApprovalForAll(address,bool) a22cb465
 	function setApprovalForAll(address operator, bool approved) public {
@@ -196,7 +253,7 @@
 		dummy = 0;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: getApproved(uint256) 081812fc
 	function getApproved(uint256 tokenId) public view returns (address) {
@@ -206,7 +263,7 @@
 		return 0x0000000000000000000000000000000000000000;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: isApprovedForAll(address,address) e985e9c5
 	function isApprovedForAll(address owner, address operator)
@@ -224,6 +281,8 @@
 
 // Selector: 5b5e139f
 contract ERC721Metadata is Dummy, ERC165 {
+	// @notice A descriptive name for a collection of NFTs in this contract
+	//
 	// Selector: name() 06fdde03
 	function name() public view returns (string memory) {
 		require(false, stub_error);
@@ -231,6 +290,8 @@
 		return "";
 	}
 
+	// @notice An abbreviated name for NFTs in this contract
+	//
 	// Selector: symbol() 95d89b41
 	function symbol() public view returns (string memory) {
 		require(false, stub_error);
@@ -238,7 +299,11 @@
 		return "";
 	}
 
-	// Returns token's const_metadata
+	// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+	// @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
+	//  3986. The URI may point to a JSON file that conforms to the "ERC721
+	//  Metadata JSON Schema".
+	// @return token's const_metadata
 	//
 	// Selector: tokenURI(uint256) c87b56dd
 	function tokenURI(uint256 tokenId) public view returns (string memory) {
@@ -258,8 +323,11 @@
 		return false;
 	}
 
-	// `token_id` should be obtained with `next_token_id` method,
-	// unlike standard, you can't specify it manually
+	// @notice Function to mint token.
+	// @dev `tokenId` should be obtained with `nextTokenId` method,
+	//  unlike standard, you can't specify it manually
+	// @param to The new owner
+	// @param tokenId ID of the minted NFT
 	//
 	// Selector: mint(address,uint256) 40c10f19
 	function mint(address to, uint256 tokenId) public returns (bool) {
@@ -270,8 +338,12 @@
 		return false;
 	}
 
-	// `token_id` should be obtained with `next_token_id` method,
-	// unlike standard, you can't specify it manually
+	// @notice Function to mint token with the given tokenUri.
+	// @dev `tokenId` should be obtained with `nextTokenId` method,
+	//  unlike standard, you can't specify it manually
+	// @param to The new owner
+	// @param tokenId ID of the minted NFT
+	// @param tokenUri Token URI that would be stored in the NFT properties
 	//
 	// Selector: mintWithTokenURI(address,uint256,string) 50bb4e7f
 	function mintWithTokenURI(
@@ -287,7 +359,7 @@
 		return false;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: finishMinting() 7d64bcb4
 	function finishMinting() public returns (bool) {
@@ -299,6 +371,11 @@
 
 // Selector: 780e9d63
 contract ERC721Enumerable is Dummy, ERC165 {
+	// @notice Enumerate valid NFTs
+	// @param index A counter less than `totalSupply()`
+	// @return The token identifier for the `index`th NFT,
+	//  (sort order not specified)
+	//
 	// Selector: tokenByIndex(uint256) 4f6ccce7
 	function tokenByIndex(uint256 index) public view returns (uint256) {
 		require(false, stub_error);
@@ -307,7 +384,7 @@
 		return 0;
 	}
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59
 	function tokenOfOwnerByIndex(address owner, uint256 index)
@@ -322,6 +399,10 @@
 		return 0;
 	}
 
+	// @notice Count NFTs tracked by this contract
+	// @return A count of valid NFTs tracked by this contract, where each one of
+	//  them has an assigned and queryable owner not equal to the zero address
+	//
 	// Selector: totalSupply() 18160ddd
 	function totalSupply() public view returns (uint256) {
 		require(false, stub_error);
@@ -332,6 +413,11 @@
 
 // Selector: 7d9262e6
 contract Collection is Dummy, ERC165 {
+	// Set collection property.
+	//
+	// @param key Property key.
+	// @param value Propery value.
+	//
 	// Selector: setCollectionProperty(string,bytes) 2f073f66
 	function setCollectionProperty(string memory key, bytes memory value)
 		public
@@ -342,6 +428,10 @@
 		dummy = 0;
 	}
 
+	// Delete collection property.
+	//
+	// @param key Property key.
+	//
 	// Selector: deleteCollectionProperty(string) 7b7debce
 	function deleteCollectionProperty(string memory key) public {
 		require(false, stub_error);
@@ -349,8 +439,13 @@
 		dummy = 0;
 	}
 
-	// Throws error if key not found
+	// Get collection property.
+	//
+	// @dev Throws error if key not found.
 	//
+	// @param key Property key.
+	// @return bytes The property corresponding to the key.
+	//
 	// Selector: collectionProperty(string) cf24fd6d
 	function collectionProperty(string memory key)
 		public
@@ -363,6 +458,12 @@
 		return hex"";
 	}
 
+	// Set the sponsor of the collection.
+	//
+	// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+	//
+	// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+	//
 	// Selector: setCollectionSponsor(address) 7623402e
 	function setCollectionSponsor(address sponsor) public {
 		require(false, stub_error);
@@ -370,12 +471,27 @@
 		dummy = 0;
 	}
 
+	// Collection sponsorship confirmation.
+	//
+	// @dev After setting the sponsor for the collection, it must be confirmed with this function.
+	//
 	// Selector: confirmCollectionSponsorship() 3c50e97a
 	function confirmCollectionSponsorship() public {
 		require(false, stub_error);
 		dummy = 0;
 	}
 
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"accountTokenOwnershipLimit",
+	// 	"sponsoredDataSize",
+	// 	"sponsoredDataRateLimit",
+	// 	"tokenLimit",
+	// 	"sponsorTransferTimeout",
+	// 	"sponsorApproveTimeout"
+	// @param value Value of the limit.
+	//
 	// Selector: setCollectionLimit(string,uint32) 6a3841db
 	function setCollectionLimit(string memory limit, uint32 value) public {
 		require(false, stub_error);
@@ -384,6 +500,14 @@
 		dummy = 0;
 	}
 
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"ownerCanTransfer",
+	// 	"ownerCanDestroy",
+	// 	"transfersEnabled"
+	// @param value Value of the limit.
+	//
 	// Selector: setCollectionLimit(string,bool) 993b7fba
 	function setCollectionLimit(string memory limit, bool value) public {
 		require(false, stub_error);
@@ -392,6 +516,8 @@
 		dummy = 0;
 	}
 
+	// Get contract address.
+	//
 	// Selector: contractAddress() f6b4dfb4
 	function contractAddress() public view returns (address) {
 		require(false, stub_error);
@@ -399,34 +525,51 @@
 		return 0x0000000000000000000000000000000000000000;
 	}
 
+	// Add collection admin by substrate address.
+	// @param new_admin Substrate administrator address.
+	//
 	// Selector: addCollectionAdminSubstrate(uint256) 5730062b
-	function addCollectionAdminSubstrate(uint256 newAdmin) public view {
+	function addCollectionAdminSubstrate(uint256 newAdmin) public {
 		require(false, stub_error);
 		newAdmin;
-		dummy;
+		dummy = 0;
 	}
 
+	// Remove collection admin by substrate address.
+	// @param admin Substrate administrator address.
+	//
 	// Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
-	function removeCollectionAdminSubstrate(uint256 newAdmin) public view {
+	function removeCollectionAdminSubstrate(uint256 admin) public {
 		require(false, stub_error);
-		newAdmin;
-		dummy;
+		admin;
+		dummy = 0;
 	}
 
+	// Add collection admin.
+	// @param new_admin Address of the added administrator.
+	//
 	// Selector: addCollectionAdmin(address) 92e462c7
-	function addCollectionAdmin(address newAdmin) public view {
+	function addCollectionAdmin(address newAdmin) public {
 		require(false, stub_error);
 		newAdmin;
-		dummy;
+		dummy = 0;
 	}
 
+	// Remove collection admin.
+	//
+	// @param new_admin Address of the removed administrator.
+	//
 	// Selector: removeCollectionAdmin(address) fafd7b42
-	function removeCollectionAdmin(address admin) public view {
+	function removeCollectionAdmin(address admin) public {
 		require(false, stub_error);
 		admin;
-		dummy;
+		dummy = 0;
 	}
 
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+	//
 	// Selector: setCollectionNesting(bool) 112d4586
 	function setCollectionNesting(bool enable) public {
 		require(false, stub_error);
@@ -434,6 +577,11 @@
 		dummy = 0;
 	}
 
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+	// @param collections Addresses of collections that will be available for nesting.
+	//
 	// Selector: setCollectionNesting(bool,address[]) 64872396
 	function setCollectionNesting(bool enable, address[] memory collections)
 		public
@@ -444,6 +592,11 @@
 		dummy = 0;
 	}
 
+	// Set the collection access method.
+	// @param mode Access mode
+	// 	0 for Normal
+	// 	1 for AllowList
+	//
 	// Selector: setCollectionAccess(uint8) 41835d4c
 	function setCollectionAccess(uint8 mode) public {
 		require(false, stub_error);
@@ -451,20 +604,32 @@
 		dummy = 0;
 	}
 
+	// Add the user to the allowed list.
+	//
+	// @param user Address of a trusted user.
+	//
 	// Selector: addToCollectionAllowList(address) 67844fe6
-	function addToCollectionAllowList(address user) public view {
+	function addToCollectionAllowList(address user) public {
 		require(false, stub_error);
 		user;
-		dummy;
+		dummy = 0;
 	}
 
+	// Remove the user from the allowed list.
+	//
+	// @param user Address of a removed user.
+	//
 	// Selector: removeFromCollectionAllowList(address) 85c51acb
-	function removeFromCollectionAllowList(address user) public view {
+	function removeFromCollectionAllowList(address user) public {
 		require(false, stub_error);
 		user;
-		dummy;
+		dummy = 0;
 	}
 
+	// Switch permission for minting.
+	//
+	// @param mode Enable if "true".
+	//
 	// Selector: setCollectionMintMode(bool) 00018e84
 	function setCollectionMintMode(bool mode) public {
 		require(false, stub_error);
@@ -475,6 +640,13 @@
 
 // Selector: d74d154f
 contract ERC721UniqueExtensions is Dummy, ERC165 {
+	// @notice Transfer ownership of an NFT
+	// @dev Throws unless `msg.sender` is the current owner. Throws if `to`
+	//  is the zero address. Throws if `tokenId` is not a valid NFT.
+	// @param to The new owner
+	// @param tokenId The NFT to transfer
+	// @param _value Not used for an NFT
+	//
 	// Selector: transfer(address,uint256) a9059cbb
 	function transfer(address to, uint256 tokenId) public {
 		require(false, stub_error);
@@ -483,6 +655,14 @@
 		dummy = 0;
 	}
 
+	// @notice Burns a specific ERC721 token.
+	// @dev Throws unless `msg.sender` is the current owner or an authorized
+	//  operator for this NFT. Throws if `from` is not the current owner. Throws
+	//  if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+	// @param from The current owner of the NFT
+	// @param tokenId The NFT to transfer
+	// @param _value Not used for an NFT
+	//
 	// Selector: burnFrom(address,uint256) 79cc6790
 	function burnFrom(address from, uint256 tokenId) public {
 		require(false, stub_error);
@@ -491,6 +671,8 @@
 		dummy = 0;
 	}
 
+	// @notice Returns next free NFT ID.
+	//
 	// Selector: nextTokenId() 75794a3c
 	function nextTokenId() public view returns (uint256) {
 		require(false, stub_error);
@@ -498,6 +680,12 @@
 		return 0;
 	}
 
+	// @notice Function to mint multiple tokens.
+	// @dev `tokenIds` should be an array of consecutive numbers and first number
+	//  should be obtained with `nextTokenId` method
+	// @param to The new owner
+	// @param tokenIds IDs of the minted NFTs
+	//
 	// Selector: mintBulk(address,uint256[]) 44a9945e
 	function mintBulk(address to, uint256[] memory tokenIds)
 		public
@@ -510,6 +698,12 @@
 		return false;
 	}
 
+	// @notice Function to mint multiple tokens with the given tokenUris.
+	// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+	//  numbers and first number should be obtained with `nextTokenId` method
+	// @param to The new owner
+	// @param tokens array of pairs of token ID and token URI for minted tokens
+	//
 	// Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006
 	function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)
 		public
modifiedpallets/nonfungible/src/weights.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/weights.rs
+++ b/pallets/nonfungible/src/weights.rs
@@ -3,7 +3,7 @@
 //! Autogenerated weights for pallet_nonfungible
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-07-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
 
 // Executed Command:
@@ -56,7 +56,7 @@
 	// Storage: Nonfungible TokenData (r:0 w:1)
 	// Storage: Nonfungible Owned (r:0 w:1)
 	fn create_item() -> Weight {
-		(24_135_000 as Weight)
+		(20_328_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(4 as Weight))
 	}
@@ -65,9 +65,9 @@
 	// Storage: Nonfungible TokenData (r:0 w:4)
 	// Storage: Nonfungible Owned (r:0 w:4)
 	fn create_multiple_items(b: u32, ) -> Weight {
-		(21_952_000 as Weight)
-			// Standard Error: 5_000
-			.saturating_add((4_727_000 as Weight).saturating_mul(b as Weight))
+		(10_134_000 as Weight)
+			// Standard Error: 3_000
+			.saturating_add((4_927_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(b as Weight)))
@@ -77,9 +77,9 @@
 	// Storage: Nonfungible TokenData (r:0 w:4)
 	// Storage: Nonfungible Owned (r:0 w:4)
 	fn create_multiple_items_ex(b: u32, ) -> Weight {
-		(10_432_000 as Weight)
-			// Standard Error: 6_000
-			.saturating_add((7_383_000 as Weight).saturating_mul(b as Weight))
+		(5_710_000 as Weight)
+			// Standard Error: 4_000
+			.saturating_add((7_578_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -93,7 +93,7 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: Nonfungible TokenProperties (r:0 w:1)
 	fn burn_item() -> Weight {
-		(29_798_000 as Weight)
+		(28_433_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(5 as Weight))
 			.saturating_add(T::DbWeight::get().writes(5 as Weight))
 	}
@@ -105,7 +105,7 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: Nonfungible TokenProperties (r:0 w:1)
 	fn burn_recursively_self_raw() -> Weight {
-		(37_955_000 as Weight)
+		(34_435_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(5 as Weight))
 			.saturating_add(T::DbWeight::get().writes(5 as Weight))
 	}
@@ -119,8 +119,8 @@
 	// Storage: Common CollectionById (r:1 w:0)
 	fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight {
 		(0 as Weight)
-			// Standard Error: 1_349_000
-			.saturating_add((275_145_000 as Weight).saturating_mul(b as Weight))
+			// Standard Error: 1_539_000
+			.saturating_add((304_456_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(7 as Weight))
 			.saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
@@ -131,14 +131,14 @@
 	// Storage: Nonfungible Allowance (r:1 w:0)
 	// Storage: Nonfungible Owned (r:0 w:2)
 	fn transfer() -> Weight {
-		(27_867_000 as Weight)
+		(24_376_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(5 as Weight))
 	}
 	// Storage: Nonfungible TokenData (r:1 w:0)
 	// Storage: Nonfungible Allowance (r:1 w:1)
 	fn approve() -> Weight {
-		(18_824_000 as Weight)
+		(15_890_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
@@ -147,7 +147,7 @@
 	// Storage: Nonfungible AccountBalance (r:2 w:2)
 	// Storage: Nonfungible Owned (r:0 w:2)
 	fn transfer_from() -> Weight {
-		(32_879_000 as Weight)
+		(28_634_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
@@ -159,7 +159,7 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: Nonfungible TokenProperties (r:0 w:1)
 	fn burn_from() -> Weight {
-		(37_061_000 as Weight)
+		(32_201_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(5 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
@@ -167,28 +167,26 @@
 	fn set_token_property_permissions(b: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 57_000
-			.saturating_add((15_149_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((15_232_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
-	// Storage: Nonfungible TokenData (r:1 w:0)
 	// Storage: Nonfungible TokenProperties (r:1 w:1)
 	fn set_token_properties(b: u32, ) -> Weight {
 		(0 as Weight)
-			// Standard Error: 2_278_000
-			.saturating_add((409_613_000 as Weight).saturating_mul(b as Weight))
-			.saturating_add(T::DbWeight::get().reads(3 as Weight))
+			// Standard Error: 1_648_000
+			.saturating_add((288_654_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
-	// Storage: Nonfungible TokenData (r:1 w:0)
 	// Storage: Nonfungible TokenProperties (r:1 w:1)
 	fn delete_token_properties(b: u32, ) -> Weight {
 		(0 as Weight)
-			// Standard Error: 2_234_000
-			.saturating_add((408_185_000 as Weight).saturating_mul(b as Weight))
-			.saturating_add(T::DbWeight::get().reads(3 as Weight))
+			// Standard Error: 1_632_000
+			.saturating_add((289_190_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 }
@@ -200,7 +198,7 @@
 	// Storage: Nonfungible TokenData (r:0 w:1)
 	// Storage: Nonfungible Owned (r:0 w:1)
 	fn create_item() -> Weight {
-		(24_135_000 as Weight)
+		(20_328_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(4 as Weight))
 	}
@@ -209,9 +207,9 @@
 	// Storage: Nonfungible TokenData (r:0 w:4)
 	// Storage: Nonfungible Owned (r:0 w:4)
 	fn create_multiple_items(b: u32, ) -> Weight {
-		(21_952_000 as Weight)
-			// Standard Error: 5_000
-			.saturating_add((4_727_000 as Weight).saturating_mul(b as Weight))
+		(10_134_000 as Weight)
+			// Standard Error: 3_000
+			.saturating_add((4_927_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(b as Weight)))
@@ -221,9 +219,9 @@
 	// Storage: Nonfungible TokenData (r:0 w:4)
 	// Storage: Nonfungible Owned (r:0 w:4)
 	fn create_multiple_items_ex(b: u32, ) -> Weight {
-		(10_432_000 as Weight)
-			// Standard Error: 6_000
-			.saturating_add((7_383_000 as Weight).saturating_mul(b as Weight))
+		(5_710_000 as Weight)
+			// Standard Error: 4_000
+			.saturating_add((7_578_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(1 as Weight))
 			.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
@@ -237,7 +235,7 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: Nonfungible TokenProperties (r:0 w:1)
 	fn burn_item() -> Weight {
-		(29_798_000 as Weight)
+		(28_433_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(5 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(5 as Weight))
 	}
@@ -249,7 +247,7 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: Nonfungible TokenProperties (r:0 w:1)
 	fn burn_recursively_self_raw() -> Weight {
-		(37_955_000 as Weight)
+		(34_435_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(5 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(5 as Weight))
 	}
@@ -263,8 +261,8 @@
 	// Storage: Common CollectionById (r:1 w:0)
 	fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight {
 		(0 as Weight)
-			// Standard Error: 1_349_000
-			.saturating_add((275_145_000 as Weight).saturating_mul(b as Weight))
+			// Standard Error: 1_539_000
+			.saturating_add((304_456_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(7 as Weight))
 			.saturating_add(RocksDbWeight::get().reads((4 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(RocksDbWeight::get().writes(6 as Weight))
@@ -275,14 +273,14 @@
 	// Storage: Nonfungible Allowance (r:1 w:0)
 	// Storage: Nonfungible Owned (r:0 w:2)
 	fn transfer() -> Weight {
-		(27_867_000 as Weight)
+		(24_376_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(5 as Weight))
 	}
 	// Storage: Nonfungible TokenData (r:1 w:0)
 	// Storage: Nonfungible Allowance (r:1 w:1)
 	fn approve() -> Weight {
-		(18_824_000 as Weight)
+		(15_890_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
 	}
@@ -291,7 +289,7 @@
 	// Storage: Nonfungible AccountBalance (r:2 w:2)
 	// Storage: Nonfungible Owned (r:0 w:2)
 	fn transfer_from() -> Weight {
-		(32_879_000 as Weight)
+		(28_634_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(6 as Weight))
 	}
@@ -303,7 +301,7 @@
 	// Storage: Nonfungible Owned (r:0 w:1)
 	// Storage: Nonfungible TokenProperties (r:0 w:1)
 	fn burn_from() -> Weight {
-		(37_061_000 as Weight)
+		(32_201_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(5 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(6 as Weight))
 	}
@@ -311,28 +309,26 @@
 	fn set_token_property_permissions(b: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 57_000
-			.saturating_add((15_149_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((15_232_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(1 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
-	// Storage: Nonfungible TokenData (r:1 w:0)
 	// Storage: Nonfungible TokenProperties (r:1 w:1)
 	fn set_token_properties(b: u32, ) -> Weight {
 		(0 as Weight)
-			// Standard Error: 2_278_000
-			.saturating_add((409_613_000 as Weight).saturating_mul(b as Weight))
-			.saturating_add(RocksDbWeight::get().reads(3 as Weight))
+			// Standard Error: 1_648_000
+			.saturating_add((288_654_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
-	// Storage: Nonfungible TokenData (r:1 w:0)
 	// Storage: Nonfungible TokenProperties (r:1 w:1)
 	fn delete_token_properties(b: u32, ) -> Weight {
 		(0 as Weight)
-			// Standard Error: 2_234_000
-			.saturating_add((408_185_000 as Weight).saturating_mul(b as Weight))
-			.saturating_add(RocksDbWeight::get().reads(3 as Weight))
+			// Standard Error: 1_632_000
+			.saturating_add((289_190_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
 	}
 }
addedpallets/refungible/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/pallets/refungible/CHANGELOG.md
@@ -0,0 +1,18 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [v0.1.2] - 2022-07-14
+
+### Other changes
+
+feat(refungible-pallet): add ERC-20 EVM API for RFT token pieces ([#413](https://github.com/UniqueNetwork/unique-chain/pull/413))
+test(refungible-pallet): add tests for ERC-20 EVM API for RFT token pieces ([#413](https://github.com/UniqueNetwork/unique-chain/pull/413))
+
+## [v0.1.1] - 2022-07-14
+
+### Other changes
+
+- feat: RPC method `token_owners` returning 10 owners in no particular order.
+
+This was an internal request to improve the web interface and support fractionalization event. 
modifiedpallets/refungible/Cargo.tomldiffbeforeafterboth
--- a/pallets/refungible/Cargo.toml
+++ b/pallets/refungible/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "pallet-refungible"
-version = "0.1.0"
+version = "0.1.2"
 license = "GPLv3"
 edition = "2021"
 
@@ -11,36 +11,43 @@
 version = '3.1.2'
 
 [dependencies]
-frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" }
+evm-coder = { default-features = false, path = '../../crates/evm-coder' }
+pallet-evm-coder-substrate = { default-features = false, path = '../../pallets/evm-coder-substrate' }
 pallet-common = { default-features = false, path = '../common' }
 pallet-structure = { default-features = false, path = '../structure' }
+struct-versioning = { path = "../../crates/struct-versioning" }
 up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
+
+ethereum = { version = "0.12.0", default-features = false }
+scale-info = { version = "2.0.1", default-features = false, features = ["derive",] }
+
 frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-scale-info = { version = "2.0.1", default-features = false, features = [
-    "derive",
-] }
-struct-versioning = { path = "../../crates/struct-versioning" }
+frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" }
+sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
 
 [features]
 default = ["std"]
 std = [
+    "ethereum/std",
+    "evm-coder/std",
+    'frame-benchmarking/std',
     "frame-support/std",
     "frame-system/std",
+    "pallet-common/std",
+    "pallet-evm/std",
+    "pallet-evm-coder-substrate/std",
+    "pallet-structure/std",
     "sp-runtime/std",
     "sp-std/std",
     "up-data-structs/std",
-    "pallet-common/std",
-    "pallet-structure/std",
-    'frame-benchmarking/std',
-    "pallet-evm/std",
 ]
 runtime-benchmarks = [
     'frame-benchmarking',
     'frame-support/runtime-benchmarks',
     'frame-system/runtime-benchmarks',
+    'up-data-structs/runtime-benchmarks',
 ]
addedpallets/refungible/Changelog.mddiffbeforeafterboth
--- /dev/null
+++ b/pallets/refungible/Changelog.md
@@ -0,0 +1,3 @@
+### 0.1.1
+---
+* Added support for properties for RFT collections and tokens.
modifiedpallets/refungible/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/refungible/src/benchmarking.rs
+++ b/pallets/refungible/src/benchmarking.rs
@@ -18,9 +18,12 @@
 use crate::{Pallet, Config, RefungibleHandle};
 
 use sp_std::prelude::*;
-use pallet_common::benchmarking::{create_collection_raw, create_data};
+use pallet_common::benchmarking::{create_collection_raw, property_key, property_value, create_data};
 use frame_benchmarking::{benchmarks, account};
-use up_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH, CUSTOM_DATA_LIMIT, budget::Unlimited};
+use up_data_structs::{
+	CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, CUSTOM_DATA_LIMIT,
+	budget::Unlimited,
+};
 use pallet_common::bench_init;
 use core::convert::TryInto;
 use core::iter::IntoIterator;
@@ -38,6 +41,7 @@
 			.collect::<BTreeMap<_, _>>()
 			.try_into()
 			.unwrap(),
+		properties: Default::default(),
 	}
 }
 fn create_max_item<T: Config>(
@@ -204,6 +208,68 @@
 		<Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;
 	}: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}
 
+	set_token_property_permissions {
+		let b in 0..MAX_PROPERTIES_PER_ITEM;
+		bench_init!{
+			owner: sub; collection: collection(owner);
+			owner: cross_from_sub;
+		};
+		let perms = (0..b).map(|k| PropertyKeyPermission {
+			key: property_key(k as usize),
+			permission: PropertyPermission {
+				mutable: false,
+				collection_admin: false,
+				token_owner: false,
+			},
+		}).collect::<Vec<_>>();
+	}: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}
+
+	set_token_properties {
+		let b in 0..MAX_PROPERTIES_PER_ITEM;
+		bench_init!{
+			owner: sub; collection: collection(owner);
+			owner: cross_from_sub;
+		};
+		let perms = (0..b).map(|k| PropertyKeyPermission {
+			key: property_key(k as usize),
+			permission: PropertyPermission {
+				mutable: false,
+				collection_admin: true,
+				token_owner: true,
+			},
+		}).collect::<Vec<_>>();
+		<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;
+		let props = (0..b).map(|k| Property {
+			key: property_key(k as usize),
+			value: property_value(),
+		}).collect::<Vec<_>>();
+		let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;
+	}: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}
+
+	delete_token_properties {
+		let b in 0..MAX_PROPERTIES_PER_ITEM;
+		bench_init!{
+			owner: sub; collection: collection(owner);
+			owner: cross_from_sub;
+		};
+		let perms = (0..b).map(|k| PropertyKeyPermission {
+			key: property_key(k as usize),
+			permission: PropertyPermission {
+				mutable: true,
+				collection_admin: true,
+				token_owner: true,
+			},
+		}).collect::<Vec<_>>();
+		<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;
+		let props = (0..b).map(|k| Property {
+			key: property_key(k as usize),
+			value: property_value(),
+		}).collect::<Vec<_>>();
+		let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;
+		<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;
+		let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();
+	}: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}
+
 	repartition_item {
 		bench_init!{
 			owner: sub; collection: collection(owner);
modifiedpallets/refungible/src/common.rsdiffbeforeafterboth
--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -20,9 +20,12 @@
 use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight, traits::Get};
 use up_data_structs::{
 	CollectionId, TokenId, CreateItemExData, CreateRefungibleExData, budget::Budget, Property,
-	PropertyKey, PropertyValue, PropertyKeyPermission, CreateItemData,
+	PropertyKey, PropertyValue, PropertyKeyPermission, CreateItemData, CollectionPropertiesVec,
+};
+use pallet_common::{
+	CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight,
+	weights::WeightInfo as _,
 };
-use pallet_common::{CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight};
 use pallet_structure::Error as StructureError;
 use sp_runtime::{DispatchError};
 use sp_std::{vec::Vec, vec};
@@ -41,6 +44,14 @@
 	};
 }
 
+fn properties_weight<T: Config>(properties: &CollectionPropertiesVec) -> u64 {
+	if properties.len() > 0 {
+		<CommonWeights<T>>::set_token_properties(properties.len() as u32)
+	} else {
+		0
+	}
+}
+
 pub struct CommonWeights<T: Config>(PhantomData<T>);
 impl<T: Config> CommonWeightInfo<T::CrossAccountId> for CommonWeights<T> {
 	fn create_item() -> Weight {
@@ -48,16 +59,31 @@
 	}
 
 	fn create_multiple_items(data: &[CreateItemData]) -> Weight {
-		<SelfWeightOf<T>>::create_multiple_items(data.len() as u32)
+		<SelfWeightOf<T>>::create_multiple_items(data.len() as u32).saturating_add(
+			data.iter()
+				.map(|data| match data {
+					CreateItemData::ReFungible(rft_data) => {
+						properties_weight::<T>(&rft_data.properties)
+					}
+					_ => 0,
+				})
+				.fold(0, |a, b| a.saturating_add(b)),
+		)
 	}
 
 	fn create_multiple_items_ex(call: &CreateItemExData<T::CrossAccountId>) -> Weight {
 		match call {
 			CreateItemExData::RefungibleMultipleOwners(i) => {
 				<SelfWeightOf<T>>::create_multiple_items_ex_multiple_owners(i.users.len() as u32)
+					.saturating_add(properties_weight::<T>(&i.properties))
 			}
 			CreateItemExData::RefungibleMultipleItems(i) => {
 				<SelfWeightOf<T>>::create_multiple_items_ex_multiple_items(i.len() as u32)
+					.saturating_add(
+						i.iter()
+							.map(|d| properties_weight::<T>(&d.properties))
+							.fold(0, |a, b| a.saturating_add(b)),
+					)
 			}
 			_ => 0,
 		}
@@ -67,29 +93,24 @@
 		max_weight_of!(burn_item_partial(), burn_item_fully())
 	}
 
-	fn set_collection_properties(_amount: u32) -> Weight {
-		// Error
-		0
+	fn set_collection_properties(amount: u32) -> Weight {
+		<pallet_common::SelfWeightOf<T>>::set_collection_properties(amount)
 	}
 
-	fn delete_collection_properties(_amount: u32) -> Weight {
-		// Error
-		0
+	fn delete_collection_properties(amount: u32) -> Weight {
+		<pallet_common::SelfWeightOf<T>>::delete_collection_properties(amount)
 	}
 
-	fn set_token_properties(_amount: u32) -> Weight {
-		// Error
-		0
+	fn set_token_properties(amount: u32) -> Weight {
+		<SelfWeightOf<T>>::set_token_properties(amount)
 	}
 
-	fn delete_token_properties(_amount: u32) -> Weight {
-		// Error
-		0
+	fn delete_token_properties(amount: u32) -> Weight {
+		<SelfWeightOf<T>>::delete_token_properties(amount)
 	}
 
-	fn set_token_property_permissions(_amount: u32) -> Weight {
-		// Error
-		0
+	fn set_token_property_permissions(amount: u32) -> Weight {
+		<SelfWeightOf<T>>::set_token_property_permissions(amount)
 	}
 
 	fn transfer() -> Weight {
@@ -140,11 +161,14 @@
 				out.insert(to.clone(), data.pieces);
 				out.try_into().expect("limit > 0")
 			},
+			properties: data.properties,
 		}),
 		_ => fail!(<Error<T>>::NotRefungibleDataUsedToMintFungibleCollectionToken),
 	}
 }
 
+/// Implementation of `CommonCollectionOperations` for `RefungibleHandle`. It wraps Refungible Pallete
+/// methods and adds weight info.
 impl<T: Config> CommonCollectionOperations<T> for RefungibleHandle<T> {
 	fn create_item(
 		&self,
@@ -295,46 +319,85 @@
 
 	fn set_collection_properties(
 		&self,
-		_sender: T::CrossAccountId,
-		_property: Vec<Property>,
+		sender: T::CrossAccountId,
+		properties: Vec<Property>,
 	) -> DispatchResultWithPostInfo {
-		fail!(<Error<T>>::SettingPropertiesNotAllowed)
+		let weight = <CommonWeights<T>>::set_collection_properties(properties.len() as u32);
+
+		with_weight(
+			<Pallet<T>>::set_collection_properties(self, &sender, properties),
+			weight,
+		)
 	}
 
 	fn delete_collection_properties(
 		&self,
-		_sender: &T::CrossAccountId,
-		_property_keys: Vec<PropertyKey>,
+		sender: &T::CrossAccountId,
+		property_keys: Vec<PropertyKey>,
 	) -> DispatchResultWithPostInfo {
-		fail!(<Error<T>>::SettingPropertiesNotAllowed)
+		let weight = <CommonWeights<T>>::delete_collection_properties(property_keys.len() as u32);
+
+		with_weight(
+			<Pallet<T>>::delete_collection_properties(self, sender, property_keys),
+			weight,
+		)
 	}
 
 	fn set_token_properties(
 		&self,
-		_sender: T::CrossAccountId,
-		_token_id: TokenId,
-		_property: Vec<Property>,
-		_nesting_budget: &dyn Budget,
+		sender: T::CrossAccountId,
+		token_id: TokenId,
+		properties: Vec<Property>,
+		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo {
-		fail!(<Error<T>>::SettingPropertiesNotAllowed)
+		let weight = <CommonWeights<T>>::set_token_properties(properties.len() as u32);
+
+		with_weight(
+			<Pallet<T>>::set_token_properties(
+				self,
+				&sender,
+				token_id,
+				properties.into_iter(),
+				false,
+				nesting_budget,
+			),
+			weight,
+		)
 	}
 
 	fn set_token_property_permissions(
 		&self,
-		_sender: &T::CrossAccountId,
-		_property_permissions: Vec<PropertyKeyPermission>,
+		sender: &T::CrossAccountId,
+		property_permissions: Vec<PropertyKeyPermission>,
 	) -> DispatchResultWithPostInfo {
-		fail!(<Error<T>>::SettingPropertiesNotAllowed)
+		let weight =
+			<CommonWeights<T>>::set_token_property_permissions(property_permissions.len() as u32);
+
+		with_weight(
+			<Pallet<T>>::set_token_property_permissions(self, sender, property_permissions),
+			weight,
+		)
 	}
 
 	fn delete_token_properties(
 		&self,
-		_sender: T::CrossAccountId,
-		_token_id: TokenId,
-		_property_keys: Vec<PropertyKey>,
-		_nesting_budget: &dyn Budget,
+		sender: T::CrossAccountId,
+		token_id: TokenId,
+		property_keys: Vec<PropertyKey>,
+		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo {
-		fail!(<Error<T>>::SettingPropertiesNotAllowed)
+		let weight = <CommonWeights<T>>::delete_token_properties(property_keys.len() as u32);
+
+		with_weight(
+			<Pallet<T>>::delete_token_properties(
+				self,
+				&sender,
+				token_id,
+				property_keys.into_iter(),
+				nesting_budget,
+			),
+			weight,
+		)
 	}
 
 	fn check_nesting(
@@ -371,8 +434,13 @@
 		TokenId(<TokensMinted<T>>::get(self.id))
 	}
 
-	fn token_owner(&self, _token: TokenId) -> Option<T::CrossAccountId> {
-		None
+	fn token_owner(&self, token: TokenId) -> Option<T::CrossAccountId> {
+		<Pallet<T>>::token_owner(self.id, token)
+	}
+
+	/// Returns 10 token in no particular order.
+	fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+		<Pallet<T>>::token_owners(self.id, token).unwrap_or_default()
 	}
 
 	fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -14,34 +14,35 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-use up_data_structs::TokenId;
-use pallet_common::erc::CommonEvmHandler;
-use pallet_evm::PrecompileHandle;
+extern crate alloc;
+use evm_coder::{generate_stubgen, solidity_interface, types::*};
 
-use crate::{Config, RefungibleHandle};
+use pallet_common::{CollectionHandle, erc::CollectionCall, erc::CommonEvmHandler};
 
-impl<T: Config> CommonEvmHandler for RefungibleHandle<T> {
-	const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungible.raw");
+use pallet_evm::PrecompileHandle;
+use pallet_evm_coder_substrate::call;
 
-	fn call(
-		self,
-		_handle: &mut impl PrecompileHandle,
-	) -> Option<pallet_common::erc::PrecompileResult> {
-		// TODO: Implement RFT variant of ERC721
-		None
-	}
-}
+use crate::{Config, RefungibleHandle};
 
-pub struct RefungibleTokenHandle<T: Config>(pub RefungibleHandle<T>, pub TokenId);
+#[solidity_interface(
+	name = "UniqueRFT",
+	is(via("CollectionHandle<T>", common_mut, Collection),)
+)]
+impl<T: Config> RefungibleHandle<T> where T::AccountId: From<[u8; 32]> {}
 
-impl<T: Config> CommonEvmHandler for RefungibleTokenHandle<T> {
-	const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungibleToken.raw");
+// Not a tests, but code generators
+generate_stubgen!(gen_impl, UniqueRFTCall<()>, true);
+generate_stubgen!(gen_iface, UniqueRFTCall<()>, false);
 
+impl<T: Config> CommonEvmHandler for RefungibleHandle<T>
+where
+	T::AccountId: From<[u8; 32]>,
+{
+	const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungible.raw");
 	fn call(
 		self,
-		_handle: &mut impl PrecompileHandle,
+		handle: &mut impl PrecompileHandle,
 	) -> Option<pallet_common::erc::PrecompileResult> {
-		// TODO: Implement RFT variant of ERC20
-		None
+		call::<T, UniqueRFTCall<T>, _, _>(handle, self)
 	}
 }
addedpallets/refungible/src/erc_token.rsdiffbeforeafterboth
--- /dev/null
+++ b/pallets/refungible/src/erc_token.rs
@@ -0,0 +1,257 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+//! # Refungible Pallet EVM API for token pieces
+//!
+//! Provides ERC-20 standart support implementation and EVM API for unique extensions for Refungible Pallet.
+//! Method implementations are mostly doing parameter conversion and calling Nonfungible Pallet methods.
+
+extern crate alloc;
+use core::{
+	char::{REPLACEMENT_CHARACTER, decode_utf16},
+	convert::TryInto,
+	ops::Deref,
+};
+use evm_coder::{ToLog, execution::*, generate_stubgen, solidity_interface, types::*, weight};
+use pallet_common::{
+	CommonWeightInfo,
+	erc::{CommonEvmHandler, PrecompileResult},
+};
+use pallet_evm::{account::CrossAccountId, PrecompileHandle};
+use pallet_evm_coder_substrate::{call, dispatch_to_evm, WithRecorder};
+use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};
+use sp_std::vec::Vec;
+use up_data_structs::TokenId;
+
+use crate::{
+	Allowance, Balance, common::CommonWeights, Config, Pallet, RefungibleHandle, SelfWeightOf,
+	weights::WeightInfo, TotalSupply,
+};
+
+pub struct RefungibleTokenHandle<T: Config>(pub RefungibleHandle<T>, pub TokenId);
+
+#[derive(ToLog)]
+pub enum ERC20Events {
+	/// @dev This event is emitted when the amount of tokens (value) is sent
+	/// from the from address to the to address. In the case of minting new
+	/// tokens, the transfer is usually from the 0 address while in the case
+	/// of burning tokens the transfer is to 0.
+	Transfer {
+		#[indexed]
+		from: address,
+		#[indexed]
+		to: address,
+		value: uint256,
+	},
+	/// @dev This event is emitted when the amount of tokens (value) is approved
+	/// by the owner to be used by the spender.
+	Approval {
+		#[indexed]
+		owner: address,
+		#[indexed]
+		spender: address,
+		value: uint256,
+	},
+}
+
+/// @title Standard ERC20 token
+///
+/// @dev Implementation of the basic standard token.
+/// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
+#[solidity_interface(name = "ERC20", events(ERC20Events))]
+impl<T: Config> RefungibleTokenHandle<T> {
+	/// @return the name of the token.
+	fn name(&self) -> Result<string> {
+		Ok(decode_utf16(self.name.iter().copied())
+			.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
+			.collect::<string>())
+	}
+
+	/// @return the symbol of the token.
+	fn symbol(&self) -> Result<string> {
+		Ok(string::from_utf8_lossy(&self.token_prefix).into())
+	}
+
+	/// @dev Total number of tokens in existence
+	fn total_supply(&self) -> Result<uint256> {
+		self.consume_store_reads(1)?;
+		Ok(<TotalSupply<T>>::get((self.id, self.1)).into())
+	}
+
+	/// @dev Not supported
+	fn decimals(&self) -> Result<uint8> {
+		// Decimals aren't supported for refungible tokens
+		Ok(0)
+	}
+
+	/// @dev Gets the balance of the specified address.
+	/// @param owner The address to query the balance of.
+	/// @return An uint256 representing the amount owned by the passed address.
+	fn balance_of(&self, owner: address) -> Result<uint256> {
+		self.consume_store_reads(1)?;
+		let owner = T::CrossAccountId::from_eth(owner);
+		let balance = <Balance<T>>::get((self.id, self.1, owner));
+		Ok(balance.into())
+	}
+
+	/// @dev Transfer token for a specified address
+	/// @param to The address to transfer to.
+	/// @param amount The amount to be transferred.
+	#[weight(<CommonWeights<T>>::transfer())]
+	fn transfer(&mut self, caller: caller, to: address, amount: uint256) -> Result<bool> {
+		let caller = T::CrossAccountId::from_eth(caller);
+		let to = T::CrossAccountId::from_eth(to);
+		let amount = amount.try_into().map_err(|_| "amount overflow")?;
+		let budget = self
+			.recorder
+			.weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+		<Pallet<T>>::transfer(self, &caller, &to, self.1, amount, &budget)
+			.map_err(|_| "transfer error")?;
+		Ok(true)
+	}
+
+	/// @dev Transfer tokens from one address to another
+	/// @param from address The address which you want to send tokens from
+	/// @param to address The address which you want to transfer to
+	/// @param amount uint256 the amount of tokens to be transferred
+	#[weight(<CommonWeights<T>>::transfer_from())]
+	fn transfer_from(
+		&mut self,
+		caller: caller,
+		from: address,
+		to: address,
+		amount: uint256,
+	) -> Result<bool> {
+		let caller = T::CrossAccountId::from_eth(caller);
+		let from = T::CrossAccountId::from_eth(from);
+		let to = T::CrossAccountId::from_eth(to);
+		let amount = amount.try_into().map_err(|_| "amount overflow")?;
+		let budget = self
+			.recorder
+			.weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+		<Pallet<T>>::transfer_from(self, &caller, &from, &to, self.1, amount, &budget)
+			.map_err(dispatch_to_evm::<T>)?;
+		Ok(true)
+	}
+
+	/// @dev Approve the passed address to spend the specified amount of tokens on behalf of `msg.sender`.
+	/// Beware that changing an allowance with this method brings the risk that someone may use both the old
+	/// and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
+	/// race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
+	/// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+	/// @param spender The address which will spend the funds.
+	/// @param amount The amount of tokens to be spent.
+	#[weight(<SelfWeightOf<T>>::approve())]
+	fn approve(&mut self, caller: caller, spender: address, amount: uint256) -> Result<bool> {
+		let caller = T::CrossAccountId::from_eth(caller);
+		let spender = T::CrossAccountId::from_eth(spender);
+		let amount = amount.try_into().map_err(|_| "amount overflow")?;
+
+		<Pallet<T>>::set_allowance(self, &caller, &spender, self.1, amount)
+			.map_err(dispatch_to_evm::<T>)?;
+		Ok(true)
+	}
+
+	/// @dev Function to check the amount of tokens that an owner allowed to a spender.
+	/// @param owner address The address which owns the funds.
+	/// @param spender address The address which will spend the funds.
+	/// @return A uint256 specifying the amount of tokens still available for the spender.
+	fn allowance(&self, owner: address, spender: address) -> Result<uint256> {
+		self.consume_store_reads(1)?;
+		let owner = T::CrossAccountId::from_eth(owner);
+		let spender = T::CrossAccountId::from_eth(spender);
+
+		Ok(<Allowance<T>>::get((self.id, self.1, owner, spender)).into())
+	}
+}
+
+#[solidity_interface(name = "ERC20UniqueExtensions")]
+impl<T: Config> RefungibleTokenHandle<T> {
+	/// @dev Function that burns an amount of the token of a given account,
+	/// deducting from the sender's allowance for said account.
+	/// @param from The account whose tokens will be burnt.
+	/// @param amount The amount that will be burnt.
+	#[weight(<SelfWeightOf<T>>::burn_from())]
+	fn burn_from(&mut self, caller: caller, from: address, amount: uint256) -> Result<bool> {
+		let caller = T::CrossAccountId::from_eth(caller);
+		let from = T::CrossAccountId::from_eth(from);
+		let amount = amount.try_into().map_err(|_| "amount overflow")?;
+		let budget = self
+			.recorder
+			.weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+		<Pallet<T>>::burn_from(self, &caller, &from, self.1, amount, &budget)
+			.map_err(dispatch_to_evm::<T>)?;
+		Ok(true)
+	}
+
+	/// @dev Function that changes total amount of the tokens.
+	///  Throws if `msg.sender` doesn't owns all of the tokens.
+	/// @param amount New total amount of the tokens.
+	#[weight(<SelfWeightOf<T>>::repartition_item())]
+	fn repartition(&mut self, caller: caller, amount: uint256) -> Result<bool> {
+		let caller = T::CrossAccountId::from_eth(caller);
+		let amount = amount.try_into().map_err(|_| "amount overflow")?;
+
+		<Pallet<T>>::repartition(self, &caller, self.1, amount).map_err(dispatch_to_evm::<T>)?;
+		Ok(true)
+	}
+}
+
+impl<T: Config> RefungibleTokenHandle<T> {
+	pub fn into_inner(self) -> RefungibleHandle<T> {
+		self.0
+	}
+	pub fn common_mut(&mut self) -> &mut RefungibleHandle<T> {
+		&mut self.0
+	}
+}
+
+impl<T: Config> WithRecorder<T> for RefungibleTokenHandle<T> {
+	fn recorder(&self) -> &pallet_evm_coder_substrate::SubstrateRecorder<T> {
+		self.0.recorder()
+	}
+	fn into_recorder(self) -> pallet_evm_coder_substrate::SubstrateRecorder<T> {
+		self.0.into_recorder()
+	}
+}
+
+impl<T: Config> Deref for RefungibleTokenHandle<T> {
+	type Target = RefungibleHandle<T>;
+
+	fn deref(&self) -> &Self::Target {
+		&self.0
+	}
+}
+
+#[solidity_interface(name = "UniqueRefungibleToken", is(ERC20, ERC20UniqueExtensions,))]
+impl<T: Config> RefungibleTokenHandle<T> where T::AccountId: From<[u8; 32]> {}
+
+generate_stubgen!(gen_impl, UniqueRefungibleTokenCall<()>, true);
+generate_stubgen!(gen_iface, UniqueRefungibleTokenCall<()>, false);
+
+impl<T: Config> CommonEvmHandler for RefungibleTokenHandle<T>
+where
+	T::AccountId: From<[u8; 32]>,
+{
+	const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungibleToken.raw");
+
+	fn call(self, handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {
+		call::<T, UniqueRefungibleTokenCall<T>, _, _>(handle, self)
+	}
+}
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -14,32 +14,113 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
+//! # Refungible Pallet
+//!
+//! The Refungible pallet provides functionality for handling refungible collections and tokens.
+//!
+//! - [`Config`]
+//! - [`RefungibleHandle`]
+//! - [`Pallet`]
+//! - [`CommonWeights`](common::CommonWeights)
+//!
+//! ## Overview
+//!
+//! The Refungible pallet provides functions for:
+//!
+//! - RFT collection creation and removal
+//! - Minting and burning of RFT tokens
+//! - Partition and repartition of RFT tokens
+//! - Retrieving number of pieces of RFT token
+//! - Retrieving account balances
+//! - Transfering RFT token pieces
+//! - Burning RFT token pieces
+//! - Setting and checking allowance for RFT tokens
+//!
+//! ### Terminology
+//!
+//! - **RFT token:** Non fungible token that was partitioned to pieces. If an account owns all
+//!   of the RFT token pieces than it owns the RFT token and can repartition it.
+//!
+//! - **RFT Collection:** A collection of RFT tokens. All RFT tokens are part of a collection.
+//!   Each collection has its own settings and set of permissions.
+//!
+//! - **RFT token piece:** A fungible part of an RFT token.
+//!
+//! - **Balance:** RFT token pieces owned by an account
+//!
+//! - **Allowance:** Maximum number of RFT token pieces that one account is allowed to
+//!   transfer from the balance of another account
+//!
+//! - **Burning:** The process of “deleting” a token from a collection or removing token pieces from
+//!   an account balance.
+//!
+//! ### Implementations
+//!
+//! The Refungible pallet provides implementations for the following traits. If these traits provide
+//! the functionality that you need, then you can avoid coupling with the Refungible pallet.
+//!
+//! - [`CommonWeightInfo`](pallet_common::CommonWeightInfo): Functions for retrieval of transaction weight
+//! - [`CommonCollectionOperations`](pallet_common::CommonCollectionOperations): Functions for dealing
+//!   with collections
+//! - [`RefungibleExtensions`](pallet_common::RefungibleExtensions): Functions specific for refungible
+//!   collection
+//!
+//! ## Interface
+//!
+//! ### Dispatchable Functions
+//!
+//! - `init_collection` - Create RFT collection. RFT collection can be configured to allow or deny access for
+//!   some accounts.
+//! - `destroy_collection` - Destroy exising RFT collection. There should be no tokens in the collection.
+//! - `burn` - Burn some amount of RFT token pieces owned by account. Burns the RFT token if no pieces left.
+//! - `transfer` - Transfer some amount of RFT token pieces. Transfers should be enabled for RFT collection.
+//!   Nests the RFT token if RFT token pieces are sent to another token.
+//! - `create_item` - Mint RFT token in collection. Sender should have permission to mint tokens.
+//! - `set_allowance` - Set allowance for another account to transfer balance from sender's account.
+//! - `repartition` - Repartition token to selected number of pieces. Sender should own all existing pieces.
+//!
+//! ## Assumptions
+//!
+//! * Total number of pieces for one token shouldn't exceed `up_data_structs::MAX_REFUNGIBLE_PIECES`.
+//! * Total number of tokens of all types shouldn't be greater than `up_data_structs::MAX_TOKEN_PREFIX_LENGTH`.
+//! * Sender should be in collection's allow list to perform operations on tokens.
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
-use frame_support::{ensure, BoundedVec};
-use up_data_structs::{
-	AccessMode, CollectionId, CustomDataLimit, MAX_REFUNGIBLE_PIECES, TokenId,
-	CreateCollectionData, CreateRefungibleExData, mapping::TokenAddressMapping, budget::Budget,
+use crate::erc_token::ERC20Events;
+
+use codec::{Encode, Decode, MaxEncodedLen};
+use core::ops::Deref;
+use evm_coder::ToLog;
+use frame_support::{BoundedVec, ensure, fail, storage::with_transaction, transactional};
+use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm};
+use pallet_evm_coder_substrate::WithRecorder;
+use pallet_common::{
+	CommonCollectionOperations, Error as CommonError, Event as CommonEvent, Pallet as PalletCommon,
 };
-use pallet_evm::account::CrossAccountId;
-use pallet_common::{Error as CommonError, Event as CommonEvent, Pallet as PalletCommon};
 use pallet_structure::Pallet as PalletStructure;
-use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
+use scale_info::TypeInfo;
+use sp_core::H160;
+use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
 use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
-use core::ops::Deref;
-use codec::{Encode, Decode, MaxEncodedLen};
-use scale_info::TypeInfo;
+use up_data_structs::{
+	AccessMode, budget::Budget, CollectionId, CreateCollectionData, CreateRefungibleExData,
+	CustomDataLimit, mapping::TokenAddressMapping, MAX_REFUNGIBLE_PIECES, TokenId, Property,
+	PropertyKey, PropertyKeyPermission, PropertyPermission, PropertyScope, PropertyValue,
+	TrySetProperty,
+};
 
 pub use pallet::*;
 #[cfg(feature = "runtime-benchmarks")]
 pub mod benchmarking;
 pub mod common;
 pub mod erc;
+pub mod erc_token;
 pub mod weights;
 pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
 
-/// Token data, stored independently from other data used to describe it.
-/// Notably contains the token metadata.
+/// Token data, stored independently from other data used to describe it
+/// for the convenience of database access. Notably contains the token metadata.
 #[struct_versioning::versioned(version = 2, upper)]
 #[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)]
 pub struct ItemData {
@@ -108,6 +189,16 @@
 
 	/// Amount of pieces a refungible token is split into.
 	#[pallet::storage]
+	#[pallet::getter(fn token_properties)]
+	pub type TokenProperties<T: Config> = StorageNMap<
+		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
+		Value = up_data_structs::Properties,
+		QueryKind = ValueQuery,
+		OnEmpty = up_data_structs::TokenProperties,
+	>;
+
+	/// Total amount of pieces for token
+	#[pallet::storage]
 	pub type TotalSupply<T: Config> = StorageNMap<
 		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
 		Value = u128,
@@ -138,7 +229,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// Amount of pieces of a token owned by an account.
+	/// Amount of token pieces owned by account.
 	#[pallet::storage]
 	pub type Balance<T: Config> = StorageNMap<
 		Key = (
@@ -151,7 +242,7 @@
 		QueryKind = ValueQuery,
 	>;
 
-	/// todo:doc
+	/// Allowance set by a token owner for another user to perform one of certain transactions on a number of pieces of a token.
 	#[pallet::storage]
 	pub type Allowance<T: Config> = StorageNMap<
 		Key = (
@@ -188,7 +279,11 @@
 	pub fn into_inner(self) -> pallet_common::CollectionHandle<T> {
 		self.0
 	}
+	pub fn common_mut(&mut self) -> &mut pallet_common::CollectionHandle<T> {
+		&mut self.0
+	}
 }
+
 impl<T: Config> Deref for RefungibleHandle<T> {
 	type Target = pallet_common::CollectionHandle<T>;
 
@@ -197,23 +292,75 @@
 	}
 }
 
+impl<T: Config> WithRecorder<T> for RefungibleHandle<T> {
+	fn recorder(&self) -> &pallet_evm_coder_substrate::SubstrateRecorder<T> {
+		self.0.recorder()
+	}
+	fn into_recorder(self) -> pallet_evm_coder_substrate::SubstrateRecorder<T> {
+		self.0.into_recorder()
+	}
+}
+
 impl<T: Config> Pallet<T> {
+	/// Get number of RFT tokens in collection
 	pub fn total_supply(collection: &RefungibleHandle<T>) -> u32 {
 		<TokensMinted<T>>::get(collection.id) - <TokensBurnt<T>>::get(collection.id)
 	}
+
+	/// Check that RFT token exists
+	///
+	/// - `token`: Token ID.
 	pub fn token_exists(collection: &RefungibleHandle<T>, token: TokenId) -> bool {
 		<TotalSupply<T>>::contains_key((collection.id, token))
 	}
+
+	pub fn set_scoped_token_property(
+		collection_id: CollectionId,
+		token_id: TokenId,
+		scope: PropertyScope,
+		property: Property,
+	) -> DispatchResult {
+		TokenProperties::<T>::try_mutate((collection_id, token_id), |properties| {
+			properties.try_scoped_set(scope, property.key, property.value)
+		})
+		.map_err(<CommonError<T>>::from)?;
+
+		Ok(())
+	}
+
+	pub fn set_scoped_token_properties(
+		collection_id: CollectionId,
+		token_id: TokenId,
+		scope: PropertyScope,
+		properties: impl Iterator<Item = Property>,
+	) -> DispatchResult {
+		TokenProperties::<T>::try_mutate((collection_id, token_id), |stored_properties| {
+			stored_properties.try_scoped_set_from_iter(scope, properties)
+		})
+		.map_err(<CommonError<T>>::from)?;
+
+		Ok(())
+	}
 }
 
 // unchecked calls skips any permission checks
 impl<T: Config> Pallet<T> {
+	/// Create RFT collection
+	///
+	/// `init_collection` will take non-refundable deposit for collection creation.
+	///
+	/// - `data`: Contains settings for collection limits and permissions.
 	pub fn init_collection(
 		owner: T::CrossAccountId,
 		data: CreateCollectionData<T::AccountId>,
 	) -> Result<CollectionId, DispatchError> {
 		<PalletCommon<T>>::init_collection(owner, data, false)
 	}
+
+	/// Destroy RFT collection
+	///
+	/// `destroy_collection` will throw error if collection contains any tokens.
+	/// Only owner can destroy collection.
 	pub fn destroy_collection(
 		collection: RefungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -245,13 +392,17 @@
 			.is_some()
 	}
 
-	pub fn burn_token(collection: &RefungibleHandle<T>, token_id: TokenId) -> DispatchResult {
+	pub fn burn_token_unchecked(
+		collection: &RefungibleHandle<T>,
+		token_id: TokenId,
+	) -> DispatchResult {
 		let burnt = <TokensBurnt<T>>::get(collection.id)
 			.checked_add(1)
 			.ok_or(ArithmeticError::Overflow)?;
 
 		<TokensBurnt<T>>::insert(collection.id, burnt);
 		<TokenData<T>>::remove((collection.id, token_id));
+		<TokenProperties<T>>::remove((collection.id, token_id));
 		<TotalSupply<T>>::remove((collection.id, token_id));
 		<Balance<T>>::remove_prefix((collection.id, token_id), None);
 		<Allowance<T>>::remove_prefix((collection.id, token_id), None);
@@ -259,6 +410,17 @@
 		Ok(())
 	}
 
+	/// Burn RFT token pieces
+	///
+	/// `burn` will decrease total amount of token pieces and amount owned by sender.
+	/// `burn` can be called even if there are multiple owners of the RFT token.
+	/// If sender wouldn't have any pieces left after `burn` than she will stop being
+	/// one of the owners of the token. If there is no account that owns any pieces of
+	/// the token than token will be burned too.
+	///
+	/// - `amount`: Amount of token pieces to burn.
+	/// - `token`: Token who's pieces should be burned
+	/// - `collection`: Collection that contains the token
 	pub fn burn(
 		collection: &RefungibleHandle<T>,
 		owner: &T::CrossAccountId,
@@ -286,7 +448,7 @@
 			<Owned<T>>::remove((collection.id, owner, token));
 			<PalletStructure<T>>::unnest_if_nested(owner, collection.id, token);
 			<AccountBalance<T>>::insert((collection.id, owner), account_balance);
-			Self::burn_token(collection, token)?;
+			Self::burn_token_unchecked(collection, token)?;
 			<PalletCommon<T>>::deposit_event(CommonEvent::ItemDestroyed(
 				collection.id,
 				token,
@@ -319,7 +481,18 @@
 			<Balance<T>>::insert((collection.id, token, owner), balance);
 		}
 		<TotalSupply<T>>::insert((collection.id, token), total_supply);
-		// TODO: ERC20 transfer event
+
+		<PalletEvm<T>>::deposit_log(
+			ERC20Events::Transfer {
+				from: *owner.as_eth(),
+				to: H160::default(),
+				value: amount.into(),
+			}
+			.to_log(T::EvmTokenAddressMapping::token_to_address(
+				collection.id,
+				token,
+			)),
+		);
 		<PalletCommon<T>>::deposit_event(CommonEvent::ItemDestroyed(
 			collection.id,
 			token,
@@ -329,6 +502,179 @@
 		Ok(())
 	}
 
+	#[transactional]
+	fn modify_token_properties(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		token_id: TokenId,
+		properties: impl Iterator<Item = (PropertyKey, Option<PropertyValue>)>,
+		is_token_create: bool,
+		nesting_budget: &dyn Budget,
+	) -> DispatchResult {
+		let is_collection_admin = || collection.is_owner_or_admin(sender);
+		let is_token_owner = || -> Result<bool, DispatchError> {
+			let balance = collection.balance(sender.clone(), token_id);
+			let total_pieces: u128 =
+				Self::total_pieces(collection.id, token_id).unwrap_or(u128::MAX);
+			if balance != total_pieces {
+				return Ok(false);
+			}
+
+			let is_bundle_owner = <PalletStructure<T>>::check_indirectly_owned(
+				sender.clone(),
+				collection.id,
+				token_id,
+				None,
+				nesting_budget,
+			)?;
+
+			Ok(is_bundle_owner)
+		};
+
+		for (key, value) in properties {
+			let permission = <PalletCommon<T>>::property_permissions(collection.id)
+				.get(&key)
+				.cloned()
+				.unwrap_or_else(PropertyPermission::none);
+
+			let is_property_exists = TokenProperties::<T>::get((collection.id, token_id))
+				.get(&key)
+				.is_some();
+
+			match permission {
+				PropertyPermission { mutable: false, .. } if is_property_exists => {
+					return Err(<CommonError<T>>::NoPermission.into());
+				}
+
+				PropertyPermission {
+					collection_admin,
+					token_owner,
+					..
+				} => {
+					//TODO: investigate threats during public minting.
+					let is_token_create =
+						is_token_create && (collection_admin || token_owner) && value.is_some();
+					if !(is_token_create
+						|| (collection_admin && is_collection_admin())
+						|| (token_owner && is_token_owner()?))
+					{
+						fail!(<CommonError<T>>::NoPermission);
+					}
+				}
+			}
+
+			match value {
+				Some(value) => {
+					<TokenProperties<T>>::try_mutate((collection.id, token_id), |properties| {
+						properties.try_set(key.clone(), value)
+					})
+					.map_err(<CommonError<T>>::from)?;
+
+					<PalletCommon<T>>::deposit_event(CommonEvent::TokenPropertySet(
+						collection.id,
+						token_id,
+						key,
+					));
+				}
+				None => {
+					<TokenProperties<T>>::try_mutate((collection.id, token_id), |properties| {
+						properties.remove(&key)
+					})
+					.map_err(<CommonError<T>>::from)?;
+
+					<PalletCommon<T>>::deposit_event(CommonEvent::TokenPropertyDeleted(
+						collection.id,
+						token_id,
+						key,
+					));
+				}
+			}
+		}
+
+		Ok(())
+	}
+
+	pub fn set_token_properties(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		token_id: TokenId,
+		properties: impl Iterator<Item = Property>,
+		is_token_create: bool,
+		nesting_budget: &dyn Budget,
+	) -> DispatchResult {
+		Self::modify_token_properties(
+			collection,
+			sender,
+			token_id,
+			properties.map(|p| (p.key, Some(p.value))),
+			is_token_create,
+			nesting_budget,
+		)
+	}
+
+	pub fn set_token_property(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		token_id: TokenId,
+		property: Property,
+		nesting_budget: &dyn Budget,
+	) -> DispatchResult {
+		let is_token_create = false;
+
+		Self::set_token_properties(
+			collection,
+			sender,
+			token_id,
+			[property].into_iter(),
+			is_token_create,
+			nesting_budget,
+		)
+	}
+
+	pub fn delete_token_properties(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		token_id: TokenId,
+		property_keys: impl Iterator<Item = PropertyKey>,
+		nesting_budget: &dyn Budget,
+	) -> DispatchResult {
+		let is_token_create = false;
+
+		Self::modify_token_properties(
+			collection,
+			sender,
+			token_id,
+			property_keys.into_iter().map(|key| (key, None)),
+			is_token_create,
+			nesting_budget,
+		)
+	}
+
+	pub fn delete_token_property(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		token_id: TokenId,
+		property_key: PropertyKey,
+		nesting_budget: &dyn Budget,
+	) -> DispatchResult {
+		Self::delete_token_properties(
+			collection,
+			sender,
+			token_id,
+			[property_key].into_iter(),
+			nesting_budget,
+		)
+	}
+
+	/// Transfer RFT token pieces from one account to another.
+	///
+	/// If the sender is no longer owns any pieces after the `transfer` than she stops being an owner of the token.
+	///
+	/// - `from`: Owner of token pieces to transfer.
+	/// - `to`: Recepient of transfered token pieces.
+	/// - `amount`: Amount of token pieces to transfer.
+	/// - `token`: Token whos pieces should be transfered
+	/// - `collection`: Collection that contains the token
 	pub fn transfer(
 		collection: &RefungibleHandle<T>,
 		from: &T::CrossAccountId,
@@ -422,7 +768,17 @@
 			}
 		}
 
-		// TODO: ERC20 transfer event
+		<PalletEvm<T>>::deposit_log(
+			ERC20Events::Transfer {
+				from: *from.as_eth(),
+				to: *to.as_eth(),
+				value: amount.into(),
+			}
+			.to_log(T::EvmTokenAddressMapping::token_to_address(
+				collection.id,
+				token,
+			)),
+		);
 		<PalletCommon<T>>::deposit_event(CommonEvent::Transfer(
 			collection.id,
 			token,
@@ -433,6 +789,11 @@
 		Ok(())
 	}
 
+	/// Batched operation to create multiple RFT tokens.
+	///
+	/// Same as `create_item` but creates multiple tokens.
+	///
+	/// - `data`: Same as 'data` in `create_item` but contains data for multiple tokens.
 	pub fn create_multiple_items(
 		collection: &RefungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -517,34 +878,70 @@
 
 		// =========
 
+		with_transaction(|| {
+			for (i, data) in data.iter().enumerate() {
+				let token_id = first_token_id + i as u32 + 1;
+				<TotalSupply<T>>::insert((collection.id, token_id), totals[i]);
+
+				<TokenData<T>>::insert(
+					(collection.id, token_id),
+					ItemData {
+						const_data: data.const_data.clone(),
+					},
+				);
+
+				for (user, amount) in data.users.iter() {
+					if *amount == 0 {
+						continue;
+					}
+					<Balance<T>>::insert((collection.id, token_id, &user), amount);
+					<Owned<T>>::insert((collection.id, &user, TokenId(token_id)), true);
+					<PalletStructure<T>>::nest_if_sent_to_token_unchecked(
+						user,
+						collection.id,
+						TokenId(token_id),
+					);
+				}
+
+				if let Err(e) = Self::set_token_properties(
+					collection,
+					sender,
+					TokenId(token_id),
+					data.properties.clone().into_iter(),
+					true,
+					nesting_budget,
+				) {
+					return TransactionOutcome::Rollback(Err(e));
+				}
+			}
+			TransactionOutcome::Commit(Ok(()))
+		})?;
+
 		<TokensMinted<T>>::insert(collection.id, tokens_minted);
+
 		for (account, balance) in balances {
 			<AccountBalance<T>>::insert((collection.id, account), balance);
 		}
+
 		for (i, token) in data.into_iter().enumerate() {
 			let token_id = first_token_id + i as u32 + 1;
-			<TotalSupply<T>>::insert((collection.id, token_id), totals[i]);
-
-			<TokenData<T>>::insert(
-				(collection.id, token_id),
-				ItemData {
-					const_data: token.const_data,
-				},
-			);
 
 			for (user, amount) in token.users.into_iter() {
 				if amount == 0 {
 					continue;
 				}
-				<Balance<T>>::insert((collection.id, token_id, &user), amount);
-				<Owned<T>>::insert((collection.id, &user, TokenId(token_id)), true);
-				<PalletStructure<T>>::nest_if_sent_to_token_unchecked(
-					&user,
-					collection.id,
-					TokenId(token_id),
+
+				<PalletEvm<T>>::deposit_log(
+					ERC20Events::Transfer {
+						from: H160::default(),
+						to: *user.as_eth(),
+						value: amount.into(),
+					}
+					.to_log(T::EvmTokenAddressMapping::token_to_address(
+						collection.id,
+						TokenId(token_id),
+					)),
 				);
-
-				// TODO: ERC20 transfer event
 				<PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
 					collection.id,
 					TokenId(token_id),
@@ -568,7 +965,18 @@
 		} else {
 			<Allowance<T>>::insert((collection.id, token, sender, spender), amount);
 		}
-		// TODO: ERC20 approval event
+
+		<PalletEvm<T>>::deposit_log(
+			ERC20Events::Approval {
+				owner: *sender.as_eth(),
+				spender: *spender.as_eth(),
+				value: amount.into(),
+			}
+			.to_log(T::EvmTokenAddressMapping::token_to_address(
+				collection.id,
+				token,
+			)),
+		);
 		<PalletCommon<T>>::deposit_event(CommonEvent::Approved(
 			collection.id,
 			token,
@@ -578,6 +986,9 @@
 		))
 	}
 
+	/// Set allowance for the spender to `transfer` or `burn` sender's token pieces.
+	///
+	/// - `amount`: Amount of token pieces the spender is allowed to `transfer` or `burn.
 	pub fn set_allowance(
 		collection: &RefungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -646,6 +1057,12 @@
 		Ok(allowance)
 	}
 
+	/// Transfer RFT token pieces from one account to another.
+	///
+	/// Same as the [`transfer`] but spender doesn't needs to be an owner of the token pieces.
+	/// The owner should set allowance for the spender to transfer pieces.
+	///
+	/// [`transfer`]: struct.Pallet.html#method.transfer
 	pub fn transfer_from(
 		collection: &RefungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -667,6 +1084,12 @@
 		Ok(())
 	}
 
+	/// Burn RFT token pieces from the account.
+	///
+	/// Same as the [`burn`] but spender doesn't need to be an owner of the token pieces. The owner should
+	/// set allowance for the spender to burn pieces
+	///
+	/// [`burn`]: struct.Pallet.html#method.burn
 	pub fn burn_from(
 		collection: &RefungibleHandle<T>,
 		spender: &T::CrossAccountId,
@@ -687,7 +1110,13 @@
 		Ok(())
 	}
 
-	/// Delegated to `create_multiple_items`
+	/// Create RFT token.
+	///
+	/// The sender should be the owner/admin of the collection or collection should be configured
+	/// to allow public minting.
+	///
+	/// - `data`: Contains list of users who will become the owners of the token pieces and amount
+	///   of token pieces they will receive.
 	pub fn create_item(
 		collection: &RefungibleHandle<T>,
 		sender: &T::CrossAccountId,
@@ -697,6 +1126,13 @@
 		Self::create_multiple_items(collection, sender, vec![data], nesting_budget)
 	}
 
+	/// Repartition RFT token.
+	///
+	/// `repartition` will set token balance of the sender and total amount of token pieces.
+	/// Sender should own all of the token pieces. `repartition' could be done even if some
+	/// token pieces were burned before.
+	///
+	/// - `amount`: Total amount of token pieces that the token will have after `repartition`.
 	pub fn repartition(
 		collection: &RefungibleHandle<T>,
 		owner: &T::CrossAccountId,
@@ -709,19 +1145,119 @@
 		);
 		ensure!(amount > 0, <CommonError<T>>::TokenValueTooLow);
 		// Ensure user owns all pieces
-		let total_supply = <TotalSupply<T>>::get((collection.id, token));
+		let total_pieces = Self::total_pieces(collection.id, token).unwrap_or(u128::MAX);
 		let balance = <Balance<T>>::get((collection.id, token, owner));
 		ensure!(
-			total_supply == balance,
+			total_pieces == balance,
 			<Error<T>>::RepartitionWhileNotOwningAllPieces
 		);
 
 		<Balance<T>>::insert((collection.id, token, owner), amount);
 		<TotalSupply<T>>::insert((collection.id, token), amount);
+
+		if amount > total_pieces {
+			let mint_amount = amount - total_pieces;
+			<PalletEvm<T>>::deposit_log(
+				ERC20Events::Transfer {
+					from: H160::default(),
+					to: *owner.as_eth(),
+					value: mint_amount.into(),
+				}
+				.to_log(T::EvmTokenAddressMapping::token_to_address(
+					collection.id,
+					token,
+				)),
+			);
+			<PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
+				collection.id,
+				token,
+				owner.clone(),
+				mint_amount,
+			));
+		} else if total_pieces > amount {
+			let burn_amount = total_pieces - amount;
+			<PalletEvm<T>>::deposit_log(
+				ERC20Events::Transfer {
+					from: *owner.as_eth(),
+					to: H160::default(),
+					value: burn_amount.into(),
+				}
+				.to_log(T::EvmTokenAddressMapping::token_to_address(
+					collection.id,
+					token,
+				)),
+			);
+			<PalletCommon<T>>::deposit_event(CommonEvent::ItemDestroyed(
+				collection.id,
+				token,
+				owner.clone(),
+				burn_amount,
+			));
+		}
+
 		Ok(())
 	}
 
+	fn token_owner(collection_id: CollectionId, token_id: TokenId) -> Option<T::CrossAccountId> {
+		let mut owner = None;
+		let mut count = 0;
+		for key in Balance::<T>::iter_key_prefix((collection_id, token_id)) {
+			count += 1;
+			if count > 1 {
+				return None;
+			}
+			owner = Some(key);
+		}
+		owner
+	}
+
 	fn total_pieces(collection_id: CollectionId, token_id: TokenId) -> Option<u128> {
 		<TotalSupply<T>>::try_get((collection_id, token_id)).ok()
 	}
+
+	pub fn set_collection_properties(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		properties: Vec<Property>,
+	) -> DispatchResult {
+		<PalletCommon<T>>::set_collection_properties(collection, sender, properties)
+	}
+
+	pub fn delete_collection_properties(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		property_keys: Vec<PropertyKey>,
+	) -> DispatchResult {
+		<PalletCommon<T>>::delete_collection_properties(collection, sender, property_keys)
+	}
+
+	pub fn set_token_property_permissions(
+		collection: &RefungibleHandle<T>,
+		sender: &T::CrossAccountId,
+		property_permissions: Vec<PropertyKeyPermission>,
+	) -> DispatchResult {
+		<PalletCommon<T>>::set_token_property_permissions(collection, sender, property_permissions)
+	}
+
+	/// Returns 10 token in no particular order.
+	///
+	/// There is no direct way to get token holders in ascending order,
+	/// since `iter_prefix` returns values in no particular order.
+	/// Therefore, getting the 10 largest holders with a large value of holders
+	/// can lead to impact memory allocation + sorting with  `n * log (n)`.
+	pub fn token_owners(
+		collection_id: CollectionId,
+		token: TokenId,
+	) -> Option<Vec<T::CrossAccountId>> {
+		let res: Vec<T::CrossAccountId> = <Balance<T>>::iter_prefix((collection_id, token))
+			.map(|(owner, _amount)| owner)
+			.take(10)
+			.collect();
+
+		if res.is_empty() {
+			None
+		} else {
+			Some(res)
+		}
+	}
 }
modifiedpallets/refungible/src/stubs/UniqueRefungibleToken.rawdiffbeforeafterboth

binary blob — no preview

addedpallets/refungible/src/stubs/UniqueRefungibleToken.soldiffbeforeafterboth
--- /dev/null
+++ b/pallets/refungible/src/stubs/UniqueRefungibleToken.sol
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: OTHER
+// This code is automatically generated
+
+pragma solidity >=0.8.0 <0.9.0;
+
+// Common stubs holder
+contract Dummy {
+	uint8 dummy;
+	string stub_error = "this contract is implemented in native";
+}
+
+contract ERC165 is Dummy {
+	function supportsInterface(bytes4 interfaceID)
+		external
+		view
+		returns (bool)
+	{
+		require(false, stub_error);
+		interfaceID;
+		return true;
+	}
+}
+
+// Inline
+contract ERC20Events {
+	event Transfer(address indexed from, address indexed to, uint256 value);
+	event Approval(
+		address indexed owner,
+		address indexed spender,
+		uint256 value
+	);
+}
+
+// Selector: 942e8b22
+contract ERC20 is Dummy, ERC165, ERC20Events {
+	// Selector: name() 06fdde03
+	function name() public view returns (string memory) {
+		require(false, stub_error);
+		dummy;
+		return "";
+	}
+
+	// Selector: symbol() 95d89b41
+	function symbol() public view returns (string memory) {
+		require(false, stub_error);
+		dummy;
+		return "";
+	}
+
+	// Selector: totalSupply() 18160ddd
+	function totalSupply() public view returns (uint256) {
+		require(false, stub_error);
+		dummy;
+		return 0;
+	}
+
+	// Selector: decimals() 313ce567
+	function decimals() public view returns (uint8) {
+		require(false, stub_error);
+		dummy;
+		return 0;
+	}
+
+	// Selector: balanceOf(address) 70a08231
+	function balanceOf(address owner) public view returns (uint256) {
+		require(false, stub_error);
+		owner;
+		dummy;
+		return 0;
+	}
+
+	// Selector: transfer(address,uint256) a9059cbb
+	function transfer(address to, uint256 amount) public returns (bool) {
+		require(false, stub_error);
+		to;
+		amount;
+		dummy = 0;
+		return false;
+	}
+
+	// Selector: transferFrom(address,address,uint256) 23b872dd
+	function transferFrom(
+		address from,
+		address to,
+		uint256 amount
+	) public returns (bool) {
+		require(false, stub_error);
+		from;
+		to;
+		amount;
+		dummy = 0;
+		return false;
+	}
+
+	// Selector: approve(address,uint256) 095ea7b3
+	function approve(address spender, uint256 amount) public returns (bool) {
+		require(false, stub_error);
+		spender;
+		amount;
+		dummy = 0;
+		return false;
+	}
+
+	// Selector: allowance(address,address) dd62ed3e
+	function allowance(address owner, address spender)
+		public
+		view
+		returns (uint256)
+	{
+		require(false, stub_error);
+		owner;
+		spender;
+		dummy;
+		return 0;
+	}
+}
+
+// Selector: ab8deb37
+contract ERC20UniqueExtensions is Dummy, ERC165 {
+	// Selector: burnFrom(address,uint256) 79cc6790
+	function burnFrom(address from, uint256 amount) public returns (bool) {
+		require(false, stub_error);
+		from;
+		amount;
+		dummy = 0;
+		return false;
+	}
+
+	// Selector: repartition(uint256) d2418ca7
+	function repartition(uint256 amount) public returns (bool) {
+		require(false, stub_error);
+		amount;
+		dummy = 0;
+		return false;
+	}
+}
+
+contract UniqueRefungibleToken is Dummy, ERC165, ERC20, ERC20UniqueExtensions {}
modifiedpallets/refungible/src/weights.rsdiffbeforeafterboth
--- a/pallets/refungible/src/weights.rs
+++ b/pallets/refungible/src/weights.rs
@@ -3,7 +3,7 @@
 //! Autogenerated weights for pallet_refungible
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-06-27, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-07-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
 
 // Executed Command:
@@ -49,6 +49,9 @@
 	fn transfer_from_removing() -> Weight;
 	fn transfer_from_creating_removing() -> Weight;
 	fn burn_from() -> Weight;
+	fn set_token_property_permissions(b: u32, ) -> Weight;
+	fn set_token_properties(b: u32, ) -> Weight;
+	fn delete_token_properties(b: u32, ) -> Weight;
 	fn repartition_item() -> Weight;
 }
 
@@ -62,7 +65,7 @@
 	// Storage: Refungible TokenData (r:0 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn create_item() -> Weight {
-		(17_553_000 as Weight)
+		(21_310_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
@@ -73,9 +76,9 @@
 	// Storage: Refungible TokenData (r:0 w:4)
 	// Storage: Refungible Owned (r:0 w:4)
 	fn create_multiple_items(b: u32, ) -> Weight {
-		(10_654_000 as Weight)
-			// Standard Error: 1_000
-			.saturating_add((5_114_000 as Weight).saturating_mul(b as Weight))
+		(9_552_000 as Weight)
+			// Standard Error: 2_000
+			.saturating_add((7_056_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
@@ -87,9 +90,9 @@
 	// Storage: Refungible TokenData (r:0 w:4)
 	// Storage: Refungible Owned (r:0 w:4)
 	fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight {
-		(3_587_000 as Weight)
+		(4_857_000 as Weight)
 			// Standard Error: 2_000
-			.saturating_add((7_931_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((9_838_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -102,9 +105,9 @@
 	// Storage: Refungible Balance (r:0 w:4)
 	// Storage: Refungible Owned (r:0 w:4)
 	fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight {
-		(1_980_000 as Weight)
+		(11_335_000 as Weight)
 			// Standard Error: 2_000
-			.saturating_add((6_305_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((6_784_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(T::DbWeight::get().writes(3 as Weight))
@@ -115,7 +118,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn burn_item_partial() -> Weight {
-		(21_010_000 as Weight)
+		(21_239_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(3 as Weight))
 			.saturating_add(T::DbWeight::get().writes(4 as Weight))
 	}
@@ -125,14 +128,15 @@
 	// Storage: Refungible TokensBurnt (r:1 w:1)
 	// Storage: Refungible TokenData (r:0 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
+	// Storage: Refungible TokenProperties (r:0 w:1)
 	fn burn_item_fully() -> Weight {
-		(28_413_000 as Weight)
+		(29_426_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
-			.saturating_add(T::DbWeight::get().writes(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(7 as Weight))
 	}
 	// Storage: Refungible Balance (r:2 w:2)
 	fn transfer_normal() -> Weight {
-		(17_513_000 as Weight)
+		(17_743_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(2 as Weight))
 	}
@@ -140,7 +144,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_creating() -> Weight {
-		(20_469_000 as Weight)
+		(20_699_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(3 as Weight))
 			.saturating_add(T::DbWeight::get().writes(4 as Weight))
 	}
@@ -148,7 +152,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_removing() -> Weight {
-		(22_472_000 as Weight)
+		(22_833_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(3 as Weight))
 			.saturating_add(T::DbWeight::get().writes(4 as Weight))
 	}
@@ -156,21 +160,21 @@
 	// Storage: Refungible AccountBalance (r:2 w:2)
 	// Storage: Refungible Owned (r:0 w:2)
 	fn transfer_creating_removing() -> Weight {
-		(24_866_000 as Weight)
+		(24_936_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
 	// Storage: Refungible Balance (r:1 w:0)
 	// Storage: Refungible Allowance (r:0 w:1)
 	fn approve() -> Weight {
-		(13_475_000 as Weight)
+		(13_446_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Refungible Allowance (r:1 w:1)
 	// Storage: Refungible Balance (r:2 w:2)
 	fn transfer_from_normal() -> Weight {
-		(24_707_000 as Weight)
+		(24_777_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(3 as Weight))
 			.saturating_add(T::DbWeight::get().writes(3 as Weight))
 	}
@@ -179,7 +183,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_from_creating() -> Weight {
-		(27_812_000 as Weight)
+		(28_483_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(5 as Weight))
 	}
@@ -188,7 +192,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_from_removing() -> Weight {
-		(29_966_000 as Weight)
+		(29_896_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(5 as Weight))
 	}
@@ -197,7 +201,7 @@
 	// Storage: Refungible AccountBalance (r:2 w:2)
 	// Storage: Refungible Owned (r:0 w:2)
 	fn transfer_from_creating_removing() -> Weight {
-		(31_660_000 as Weight)
+		(32_070_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(5 as Weight))
 			.saturating_add(T::DbWeight::get().writes(7 as Weight))
 	}
@@ -208,15 +212,42 @@
 	// Storage: Refungible TokensBurnt (r:1 w:1)
 	// Storage: Refungible TokenData (r:0 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
+	// Storage: Refungible TokenProperties (r:0 w:1)
 	fn burn_from() -> Weight {
-		(36_248_000 as Weight)
+		(36_789_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(5 as Weight))
-			.saturating_add(T::DbWeight::get().writes(7 as Weight))
+			.saturating_add(T::DbWeight::get().writes(8 as Weight))
+	}
+	// Storage: Common CollectionPropertyPermissions (r:1 w:1)
+	fn set_token_property_permissions(b: u32, ) -> Weight {
+		(0 as Weight)
+			// Standard Error: 62_000
+			.saturating_add((15_803_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(T::DbWeight::get().reads(1 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
+	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
+	// Storage: Refungible TokenProperties (r:1 w:1)
+	fn set_token_properties(b: u32, ) -> Weight {
+		(0 as Weight)
+			// Standard Error: 1_668_000
+			.saturating_add((302_308_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(T::DbWeight::get().reads(2 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
+	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
+	// Storage: Refungible TokenProperties (r:1 w:1)
+	fn delete_token_properties(b: u32, ) -> Weight {
+		(0 as Weight)
+			// Standard Error: 1_619_000
+			.saturating_add((294_574_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(T::DbWeight::get().reads(2 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Refungible TotalSupply (r:1 w:1)
 	// Storage: Refungible Balance (r:1 w:1)
 	fn repartition_item() -> Weight {
-		(8_226_000 as Weight)
+		(8_325_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(2 as Weight))
 	}
@@ -231,7 +262,7 @@
 	// Storage: Refungible TokenData (r:0 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn create_item() -> Weight {
-		(17_553_000 as Weight)
+		(21_310_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(6 as Weight))
 	}
@@ -242,9 +273,9 @@
 	// Storage: Refungible TokenData (r:0 w:4)
 	// Storage: Refungible Owned (r:0 w:4)
 	fn create_multiple_items(b: u32, ) -> Weight {
-		(10_654_000 as Weight)
-			// Standard Error: 1_000
-			.saturating_add((5_114_000 as Weight).saturating_mul(b as Weight))
+		(9_552_000 as Weight)
+			// Standard Error: 2_000
+			.saturating_add((7_056_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
@@ -256,9 +287,9 @@
 	// Storage: Refungible TokenData (r:0 w:4)
 	// Storage: Refungible Owned (r:0 w:4)
 	fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight {
-		(3_587_000 as Weight)
+		(4_857_000 as Weight)
 			// Standard Error: 2_000
-			.saturating_add((7_931_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((9_838_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(1 as Weight))
 			.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
@@ -271,9 +302,9 @@
 	// Storage: Refungible Balance (r:0 w:4)
 	// Storage: Refungible Owned (r:0 w:4)
 	fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight {
-		(1_980_000 as Weight)
+		(11_335_000 as Weight)
 			// Standard Error: 2_000
-			.saturating_add((6_305_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add((6_784_000 as Weight).saturating_mul(b as Weight))
 			.saturating_add(RocksDbWeight::get().reads(1 as Weight))
 			.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
 			.saturating_add(RocksDbWeight::get().writes(3 as Weight))
@@ -284,7 +315,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn burn_item_partial() -> Weight {
-		(21_010_000 as Weight)
+		(21_239_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(3 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(4 as Weight))
 	}
@@ -294,14 +325,15 @@
 	// Storage: Refungible TokensBurnt (r:1 w:1)
 	// Storage: Refungible TokenData (r:0 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
+	// Storage: Refungible TokenProperties (r:0 w:1)
 	fn burn_item_fully() -> Weight {
-		(28_413_000 as Weight)
+		(29_426_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
-			.saturating_add(RocksDbWeight::get().writes(6 as Weight))
+			.saturating_add(RocksDbWeight::get().writes(7 as Weight))
 	}
 	// Storage: Refungible Balance (r:2 w:2)
 	fn transfer_normal() -> Weight {
-		(17_513_000 as Weight)
+		(17_743_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(2 as Weight))
 	}
@@ -309,7 +341,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_creating() -> Weight {
-		(20_469_000 as Weight)
+		(20_699_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(3 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(4 as Weight))
 	}
@@ -317,7 +349,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_removing() -> Weight {
-		(22_472_000 as Weight)
+		(22_833_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(3 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(4 as Weight))
 	}
@@ -325,21 +357,21 @@
 	// Storage: Refungible AccountBalance (r:2 w:2)
 	// Storage: Refungible Owned (r:0 w:2)
 	fn transfer_creating_removing() -> Weight {
-		(24_866_000 as Weight)
+		(24_936_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(6 as Weight))
 	}
 	// Storage: Refungible Balance (r:1 w:0)
 	// Storage: Refungible Allowance (r:0 w:1)
 	fn approve() -> Weight {
-		(13_475_000 as Weight)
+		(13_446_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(1 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Refungible Allowance (r:1 w:1)
 	// Storage: Refungible Balance (r:2 w:2)
 	fn transfer_from_normal() -> Weight {
-		(24_707_000 as Weight)
+		(24_777_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(3 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(3 as Weight))
 	}
@@ -348,7 +380,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_from_creating() -> Weight {
-		(27_812_000 as Weight)
+		(28_483_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(5 as Weight))
 	}
@@ -357,7 +389,7 @@
 	// Storage: Refungible AccountBalance (r:1 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
 	fn transfer_from_removing() -> Weight {
-		(29_966_000 as Weight)
+		(29_896_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(4 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(5 as Weight))
 	}
@@ -366,7 +398,7 @@
 	// Storage: Refungible AccountBalance (r:2 w:2)
 	// Storage: Refungible Owned (r:0 w:2)
 	fn transfer_from_creating_removing() -> Weight {
-		(31_660_000 as Weight)
+		(32_070_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(5 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(7 as Weight))
 	}
@@ -377,15 +409,42 @@
 	// Storage: Refungible TokensBurnt (r:1 w:1)
 	// Storage: Refungible TokenData (r:0 w:1)
 	// Storage: Refungible Owned (r:0 w:1)
+	// Storage: Refungible TokenProperties (r:0 w:1)
 	fn burn_from() -> Weight {
-		(36_248_000 as Weight)
+		(36_789_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(5 as Weight))
-			.saturating_add(RocksDbWeight::get().writes(7 as Weight))
+			.saturating_add(RocksDbWeight::get().writes(8 as Weight))
+	}
+	// Storage: Common CollectionPropertyPermissions (r:1 w:1)
+	fn set_token_property_permissions(b: u32, ) -> Weight {
+		(0 as Weight)
+			// Standard Error: 62_000
+			.saturating_add((15_803_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(RocksDbWeight::get().reads(1 as Weight))
+			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
+	}
+	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
+	// Storage: Refungible TokenProperties (r:1 w:1)
+	fn set_token_properties(b: u32, ) -> Weight {
+		(0 as Weight)
+			// Standard Error: 1_668_000
+			.saturating_add((302_308_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
+			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
 	}
+	// Storage: Common CollectionPropertyPermissions (r:1 w:0)
+	// Storage: Refungible TokenProperties (r:1 w:1)
+	fn delete_token_properties(b: u32, ) -> Weight {
+		(0 as Weight)
+			// Standard Error: 1_619_000
+			.saturating_add((294_574_000 as Weight).saturating_mul(b as Weight))
+			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
+			.saturating_add(RocksDbWeight::get().writes(1 as Weight))
+	}
 	// Storage: Refungible TotalSupply (r:1 w:1)
 	// Storage: Refungible Balance (r:1 w:1)
 	fn repartition_item() -> Weight {
-		(8_226_000 as Weight)
+		(8_325_000 as Weight)
 			.saturating_add(RocksDbWeight::get().reads(2 as Weight))
 			.saturating_add(RocksDbWeight::get().writes(2 as Weight))
 	}
modifiedpallets/scheduler/src/lib.rsdiffbeforeafterboth
--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -24,7 +24,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-// 	http://www.apache.org/licenses/LICENSE-2.0
+// 	<http://www.apache.org/licenses/LICENSE-2.0>
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -32,27 +32,36 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-//! # Schedulerdo_reschedule
+//! # Unique scheduler
+//! A Pallet for scheduling dispatches.
+//!
+//! - [`Config`]
+//! - [`Call`]
+//! - [`Pallet`]
+//!
+//! ## Overview
 //!
 //! This Pallet exposes capabilities for scheduling dispatches to occur at a
 //! specified block number or at a specified period. These scheduled dispatches
-//! may be named or anonymous and may be canceled.
+//! should be named and may be canceled.
 //!
-//! **NOTE:** The scheduled calls will be dispatched with the default filter
-//! for the origin: namely `frame_system::Config::BaseCallFilter` for all origin
-//! except root which will get no filter. And not the filter contained in origin
-//! use to call `fn schedule`.
+//! **NOTE:** The unique scheduler is designed for deferred transaction calls by block number.
+//! Any user can book a call of a certain transaction to a specific block number.
+//! Also possible to book a call with a certain frequency.
 //!
-//! If a call is scheduled using proxy or whatever mecanism which adds filter,
-//! then those filter will not be used when dispatching the schedule call.
+//! Key differences from the original pallet:
+//! <https://crates.io/crates/pallet-scheduler>
+//! Schedule Id restricted by 16 bytes. Identificator for booked call.
+//! Priority limited by HARD DEADLINE (<= 63). Calls over maximum weight don't include to block.
+//! The maximum weight that may be scheduled per block for any dispatchables of less priority than `schedule::HARD_DEADLINE`.
+//! Maybe_periodic limit is 100 calls. Reserved for future sponsored transaction support.
+//! At 100 calls reserved amount is not so much and this is avoid potential problems with balance locks.
+//! Any account allowed to schedule any calls. Account withdraw implemented through default transaction logic.
 //!
 //! ## Interface
 //!
 //! ### Dispatchable Functions
 //!
-//! * `schedule` - schedule a dispatch, which may be periodic, to occur at a specified block and
-//!   with a specified priority.
-//! * `cancel` - cancel a scheduled dispatch, specified by block number and index.
 //! * `schedule_named` - augments the `schedule` interface with an additional `Vec<u8>` parameter
 //!   that can be used for identification.
 //! * `cancel_named` - the named complement to the cancel function.
@@ -258,7 +267,7 @@
 
 	/// A Scheduler-Runtime interface for finer payment handling.
 	pub trait DispatchCall<T: frame_system::Config + Config, SelfContainedSignedInfo> {
-		/// Reserve the maximum spendings on a call.
+		/// Reserve (lock) the maximum spendings on a call, calculated from its weight and the repetition count.
 		fn reserve_balance(
 			id: ScheduledId,
 			sponsor: <T as frame_system::Config>::AccountId,
@@ -266,7 +275,7 @@
 			count: u32,
 		) -> Result<(), DispatchError>;
 
-		/// Pay for call dispatch (un-reserve) from the reserved funds, returning the change.
+		/// Unreserve (unlock) a certain amount from the payer's reserved funds, returning the change.
 		fn pay_for_call(
 			id: ScheduledId,
 			sponsor: <T as frame_system::Config>::AccountId,
@@ -282,7 +291,7 @@
 			TransactionValidityError,
 		>;
 
-		/// Release reserved funds.
+		/// Release unspent reserved funds in case of a schedule cancel.
 		fn cancel_reserve(
 			id: ScheduledId,
 			sponsor: <T as frame_system::Config>::AccountId,
@@ -441,6 +450,8 @@
 				// 	);
 				// }
 
+				// Execute transaction via chain default pipeline
+				// That means dispatch will be processed like any user's extrinsic e.g. transaction fees will be taken
 				let r = T::CallExecutor::dispatch_call(sender, call.clone());
 
 				let mut actual_call_weight: Weight = item_weight;
@@ -485,8 +496,8 @@
 					Agenda::<T>::append(wake, Some(s));
 				}
 			}
+			// Total weight should be 0, because the transaction is already paid for
 			0
-			//total_weight
 		}
 	}
 
modifiedpallets/structure/src/benchmarking.rsdiffbeforeafterboth
--- a/pallets/structure/src/benchmarking.rs
+++ b/pallets/structure/src/benchmarking.rs
@@ -1,3 +1,19 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
 use super::*;
 
 use frame_benchmarking::{benchmarks, account};
modifiedpallets/structure/src/lib.rsdiffbeforeafterboth
--- a/pallets/structure/src/lib.rs
+++ b/pallets/structure/src/lib.rs
@@ -1,3 +1,56 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+//! # Structure Pallet
+//!
+//! The Structure pallet provides functionality for handling tokens nesting an unnesting.
+//!
+//! - [`Config`]
+//! - [`Pallet`]
+//!
+//! ## Overview
+//!
+//! The Structure pallet provides functions for:
+//!
+//! - Searching for token parents, children and owners. Actual implementation of searching for
+//!   parent/child is done by pallets corresponding to token's collection type.
+//! - Nesting and unnesting tokens. Actual implementation of nesting is done by pallets corresponding
+//!   to token's collection type.
+//!
+//! ### Terminology
+//!
+//! - **Nesting:** Setting up parent-child relationship between tokens. Nested tokens are inhereting
+//!   owner from their parent. There could be multiple levels of nesting. Token couldn't be nested in
+//!   it's child token i.e. parent-child relationship graph shouldn't have
+//!
+//! - **Parent:** Token that current token is nested in.
+//!
+//! - **Owner:** Account that owns the token and all nested tokens.
+//!
+//! ## Interface
+//!
+//! ### Available Functions
+//!
+//! - `find_parent` - Find parent of the token. It could be an account or another token.
+//! - `parent_chain` - Find chain of parents of the token.
+//! - `find_topmost_owner` - Find account or token in the end of the chain of parents.
+//! - `check_nesting` - Check if the token could be nested in the other token
+//! - `nest_if_sent_to_token` - Nest the token in the other token
+//! - `unnest_if_nested` - Unnest the token from the other token
+
 #![cfg_attr(not(feature = "std"), no_std)]
 
 use pallet_common::CommonCollectionOperations;
@@ -82,6 +135,12 @@
 }
 
 impl<T: Config> Pallet<T> {
+	/// Find account owning the `token` or a token that the `token` is nested in.
+	///
+	/// Returns the enum that have three variants:
+	/// - [`User`](crate::Parent<T>::User): Contains account.
+	/// - [`Token`](crate::Parent<T>::Token): Contains token id and collection id.
+	/// - [`TokenNotFound`](crate::Parent<T>::TokenNotFound): Indicates that parent was not found
 	pub fn find_parent(
 		collection: CollectionId,
 		token: TokenId,
@@ -103,6 +162,11 @@
 		})
 	}
 
+	/// Get the chain of parents of a token in the nesting hierarchy
+	///
+	/// Returns an iterator of addresses of the owning tokens and the owning account,
+	/// starting from the immediate parent token, ending with the account.
+	/// Returns error if cycle is detected.
 	pub fn parent_chain(
 		mut collection: CollectionId,
 		mut token: TokenId,
@@ -133,6 +197,8 @@
 	/// Try to dereference address, until finding top level owner
 	///
 	/// May return token address if parent token not yet exists
+	///
+	/// - `budget`: Limit for searching parents in depth.
 	pub fn find_topmost_owner(
 		collection: CollectionId,
 		token: TokenId,
@@ -149,6 +215,10 @@
 		})
 	}
 
+	/// Find the topmost parent and check that assigning `for_nest` token as a child for
+	/// `token` wouldn't create a cycle.
+	///
+	/// - `budget`: Limit for searching parents in depth.
 	pub fn get_checked_topmost_owner(
 		collection: CollectionId,
 		token: TokenId,
@@ -177,6 +247,10 @@
 		Err(<Error<T>>::DepthLimit.into())
 	}
 
+	/// Burn token and all of it's nested tokens
+	///
+	/// - `self_budget`: Limit for searching children in depth.
+	/// - `breadth_budget`: Limit of breadth of searching children.
 	pub fn burn_item_recursively(
 		from: T::CrossAccountId,
 		collection: CollectionId,
@@ -190,7 +264,13 @@
 		dispatch.burn_item_recursively(from.clone(), token, self_budget, breadth_budget)
 	}
 
-	/// Check if token indirectly owned by specified user
+	/// Check if `token` indirectly owned by `user`
+	///
+	/// Returns `true` if `user` is `token`'s owner. Or If token is provided as `user` then
+	/// check that `user` and `token` have same owner.
+	/// Checks that assigning `for_nest` token as a child for `token` wouldn't create a cycle.
+	///
+	/// - `budget`: Limit for searching parents in depth.
 	pub fn check_indirectly_owned(
 		user: T::CrossAccountId,
 		collection: CollectionId,
@@ -207,6 +287,12 @@
 			.map(|indirect_owner| indirect_owner == target_parent)
 	}
 
+	/// Checks that `under` is valid token and that `token_id` could be nested under it
+	/// and that `from` is `under`'s owner
+	///
+	/// Returns OK if `under` is not a token
+	///
+	/// - `nesting_budget`: Limit for searching parents in depth.
 	pub fn check_nesting(
 		from: T::CrossAccountId,
 		under: &T::CrossAccountId,
@@ -219,6 +305,11 @@
 		})
 	}
 
+	/// Nests `token_id` under `under` token
+	///
+	/// Returns OK if `under` is not a token. Checks that nesting is possible.
+	///
+	/// - `nesting_budget`: Limit for searching parents in depth.
 	pub fn nest_if_sent_to_token(
 		from: T::CrossAccountId,
 		under: &T::CrossAccountId,
@@ -235,6 +326,9 @@
 		})
 	}
 
+	/// Nests `token_id` under `owner` token
+	///
+	/// Caller should check that nesting wouldn't cause recursion in nesting
 	pub fn nest_if_sent_to_token_unchecked(
 		owner: &T::CrossAccountId,
 		collection_id: CollectionId,
@@ -245,6 +339,7 @@
 		});
 	}
 
+	/// Unnests `token_id` from `owner`.
 	pub fn unnest_if_nested(
 		owner: &T::CrossAccountId,
 		collection_id: CollectionId,
modifiedpallets/unique/src/eth/stubs/CollectionHelpers.rawdiffbeforeafterboth

binary blob — no preview

modifiedprimitives/data-structs/Cargo.tomldiffbeforeafterboth
--- a/primitives/data-structs/Cargo.toml
+++ b/primitives/data-structs/Cargo.toml
@@ -6,7 +6,7 @@
 license = 'GPLv3'
 homepage = "https://unique.network"
 repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = '0.1.0'
+version = '0.1.1'
 
 [dependencies]
 scale-info = { version = "2.0.1", default-features = false, features = [
addedprimitives/data-structs/Changelog.mddiffbeforeafterboth
--- /dev/null
+++ b/primitives/data-structs/Changelog.md
@@ -0,0 +1,3 @@
+### 0.1.1
+---
+* Added fields with properties to `CreateReFungibleData` and `CreateRefungibleExData`.
\ No newline at end of file
modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -563,8 +563,14 @@
 	#[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
 	#[derivative(Debug(format_with = "bounded::vec_debug"))]
 	pub const_data: BoundedVec<u8, CustomDataLimit>,
+
 	/// Number of pieces the RFT is split into
 	pub pieces: u128,
+
+	/// Key-value pairs used to describe the token as metadata
+	#[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
+	#[derivative(Debug(format_with = "bounded::vec_debug"))]
+	pub properties: CollectionPropertiesVec,
 }
 
 #[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo, MaxEncodedLen)]
@@ -601,6 +607,8 @@
 	pub const_data: BoundedVec<u8, CustomDataLimit>,
 	#[derivative(Debug(format_with = "bounded::map_debug"))]
 	pub users: BoundedBTreeMap<CrossAccountId, u128, ConstU32<MAX_ITEMS_PER_BATCH>>,
+	#[derivative(Debug(format_with = "bounded::vec_debug"))]
+	pub properties: CollectionPropertiesVec,
 }
 
 /// Explicit item creation data with meta parameters, namely the owner.
addedprimitives/rpc/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/primitives/rpc/CHANGELOG.md
@@ -0,0 +1,10 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+   This was an internal request to improve the web interface and support fractionalization event. 
\ No newline at end of file
modifiedprimitives/rpc/Cargo.tomldiffbeforeafterboth
--- a/primitives/rpc/Cargo.toml
+++ b/primitives/rpc/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "up-rpc"
-version = "0.1.0"
+version = "0.1.1"
 license = "GPLv3"
 edition = "2021"
 
modifiedprimitives/rpc/src/lib.rsdiffbeforeafterboth
--- a/primitives/rpc/src/lib.rs
+++ b/primitives/rpc/src/lib.rs
@@ -81,5 +81,6 @@
 		fn next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Result<Option<u64>>;
 		fn effective_collection_limits(collection_id: CollectionId) -> Result<Option<CollectionLimits>>;
 		fn total_pieces(collection_id: CollectionId, token_id: TokenId) -> Result<Option<u128>>;
+		fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec<CrossAccountId>>;
 	}
 }
addedruntime/common/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/runtime/common/CHANGELOG.md
@@ -0,0 +1,13 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.9.25] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+    This was an internal request to improve the web interface and support fractionalization event. 
+
+
+ 
\ No newline at end of file
modifiedruntime/common/src/dispatch.rsdiffbeforeafterboth
--- a/runtime/common/src/dispatch.rs
+++ b/runtime/common/src/dispatch.rs
@@ -25,7 +25,9 @@
 pub use pallet_common::dispatch::CollectionDispatch;
 use pallet_fungible::{Pallet as PalletFungible, FungibleHandle};
 use pallet_nonfungible::{Pallet as PalletNonfungible, NonfungibleHandle};
-use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle, erc::RefungibleTokenHandle};
+use pallet_refungible::{
+	Pallet as PalletRefungible, RefungibleHandle, erc_token::RefungibleTokenHandle,
+};
 use up_data_structs::{
 	CollectionMode, CreateCollectionData, MAX_DECIMAL_POINTS, mapping::TokenAddressMapping,
 };
modifiedruntime/common/src/runtime_apis.rsdiffbeforeafterboth
--- a/runtime/common/src/runtime_apis.rs
+++ b/runtime/common/src/runtime_apis.rs
@@ -40,6 +40,11 @@
                 fn token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {
                     dispatch_unique_runtime!(collection.token_owner(token))
                 }
+
+                fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec::<CrossAccountId>, DispatchError>  {
+                   dispatch_unique_runtime!(collection.token_owners(token))
+                }
+
                 fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {
                     let budget = up_data_structs::budget::Value::new(10);
 
modifiedruntime/tests/src/tests.rsdiffbeforeafterboth
--- a/runtime/tests/src/tests.rs
+++ b/runtime/tests/src/tests.rs
@@ -64,6 +64,12 @@
 	CreateReFungibleData {
 		const_data: vec![1, 2, 3].try_into().unwrap(),
 		pieces: 1023,
+		properties: vec![Property {
+			key: b"test-prop".to_vec().try_into().unwrap(),
+			value: b"test-nft-prop".to_vec().try_into().unwrap(),
+		}]
+		.try_into()
+		.unwrap(),
 	}
 }
 
addedtests/CHANGELOG.mddiffbeforeafterboth
--- /dev/null
+++ b/tests/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## 2022-07-14
+
+### Added
+ - Integrintegration tests of RPC method `token_owners`.
+ - Integrintegration tests of Fungible Pallet.
+  
+ 
\ No newline at end of file
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -80,6 +80,8 @@
     "testLimits": "mocha --timeout 9999999 -r ts-node/register ./**/limits.test.ts",
     "testEthCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/eth/createCollection.test.ts",
     "testRFT": "mocha --timeout 9999999 -r ts-node/register ./**/refungible.test.ts",
+    "testFT": "mocha --timeout 9999999 -r ts-node/register ./**/fungible.test.ts",
+    "testRPC": "mocha --timeout 9999999 -r ts-node/register ./**/rpc.test.ts",
     "polkadot-types-fetch-metadata": "curl -H 'Content-Type: application/json' -d '{\"id\":\"1\", \"jsonrpc\":\"2.0\", \"method\": \"state_getMetadata\", \"params\":[]}' http://localhost:9933 > src/interfaces/metadata.json",
     "polkadot-types-from-defs": "ts-node ./node_modules/.bin/polkadot-types-from-defs --endpoint src/interfaces/metadata.json --input src/interfaces/ --package .",
     "polkadot-types-from-chain": "ts-node ./node_modules/.bin/polkadot-types-from-chain --endpoint src/interfaces/metadata.json --output src/interfaces/ --package .",
modifiedtests/src/createMultipleItems.test.tsdiffbeforeafterboth
--- a/tests/src/createMultipleItems.test.ts
+++ b/tests/src/createMultipleItems.test.ts
@@ -376,14 +376,26 @@
       // ReFungible
       const collectionIdReFungible =
         await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
-      const argsReFungible = [
-        {ReFungible: ['1'.repeat(2049), 10]},
-        {ReFungible: ['2'.repeat(2049), 10]},
-        {ReFungible: ['3'.repeat(2049), 10]},
-      ];
-      const createMultipleItemsTxFungible = api.tx.unique
-        .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
-      await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
+      {
+        const argsReFungible = [
+          {ReFungible: ['1'.repeat(2049), 10, []]},
+          {ReFungible: ['2'.repeat(2049), 10, []]},
+          {ReFungible: ['3'.repeat(2049), 10, []]},
+        ];
+        const createMultipleItemsTxFungible = api.tx.unique
+          .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
+        await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
+      }
+      {
+        const argsReFungible = [
+          {ReFungible: {properties: [{key: 'key', value: 'A'.repeat(32769)}]}},
+          {ReFungible: {properties: [{key: 'key', value: 'B'.repeat(32769)}]}},
+          {ReFungible: {properties: [{key: 'key', value: 'C'.repeat(32769)}]}},
+        ];
+        const createMultipleItemsTxFungible = api.tx.unique
+          .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
+        await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
+      }
     });
   });
 
modifiedtests/src/eth/api/UniqueFungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -28,6 +28,154 @@
 	function burnFrom(address from, uint256 amount) external returns (bool);
 }
 
+// Selector: 7d9262e6
+interface Collection is Dummy, ERC165 {
+	// Set collection property.
+	//
+	// @param key Property key.
+	// @param value Propery value.
+	//
+	// Selector: setCollectionProperty(string,bytes) 2f073f66
+	function setCollectionProperty(string memory key, bytes memory value)
+		external;
+
+	// Delete collection property.
+	//
+	// @param key Property key.
+	//
+	// Selector: deleteCollectionProperty(string) 7b7debce
+	function deleteCollectionProperty(string memory key) external;
+
+	// Get collection property.
+	//
+	// @dev Throws error if key not found.
+	//
+	// @param key Property key.
+	// @return bytes The property corresponding to the key.
+	//
+	// Selector: collectionProperty(string) cf24fd6d
+	function collectionProperty(string memory key)
+		external
+		view
+		returns (bytes memory);
+
+	// Set the sponsor of the collection.
+	//
+	// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+	//
+	// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+	//
+	// Selector: setCollectionSponsor(address) 7623402e
+	function setCollectionSponsor(address sponsor) external;
+
+	// Collection sponsorship confirmation.
+	//
+	// @dev After setting the sponsor for the collection, it must be confirmed with this function.
+	//
+	// Selector: confirmCollectionSponsorship() 3c50e97a
+	function confirmCollectionSponsorship() external;
+
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"accountTokenOwnershipLimit",
+	// 	"sponsoredDataSize",
+	// 	"sponsoredDataRateLimit",
+	// 	"tokenLimit",
+	// 	"sponsorTransferTimeout",
+	// 	"sponsorApproveTimeout"
+	// @param value Value of the limit.
+	//
+	// Selector: setCollectionLimit(string,uint32) 6a3841db
+	function setCollectionLimit(string memory limit, uint32 value) external;
+
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"ownerCanTransfer",
+	// 	"ownerCanDestroy",
+	// 	"transfersEnabled"
+	// @param value Value of the limit.
+	//
+	// Selector: setCollectionLimit(string,bool) 993b7fba
+	function setCollectionLimit(string memory limit, bool value) external;
+
+	// Get contract address.
+	//
+	// Selector: contractAddress() f6b4dfb4
+	function contractAddress() external view returns (address);
+
+	// Add collection admin by substrate address.
+	// @param new_admin Substrate administrator address.
+	//
+	// Selector: addCollectionAdminSubstrate(uint256) 5730062b
+	function addCollectionAdminSubstrate(uint256 newAdmin) external;
+
+	// Remove collection admin by substrate address.
+	// @param admin Substrate administrator address.
+	//
+	// Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
+	function removeCollectionAdminSubstrate(uint256 admin) external;
+
+	// Add collection admin.
+	// @param new_admin Address of the added administrator.
+	//
+	// Selector: addCollectionAdmin(address) 92e462c7
+	function addCollectionAdmin(address newAdmin) external;
+
+	// Remove collection admin.
+	//
+	// @param new_admin Address of the removed administrator.
+	//
+	// Selector: removeCollectionAdmin(address) fafd7b42
+	function removeCollectionAdmin(address admin) external;
+
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+	//
+	// Selector: setCollectionNesting(bool) 112d4586
+	function setCollectionNesting(bool enable) external;
+
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+	// @param collections Addresses of collections that will be available for nesting.
+	//
+	// Selector: setCollectionNesting(bool,address[]) 64872396
+	function setCollectionNesting(bool enable, address[] memory collections)
+		external;
+
+	// Set the collection access method.
+	// @param mode Access mode
+	// 	0 for Normal
+	// 	1 for AllowList
+	//
+	// Selector: setCollectionAccess(uint8) 41835d4c
+	function setCollectionAccess(uint8 mode) external;
+
+	// Add the user to the allowed list.
+	//
+	// @param user Address of a trusted user.
+	//
+	// Selector: addToCollectionAllowList(address) 67844fe6
+	function addToCollectionAllowList(address user) external;
+
+	// Remove the user from the allowed list.
+	//
+	// @param user Address of a removed user.
+	//
+	// Selector: removeFromCollectionAllowList(address) 85c51acb
+	function removeFromCollectionAllowList(address user) external;
+
+	// Switch permission for minting.
+	//
+	// @param mode Enable if "true".
+	//
+	// Selector: setCollectionMintMode(bool) 00018e84
+	function setCollectionMintMode(bool mode) external;
+}
+
 // Selector: 942e8b22
 interface ERC20 is Dummy, ERC165, ERC20Events {
 	// Selector: name() 06fdde03
@@ -63,39 +211,6 @@
 		external
 		view
 		returns (uint256);
-}
-
-// Selector: c894dc35
-interface Collection is Dummy, ERC165 {
-	// Selector: setCollectionProperty(string,bytes) 2f073f66
-	function setCollectionProperty(string memory key, bytes memory value)
-		external;
-
-	// Selector: deleteCollectionProperty(string) 7b7debce
-	function deleteCollectionProperty(string memory key) external;
-
-	// Throws error if key not found
-	//
-	// Selector: collectionProperty(string) cf24fd6d
-	function collectionProperty(string memory key)
-		external
-		view
-		returns (bytes memory);
-
-	// Selector: ethSetSponsor(address) 8f9af356
-	function ethSetSponsor(address sponsor) external;
-
-	// Selector: ethConfirmSponsorship() a8580d1a
-	function ethConfirmSponsorship() external;
-
-	// Selector: setLimit(string,uint32) 68db30ca
-	function setLimit(string memory limit, uint32 value) external;
-
-	// Selector: setLimit(string,bool) ea67e4c2
-	function setLimit(string memory limit, bool value) external;
-
-	// Selector: contractAddress() f6b4dfb4
-	function contractAddress() external view returns (address);
 }
 
 interface UniqueFungible is
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -44,6 +44,13 @@
 
 // Selector: 41369377
 interface TokenProperties is Dummy, ERC165 {
+	// @notice Set permissions for token property.
+	// @dev Throws error if `msg.sender` is not admin or owner of the collection.
+	// @param key Property key.
+	// @param is_mutable Permission to mutate property.
+	// @param collection_admin Permission to mutate property by collection admin if property is mutable.
+	// @param token_owner Permission to mutate property by token owner if property is mutable.
+	//
 	// Selector: setTokenPropertyPermission(string,bool,bool,bool) 222d97fa
 	function setTokenPropertyPermission(
 		string memory key,
@@ -52,6 +59,12 @@
 		bool tokenOwner
 	) external;
 
+	// @notice Set token property value.
+	// @dev Throws error if `msg.sender` has no permission to edit the property.
+	// @param tokenId ID of the token.
+	// @param key Property key.
+	// @param value Property value.
+	//
 	// Selector: setProperty(uint256,string,bytes) 1752d67b
 	function setProperty(
 		uint256 tokenId,
@@ -59,10 +72,19 @@
 		bytes memory value
 	) external;
 
+	// @notice Delete token property value.
+	// @dev Throws error if `msg.sender` has no permission to edit the property.
+	// @param tokenId ID of the token.
+	// @param key Property key.
+	//
 	// Selector: deleteProperty(uint256,string) 066111d1
 	function deleteProperty(uint256 tokenId, string memory key) external;
 
-	// Throws error if key not found
+	// @notice Get token property value.
+	// @dev Throws error if key not found
+	// @param tokenId ID of the token.
+	// @param key Property key.
+	// @return Property value bytes
 	//
 	// Selector: property(uint256,string) 7228c327
 	function property(uint256 tokenId, string memory key)
@@ -73,19 +95,36 @@
 
 // Selector: 42966c68
 interface ERC721Burnable is Dummy, ERC165 {
+	// @notice Burns a specific ERC721 token.
+	// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+	//  operator of the current owner.
+	// @param tokenId The NFT to approve
+	//
 	// Selector: burn(uint256) 42966c68
 	function burn(uint256 tokenId) external;
 }
 
 // Selector: 58800161
 interface ERC721 is Dummy, ERC165, ERC721Events {
+	// @notice Count all NFTs assigned to an owner
+	// @dev NFTs assigned to the zero address are considered invalid, and this
+	//  function throws for queries about the zero address.
+	// @param owner An address for whom to query the balance
+	// @return The number of NFTs owned by `owner`, possibly zero
+	//
 	// Selector: balanceOf(address) 70a08231
 	function balanceOf(address owner) external view returns (uint256);
 
+	// @notice Find the owner of an NFT
+	// @dev NFTs assigned to zero address are considered invalid, and queries
+	//  about them do throw.
+	// @param tokenId The identifier for an NFT
+	// @return The address of the owner of the NFT
+	//
 	// Selector: ownerOf(uint256) 6352211e
 	function ownerOf(uint256 tokenId) external view returns (address);
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: safeTransferFromWithData(address,address,uint256,bytes) 60a11672
 	function safeTransferFromWithData(
@@ -95,7 +134,7 @@
 		bytes memory data
 	) external;
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: safeTransferFrom(address,address,uint256) 42842e0e
 	function safeTransferFrom(
@@ -104,6 +143,17 @@
 		uint256 tokenId
 	) external;
 
+	// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+	//  TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+	//  THEY MAY BE PERMANENTLY LOST
+	// @dev Throws unless `msg.sender` is the current owner or an authorized
+	//  operator for this NFT. Throws if `from` is not the current owner. Throws
+	//  if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+	// @param from The current owner of the NFT
+	// @param to The new owner
+	// @param tokenId The NFT to transfer
+	// @param _value Not used for an NFT
+	//
 	// Selector: transferFrom(address,address,uint256) 23b872dd
 	function transferFrom(
 		address from,
@@ -111,20 +161,27 @@
 		uint256 tokenId
 	) external;
 
+	// @notice Set or reaffirm the approved address for an NFT
+	// @dev The zero address indicates there is no approved address.
+	// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+	//  operator of the current owner.
+	// @param approved The new approved NFT controller
+	// @param tokenId The NFT to approve
+	//
 	// Selector: approve(address,uint256) 095ea7b3
 	function approve(address approved, uint256 tokenId) external;
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: setApprovalForAll(address,bool) a22cb465
 	function setApprovalForAll(address operator, bool approved) external;
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: getApproved(uint256) 081812fc
 	function getApproved(uint256 tokenId) external view returns (address);
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: isApprovedForAll(address,address) e985e9c5
 	function isApprovedForAll(address owner, address operator)
@@ -135,13 +192,21 @@
 
 // Selector: 5b5e139f
 interface ERC721Metadata is Dummy, ERC165 {
+	// @notice A descriptive name for a collection of NFTs in this contract
+	//
 	// Selector: name() 06fdde03
 	function name() external view returns (string memory);
 
+	// @notice An abbreviated name for NFTs in this contract
+	//
 	// Selector: symbol() 95d89b41
 	function symbol() external view returns (string memory);
 
-	// Returns token's const_metadata
+	// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+	// @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
+	//  3986. The URI may point to a JSON file that conforms to the "ERC721
+	//  Metadata JSON Schema".
+	// @return token's const_metadata
 	//
 	// Selector: tokenURI(uint256) c87b56dd
 	function tokenURI(uint256 tokenId) external view returns (string memory);
@@ -152,14 +217,21 @@
 	// Selector: mintingFinished() 05d2035b
 	function mintingFinished() external view returns (bool);
 
-	// `token_id` should be obtained with `next_token_id` method,
-	// unlike standard, you can't specify it manually
+	// @notice Function to mint token.
+	// @dev `tokenId` should be obtained with `nextTokenId` method,
+	//  unlike standard, you can't specify it manually
+	// @param to The new owner
+	// @param tokenId ID of the minted NFT
 	//
 	// Selector: mint(address,uint256) 40c10f19
 	function mint(address to, uint256 tokenId) external returns (bool);
 
-	// `token_id` should be obtained with `next_token_id` method,
-	// unlike standard, you can't specify it manually
+	// @notice Function to mint token with the given tokenUri.
+	// @dev `tokenId` should be obtained with `nextTokenId` method,
+	//  unlike standard, you can't specify it manually
+	// @param to The new owner
+	// @param tokenId ID of the minted NFT
+	// @param tokenUri Token URI that would be stored in the NFT properties
 	//
 	// Selector: mintWithTokenURI(address,uint256,string) 50bb4e7f
 	function mintWithTokenURI(
@@ -168,7 +240,7 @@
 		string memory tokenUri
 	) external returns (bool);
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: finishMinting() 7d64bcb4
 	function finishMinting() external returns (bool);
@@ -176,10 +248,15 @@
 
 // Selector: 780e9d63
 interface ERC721Enumerable is Dummy, ERC165 {
+	// @notice Enumerate valid NFTs
+	// @param index A counter less than `totalSupply()`
+	// @return The token identifier for the `index`th NFT,
+	//  (sort order not specified)
+	//
 	// Selector: tokenByIndex(uint256) 4f6ccce7
 	function tokenByIndex(uint256 index) external view returns (uint256);
 
-	// Not implemented
+	// @dev Not implemented
 	//
 	// Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59
 	function tokenOfOwnerByIndex(address owner, uint256 index)
@@ -187,20 +264,38 @@
 		view
 		returns (uint256);
 
+	// @notice Count NFTs tracked by this contract
+	// @return A count of valid NFTs tracked by this contract, where each one of
+	//  them has an assigned and queryable owner not equal to the zero address
+	//
 	// Selector: totalSupply() 18160ddd
 	function totalSupply() external view returns (uint256);
 }
 
 // Selector: 7d9262e6
 interface Collection is Dummy, ERC165 {
+	// Set collection property.
+	//
+	// @param key Property key.
+	// @param value Propery value.
+	//
 	// Selector: setCollectionProperty(string,bytes) 2f073f66
 	function setCollectionProperty(string memory key, bytes memory value)
 		external;
 
+	// Delete collection property.
+	//
+	// @param key Property key.
+	//
 	// Selector: deleteCollectionProperty(string) 7b7debce
 	function deleteCollectionProperty(string memory key) external;
 
-	// Throws error if key not found
+	// Get collection property.
+	//
+	// @dev Throws error if key not found.
+	//
+	// @param key Property key.
+	// @return bytes The property corresponding to the key.
 	//
 	// Selector: collectionProperty(string) cf24fd6d
 	function collectionProperty(string memory key)
@@ -208,69 +303,168 @@
 		view
 		returns (bytes memory);
 
+	// Set the sponsor of the collection.
+	//
+	// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+	//
+	// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+	//
 	// Selector: setCollectionSponsor(address) 7623402e
 	function setCollectionSponsor(address sponsor) external;
 
+	// Collection sponsorship confirmation.
+	//
+	// @dev After setting the sponsor for the collection, it must be confirmed with this function.
+	//
 	// Selector: confirmCollectionSponsorship() 3c50e97a
 	function confirmCollectionSponsorship() external;
 
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"accountTokenOwnershipLimit",
+	// 	"sponsoredDataSize",
+	// 	"sponsoredDataRateLimit",
+	// 	"tokenLimit",
+	// 	"sponsorTransferTimeout",
+	// 	"sponsorApproveTimeout"
+	// @param value Value of the limit.
+	//
 	// Selector: setCollectionLimit(string,uint32) 6a3841db
 	function setCollectionLimit(string memory limit, uint32 value) external;
 
+	// Set limits for the collection.
+	// @dev Throws error if limit not found.
+	// @param limit Name of the limit. Valid names:
+	// 	"ownerCanTransfer",
+	// 	"ownerCanDestroy",
+	// 	"transfersEnabled"
+	// @param value Value of the limit.
+	//
 	// Selector: setCollectionLimit(string,bool) 993b7fba
 	function setCollectionLimit(string memory limit, bool value) external;
 
+	// Get contract address.
+	//
 	// Selector: contractAddress() f6b4dfb4
 	function contractAddress() external view returns (address);
 
+	// Add collection admin by substrate address.
+	// @param new_admin Substrate administrator address.
+	//
 	// Selector: addCollectionAdminSubstrate(uint256) 5730062b
-	function addCollectionAdminSubstrate(uint256 newAdmin) external view;
+	function addCollectionAdminSubstrate(uint256 newAdmin) external;
 
+	// Remove collection admin by substrate address.
+	// @param admin Substrate administrator address.
+	//
 	// Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
-	function removeCollectionAdminSubstrate(uint256 newAdmin) external view;
+	function removeCollectionAdminSubstrate(uint256 admin) external;
 
+	// Add collection admin.
+	// @param new_admin Address of the added administrator.
+	//
 	// Selector: addCollectionAdmin(address) 92e462c7
-	function addCollectionAdmin(address newAdmin) external view;
+	function addCollectionAdmin(address newAdmin) external;
 
+	// Remove collection admin.
+	//
+	// @param new_admin Address of the removed administrator.
+	//
 	// Selector: removeCollectionAdmin(address) fafd7b42
-	function removeCollectionAdmin(address admin) external view;
+	function removeCollectionAdmin(address admin) external;
 
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+	//
 	// Selector: setCollectionNesting(bool) 112d4586
 	function setCollectionNesting(bool enable) external;
 
+	// Toggle accessibility of collection nesting.
+	//
+	// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+	// @param collections Addresses of collections that will be available for nesting.
+	//
 	// Selector: setCollectionNesting(bool,address[]) 64872396
 	function setCollectionNesting(bool enable, address[] memory collections)
 		external;
 
+	// Set the collection access method.
+	// @param mode Access mode
+	// 	0 for Normal
+	// 	1 for AllowList
+	//
 	// Selector: setCollectionAccess(uint8) 41835d4c
 	function setCollectionAccess(uint8 mode) external;
 
+	// Add the user to the allowed list.
+	//
+	// @param user Address of a trusted user.
+	//
 	// Selector: addToCollectionAllowList(address) 67844fe6
-	function addToCollectionAllowList(address user) external view;
+	function addToCollectionAllowList(address user) external;
 
+	// Remove the user from the allowed list.
+	//
+	// @param user Address of a removed user.
+	//
 	// Selector: removeFromCollectionAllowList(address) 85c51acb
-	function removeFromCollectionAllowList(address user) external view;
+	function removeFromCollectionAllowList(address user) external;
 
+	// Switch permission for minting.
+	//
+	// @param mode Enable if "true".
+	//
 	// Selector: setCollectionMintMode(bool) 00018e84
 	function setCollectionMintMode(bool mode) external;
 }
 
 // Selector: d74d154f
 interface ERC721UniqueExtensions is Dummy, ERC165 {
+	// @notice Transfer ownership of an NFT
+	// @dev Throws unless `msg.sender` is the current owner. Throws if `to`
+	//  is the zero address. Throws if `tokenId` is not a valid NFT.
+	// @param to The new owner
+	// @param tokenId The NFT to transfer
+	// @param _value Not used for an NFT
+	//
 	// Selector: transfer(address,uint256) a9059cbb
 	function transfer(address to, uint256 tokenId) external;
 
+	// @notice Burns a specific ERC721 token.
+	// @dev Throws unless `msg.sender` is the current owner or an authorized
+	//  operator for this NFT. Throws if `from` is not the current owner. Throws
+	//  if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+	// @param from The current owner of the NFT
+	// @param tokenId The NFT to transfer
+	// @param _value Not used for an NFT
+	//
 	// Selector: burnFrom(address,uint256) 79cc6790
 	function burnFrom(address from, uint256 tokenId) external;
 
+	// @notice Returns next free NFT ID.
+	//
 	// Selector: nextTokenId() 75794a3c
 	function nextTokenId() external view returns (uint256);
 
+	// @notice Function to mint multiple tokens.
+	// @dev `tokenIds` should be an array of consecutive numbers and first number
+	//  should be obtained with `nextTokenId` method
+	// @param to The new owner
+	// @param tokenIds IDs of the minted NFTs
+	//
 	// Selector: mintBulk(address,uint256[]) 44a9945e
 	function mintBulk(address to, uint256[] memory tokenIds)
 		external
 		returns (bool);
 
+	// @notice Function to mint multiple tokens with the given tokenUris.
+	// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+	//  numbers and first number should be obtained with `nextTokenId` method
+	// @param to The new owner
+	// @param tokens array of pairs of token ID and token URI for minted tokens
+	//
 	// Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006
 	function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)
 		external
addedtests/src/eth/api/UniqueRefungibleToken.soldiffbeforeafterboth
--- /dev/null
+++ b/tests/src/eth/api/UniqueRefungibleToken.sol
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: OTHER
+// This code is automatically generated
+
+pragma solidity >=0.8.0 <0.9.0;
+
+// Common stubs holder
+interface Dummy {
+
+}
+
+interface ERC165 is Dummy {
+	function supportsInterface(bytes4 interfaceID) external view returns (bool);
+}
+
+// Inline
+interface ERC20Events {
+	event Transfer(address indexed from, address indexed to, uint256 value);
+	event Approval(
+		address indexed owner,
+		address indexed spender,
+		uint256 value
+	);
+}
+
+// Selector: 942e8b22
+interface ERC20 is Dummy, ERC165, ERC20Events {
+	// Selector: name() 06fdde03
+	function name() external view returns (string memory);
+
+	// Selector: symbol() 95d89b41
+	function symbol() external view returns (string memory);
+
+	// Selector: totalSupply() 18160ddd
+	function totalSupply() external view returns (uint256);
+
+	// Selector: decimals() 313ce567
+	function decimals() external view returns (uint8);
+
+	// Selector: balanceOf(address) 70a08231
+	function balanceOf(address owner) external view returns (uint256);
+
+	// Selector: transfer(address,uint256) a9059cbb
+	function transfer(address to, uint256 amount) external returns (bool);
+
+	// Selector: transferFrom(address,address,uint256) 23b872dd
+	function transferFrom(
+		address from,
+		address to,
+		uint256 amount
+	) external returns (bool);
+
+	// Selector: approve(address,uint256) 095ea7b3
+	function approve(address spender, uint256 amount) external returns (bool);
+
+	// Selector: allowance(address,address) dd62ed3e
+	function allowance(address owner, address spender)
+		external
+		view
+		returns (uint256);
+}
+
+// Selector: ab8deb37
+interface ERC20UniqueExtensions is Dummy, ERC165 {
+	// Selector: burnFrom(address,uint256) 79cc6790
+	function burnFrom(address from, uint256 amount) external returns (bool);
+
+	// Selector: repartition(uint256) d2418ca7
+	function repartition(uint256 amount) external returns (bool);
+}
+
+interface UniqueRefungibleToken is
+	Dummy,
+	ERC165,
+	ERC20,
+	ERC20UniqueExtensions
+{}
modifiedtests/src/eth/fungibleAbi.jsondiffbeforeafterboth
--- a/tests/src/eth/fungibleAbi.json
+++ b/tests/src/eth/fungibleAbi.json
@@ -51,6 +51,33 @@
   },
   {
     "inputs": [
+      { "internalType": "address", "name": "newAdmin", "type": "address" }
+    ],
+    "name": "addCollectionAdmin",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "uint256", "name": "newAdmin", "type": "uint256" }
+    ],
+    "name": "addCollectionAdminSubstrate",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "user", "type": "address" }
+    ],
+    "name": "addToCollectionAllowList",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       { "internalType": "address", "name": "owner", "type": "address" },
       { "internalType": "address", "name": "spender", "type": "address" }
     ],
@@ -97,6 +124,13 @@
   },
   {
     "inputs": [],
+    "name": "confirmCollectionSponsorship",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
     "name": "contractAddress",
     "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
     "stateMutability": "view",
@@ -118,43 +152,51 @@
   },
   {
     "inputs": [],
-    "name": "ethConfirmSponsorship",
-    "outputs": [],
-    "stateMutability": "nonpayable",
+    "name": "name",
+    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
+    "stateMutability": "view",
     "type": "function"
   },
   {
     "inputs": [
-      { "internalType": "address", "name": "sponsor", "type": "address" }
+      { "internalType": "address", "name": "admin", "type": "address" }
     ],
-    "name": "ethSetSponsor",
+    "name": "removeCollectionAdmin",
     "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
   },
   {
-    "inputs": [],
-    "name": "name",
-    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
-    "stateMutability": "view",
+    "inputs": [
+      { "internalType": "uint256", "name": "admin", "type": "uint256" }
+    ],
+    "name": "removeCollectionAdminSubstrate",
+    "outputs": [],
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
     "inputs": [
-      { "internalType": "string", "name": "key", "type": "string" },
-      { "internalType": "bytes", "name": "value", "type": "bytes" }
+      { "internalType": "address", "name": "user", "type": "address" }
     ],
-    "name": "setCollectionProperty",
+    "name": "removeFromCollectionAllowList",
     "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
   },
   {
+    "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],
+    "name": "setCollectionAccess",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
     "inputs": [
       { "internalType": "string", "name": "limit", "type": "string" },
       { "internalType": "uint32", "name": "value", "type": "uint32" }
     ],
-    "name": "setLimit",
+    "name": "setCollectionLimit",
     "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
@@ -164,7 +206,54 @@
       { "internalType": "string", "name": "limit", "type": "string" },
       { "internalType": "bool", "name": "value", "type": "bool" }
     ],
-    "name": "setLimit",
+    "name": "setCollectionLimit",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],
+    "name": "setCollectionMintMode",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],
+    "name": "setCollectionNesting",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "bool", "name": "enable", "type": "bool" },
+      {
+        "internalType": "address[]",
+        "name": "collections",
+        "type": "address[]"
+      }
+    ],
+    "name": "setCollectionNesting",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "string", "name": "key", "type": "string" },
+      { "internalType": "bytes", "name": "value", "type": "bytes" }
+    ],
+    "name": "setCollectionProperty",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "sponsor", "type": "address" }
+    ],
+    "name": "setCollectionSponsor",
     "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
modifiedtests/src/eth/nonFungibleAbi.jsondiffbeforeafterboth
--- a/tests/src/eth/nonFungibleAbi.json
+++ b/tests/src/eth/nonFungibleAbi.json
@@ -86,7 +86,7 @@
     ],
     "name": "addCollectionAdmin",
     "outputs": [],
-    "stateMutability": "view",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -95,7 +95,7 @@
     ],
     "name": "addCollectionAdminSubstrate",
     "outputs": [],
-    "stateMutability": "view",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -104,7 +104,7 @@
     ],
     "name": "addToCollectionAllowList",
     "outputs": [],
-    "stateMutability": "view",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -304,16 +304,16 @@
     ],
     "name": "removeCollectionAdmin",
     "outputs": [],
-    "stateMutability": "view",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
     "inputs": [
-      { "internalType": "uint256", "name": "newAdmin", "type": "uint256" }
+      { "internalType": "uint256", "name": "admin", "type": "uint256" }
     ],
     "name": "removeCollectionAdminSubstrate",
     "outputs": [],
-    "stateMutability": "view",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -322,7 +322,7 @@
     ],
     "name": "removeFromCollectionAllowList",
     "outputs": [],
-    "stateMutability": "view",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
addedtests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/eth/reFungibleToken.test.ts
@@ -0,0 +1,458 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {approve, createCollection, createRefungibleToken, transfer, transferFrom, UNIQUE} from '../util/helpers';
+import {createEthAccount, createEthAccountWithBalance, GAS_ARGS, itWeb3, normalizeEvents, recordEthFee, recordEvents, subToEth, tokenIdToAddress, transferBalanceToEth} from './util/helpers';
+import reFungibleTokenAbi from './reFungibleTokenAbi.json';
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+const expect = chai.expect;
+
+describe('Refungible token: Information getting', () => {
+  itWeb3('totalSupply', async ({api, web3, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+    const totalSupply = await contract.methods.totalSupply().call();
+
+    expect(totalSupply).to.equal('200');
+  });
+
+  itWeb3('balanceOf', async ({api, web3, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+    const balance = await contract.methods.balanceOf(caller).call();
+
+    expect(balance).to.equal('200');
+  });
+
+  itWeb3('decimals', async ({api, web3, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+    const decimals = await contract.methods.decimals().call();
+
+    expect(decimals).to.equal('0');
+  });
+});
+
+describe('Refungible: Plain calls', () => {
+  itWeb3('Can perform approve()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+
+    const spender = createEthAccount(web3);
+
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    {
+      const result = await contract.methods.approve(spender, 100).send({from: owner});
+      const events = normalizeEvents(result.events);
+
+      expect(events).to.be.deep.equal([
+        {
+          address,
+          event: 'Approval',
+          args: {
+            owner,
+            spender,
+            value: '100',
+          },
+        },
+      ]);
+    }
+
+    {
+      const allowance = await contract.methods.allowance(owner, spender).call();
+      expect(+allowance).to.equal(100);
+    }
+  });
+
+  itWeb3('Can perform transferFrom()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, owner);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+    const spender = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, spender);
+
+    const receiver = createEthAccount(web3);
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    await contract.methods.approve(spender, 100).send();
+
+    {
+      const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});
+      const events = normalizeEvents(result.events);
+      expect(events).to.be.deep.equal([
+        {
+          address,
+          event: 'Transfer',
+          args: {
+            from: owner,
+            to: receiver,
+            value: '49',
+          },
+        },
+        {
+          address,
+          event: 'Approval',
+          args: {
+            owner,
+            spender,
+            value: '51',
+          },
+        },
+      ]);
+    }
+
+    {
+      const balance = await contract.methods.balanceOf(receiver).call();
+      expect(+balance).to.equal(49);
+    }
+
+    {
+      const balance = await contract.methods.balanceOf(owner).call();
+      expect(+balance).to.equal(151);
+    }
+  });
+
+  itWeb3('Can perform transfer()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, owner);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+    const receiver = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, receiver);
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    {
+      const result = await contract.methods.transfer(receiver, 50).send({from: owner});
+      const events = normalizeEvents(result.events);
+      expect(events).to.be.deep.equal([
+        {
+          address,
+          event: 'Transfer',
+          args: {
+            from: owner,
+            to: receiver,
+            value: '50',
+          },
+        },
+      ]);
+    }
+
+    {
+      const balance = await contract.methods.balanceOf(owner).call();
+      expect(+balance).to.equal(150);
+    }
+
+    {
+      const balance = await contract.methods.balanceOf(receiver).call();
+      expect(+balance).to.equal(50);
+    }
+  });
+
+  itWeb3('Can perform repartition()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, owner);
+
+    const receiver = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, receiver);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    await contract.methods.repartition(200).send({from: owner});
+    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(200);
+    await contract.methods.transfer(receiver, 110).send({from: owner});
+    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(90);
+    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(110);
+    
+    await expect(contract.methods.repartition(80).send({from: owner})).to.eventually.be.rejected;
+
+    await contract.methods.transfer(receiver, 90).send({from: owner});
+    expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(0);
+    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(200);
+
+    await contract.methods.repartition(150).send({from: receiver});
+    await expect(contract.methods.transfer(owner, 160).send({from: receiver})).to.eventually.be.rejected;
+    expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(150);
+  });
+
+  itWeb3('Can repartition with increased amount', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, owner);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    const result = await contract.methods.repartition(200).send();
+    const events = normalizeEvents(result.events);
+
+    expect(events).to.deep.equal([
+      {
+        address,
+        event: 'Transfer',
+        args: {
+          from: '0x0000000000000000000000000000000000000000',
+          to: owner,
+          value: '100',
+        },
+      },
+    ]);
+  });
+
+  itWeb3('Can repartition with decreased amount', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = createEthAccount(web3);
+    await transferBalanceToEth(api, alice, owner);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    const result = await contract.methods.repartition(50).send();
+    const events = normalizeEvents(result.events);
+    expect(events).to.deep.equal([
+      {
+        address,
+        event: 'Transfer',
+        args: {
+          from: owner,
+          to: '0x0000000000000000000000000000000000000000',
+          value: '50',
+        },
+      },
+    ]);
+  });
+});
+
+describe('Refungible: Fees', () => {
+  itWeb3('approve() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+    const spender = createEthAccount(web3);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    const cost = await recordEthFee(api, owner, () => contract.methods.approve(spender, 100).send({from: owner}));
+    expect(cost < BigInt(0.2 * Number(UNIQUE)));
+  });
+
+  itWeb3('transferFrom() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+    const spender = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    await contract.methods.approve(spender, 100).send({from: owner});
+
+    const cost = await recordEthFee(api, spender, () => contract.methods.transferFrom(owner, spender, 100).send({from: spender}));
+    expect(cost < BigInt(0.2 * Number(UNIQUE)));
+  });
+
+  itWeb3('transfer() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+    const receiver = createEthAccount(web3);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+    const cost = await recordEthFee(api, owner, () => contract.methods.transfer(receiver, 100).send({from: owner}));
+    expect(cost < BigInt(0.2 * Number(UNIQUE)));
+  });
+});
+
+describe('Refungible: Substrate calls', () => {
+  itWeb3('Events emitted for approve()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+    const receiver = createEthAccount(web3);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);
+
+    const events = await recordEvents(contract, async () => {
+      expect(await approve(api, collectionId, tokenId, alice, {Ethereum: receiver}, 100n)).to.be.true;
+    });
+
+    expect(events).to.be.deep.equal([
+      {
+        address,
+        event: 'Approval',
+        args: {
+          owner: subToEth(alice.address),
+          spender: receiver,
+          value: '100',
+        },
+      },
+    ]);
+  });
+
+  itWeb3('Events emitted for transferFrom()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+    const bob = privateKeyWrapper('//Bob');
+
+    const receiver = createEthAccount(web3);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;
+    expect(await approve(api, collectionId, tokenId, alice, bob.address, 100n)).to.be.true;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);
+
+    const events = await recordEvents(contract, async () => {
+      expect(await transferFrom(api, collectionId, tokenId, bob, alice, {Ethereum: receiver},  51n)).to.be.true;
+    });
+
+    expect(events).to.be.deep.equal([
+      {
+        address,
+        event: 'Transfer',
+        args: {
+          from: subToEth(alice.address),
+          to: receiver,
+          value: '51',
+        },
+      },
+      {
+        address,
+        event: 'Approval',
+        args: {
+          owner: subToEth(alice.address),
+          spender: subToEth(bob.address),
+          value: '49',
+        },
+      },
+    ]);
+  });
+
+  itWeb3('Events emitted for transfer()', async ({web3, api, privateKeyWrapper}) => {
+    const alice = privateKeyWrapper('//Alice');
+
+    const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+    const receiver = createEthAccount(web3);
+
+    const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+    const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);
+
+    const events = await recordEvents(contract, async () => {
+      expect(await transfer(api, collectionId, tokenId, alice, {Ethereum: receiver},  51n)).to.be.true;
+    });
+
+    expect(events).to.be.deep.equal([
+      {
+        address,
+        event: 'Transfer',
+        args: {
+          from: subToEth(alice.address),
+          to: receiver,
+          value: '51',
+        },
+      },
+    ]);
+  });
+});
addedtests/src/eth/reFungibleTokenAbi.jsondiffbeforeafterboth
--- /dev/null
+++ b/tests/src/eth/reFungibleTokenAbi.json
@@ -0,0 +1,158 @@
+[
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "owner",
+        "type": "address"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "spender",
+        "type": "address"
+      },
+      {
+        "indexed": false,
+        "internalType": "uint256",
+        "name": "value",
+        "type": "uint256"
+      }
+    ],
+    "name": "Approval",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "from",
+        "type": "address"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "to",
+        "type": "address"
+      },
+      {
+        "indexed": false,
+        "internalType": "uint256",
+        "name": "value",
+        "type": "uint256"
+      }
+    ],
+    "name": "Transfer",
+    "type": "event"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "owner", "type": "address" },
+      { "internalType": "address", "name": "spender", "type": "address" }
+    ],
+    "name": "allowance",
+    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "spender", "type": "address" },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "approve",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "owner", "type": "address" }
+    ],
+    "name": "balanceOf",
+    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "from", "type": "address" },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "burnFrom",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "decimals",
+    "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "name",
+    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "repartition",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }
+    ],
+    "name": "supportsInterface",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "symbol",
+    "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "totalSupply",
+    "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "to", "type": "address" },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "transfer",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      { "internalType": "address", "name": "from", "type": "address" },
+      { "internalType": "address", "name": "to", "type": "address" },
+      { "internalType": "uint256", "name": "amount", "type": "uint256" }
+    ],
+    "name": "transferFrom",
+    "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  }
+]
addedtests/src/fungible.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/fungible.test.ts
@@ -0,0 +1,184 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+import {default as usingApi} from './substrate/substrate-api';
+import {IKeyringPair} from '@polkadot/types/types';
+import {
+  getBalance,
+  createMultipleItemsExpectSuccess,
+  isTokenExists,
+  getLastTokenId,
+  getAllowance,
+  approve,
+  transferFrom,
+  createCollection,
+  transfer,
+  burnItem,
+  normalizeAccountId,
+  CrossAccountId,
+  createFungibleItemExpectSuccess,
+  U128_MAX,
+  burnFromExpectSuccess,
+} from './util/helpers';
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+const expect = chai.expect;
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
+
+describe('integration test: Fungible functionality:', () => {
+  before(async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      alice = privateKeyWrapper('//Alice');
+      bob = privateKeyWrapper('//Bob');
+    });
+  });
+
+  it('Create fungible collection and token', async () => {
+    await usingApi(async api => {
+      const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+      expect(createCollectionResult.success).to.be.true;
+      const collectionId  = createCollectionResult.collectionId;
+      const defaultTokenId = await getLastTokenId(api, collectionId);
+      const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+      const aliceBalance = await getBalance(api, collectionId, alice, aliceTokenId); 
+      const itemCountAfter = await getLastTokenId(api, collectionId);
+      
+      // What to expect
+      // tslint:disable-next-line:no-unused-expression
+      expect(itemCountAfter).to.be.equal(defaultTokenId);
+      expect(aliceBalance).to.be.equal(U128_MAX);
+    });
+  });
+  
+  it('RPC method tokenOnewrs for fungible collection and token', async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+      
+      const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+      const collectionId = createCollectionResult.collectionId;
+      const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+     
+      await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+      await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+            
+      for (let i = 0; i < 7; i++) {
+        await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 1);
+      } 
+      
+      const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+      const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+      const aliceID = normalizeAccountId(alice);
+      const bobId = normalizeAccountId(bob);
+
+      // What to expect
+      // tslint:disable-next-line:no-unused-expression
+      expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+      expect(owners.length == 10).to.be.true;
+      
+      const eleven = privateKeyWrapper('11');
+      expect(await transfer(api, collectionId, aliceTokenId, alice, eleven, 10n)).to.be.true;
+      expect((await api.rpc.unique.tokenOwners(collectionId, aliceTokenId)).length).to.be.equal(10);
+    });
+  });
+  
+  it('Transfer token', async () => {
+    await usingApi(async api => {
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+      const tokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: 500n}, alice.address);
+
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(500n);
+      expect(await transfer(api, collectionId, tokenId, alice, bob, 60n)).to.be.true;
+      expect(await transfer(api, collectionId, tokenId, alice, ethAcc, 140n)).to.be.true;
+
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(300n);
+      expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(60n);
+      expect(await getBalance(api, collectionId, ethAcc, tokenId)).to.be.equal(140n);
+      await expect(transfer(api, collectionId, tokenId, alice, bob, 350n)).to.eventually.be.rejected;
+    });
+  });
+
+  it('Tokens multiple creation', async () => {
+    await usingApi(async api => {
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+      
+      const args = [
+        {Fungible: {Value: 500n}},
+        {Fungible: {Value: 400n}},
+        {Fungible: {Value: 300n}},
+      ];
+      
+      await createMultipleItemsExpectSuccess(alice, collectionId, args);
+      expect(await getBalance(api, collectionId, alice, 0)).to.be.equal(1200n);
+    });   
+  });
+
+  it('Burn some tokens ', async () => {
+    await usingApi(async api => {   
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+      const tokenId = (await createFungibleItemExpectSuccess(alice, collectionId, {Value: 500n}, alice.address));
+      expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(500n);
+      expect(await burnItem(api, alice, collectionId, tokenId, 499n)).to.be.true;
+      expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(1n);
+    });
+  });
+  
+  it('Burn all tokens ', async () => {
+    await usingApi(async api => {   
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+      const tokenId = (await createFungibleItemExpectSuccess(alice, collectionId, {Value: 500n}, alice.address));
+      expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+      expect(await burnItem(api, alice, collectionId, tokenId, 500n)).to.be.true;
+      expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+      
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(0n);
+      expect((await api.rpc.unique.totalPieces(collectionId, tokenId)).value.toBigInt()).to.be.equal(0n);
+    });
+  });
+
+  it('Set allowance for token', async () => {
+    await usingApi(async api => {
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      
+      const tokenId = (await createFungibleItemExpectSuccess(alice, collectionId, {Value: 100n}, alice.address));
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(100n);
+
+      expect(await approve(api, collectionId, tokenId, alice, bob, 60n)).to.be.true;
+      expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(60n);
+      expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(0n);
+      
+      expect(await transferFrom(api, collectionId, tokenId, bob, alice, bob,  20n)).to.be.true;
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(80n);
+      expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(20n);
+      expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(40n);
+      
+      await burnFromExpectSuccess(bob, alice, collectionId, tokenId, 10n);
+     
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(70n);
+      expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(30n);
+      expect(await transferFrom(api, collectionId, tokenId, bob, alice, ethAcc,  10n)).to.be.true;
+      expect(await getBalance(api, collectionId, ethAcc, tokenId)).to.be.equal(10n);
+    });
+  });
+});
modifiedtests/src/interfaces/augment-api-consts.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-consts.ts
+++ b/tests/src/interfaces/augment-api-consts.ts
@@ -29,7 +29,13 @@
       [key: string]: Codec;
     };
     common: {
+      /**
+       * Maximum admins per collection.
+       **/
       collectionAdminsLimit: u32 & AugmentedConst<ApiType>;
+      /**
+       * Set price to create a collection.
+       **/
       collectionCreationPrice: u128 & AugmentedConst<ApiType>;
       /**
        * Generic const
modifiedtests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -285,7 +285,7 @@
        **/
       FungibleItemsDontHaveData: AugmentedError<ApiType>;
       /**
-       * Not default id passed as TokenId argument.
+       * Fungible tokens hold no ID, and the default value of TokenId for Fungible collection is 0.
        **/
       FungibleItemsHaveNoId: AugmentedError<ApiType>;
       /**
@@ -596,7 +596,7 @@
     };
     unique: {
       /**
-       * Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
+       * Decimal_points parameter must be lower than [`up_data_structs::MAX_DECIMAL_POINTS`].
        **/
       CollectionDecimalPointLimitExceeded: AugmentedError<ApiType>;
       /**
@@ -608,7 +608,7 @@
        **/
       EmptyArgument: AugmentedError<ApiType>;
       /**
-       * Repertition is only supported by refungible collection
+       * Repertition is only supported by refungible collection.
        **/
       RepartitionCalledOnNonRefungibleCollection: AugmentedError<ApiType>;
       /**
modifiedtests/src/interfaces/augment-api-events.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-events.ts
+++ b/tests/src/interfaces/augment-api-events.ts
@@ -59,114 +59,47 @@
     };
     common: {
       /**
-       * Sponsoring allowance was approved.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - todo:doc flesh out
-       * * item_id
-       * * sender
-       * * spender
-       * * amount
+       * Amount pieces of token owned by `sender` was approved for `spender`.
        **/
       Approved: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
        * New collection was created
-       * 
-       * # Arguments
-       * 
-       * * collection_id - Globally unique identifier of newly created collection.
-       * * mode - [CollectionMode] converted into u8.
-       * * account_id - Collection owner.
        **/
       CollectionCreated: AugmentedEvent<ApiType, [u32, u8, AccountId32]>;
       /**
        * New collection was destroyed
-       * 
-       * # Arguments
-       * 
-       * * collection_id - Globally unique identifier of collection that has been destroyed.
        **/
       CollectionDestroyed: AugmentedEvent<ApiType, [u32]>;
       /**
-       * Collection property was deleted.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection, whose property was just deleted.
-       * * property_key - Key of the property that was just deleted.
+       * The property has been deleted.
        **/
       CollectionPropertyDeleted: AugmentedEvent<ApiType, [u32, Bytes]>;
       /**
-       * Collection property was added or edited.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection, whose property was just set.
-       * * property_key - Key of the property that was just set.
+       * The colletion property has been added or edited.
        **/
       CollectionPropertySet: AugmentedEvent<ApiType, [u32, Bytes]>;
       /**
        * New item was created.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection where the item was created.
-       * * item_id - ID of the item. Unique within the collection.
-       * * recipient - Owner of the newly created item.
-       * * amount - The amount of tokens that were created (always 1 for NFT).
        **/
       ItemCreated: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
        * Collection item was burned.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - Identifier of the collection to which the burned NFT belonged.
-       * * item_id - Identifier of burned NFT.
-       * * owner - Which user has destroyed their tokens.
-       * * amount - Amount of tokens that were destroyed (always 1 for NFT).
        **/
       ItemDestroyed: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
-       * Token property permission was added or updated for a collection.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection, whose permissions were just set/updated.
-       * * property_key - Key of the property of the set/updated permission.
+       * The token property permission of a collection has been set.
        **/
       PropertyPermissionSet: AugmentedEvent<ApiType, [u32, Bytes]>;
       /**
-       * Item property was deleted.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection, whose token's property was just deleted.
-       * * item_id - ID of the item, whose property was just deleted.
-       * * property_key - Key of the property that was just deleted.
+       * The token property has been deleted.
        **/
       TokenPropertyDeleted: AugmentedEvent<ApiType, [u32, u32, Bytes]>;
       /**
-       * Item property was added or edited.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection, whose token's property was just set.
-       * * item_id - ID of the item, whose property was just set.
-       * * property_key - Key of the property that was just set.
+       * The token property has been added or edited.
        **/
       TokenPropertySet: AugmentedEvent<ApiType, [u32, u32, Bytes]>;
       /**
-       * Item was transferred.
-       * 
-       * # Arguments
-       * 
-       * * collection_id - ID of the collection to which the item belongs.
-       * * item_id - ID of the item transferred.
-       * * sender - Original owner of the item.
-       * * recipient - New owner of the item.
-       * * amount - Amount of tokens that were transferred (always 1 for NFT).
+       * Item was transferred
        **/
       Transfer: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
@@ -569,94 +502,77 @@
        * Address was added to the allow list
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * user:  Address.
+       * * collection_id: ID of the affected collection.
+       * * user: Address of the added account.
        **/
       AllowListAddressAdded: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Address was removed from the allow list
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * user:  Address.
+       * * collection_id: ID of the affected collection.
+       * * user: Address of the removed account.
        **/
       AllowListAddressRemoved: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection admin was added
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * admin:  Admin address.
+       * * collection_id: ID of the affected collection.
+       * * admin: Admin address.
        **/
       CollectionAdminAdded: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection admin was removed
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * admin:  Admin address.
+       * * collection_id: ID of the affected collection.
+       * * admin: Removed admin address.
        **/
       CollectionAdminRemoved: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection limits were set
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
+       * * collection_id: ID of the affected collection.
        **/
       CollectionLimitSet: AugmentedEvent<ApiType, [u32]>;
       /**
        * Collection owned was changed
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * owner:  New owner address.
+       * * collection_id: ID of the affected collection.
+       * * owner: New owner address.
        **/
       CollectionOwnedChanged: AugmentedEvent<ApiType, [u32, AccountId32]>;
       /**
        * Collection permissions were set
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
+       * * collection_id: ID of the affected collection.
        **/
       CollectionPermissionSet: AugmentedEvent<ApiType, [u32]>;
       /**
        * Collection sponsor was removed
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
+       * * collection_id: ID of the affected collection.
        **/
       CollectionSponsorRemoved: AugmentedEvent<ApiType, [u32]>;
       /**
        * Collection sponsor was set
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * owner:  New sponsor address.
+       * * collection_id: ID of the affected collection.
+       * * owner: New sponsor address.
        **/
       CollectionSponsorSet: AugmentedEvent<ApiType, [u32, AccountId32]>;
       /**
        * New sponsor was confirm
        * 
        * # Arguments
-       * 
-       * * collection_id: Globally unique collection identifier.
-       * 
-       * * sponsor:  New sponsor address.
+       * * collection_id: ID of the affected collection.
+       * * sponsor: New sponsor address.
        **/
       SponsorshipConfirmed: AugmentedEvent<ApiType, [u32, AccountId32]>;
       /**
modifiedtests/src/interfaces/augment-api-query.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -70,39 +70,39 @@
     };
     common: {
       /**
-       * Amount of collection admins
+       * Storage of the amount of collection admins.
        **/
       adminAmount: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       /**
-       * Allowlisted collection users
+       * Allowlisted collection users.
        **/
       allowlist: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * Collection info
+       * Storage of collection info.
        **/
       collectionById: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<Option<UpDataStructsCollection>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       /**
-       * Collection properties
+       * Storage of collection properties.
        **/
       collectionProperties: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       /**
-       * Token permissions of a collection
+       * Storage of token property permissions of a collection.
        **/
       collectionPropertyPermissions: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<BTreeMap<Bytes, UpDataStructsPropertyPermission>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       /**
-       * The number of created collections. Essentially contains the last collection ID.
+       * Storage of the count of created collections. Essentially contains the last collection ID.
        **/
       createdCollectionCount: AugmentedQuery<ApiType, () => Observable<u32>, []> & QueryableStorageEntry<ApiType, []>;
       /**
-       * The number of destroyed collections
+       * Storage of the count of deleted collections.
        **/
       destroyedCollectionCount: AugmentedQuery<ApiType, () => Observable<u32>, []> & QueryableStorageEntry<ApiType, []>;
       /**
-       * Not used by code, exists only to provide some types to metadata
+       * Not used by code, exists only to provide some types to metadata.
        **/
       dummyStorageValue: AugmentedQuery<ApiType, () => Observable<Option<ITuple<[UpDataStructsCollectionStats, u32, u32, UpDataStructsTokenChild, PhantomTypeUpDataStructs]>>>, []> & QueryableStorageEntry<ApiType, []>;
       /**
-       * List of collection admins
+       * List of collection admins.
        **/
       isAdmin: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
@@ -200,7 +200,7 @@
     };
     fungible: {
       /**
-       * todo:doc
+       * Storage for assets delegated to a limited extent to other users.
        **/
       allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
@@ -244,11 +244,11 @@
     };
     nonfungible: {
       /**
-       * Amount of tokens owned in a collection.
+       * Amount of tokens owned by an account in a collection.
        **/
       accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * todo:doc
+       * Allowance set by a token owner for another user to perform one of certain transactions on a token.
        **/
       allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
@@ -256,7 +256,15 @@
        **/
       owned: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: u32 | AnyNumber | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]>;
       /**
-       * Scoped, auxiliary properties of a token, primarily used for on-chain operations.
+       * Custom data of a token that is serialized to bytes,
+       * primarily reserved for on-chain operations,
+       * normally obscured from the external users.
+       * 
+       * Auxiliary properties are slightly different from
+       * usual [`TokenProperties`] due to an unlimited number
+       * and separately stored and written-to key-value pairs.
+       * 
+       * Currently used to store RMRK data.
        **/
       tokenAuxProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: UpDataStructsPropertyScope | 'None' | 'Rmrk' | number | Uint8Array, arg4: Bytes | string | Uint8Array) => Observable<Option<Bytes>>, [u32, u32, UpDataStructsPropertyScope, Bytes]> & QueryableStorageEntry<ApiType, [u32, u32, UpDataStructsPropertyScope, Bytes]>;
       /**
@@ -268,7 +276,7 @@
        **/
       tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletNonfungibleItemData>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
-       * Key-value pairs, describing the metadata of a token.
+       * Map of key-value pairs, describing the metadata of a token.
        **/
       tokenProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
@@ -447,11 +455,11 @@
        **/
       accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * todo:doc
+       * Allowance set by a token owner for another user to perform one of certain transactions on a number of pieces of a token.
        **/
       allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg4: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * Amount of pieces of a token owned by an account.
+       * Amount of token pieces owned by account.
        **/
       balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
@@ -463,6 +471,10 @@
        **/
       tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<PalletRefungibleItemData>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
+       * Amount of pieces a refungible token is split into.
+       **/
+      tokenProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+      /**
        * Amount of tokens burnt in a collection.
        **/
       tokensBurnt: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
@@ -471,7 +483,7 @@
        **/
       tokensMinted: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       /**
-       * Amount of pieces a refungible token is split into.
+       * Total amount of pieces for token
        **/
       totalSupply: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<u128>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
modifiedtests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-rpc.ts
+++ b/tests/src/interfaces/augment-api-rpc.ts
@@ -673,6 +673,10 @@
        **/
       collectionTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;
       /**
+       * Get token constant metadata
+       **/
+      constMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
+      /**
        * Get effective collection limits
        **/
       effectiveCollectionLimits: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsCollectionLimits>>>;
@@ -705,6 +709,10 @@
        **/
       tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;
       /**
+       * Returns 10 tokens owners in no particular order
+       **/
+      tokenOwners: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
+      /**
        * Get token properties, optionally limited to the provided keys
        **/
       tokenProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;
@@ -720,6 +728,10 @@
        * Get the amount of distinctive tokens present in a collection
        **/
       totalSupply: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
+      /**
+       * Get token variable metadata
+       **/
+      variableMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
     };
     web3: {
       /**
modifiedtests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -730,18 +730,22 @@
     };
     unique: {
       /**
-       * Adds an admin of the collection.
-       * NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.
+       * Add an admin to a collection.
+       * 
+       * NFT Collection can be controlled by multiple admin addresses
+       * (some which can also be servers, for example). Admins can issue
+       * and burn NFTs, as well as add and remove other admins,
+       * but cannot change NFT or Collection ownership.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the Collection to add admin for.
-       * * new_admin - Address of new admin to add.
+       * * `collection_id`: ID of the Collection to add an admin for.
+       * * `new_admin`: Address of new admin to add.
        **/
       addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdmin: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
@@ -749,61 +753,76 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * address.
+       * * `collection_id`: ID of the modified collection.
+       * * `address`: ID of the address to be added to the allowlist.
        **/
       addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * Set, change, or remove approved address to transfer the ownership of the NFT.
+       * Allow a non-permissioned address to transfer or burn an item.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
-       * * Current NFT owner
+       * * Collection owner
+       * * Collection admin
+       * * Current item owner
        * 
        * # Arguments
        * 
-       * * approved - Address that is approved to transfer this NFT or zero (if needed to remove approval).
-       * * collection_id.
-       * * item_id - ID of the item.
+       * * `spender`: 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.
        **/
       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]>;
       /**
-       * Destroy a concrete instance of NFT on behalf of the owner.
-       * See also: [`approve`]
+       * Destroy a token on behalf of the owner as a non-owner account.
+       * 
+       * See also: [`approve`][`Pallet::approve`].
+       * 
+       * After this method executes, one approval is removed from the total so that
+       * the approved address will not be able to transfer this item again from this owner.
        * 
        * # Permissions
        * 
-       * * Collection Owner.
-       * * Collection Admin.
-       * * Current NFT Owner.
+       * * Collection owner
+       * * Collection admin
+       * * Current token owner
+       * * Address approved by current item owner
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the collection.
-       * * item_id - ID of NFT to burn.
-       * * from - The owner of the item from whom it is taken away.
+       * * `from`: The owner of the burning item.
+       * * `collection_id`: ID of the collection to which the item belongs.
+       * * `item_id`: ID of item to burn.
+       * * `value`: Number of pieces to burn.
+       * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+       * * Fungible Mode: The desired number of pieces to burn.
+       * * Re-Fungible Mode: The desired number of pieces to burn.
        **/
       burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32, u128]>;
       /**
-       * Destroy a concrete instance of NFT.
+       * Destroy an item.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
-       * * Current NFT Owner
+       * * Collection owner
+       * * Collection admin
+       * * Current item owner
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the collection.
-       * * item_id - ID of NFT to burn.
+       * * `collection_id`: ID of the collection to which the item belongs.
+       * * `item_id`: ID of item to burn.
+       * * `value`: Number of pieces of the item to destroy.
+       * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+       * * Fungible Mode: The desired number of pieces to burn.
+       * * Re-Fungible Mode: The desired number of pieces to burn.
        **/
       burnItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
       /**
@@ -811,108 +830,126 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
+       * * Collection owner
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * new_owner.
+       * * `collection_id`: ID of the modified collection.
+       * * `new_owner`: ID of the account that will become the owner.
        **/
       changeCollectionOwner: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newOwner: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
       /**
-       * Confirm own sponsorship of a collection.
+       * Confirm own sponsorship of a collection, becoming the sponsor.
        * 
+       * An invitation must be pending, see [`set_collection_sponsor`][`Pallet::set_collection_sponsor`].
+       * Sponsor can pay the fees of a transaction instead of the sender,
+       * but only within specified limits.
+       * 
        * # Permissions
        * 
        * * Sponsor-to-be
        * 
        * # Arguments
        * 
-       * * collection_id.
+       * * `collection_id`: ID of the collection with the pending sponsor.
        **/
       confirmSponsorship: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
       /**
-       * This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner of the collection is set to the address that signed the transaction and can be changed later.
+       * Create a collection of tokens.
+       * 
+       * Each Token may have multiple properties encoded as an array of bytes
+       * of certain length. The initial owner of the collection is set
+       * to the address that signed the transaction and can be changed later.
        * 
+       * Prefer the more advanced [`create_collection_ex`][`Pallet::create_collection_ex`] instead.
+       * 
        * # Permissions
        * 
-       * * Anyone.
+       * * Anyone - becomes the owner of the new collection.
        * 
        * # Arguments
        * 
-       * * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.
-       * * collection_description - UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.
-       * * token_prefix - UTF-8 string with token prefix.
-       * * mode - [CollectionMode] collection type and type dependent data.
+       * * `collection_name`: Wide-character string with collection name
+       * (limit [`MAX_COLLECTION_NAME_LENGTH`]).
+       * * `collection_description`: Wide-character string with collection description
+       * (limit [`MAX_COLLECTION_DESCRIPTION_LENGTH`]).
+       * * `token_prefix`: Byte string containing the token prefix to mark a collection
+       * to which a token belongs (limit [`MAX_TOKEN_PREFIX_LENGTH`]).
+       * * `mode`: Type of items stored in the collection and type dependent data.
        **/
       createCollection: AugmentedSubmittable<(collectionName: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], collectionDescription: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], tokenPrefix: Bytes | string | Uint8Array, mode: UpDataStructsCollectionMode | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Vec<u16>, Vec<u16>, Bytes, UpDataStructsCollectionMode]>;
       /**
        * Create a collection with explicit parameters.
-       * Prefer it to the deprecated [`created_collection`] method.
        * 
+       * Prefer it to the deprecated [`create_collection`][`Pallet::create_collection`] method.
+       * 
        * # Permissions
        * 
-       * * Anyone.
+       * * Anyone - becomes the owner of the new collection.
        * 
        * # Arguments
        * 
-       * * data: explicit create-collection data.
+       * * `data`: Explicit data of a collection used for its creation.
        **/
       createCollectionEx: AugmentedSubmittable<(data: UpDataStructsCreateCollectionData | { mode?: any; access?: any; name?: any; description?: any; tokenPrefix?: any; pendingSponsor?: any; limits?: any; permissions?: any; tokenPropertyPermissions?: any; properties?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [UpDataStructsCreateCollectionData]>;
       /**
-       * Create a concrete instance of NFT Collection created with CreateCollection method.
+       * Mint an item within a collection.
+       * 
+       * A collection must exist first, see [`create_collection_ex`][`Pallet::create_collection_ex`].
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * * Anyone if
        * * Allow List is enabled, and
        * * Address is added to allow list, and
-       * * MintPermission is enabled (see SetMintPermission method)
+       * * MintPermission is enabled (see [`set_collection_permissions`][`Pallet::set_collection_permissions`])
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the collection.
-       * * owner - Address, initial owner of the NFT.
-       * * data - Token data to store on chain.
+       * * `collection_id`: ID of the collection to which an item would belong.
+       * * `owner`: Address of the initial owner of the item.
+       * * `data`: Token data describing the item to store on chain.
        **/
       createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCreateItemData]>;
       /**
-       * Create multiple items in a collection created with CreateCollection method.
+       * Create multiple items within a collection.
+       * 
+       * A collection must exist first, see [`create_collection_ex`][`Pallet::create_collection_ex`].
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * * Anyone if
        * * Allow List is enabled, and
-       * * Address is added to allow list, and
-       * * MintPermission is enabled (see SetMintPermission method)
+       * * Address is added to the allow list, and
+       * * MintPermission is enabled (see [`set_collection_permissions`][`Pallet::set_collection_permissions`])
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the collection.
-       * * owner - Address, initial owner of the NFT.
-       * * items_data - Array items properties. Each property is an array of bytes itself, see [`create_item`].
+       * * `collection_id`: ID of the collection to which the tokens would belong.
+       * * `owner`: Address of the initial owner of the tokens.
+       * * `items_data`: Vector of data describing each item to be created.
        **/
       createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<UpDataStructsCreateItemData> | (UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, Vec<UpDataStructsCreateItemData>]>;
       /**
-       * Create multiple items inside a collection with explicitly specified initial parameters.
+       * Create multiple items within a collection with explicitly specified initial parameters.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * * Anyone if
        * * Allow List is enabled, and
        * * Address is added to allow list, and
-       * * MintPermission is enabled (see SetMintPermission method)
+       * * MintPermission is enabled (see [`set_collection_permissions`][`Pallet::set_collection_permissions`])
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the collection.
-       * * data - Explicit item creation data.
+       * * `collection_id`: ID of the collection to which the tokens would belong.
+       * * `data`: Explicit item creation data.
        **/
       createMultipleItemsEx: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, data: UpDataStructsCreateItemExData | { NFT: any } | { Fungible: any } | { RefungibleMultipleItems: any } | { RefungibleMultipleOwners: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCreateItemExData]>;
       /**
@@ -925,63 +962,68 @@
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * property_keys - Vector of keys of the properties to be deleted.
+       * * `collection_id`: ID of the modified collection.
+       * * `property_keys`: Vector of keys of the properties to be deleted.
+       * Keys support Latin letters, `-`, `_`, and `.` as symbols.
        **/
       deleteCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<Bytes>]>;
       /**
-       * Delete specified token properties.
+       * Delete specified token properties. Currently properties only work with NFTs.
        * 
        * # Permissions
        * 
        * * Depends on collection's token property permissions and specified property mutability:
-       * * Collection Owner
-       * * Collection Admin
-       * * Token Owner
+       * * Collection owner
+       * * Collection admin
+       * * Token owner
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * token_id.
-       * * property_keys - Vector of keys of the properties to be deleted.
+       * * `collection_id`: ID of the collection to which the token belongs.
+       * * `token_id`: ID of the modified token.
+       * * `property_keys`: Vector of keys of the properties to be deleted.
+       * Keys support Latin letters, `-`, `_`, and `.` as symbols.
        **/
       deleteTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, u32, Vec<Bytes>]>;
       /**
-       * Destroy the collection if no tokens exist within.
+       * Destroy a collection if no tokens exist within.
        * 
        * # Permissions
        * 
-       * * Collection Owner
+       * * Collection owner
        * 
        * # Arguments
        * 
-       * * collection_id - collection to destroy.
+       * * `collection_id`: Collection to destroy.
        **/
       destroyCollection: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
       /**
-       * Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.
+       * Remove admin of a collection.
+       * 
+       * An admin address can remove itself. List of admins may become empty,
+       * in which case only Collection Owner will be able to add an Admin.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the Collection to remove admin for.
-       * * account_id - Address of admin to remove.
+       * * `collection_id`: ID of the collection to remove the admin for.
+       * * `account_id`: Address of the admin to remove.
        **/
       removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * Switch back to pay-per-own-transaction model.
+       * Remove a collection's a sponsor, making everyone pay for their own transactions.
        * 
        * # Permissions
        * 
-       * * Collection Owner
+       * * Collection owner
        * 
        * # Arguments
        * 
-       * * collection_id.
+       * * `collection_id`: ID of the collection with the sponsor to remove.
        **/
       removeCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
       /**
@@ -989,27 +1031,27 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * address.
+       * * `collection_id`: ID of the modified collection.
+       * * `address`: ID of the address to be removed from the allowlist.
        **/
       removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
-       * Re-partition a refungible token, while owning all of its parts.
+       * Re-partition a refungible token, while owning all of its parts/pieces.
        * 
        * # Permissions
        * 
-       * * Token Owner (must own every part)
+       * * Token owner (must own every part)
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * token_id - ID of the RFT.
-       * * amount - New number of parts into which the token shall be partitioned.
+       * * `collection_id`: ID of the collection the RFT belongs to.
+       * * `token_id`: ID of the RFT.
+       * * `amount`: New number of parts/pieces into which the token shall be partitioned.
        **/
       repartition: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
       /**
@@ -1017,13 +1059,14 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * new_limit - New limits of the collection. They will overwrite the current ones.
+       * * `collection_id`: ID of the modified collection.
+       * * `new_limit`: New limits of the collection. Fields that are not set (None)
+       * will not overwrite the old ones.
        **/
       setCollectionLimits: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: UpDataStructsCollectionLimits | { accountTokenOwnershipLimit?: any; sponsoredDataSize?: any; sponsoredDataRateLimit?: any; tokenLimit?: any; sponsorTransferTimeout?: any; sponsorApproveTimeout?: any; ownerCanTransfer?: any; ownerCanDestroy?: any; transfersEnabled?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionLimits]>;
       /**
@@ -1031,13 +1074,14 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * new_permission - New permissions of the collection. They will overwrite the current ones.
+       * * `collection_id`: ID of the modified collection.
+       * * `new_permission`: New permissions of the collection. Fields that are not set (None)
+       * will not overwrite the old ones.
        **/
       setCollectionPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newPermission: UpDataStructsCollectionPermissions | { access?: any; mintMode?: any; nesting?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionPermissions]>;
       /**
@@ -1045,71 +1089,82 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * properties - Vector of key-value pairs stored as the collection's metadata. Keys support Latin letters, `-`, `_`, and `.` as symbols.
+       * * `collection_id`: ID of the modified collection.
+       * * `properties`: Vector of key-value pairs stored as the collection's metadata.
+       * Keys support Latin letters, `-`, `_`, and `.` as symbols.
        **/
       setCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsProperty>]>;
       /**
-       * Set (invite) a new collection sponsor. If successful, confirmation from the sponsor-to-be will be pending.
+       * Set (invite) a new collection sponsor.
+       * 
+       * If successful, confirmation from the sponsor-to-be will be pending.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * new_sponsor.
+       * * `collection_id`: ID of the modified collection.
+       * * `new_sponsor`: ID of the account of the sponsor-to-be.
        **/
       setCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newSponsor: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
       /**
        * Add or change token properties according to collection's permissions.
+       * Currently properties only work with NFTs.
        * 
        * # Permissions
        * 
        * * Depends on collection's token property permissions and specified property mutability:
-       * * Collection Owner
-       * * Collection Admin
-       * * Token Owner
+       * * Collection owner
+       * * Collection admin
+       * * Token owner
+       * 
+       * See [`set_token_property_permissions`][`Pallet::set_token_property_permissions`].
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * token_id.
-       * * properties - Vector of key-value pairs stored as the token's metadata. Keys support Latin letters, `-`, `_`, and `.` as symbols.
+       * * `collection_id: ID of the collection to which the token belongs.
+       * * `token_id`: ID of the modified token.
+       * * `properties`: Vector of key-value pairs stored as the token's metadata.
+       * Keys support Latin letters, `-`, `_`, and `.` as symbols.
        **/
       setTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, u32, Vec<UpDataStructsProperty>]>;
       /**
        * Add or change token property permissions of a collection.
        * 
+       * Without a permission for a particular key, a property with that key
+       * cannot be created in a token.
+       * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
+       * * Collection owner
+       * * Collection admin
        * 
        * # Arguments
        * 
-       * * collection_id.
-       * * property_permissions - Vector of permissions for property keys. Keys support Latin letters, `-`, `_`, and `.` as symbols.
+       * * `collection_id`: ID of the modified collection.
+       * * `property_permissions`: Vector of permissions for property keys.
+       * Keys support Latin letters, `-`, `_`, and `.` as symbols.
        **/
       setTokenPropertyPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyPermissions: Vec<UpDataStructsPropertyKeyPermission> | (UpDataStructsPropertyKeyPermission | { key?: any; permission?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsPropertyKeyPermission>]>;
       /**
-       * Set transfers_enabled value for particular collection.
+       * Completely allow or disallow transfers for a particular collection.
        * 
        * # Permissions
        * 
-       * * Collection Owner
+       * * Collection owner
        * 
        * # Arguments
        * 
-       * * collection_id - ID of the collection.
-       * * value - New flag value.
+       * * `collection_id`: ID of the collection.
+       * * `value`: New value of the flag, are transfers allowed?
        **/
       setTransfersEnabledFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;
       /**
@@ -1117,44 +1172,50 @@
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
-       * * Current NFT owner
+       * * Collection owner
+       * * Collection admin
+       * * Current token owner
        * 
        * # Arguments
        * 
-       * * recipient - Address of token recipient.
-       * 
-       * * collection_id.
-       * 
-       * * item_id - ID of the item
+       * * `recipient`: Address of token recipient.
+       * * `collection_id`: ID of the collection the item belongs to.
+       * * `item_id`: ID of the item.
        * * Non-Fungible Mode: Required.
        * * Fungible Mode: Ignored.
        * * Re-Fungible Mode: Required.
        * 
-       * * value - Amount to transfer.
-       * * Non-Fungible Mode: Ignored
-       * * Fungible Mode: Must specify transferred amount
-       * * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
+       * * `value`: Amount to transfer.
+       * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+       * * Fungible Mode: The desired number of pieces to transfer.
+       * * Re-Fungible Mode: The desired number of pieces to transfer.
        **/
       transfer: AugmentedSubmittable<(recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
       /**
-       * Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
+       * Change ownership of an item on behalf of the owner as a non-owner account.
+       * 
+       * See the [`approve`][`Pallet::approve`] method for additional information.
+       * 
+       * After this method executes, one approval is removed from the total so that
+       * the approved address will not be able to transfer this item again from this owner.
        * 
        * # Permissions
        * 
-       * * Collection Owner
-       * * Collection Admin
-       * * Current NFT owner
-       * * Address approved by current NFT owner
+       * * Collection owner
+       * * Collection admin
+       * * Current item owner
+       * * Address approved by current item owner
        * 
        * # Arguments
        * 
-       * * from - Address that currently owns the token.
-       * * recipient - Address of the new token-owner-to-be.
-       * * collection_id.
-       * * item_id - ID of the item to be transferred.
-       * * value - Amount to transfer.
+       * * `from`: Address that currently owns the token.
+       * * `recipient`: Address of the new token-owner-to-be.
+       * * `collection_id`: ID of the collection the item.
+       * * `item_id`: ID of the item to be transferred.
+       * * `value`: Amount to transfer.
+       * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+       * * Fungible Mode: The desired number of pieces to transfer.
+       * * Re-Fungible Mode: The desired number of pieces to transfer.
        **/
       transferFrom: AugmentedSubmittable<(from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
       /**
modifiedtests/src/interfaces/default/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/default/types.ts
+++ b/tests/src/interfaces/default/types.ts
@@ -2461,12 +2461,14 @@
 export interface UpDataStructsCreateReFungibleData extends Struct {
   readonly constData: Bytes;
   readonly pieces: u128;
+  readonly properties: Vec<UpDataStructsProperty>;
 }
 
 /** @name UpDataStructsCreateRefungibleExData */
 export interface UpDataStructsCreateRefungibleExData extends Struct {
   readonly constData: Bytes;
   readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
+  readonly properties: Vec<UpDataStructsProperty>;
 }
 
 /** @name UpDataStructsNestingPermissions */
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -1502,7 +1502,8 @@
    **/
   UpDataStructsCreateReFungibleData: {
     constData: 'Bytes',
-    pieces: 'u128'
+    pieces: 'u128',
+    properties: 'Vec<UpDataStructsProperty>'
   },
   /**
    * Lookup193: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
@@ -1527,7 +1528,8 @@
    **/
   UpDataStructsCreateRefungibleExData: {
     constData: 'Bytes',
-    users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>'
+    users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>',
+    properties: 'Vec<UpDataStructsProperty>'
   },
   /**
    * Lookup204: pallet_unique_scheduler::pallet::Call<T>
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
before · tests/src/interfaces/types-lookup.ts
1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34declare module '@polkadot/types/lookup' {5  import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';6  import type { ITuple } from '@polkadot/types-codec/types';7  import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';8  import type { Event } from '@polkadot/types/interfaces/system';910  /** @name PolkadotPrimitivesV2PersistedValidationData (2) */11  export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {12    readonly parentHead: Bytes;13    readonly relayParentNumber: u32;14    readonly relayParentStorageRoot: H256;15    readonly maxPovSize: u32;16  }1718  /** @name PolkadotPrimitivesV2UpgradeRestriction (9) */19  export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {20    readonly isPresent: boolean;21    readonly type: 'Present';22  }2324  /** @name SpTrieStorageProof (10) */25  export interface SpTrieStorageProof extends Struct {26    readonly trieNodes: BTreeSet<Bytes>;27  }2829  /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (13) */30  export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {31    readonly dmqMqcHead: H256;32    readonly relayDispatchQueueSize: ITuple<[u32, u32]>;33    readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;34    readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;35  }3637  /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (18) */38  export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {39    readonly maxCapacity: u32;40    readonly maxTotalSize: u32;41    readonly maxMessageSize: u32;42    readonly msgCount: u32;43    readonly totalSize: u32;44    readonly mqcHead: Option<H256>;45  }4647  /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (20) */48  export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {49    readonly maxCodeSize: u32;50    readonly maxHeadDataSize: u32;51    readonly maxUpwardQueueCount: u32;52    readonly maxUpwardQueueSize: u32;53    readonly maxUpwardMessageSize: u32;54    readonly maxUpwardMessageNumPerCandidate: u32;55    readonly hrmpMaxMessageNumPerCandidate: u32;56    readonly validationUpgradeCooldown: u32;57    readonly validationUpgradeDelay: u32;58  }5960  /** @name PolkadotCorePrimitivesOutboundHrmpMessage (26) */61  export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {62    readonly recipient: u32;63    readonly data: Bytes;64  }6566  /** @name CumulusPalletParachainSystemCall (28) */67  export interface CumulusPalletParachainSystemCall extends Enum {68    readonly isSetValidationData: boolean;69    readonly asSetValidationData: {70      readonly data: CumulusPrimitivesParachainInherentParachainInherentData;71    } & Struct;72    readonly isSudoSendUpwardMessage: boolean;73    readonly asSudoSendUpwardMessage: {74      readonly message: Bytes;75    } & Struct;76    readonly isAuthorizeUpgrade: boolean;77    readonly asAuthorizeUpgrade: {78      readonly codeHash: H256;79    } & Struct;80    readonly isEnactAuthorizedUpgrade: boolean;81    readonly asEnactAuthorizedUpgrade: {82      readonly code: Bytes;83    } & Struct;84    readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';85  }8687  /** @name CumulusPrimitivesParachainInherentParachainInherentData (29) */88  export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {89    readonly validationData: PolkadotPrimitivesV2PersistedValidationData;90    readonly relayChainState: SpTrieStorageProof;91    readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;92    readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;93  }9495  /** @name PolkadotCorePrimitivesInboundDownwardMessage (31) */96  export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {97    readonly sentAt: u32;98    readonly msg: Bytes;99  }100101  /** @name PolkadotCorePrimitivesInboundHrmpMessage (34) */102  export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {103    readonly sentAt: u32;104    readonly data: Bytes;105  }106107  /** @name CumulusPalletParachainSystemEvent (37) */108  export 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: u64;126      readonly dmqHead: H256;127    } & Struct;128    readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';129  }130131  /** @name CumulusPalletParachainSystemError (38) */132  export interface CumulusPalletParachainSystemError extends Enum {133    readonly isOverlappingUpgrades: boolean;134    readonly isProhibitedByPolkadot: boolean;135    readonly isTooBig: boolean;136    readonly isValidationDataNotAvailable: boolean;137    readonly isHostConfigurationNotAvailable: boolean;138    readonly isNotScheduled: boolean;139    readonly isNothingAuthorized: boolean;140    readonly isUnauthorized: boolean;141    readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';142  }143144  /** @name PalletBalancesAccountData (41) */145  export interface PalletBalancesAccountData extends Struct {146    readonly free: u128;147    readonly reserved: u128;148    readonly miscFrozen: u128;149    readonly feeFrozen: u128;150  }151152  /** @name PalletBalancesBalanceLock (43) */153  export interface PalletBalancesBalanceLock extends Struct {154    readonly id: U8aFixed;155    readonly amount: u128;156    readonly reasons: PalletBalancesReasons;157  }158159  /** @name PalletBalancesReasons (45) */160  export interface PalletBalancesReasons extends Enum {161    readonly isFee: boolean;162    readonly isMisc: boolean;163    readonly isAll: boolean;164    readonly type: 'Fee' | 'Misc' | 'All';165  }166167  /** @name PalletBalancesReserveData (48) */168  export interface PalletBalancesReserveData extends Struct {169    readonly id: U8aFixed;170    readonly amount: u128;171  }172173  /** @name PalletBalancesReleases (51) */174  export interface PalletBalancesReleases extends Enum {175    readonly isV100: boolean;176    readonly isV200: boolean;177    readonly type: 'V100' | 'V200';178  }179180  /** @name PalletBalancesCall (52) */181  export interface PalletBalancesCall extends Enum {182    readonly isTransfer: boolean;183    readonly asTransfer: {184      readonly dest: MultiAddress;185      readonly value: Compact<u128>;186    } & Struct;187    readonly isSetBalance: boolean;188    readonly asSetBalance: {189      readonly who: MultiAddress;190      readonly newFree: Compact<u128>;191      readonly newReserved: Compact<u128>;192    } & Struct;193    readonly isForceTransfer: boolean;194    readonly asForceTransfer: {195      readonly source: MultiAddress;196      readonly dest: MultiAddress;197      readonly value: Compact<u128>;198    } & Struct;199    readonly isTransferKeepAlive: boolean;200    readonly asTransferKeepAlive: {201      readonly dest: MultiAddress;202      readonly value: Compact<u128>;203    } & Struct;204    readonly isTransferAll: boolean;205    readonly asTransferAll: {206      readonly dest: MultiAddress;207      readonly keepAlive: bool;208    } & Struct;209    readonly isForceUnreserve: boolean;210    readonly asForceUnreserve: {211      readonly who: MultiAddress;212      readonly amount: u128;213    } & Struct;214    readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';215  }216217  /** @name PalletBalancesEvent (58) */218  export interface PalletBalancesEvent extends Enum {219    readonly isEndowed: boolean;220    readonly asEndowed: {221      readonly account: AccountId32;222      readonly freeBalance: u128;223    } & Struct;224    readonly isDustLost: boolean;225    readonly asDustLost: {226      readonly account: AccountId32;227      readonly amount: u128;228    } & Struct;229    readonly isTransfer: boolean;230    readonly asTransfer: {231      readonly from: AccountId32;232      readonly to: AccountId32;233      readonly amount: u128;234    } & Struct;235    readonly isBalanceSet: boolean;236    readonly asBalanceSet: {237      readonly who: AccountId32;238      readonly free: u128;239      readonly reserved: u128;240    } & Struct;241    readonly isReserved: boolean;242    readonly asReserved: {243      readonly who: AccountId32;244      readonly amount: u128;245    } & Struct;246    readonly isUnreserved: boolean;247    readonly asUnreserved: {248      readonly who: AccountId32;249      readonly amount: u128;250    } & Struct;251    readonly isReserveRepatriated: boolean;252    readonly asReserveRepatriated: {253      readonly from: AccountId32;254      readonly to: AccountId32;255      readonly amount: u128;256      readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;257    } & Struct;258    readonly isDeposit: boolean;259    readonly asDeposit: {260      readonly who: AccountId32;261      readonly amount: u128;262    } & Struct;263    readonly isWithdraw: boolean;264    readonly asWithdraw: {265      readonly who: AccountId32;266      readonly amount: u128;267    } & Struct;268    readonly isSlashed: boolean;269    readonly asSlashed: {270      readonly who: AccountId32;271      readonly amount: u128;272    } & Struct;273    readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';274  }275276  /** @name FrameSupportTokensMiscBalanceStatus (59) */277  export interface FrameSupportTokensMiscBalanceStatus extends Enum {278    readonly isFree: boolean;279    readonly isReserved: boolean;280    readonly type: 'Free' | 'Reserved';281  }282283  /** @name PalletBalancesError (60) */284  export interface PalletBalancesError extends Enum {285    readonly isVestingBalance: boolean;286    readonly isLiquidityRestrictions: boolean;287    readonly isInsufficientBalance: boolean;288    readonly isExistentialDeposit: boolean;289    readonly isKeepAlive: boolean;290    readonly isExistingVestingSchedule: boolean;291    readonly isDeadAccount: boolean;292    readonly isTooManyReserves: boolean;293    readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';294  }295296  /** @name PalletTimestampCall (63) */297  export interface PalletTimestampCall extends Enum {298    readonly isSet: boolean;299    readonly asSet: {300      readonly now: Compact<u64>;301    } & Struct;302    readonly type: 'Set';303  }304305  /** @name PalletTransactionPaymentReleases (66) */306  export interface PalletTransactionPaymentReleases extends Enum {307    readonly isV1Ancient: boolean;308    readonly isV2: boolean;309    readonly type: 'V1Ancient' | 'V2';310  }311312  /** @name PalletTreasuryProposal (67) */313  export interface PalletTreasuryProposal extends Struct {314    readonly proposer: AccountId32;315    readonly value: u128;316    readonly beneficiary: AccountId32;317    readonly bond: u128;318  }319320  /** @name PalletTreasuryCall (70) */321  export interface PalletTreasuryCall extends Enum {322    readonly isProposeSpend: boolean;323    readonly asProposeSpend: {324      readonly value: Compact<u128>;325      readonly beneficiary: MultiAddress;326    } & Struct;327    readonly isRejectProposal: boolean;328    readonly asRejectProposal: {329      readonly proposalId: Compact<u32>;330    } & Struct;331    readonly isApproveProposal: boolean;332    readonly asApproveProposal: {333      readonly proposalId: Compact<u32>;334    } & Struct;335    readonly isRemoveApproval: boolean;336    readonly asRemoveApproval: {337      readonly proposalId: Compact<u32>;338    } & Struct;339    readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';340  }341342  /** @name PalletTreasuryEvent (72) */343  export interface PalletTreasuryEvent extends Enum {344    readonly isProposed: boolean;345    readonly asProposed: {346      readonly proposalIndex: u32;347    } & Struct;348    readonly isSpending: boolean;349    readonly asSpending: {350      readonly budgetRemaining: u128;351    } & Struct;352    readonly isAwarded: boolean;353    readonly asAwarded: {354      readonly proposalIndex: u32;355      readonly award: u128;356      readonly account: AccountId32;357    } & Struct;358    readonly isRejected: boolean;359    readonly asRejected: {360      readonly proposalIndex: u32;361      readonly slashed: u128;362    } & Struct;363    readonly isBurnt: boolean;364    readonly asBurnt: {365      readonly burntFunds: u128;366    } & Struct;367    readonly isRollover: boolean;368    readonly asRollover: {369      readonly rolloverBalance: u128;370    } & Struct;371    readonly isDeposit: boolean;372    readonly asDeposit: {373      readonly value: u128;374    } & Struct;375    readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';376  }377378  /** @name FrameSupportPalletId (75) */379  export interface FrameSupportPalletId extends U8aFixed {}380381  /** @name PalletTreasuryError (76) */382  export interface PalletTreasuryError extends Enum {383    readonly isInsufficientProposersBalance: boolean;384    readonly isInvalidIndex: boolean;385    readonly isTooManyApprovals: boolean;386    readonly isProposalNotApproved: boolean;387    readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';388  }389390  /** @name PalletSudoCall (77) */391  export interface PalletSudoCall extends Enum {392    readonly isSudo: boolean;393    readonly asSudo: {394      readonly call: Call;395    } & Struct;396    readonly isSudoUncheckedWeight: boolean;397    readonly asSudoUncheckedWeight: {398      readonly call: Call;399      readonly weight: u64;400    } & Struct;401    readonly isSetKey: boolean;402    readonly asSetKey: {403      readonly new_: MultiAddress;404    } & Struct;405    readonly isSudoAs: boolean;406    readonly asSudoAs: {407      readonly who: MultiAddress;408      readonly call: Call;409    } & Struct;410    readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';411  }412413  /** @name FrameSystemCall (79) */414  export interface FrameSystemCall extends Enum {415    readonly isFillBlock: boolean;416    readonly asFillBlock: {417      readonly ratio: Perbill;418    } & Struct;419    readonly isRemark: boolean;420    readonly asRemark: {421      readonly remark: Bytes;422    } & Struct;423    readonly isSetHeapPages: boolean;424    readonly asSetHeapPages: {425      readonly pages: u64;426    } & Struct;427    readonly isSetCode: boolean;428    readonly asSetCode: {429      readonly code: Bytes;430    } & Struct;431    readonly isSetCodeWithoutChecks: boolean;432    readonly asSetCodeWithoutChecks: {433      readonly code: Bytes;434    } & Struct;435    readonly isSetStorage: boolean;436    readonly asSetStorage: {437      readonly items: Vec<ITuple<[Bytes, Bytes]>>;438    } & Struct;439    readonly isKillStorage: boolean;440    readonly asKillStorage: {441      readonly keys_: Vec<Bytes>;442    } & Struct;443    readonly isKillPrefix: boolean;444    readonly asKillPrefix: {445      readonly prefix: Bytes;446      readonly subkeys: u32;447    } & Struct;448    readonly isRemarkWithEvent: boolean;449    readonly asRemarkWithEvent: {450      readonly remark: Bytes;451    } & Struct;452    readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';453  }454455  /** @name OrmlVestingModuleCall (83) */456  export interface OrmlVestingModuleCall extends Enum {457    readonly isClaim: boolean;458    readonly isVestedTransfer: boolean;459    readonly asVestedTransfer: {460      readonly dest: MultiAddress;461      readonly schedule: OrmlVestingVestingSchedule;462    } & Struct;463    readonly isUpdateVestingSchedules: boolean;464    readonly asUpdateVestingSchedules: {465      readonly who: MultiAddress;466      readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;467    } & Struct;468    readonly isClaimFor: boolean;469    readonly asClaimFor: {470      readonly dest: MultiAddress;471    } & Struct;472    readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';473  }474475  /** @name OrmlVestingVestingSchedule (84) */476  export interface OrmlVestingVestingSchedule extends Struct {477    readonly start: u32;478    readonly period: u32;479    readonly periodCount: u32;480    readonly perPeriod: Compact<u128>;481  }482483  /** @name CumulusPalletXcmpQueueCall (86) */484  export interface CumulusPalletXcmpQueueCall extends Enum {485    readonly isServiceOverweight: boolean;486    readonly asServiceOverweight: {487      readonly index: u64;488      readonly weightLimit: u64;489    } & Struct;490    readonly isSuspendXcmExecution: boolean;491    readonly isResumeXcmExecution: boolean;492    readonly isUpdateSuspendThreshold: boolean;493    readonly asUpdateSuspendThreshold: {494      readonly new_: u32;495    } & Struct;496    readonly isUpdateDropThreshold: boolean;497    readonly asUpdateDropThreshold: {498      readonly new_: u32;499    } & Struct;500    readonly isUpdateResumeThreshold: boolean;501    readonly asUpdateResumeThreshold: {502      readonly new_: u32;503    } & Struct;504    readonly isUpdateThresholdWeight: boolean;505    readonly asUpdateThresholdWeight: {506      readonly new_: u64;507    } & Struct;508    readonly isUpdateWeightRestrictDecay: boolean;509    readonly asUpdateWeightRestrictDecay: {510      readonly new_: u64;511    } & Struct;512    readonly isUpdateXcmpMaxIndividualWeight: boolean;513    readonly asUpdateXcmpMaxIndividualWeight: {514      readonly new_: u64;515    } & Struct;516    readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';517  }518519  /** @name PalletXcmCall (87) */520  export interface PalletXcmCall extends Enum {521    readonly isSend: boolean;522    readonly asSend: {523      readonly dest: XcmVersionedMultiLocation;524      readonly message: XcmVersionedXcm;525    } & Struct;526    readonly isTeleportAssets: boolean;527    readonly asTeleportAssets: {528      readonly dest: XcmVersionedMultiLocation;529      readonly beneficiary: XcmVersionedMultiLocation;530      readonly assets: XcmVersionedMultiAssets;531      readonly feeAssetItem: u32;532    } & Struct;533    readonly isReserveTransferAssets: boolean;534    readonly asReserveTransferAssets: {535      readonly dest: XcmVersionedMultiLocation;536      readonly beneficiary: XcmVersionedMultiLocation;537      readonly assets: XcmVersionedMultiAssets;538      readonly feeAssetItem: u32;539    } & Struct;540    readonly isExecute: boolean;541    readonly asExecute: {542      readonly message: XcmVersionedXcm;543      readonly maxWeight: u64;544    } & Struct;545    readonly isForceXcmVersion: boolean;546    readonly asForceXcmVersion: {547      readonly location: XcmV1MultiLocation;548      readonly xcmVersion: u32;549    } & Struct;550    readonly isForceDefaultXcmVersion: boolean;551    readonly asForceDefaultXcmVersion: {552      readonly maybeXcmVersion: Option<u32>;553    } & Struct;554    readonly isForceSubscribeVersionNotify: boolean;555    readonly asForceSubscribeVersionNotify: {556      readonly location: XcmVersionedMultiLocation;557    } & Struct;558    readonly isForceUnsubscribeVersionNotify: boolean;559    readonly asForceUnsubscribeVersionNotify: {560      readonly location: XcmVersionedMultiLocation;561    } & Struct;562    readonly isLimitedReserveTransferAssets: boolean;563    readonly asLimitedReserveTransferAssets: {564      readonly dest: XcmVersionedMultiLocation;565      readonly beneficiary: XcmVersionedMultiLocation;566      readonly assets: XcmVersionedMultiAssets;567      readonly feeAssetItem: u32;568      readonly weightLimit: XcmV2WeightLimit;569    } & Struct;570    readonly isLimitedTeleportAssets: boolean;571    readonly asLimitedTeleportAssets: {572      readonly dest: XcmVersionedMultiLocation;573      readonly beneficiary: XcmVersionedMultiLocation;574      readonly assets: XcmVersionedMultiAssets;575      readonly feeAssetItem: u32;576      readonly weightLimit: XcmV2WeightLimit;577    } & Struct;578    readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';579  }580581  /** @name XcmVersionedMultiLocation (88) */582  export interface XcmVersionedMultiLocation extends Enum {583    readonly isV0: boolean;584    readonly asV0: XcmV0MultiLocation;585    readonly isV1: boolean;586    readonly asV1: XcmV1MultiLocation;587    readonly type: 'V0' | 'V1';588  }589590  /** @name XcmV0MultiLocation (89) */591  export interface XcmV0MultiLocation extends Enum {592    readonly isNull: boolean;593    readonly isX1: boolean;594    readonly asX1: XcmV0Junction;595    readonly isX2: boolean;596    readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;597    readonly isX3: boolean;598    readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;599    readonly isX4: boolean;600    readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;601    readonly isX5: boolean;602    readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;603    readonly isX6: boolean;604    readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;605    readonly isX7: boolean;606    readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;607    readonly isX8: boolean;608    readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;609    readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';610  }611612  /** @name XcmV0Junction (90) */613  export interface XcmV0Junction extends Enum {614    readonly isParent: boolean;615    readonly isParachain: boolean;616    readonly asParachain: Compact<u32>;617    readonly isAccountId32: boolean;618    readonly asAccountId32: {619      readonly network: XcmV0JunctionNetworkId;620      readonly id: U8aFixed;621    } & Struct;622    readonly isAccountIndex64: boolean;623    readonly asAccountIndex64: {624      readonly network: XcmV0JunctionNetworkId;625      readonly index: Compact<u64>;626    } & Struct;627    readonly isAccountKey20: boolean;628    readonly asAccountKey20: {629      readonly network: XcmV0JunctionNetworkId;630      readonly key: U8aFixed;631    } & Struct;632    readonly isPalletInstance: boolean;633    readonly asPalletInstance: u8;634    readonly isGeneralIndex: boolean;635    readonly asGeneralIndex: Compact<u128>;636    readonly isGeneralKey: boolean;637    readonly asGeneralKey: Bytes;638    readonly isOnlyChild: boolean;639    readonly isPlurality: boolean;640    readonly asPlurality: {641      readonly id: XcmV0JunctionBodyId;642      readonly part: XcmV0JunctionBodyPart;643    } & Struct;644    readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';645  }646647  /** @name XcmV0JunctionNetworkId (91) */648  export interface XcmV0JunctionNetworkId extends Enum {649    readonly isAny: boolean;650    readonly isNamed: boolean;651    readonly asNamed: Bytes;652    readonly isPolkadot: boolean;653    readonly isKusama: boolean;654    readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';655  }656657  /** @name XcmV0JunctionBodyId (92) */658  export interface XcmV0JunctionBodyId extends Enum {659    readonly isUnit: boolean;660    readonly isNamed: boolean;661    readonly asNamed: Bytes;662    readonly isIndex: boolean;663    readonly asIndex: Compact<u32>;664    readonly isExecutive: boolean;665    readonly isTechnical: boolean;666    readonly isLegislative: boolean;667    readonly isJudicial: boolean;668    readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';669  }670671  /** @name XcmV0JunctionBodyPart (93) */672  export interface XcmV0JunctionBodyPart extends Enum {673    readonly isVoice: boolean;674    readonly isMembers: boolean;675    readonly asMembers: {676      readonly count: Compact<u32>;677    } & Struct;678    readonly isFraction: boolean;679    readonly asFraction: {680      readonly nom: Compact<u32>;681      readonly denom: Compact<u32>;682    } & Struct;683    readonly isAtLeastProportion: boolean;684    readonly asAtLeastProportion: {685      readonly nom: Compact<u32>;686      readonly denom: Compact<u32>;687    } & Struct;688    readonly isMoreThanProportion: boolean;689    readonly asMoreThanProportion: {690      readonly nom: Compact<u32>;691      readonly denom: Compact<u32>;692    } & Struct;693    readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';694  }695696  /** @name XcmV1MultiLocation (94) */697  export interface XcmV1MultiLocation extends Struct {698    readonly parents: u8;699    readonly interior: XcmV1MultilocationJunctions;700  }701702  /** @name XcmV1MultilocationJunctions (95) */703  export interface XcmV1MultilocationJunctions extends Enum {704    readonly isHere: boolean;705    readonly isX1: boolean;706    readonly asX1: XcmV1Junction;707    readonly isX2: boolean;708    readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;709    readonly isX3: boolean;710    readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;711    readonly isX4: boolean;712    readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;713    readonly isX5: boolean;714    readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;715    readonly isX6: boolean;716    readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;717    readonly isX7: boolean;718    readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;719    readonly isX8: boolean;720    readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;721    readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';722  }723724  /** @name XcmV1Junction (96) */725  export interface XcmV1Junction extends Enum {726    readonly isParachain: boolean;727    readonly asParachain: Compact<u32>;728    readonly isAccountId32: boolean;729    readonly asAccountId32: {730      readonly network: XcmV0JunctionNetworkId;731      readonly id: U8aFixed;732    } & Struct;733    readonly isAccountIndex64: boolean;734    readonly asAccountIndex64: {735      readonly network: XcmV0JunctionNetworkId;736      readonly index: Compact<u64>;737    } & Struct;738    readonly isAccountKey20: boolean;739    readonly asAccountKey20: {740      readonly network: XcmV0JunctionNetworkId;741      readonly key: U8aFixed;742    } & Struct;743    readonly isPalletInstance: boolean;744    readonly asPalletInstance: u8;745    readonly isGeneralIndex: boolean;746    readonly asGeneralIndex: Compact<u128>;747    readonly isGeneralKey: boolean;748    readonly asGeneralKey: Bytes;749    readonly isOnlyChild: boolean;750    readonly isPlurality: boolean;751    readonly asPlurality: {752      readonly id: XcmV0JunctionBodyId;753      readonly part: XcmV0JunctionBodyPart;754    } & Struct;755    readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';756  }757758  /** @name XcmVersionedXcm (97) */759  export interface XcmVersionedXcm extends Enum {760    readonly isV0: boolean;761    readonly asV0: XcmV0Xcm;762    readonly isV1: boolean;763    readonly asV1: XcmV1Xcm;764    readonly isV2: boolean;765    readonly asV2: XcmV2Xcm;766    readonly type: 'V0' | 'V1' | 'V2';767  }768769  /** @name XcmV0Xcm (98) */770  export interface XcmV0Xcm extends Enum {771    readonly isWithdrawAsset: boolean;772    readonly asWithdrawAsset: {773      readonly assets: Vec<XcmV0MultiAsset>;774      readonly effects: Vec<XcmV0Order>;775    } & Struct;776    readonly isReserveAssetDeposit: boolean;777    readonly asReserveAssetDeposit: {778      readonly assets: Vec<XcmV0MultiAsset>;779      readonly effects: Vec<XcmV0Order>;780    } & Struct;781    readonly isTeleportAsset: boolean;782    readonly asTeleportAsset: {783      readonly assets: Vec<XcmV0MultiAsset>;784      readonly effects: Vec<XcmV0Order>;785    } & Struct;786    readonly isQueryResponse: boolean;787    readonly asQueryResponse: {788      readonly queryId: Compact<u64>;789      readonly response: XcmV0Response;790    } & Struct;791    readonly isTransferAsset: boolean;792    readonly asTransferAsset: {793      readonly assets: Vec<XcmV0MultiAsset>;794      readonly dest: XcmV0MultiLocation;795    } & Struct;796    readonly isTransferReserveAsset: boolean;797    readonly asTransferReserveAsset: {798      readonly assets: Vec<XcmV0MultiAsset>;799      readonly dest: XcmV0MultiLocation;800      readonly effects: Vec<XcmV0Order>;801    } & Struct;802    readonly isTransact: boolean;803    readonly asTransact: {804      readonly originType: XcmV0OriginKind;805      readonly requireWeightAtMost: u64;806      readonly call: XcmDoubleEncoded;807    } & Struct;808    readonly isHrmpNewChannelOpenRequest: boolean;809    readonly asHrmpNewChannelOpenRequest: {810      readonly sender: Compact<u32>;811      readonly maxMessageSize: Compact<u32>;812      readonly maxCapacity: Compact<u32>;813    } & Struct;814    readonly isHrmpChannelAccepted: boolean;815    readonly asHrmpChannelAccepted: {816      readonly recipient: Compact<u32>;817    } & Struct;818    readonly isHrmpChannelClosing: boolean;819    readonly asHrmpChannelClosing: {820      readonly initiator: Compact<u32>;821      readonly sender: Compact<u32>;822      readonly recipient: Compact<u32>;823    } & Struct;824    readonly isRelayedFrom: boolean;825    readonly asRelayedFrom: {826      readonly who: XcmV0MultiLocation;827      readonly message: XcmV0Xcm;828    } & Struct;829    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';830  }831832  /** @name XcmV0MultiAsset (100) */833  export interface XcmV0MultiAsset extends Enum {834    readonly isNone: boolean;835    readonly isAll: boolean;836    readonly isAllFungible: boolean;837    readonly isAllNonFungible: boolean;838    readonly isAllAbstractFungible: boolean;839    readonly asAllAbstractFungible: {840      readonly id: Bytes;841    } & Struct;842    readonly isAllAbstractNonFungible: boolean;843    readonly asAllAbstractNonFungible: {844      readonly class: Bytes;845    } & Struct;846    readonly isAllConcreteFungible: boolean;847    readonly asAllConcreteFungible: {848      readonly id: XcmV0MultiLocation;849    } & Struct;850    readonly isAllConcreteNonFungible: boolean;851    readonly asAllConcreteNonFungible: {852      readonly class: XcmV0MultiLocation;853    } & Struct;854    readonly isAbstractFungible: boolean;855    readonly asAbstractFungible: {856      readonly id: Bytes;857      readonly amount: Compact<u128>;858    } & Struct;859    readonly isAbstractNonFungible: boolean;860    readonly asAbstractNonFungible: {861      readonly class: Bytes;862      readonly instance: XcmV1MultiassetAssetInstance;863    } & Struct;864    readonly isConcreteFungible: boolean;865    readonly asConcreteFungible: {866      readonly id: XcmV0MultiLocation;867      readonly amount: Compact<u128>;868    } & Struct;869    readonly isConcreteNonFungible: boolean;870    readonly asConcreteNonFungible: {871      readonly class: XcmV0MultiLocation;872      readonly instance: XcmV1MultiassetAssetInstance;873    } & Struct;874    readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';875  }876877  /** @name XcmV1MultiassetAssetInstance (101) */878  export interface XcmV1MultiassetAssetInstance extends Enum {879    readonly isUndefined: boolean;880    readonly isIndex: boolean;881    readonly asIndex: Compact<u128>;882    readonly isArray4: boolean;883    readonly asArray4: U8aFixed;884    readonly isArray8: boolean;885    readonly asArray8: U8aFixed;886    readonly isArray16: boolean;887    readonly asArray16: U8aFixed;888    readonly isArray32: boolean;889    readonly asArray32: U8aFixed;890    readonly isBlob: boolean;891    readonly asBlob: Bytes;892    readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';893  }894895  /** @name XcmV0Order (104) */896  export interface XcmV0Order extends Enum {897    readonly isNull: boolean;898    readonly isDepositAsset: boolean;899    readonly asDepositAsset: {900      readonly assets: Vec<XcmV0MultiAsset>;901      readonly dest: XcmV0MultiLocation;902    } & Struct;903    readonly isDepositReserveAsset: boolean;904    readonly asDepositReserveAsset: {905      readonly assets: Vec<XcmV0MultiAsset>;906      readonly dest: XcmV0MultiLocation;907      readonly effects: Vec<XcmV0Order>;908    } & Struct;909    readonly isExchangeAsset: boolean;910    readonly asExchangeAsset: {911      readonly give: Vec<XcmV0MultiAsset>;912      readonly receive: Vec<XcmV0MultiAsset>;913    } & Struct;914    readonly isInitiateReserveWithdraw: boolean;915    readonly asInitiateReserveWithdraw: {916      readonly assets: Vec<XcmV0MultiAsset>;917      readonly reserve: XcmV0MultiLocation;918      readonly effects: Vec<XcmV0Order>;919    } & Struct;920    readonly isInitiateTeleport: boolean;921    readonly asInitiateTeleport: {922      readonly assets: Vec<XcmV0MultiAsset>;923      readonly dest: XcmV0MultiLocation;924      readonly effects: Vec<XcmV0Order>;925    } & Struct;926    readonly isQueryHolding: boolean;927    readonly asQueryHolding: {928      readonly queryId: Compact<u64>;929      readonly dest: XcmV0MultiLocation;930      readonly assets: Vec<XcmV0MultiAsset>;931    } & Struct;932    readonly isBuyExecution: boolean;933    readonly asBuyExecution: {934      readonly fees: XcmV0MultiAsset;935      readonly weight: u64;936      readonly debt: u64;937      readonly haltOnError: bool;938      readonly xcm: Vec<XcmV0Xcm>;939    } & Struct;940    readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';941  }942943  /** @name XcmV0Response (106) */944  export interface XcmV0Response extends Enum {945    readonly isAssets: boolean;946    readonly asAssets: Vec<XcmV0MultiAsset>;947    readonly type: 'Assets';948  }949950  /** @name XcmV0OriginKind (107) */951  export interface XcmV0OriginKind extends Enum {952    readonly isNative: boolean;953    readonly isSovereignAccount: boolean;954    readonly isSuperuser: boolean;955    readonly isXcm: boolean;956    readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';957  }958959  /** @name XcmDoubleEncoded (108) */960  export interface XcmDoubleEncoded extends Struct {961    readonly encoded: Bytes;962  }963964  /** @name XcmV1Xcm (109) */965  export interface XcmV1Xcm extends Enum {966    readonly isWithdrawAsset: boolean;967    readonly asWithdrawAsset: {968      readonly assets: XcmV1MultiassetMultiAssets;969      readonly effects: Vec<XcmV1Order>;970    } & Struct;971    readonly isReserveAssetDeposited: boolean;972    readonly asReserveAssetDeposited: {973      readonly assets: XcmV1MultiassetMultiAssets;974      readonly effects: Vec<XcmV1Order>;975    } & Struct;976    readonly isReceiveTeleportedAsset: boolean;977    readonly asReceiveTeleportedAsset: {978      readonly assets: XcmV1MultiassetMultiAssets;979      readonly effects: Vec<XcmV1Order>;980    } & Struct;981    readonly isQueryResponse: boolean;982    readonly asQueryResponse: {983      readonly queryId: Compact<u64>;984      readonly response: XcmV1Response;985    } & Struct;986    readonly isTransferAsset: boolean;987    readonly asTransferAsset: {988      readonly assets: XcmV1MultiassetMultiAssets;989      readonly beneficiary: XcmV1MultiLocation;990    } & Struct;991    readonly isTransferReserveAsset: boolean;992    readonly asTransferReserveAsset: {993      readonly assets: XcmV1MultiassetMultiAssets;994      readonly dest: XcmV1MultiLocation;995      readonly effects: Vec<XcmV1Order>;996    } & Struct;997    readonly isTransact: boolean;998    readonly asTransact: {999      readonly originType: XcmV0OriginKind;1000      readonly requireWeightAtMost: u64;1001      readonly call: XcmDoubleEncoded;1002    } & Struct;1003    readonly isHrmpNewChannelOpenRequest: boolean;1004    readonly asHrmpNewChannelOpenRequest: {1005      readonly sender: Compact<u32>;1006      readonly maxMessageSize: Compact<u32>;1007      readonly maxCapacity: Compact<u32>;1008    } & Struct;1009    readonly isHrmpChannelAccepted: boolean;1010    readonly asHrmpChannelAccepted: {1011      readonly recipient: Compact<u32>;1012    } & Struct;1013    readonly isHrmpChannelClosing: boolean;1014    readonly asHrmpChannelClosing: {1015      readonly initiator: Compact<u32>;1016      readonly sender: Compact<u32>;1017      readonly recipient: Compact<u32>;1018    } & Struct;1019    readonly isRelayedFrom: boolean;1020    readonly asRelayedFrom: {1021      readonly who: XcmV1MultilocationJunctions;1022      readonly message: XcmV1Xcm;1023    } & Struct;1024    readonly isSubscribeVersion: boolean;1025    readonly asSubscribeVersion: {1026      readonly queryId: Compact<u64>;1027      readonly maxResponseWeight: Compact<u64>;1028    } & Struct;1029    readonly isUnsubscribeVersion: boolean;1030    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';1031  }10321033  /** @name XcmV1MultiassetMultiAssets (110) */1034  export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}10351036  /** @name XcmV1MultiAsset (112) */1037  export interface XcmV1MultiAsset extends Struct {1038    readonly id: XcmV1MultiassetAssetId;1039    readonly fun: XcmV1MultiassetFungibility;1040  }10411042  /** @name XcmV1MultiassetAssetId (113) */1043  export interface XcmV1MultiassetAssetId extends Enum {1044    readonly isConcrete: boolean;1045    readonly asConcrete: XcmV1MultiLocation;1046    readonly isAbstract: boolean;1047    readonly asAbstract: Bytes;1048    readonly type: 'Concrete' | 'Abstract';1049  }10501051  /** @name XcmV1MultiassetFungibility (114) */1052  export interface XcmV1MultiassetFungibility extends Enum {1053    readonly isFungible: boolean;1054    readonly asFungible: Compact<u128>;1055    readonly isNonFungible: boolean;1056    readonly asNonFungible: XcmV1MultiassetAssetInstance;1057    readonly type: 'Fungible' | 'NonFungible';1058  }10591060  /** @name XcmV1Order (116) */1061  export interface XcmV1Order extends Enum {1062    readonly isNoop: boolean;1063    readonly isDepositAsset: boolean;1064    readonly asDepositAsset: {1065      readonly assets: XcmV1MultiassetMultiAssetFilter;1066      readonly maxAssets: u32;1067      readonly beneficiary: XcmV1MultiLocation;1068    } & Struct;1069    readonly isDepositReserveAsset: boolean;1070    readonly asDepositReserveAsset: {1071      readonly assets: XcmV1MultiassetMultiAssetFilter;1072      readonly maxAssets: u32;1073      readonly dest: XcmV1MultiLocation;1074      readonly effects: Vec<XcmV1Order>;1075    } & Struct;1076    readonly isExchangeAsset: boolean;1077    readonly asExchangeAsset: {1078      readonly give: XcmV1MultiassetMultiAssetFilter;1079      readonly receive: XcmV1MultiassetMultiAssets;1080    } & Struct;1081    readonly isInitiateReserveWithdraw: boolean;1082    readonly asInitiateReserveWithdraw: {1083      readonly assets: XcmV1MultiassetMultiAssetFilter;1084      readonly reserve: XcmV1MultiLocation;1085      readonly effects: Vec<XcmV1Order>;1086    } & Struct;1087    readonly isInitiateTeleport: boolean;1088    readonly asInitiateTeleport: {1089      readonly assets: XcmV1MultiassetMultiAssetFilter;1090      readonly dest: XcmV1MultiLocation;1091      readonly effects: Vec<XcmV1Order>;1092    } & Struct;1093    readonly isQueryHolding: boolean;1094    readonly asQueryHolding: {1095      readonly queryId: Compact<u64>;1096      readonly dest: XcmV1MultiLocation;1097      readonly assets: XcmV1MultiassetMultiAssetFilter;1098    } & Struct;1099    readonly isBuyExecution: boolean;1100    readonly asBuyExecution: {1101      readonly fees: XcmV1MultiAsset;1102      readonly weight: u64;1103      readonly debt: u64;1104      readonly haltOnError: bool;1105      readonly instructions: Vec<XcmV1Xcm>;1106    } & Struct;1107    readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';1108  }11091110  /** @name XcmV1MultiassetMultiAssetFilter (117) */1111  export interface XcmV1MultiassetMultiAssetFilter extends Enum {1112    readonly isDefinite: boolean;1113    readonly asDefinite: XcmV1MultiassetMultiAssets;1114    readonly isWild: boolean;1115    readonly asWild: XcmV1MultiassetWildMultiAsset;1116    readonly type: 'Definite' | 'Wild';1117  }11181119  /** @name XcmV1MultiassetWildMultiAsset (118) */1120  export interface XcmV1MultiassetWildMultiAsset extends Enum {1121    readonly isAll: boolean;1122    readonly isAllOf: boolean;1123    readonly asAllOf: {1124      readonly id: XcmV1MultiassetAssetId;1125      readonly fun: XcmV1MultiassetWildFungibility;1126    } & Struct;1127    readonly type: 'All' | 'AllOf';1128  }11291130  /** @name XcmV1MultiassetWildFungibility (119) */1131  export interface XcmV1MultiassetWildFungibility extends Enum {1132    readonly isFungible: boolean;1133    readonly isNonFungible: boolean;1134    readonly type: 'Fungible' | 'NonFungible';1135  }11361137  /** @name XcmV1Response (121) */1138  export interface XcmV1Response extends Enum {1139    readonly isAssets: boolean;1140    readonly asAssets: XcmV1MultiassetMultiAssets;1141    readonly isVersion: boolean;1142    readonly asVersion: u32;1143    readonly type: 'Assets' | 'Version';1144  }11451146  /** @name XcmV2Xcm (122) */1147  export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}11481149  /** @name XcmV2Instruction (124) */1150  export interface XcmV2Instruction extends Enum {1151    readonly isWithdrawAsset: boolean;1152    readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;1153    readonly isReserveAssetDeposited: boolean;1154    readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;1155    readonly isReceiveTeleportedAsset: boolean;1156    readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;1157    readonly isQueryResponse: boolean;1158    readonly asQueryResponse: {1159      readonly queryId: Compact<u64>;1160      readonly response: XcmV2Response;1161      readonly maxWeight: Compact<u64>;1162    } & Struct;1163    readonly isTransferAsset: boolean;1164    readonly asTransferAsset: {1165      readonly assets: XcmV1MultiassetMultiAssets;1166      readonly beneficiary: XcmV1MultiLocation;1167    } & Struct;1168    readonly isTransferReserveAsset: boolean;1169    readonly asTransferReserveAsset: {1170      readonly assets: XcmV1MultiassetMultiAssets;1171      readonly dest: XcmV1MultiLocation;1172      readonly xcm: XcmV2Xcm;1173    } & Struct;1174    readonly isTransact: boolean;1175    readonly asTransact: {1176      readonly originType: XcmV0OriginKind;1177      readonly requireWeightAtMost: Compact<u64>;1178      readonly call: XcmDoubleEncoded;1179    } & Struct;1180    readonly isHrmpNewChannelOpenRequest: boolean;1181    readonly asHrmpNewChannelOpenRequest: {1182      readonly sender: Compact<u32>;1183      readonly maxMessageSize: Compact<u32>;1184      readonly maxCapacity: Compact<u32>;1185    } & Struct;1186    readonly isHrmpChannelAccepted: boolean;1187    readonly asHrmpChannelAccepted: {1188      readonly recipient: Compact<u32>;1189    } & Struct;1190    readonly isHrmpChannelClosing: boolean;1191    readonly asHrmpChannelClosing: {1192      readonly initiator: Compact<u32>;1193      readonly sender: Compact<u32>;1194      readonly recipient: Compact<u32>;1195    } & Struct;1196    readonly isClearOrigin: boolean;1197    readonly isDescendOrigin: boolean;1198    readonly asDescendOrigin: XcmV1MultilocationJunctions;1199    readonly isReportError: boolean;1200    readonly asReportError: {1201      readonly queryId: Compact<u64>;1202      readonly dest: XcmV1MultiLocation;1203      readonly maxResponseWeight: Compact<u64>;1204    } & Struct;1205    readonly isDepositAsset: boolean;1206    readonly asDepositAsset: {1207      readonly assets: XcmV1MultiassetMultiAssetFilter;1208      readonly maxAssets: Compact<u32>;1209      readonly beneficiary: XcmV1MultiLocation;1210    } & Struct;1211    readonly isDepositReserveAsset: boolean;1212    readonly asDepositReserveAsset: {1213      readonly assets: XcmV1MultiassetMultiAssetFilter;1214      readonly maxAssets: Compact<u32>;1215      readonly dest: XcmV1MultiLocation;1216      readonly xcm: XcmV2Xcm;1217    } & Struct;1218    readonly isExchangeAsset: boolean;1219    readonly asExchangeAsset: {1220      readonly give: XcmV1MultiassetMultiAssetFilter;1221      readonly receive: XcmV1MultiassetMultiAssets;1222    } & Struct;1223    readonly isInitiateReserveWithdraw: boolean;1224    readonly asInitiateReserveWithdraw: {1225      readonly assets: XcmV1MultiassetMultiAssetFilter;1226      readonly reserve: XcmV1MultiLocation;1227      readonly xcm: XcmV2Xcm;1228    } & Struct;1229    readonly isInitiateTeleport: boolean;1230    readonly asInitiateTeleport: {1231      readonly assets: XcmV1MultiassetMultiAssetFilter;1232      readonly dest: XcmV1MultiLocation;1233      readonly xcm: XcmV2Xcm;1234    } & Struct;1235    readonly isQueryHolding: boolean;1236    readonly asQueryHolding: {1237      readonly queryId: Compact<u64>;1238      readonly dest: XcmV1MultiLocation;1239      readonly assets: XcmV1MultiassetMultiAssetFilter;1240      readonly maxResponseWeight: Compact<u64>;1241    } & Struct;1242    readonly isBuyExecution: boolean;1243    readonly asBuyExecution: {1244      readonly fees: XcmV1MultiAsset;1245      readonly weightLimit: XcmV2WeightLimit;1246    } & Struct;1247    readonly isRefundSurplus: boolean;1248    readonly isSetErrorHandler: boolean;1249    readonly asSetErrorHandler: XcmV2Xcm;1250    readonly isSetAppendix: boolean;1251    readonly asSetAppendix: XcmV2Xcm;1252    readonly isClearError: boolean;1253    readonly isClaimAsset: boolean;1254    readonly asClaimAsset: {1255      readonly assets: XcmV1MultiassetMultiAssets;1256      readonly ticket: XcmV1MultiLocation;1257    } & Struct;1258    readonly isTrap: boolean;1259    readonly asTrap: Compact<u64>;1260    readonly isSubscribeVersion: boolean;1261    readonly asSubscribeVersion: {1262      readonly queryId: Compact<u64>;1263      readonly maxResponseWeight: Compact<u64>;1264    } & Struct;1265    readonly isUnsubscribeVersion: boolean;1266    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';1267  }12681269  /** @name XcmV2Response (125) */1270  export interface XcmV2Response extends Enum {1271    readonly isNull: boolean;1272    readonly isAssets: boolean;1273    readonly asAssets: XcmV1MultiassetMultiAssets;1274    readonly isExecutionResult: boolean;1275    readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;1276    readonly isVersion: boolean;1277    readonly asVersion: u32;1278    readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';1279  }12801281  /** @name XcmV2TraitsError (128) */1282  export interface XcmV2TraitsError extends Enum {1283    readonly isOverflow: boolean;1284    readonly isUnimplemented: boolean;1285    readonly isUntrustedReserveLocation: boolean;1286    readonly isUntrustedTeleportLocation: boolean;1287    readonly isMultiLocationFull: boolean;1288    readonly isMultiLocationNotInvertible: boolean;1289    readonly isBadOrigin: boolean;1290    readonly isInvalidLocation: boolean;1291    readonly isAssetNotFound: boolean;1292    readonly isFailedToTransactAsset: boolean;1293    readonly isNotWithdrawable: boolean;1294    readonly isLocationCannotHold: boolean;1295    readonly isExceedsMaxMessageSize: boolean;1296    readonly isDestinationUnsupported: boolean;1297    readonly isTransport: boolean;1298    readonly isUnroutable: boolean;1299    readonly isUnknownClaim: boolean;1300    readonly isFailedToDecode: boolean;1301    readonly isMaxWeightInvalid: boolean;1302    readonly isNotHoldingFees: boolean;1303    readonly isTooExpensive: boolean;1304    readonly isTrap: boolean;1305    readonly asTrap: u64;1306    readonly isUnhandledXcmVersion: boolean;1307    readonly isWeightLimitReached: boolean;1308    readonly asWeightLimitReached: u64;1309    readonly isBarrier: boolean;1310    readonly isWeightNotComputable: boolean;1311    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';1312  }13131314  /** @name XcmV2WeightLimit (129) */1315  export interface XcmV2WeightLimit extends Enum {1316    readonly isUnlimited: boolean;1317    readonly isLimited: boolean;1318    readonly asLimited: Compact<u64>;1319    readonly type: 'Unlimited' | 'Limited';1320  }13211322  /** @name XcmVersionedMultiAssets (130) */1323  export interface XcmVersionedMultiAssets extends Enum {1324    readonly isV0: boolean;1325    readonly asV0: Vec<XcmV0MultiAsset>;1326    readonly isV1: boolean;1327    readonly asV1: XcmV1MultiassetMultiAssets;1328    readonly type: 'V0' | 'V1';1329  }13301331  /** @name CumulusPalletXcmCall (145) */1332  export type CumulusPalletXcmCall = Null;13331334  /** @name CumulusPalletDmpQueueCall (146) */1335  export interface CumulusPalletDmpQueueCall extends Enum {1336    readonly isServiceOverweight: boolean;1337    readonly asServiceOverweight: {1338      readonly index: u64;1339      readonly weightLimit: u64;1340    } & Struct;1341    readonly type: 'ServiceOverweight';1342  }13431344  /** @name PalletInflationCall (147) */1345  export interface PalletInflationCall extends Enum {1346    readonly isStartInflation: boolean;1347    readonly asStartInflation: {1348      readonly inflationStartRelayBlock: u32;1349    } & Struct;1350    readonly type: 'StartInflation';1351  }13521353  /** @name PalletUniqueCall (148) */1354  export interface PalletUniqueCall extends Enum {1355    readonly isCreateCollection: boolean;1356    readonly asCreateCollection: {1357      readonly collectionName: Vec<u16>;1358      readonly collectionDescription: Vec<u16>;1359      readonly tokenPrefix: Bytes;1360      readonly mode: UpDataStructsCollectionMode;1361    } & Struct;1362    readonly isCreateCollectionEx: boolean;1363    readonly asCreateCollectionEx: {1364      readonly data: UpDataStructsCreateCollectionData;1365    } & Struct;1366    readonly isDestroyCollection: boolean;1367    readonly asDestroyCollection: {1368      readonly collectionId: u32;1369    } & Struct;1370    readonly isAddToAllowList: boolean;1371    readonly asAddToAllowList: {1372      readonly collectionId: u32;1373      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1374    } & Struct;1375    readonly isRemoveFromAllowList: boolean;1376    readonly asRemoveFromAllowList: {1377      readonly collectionId: u32;1378      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1379    } & Struct;1380    readonly isChangeCollectionOwner: boolean;1381    readonly asChangeCollectionOwner: {1382      readonly collectionId: u32;1383      readonly newOwner: AccountId32;1384    } & Struct;1385    readonly isAddCollectionAdmin: boolean;1386    readonly asAddCollectionAdmin: {1387      readonly collectionId: u32;1388      readonly newAdmin: PalletEvmAccountBasicCrossAccountIdRepr;1389    } & Struct;1390    readonly isRemoveCollectionAdmin: boolean;1391    readonly asRemoveCollectionAdmin: {1392      readonly collectionId: u32;1393      readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1394    } & Struct;1395    readonly isSetCollectionSponsor: boolean;1396    readonly asSetCollectionSponsor: {1397      readonly collectionId: u32;1398      readonly newSponsor: AccountId32;1399    } & Struct;1400    readonly isConfirmSponsorship: boolean;1401    readonly asConfirmSponsorship: {1402      readonly collectionId: u32;1403    } & Struct;1404    readonly isRemoveCollectionSponsor: boolean;1405    readonly asRemoveCollectionSponsor: {1406      readonly collectionId: u32;1407    } & Struct;1408    readonly isCreateItem: boolean;1409    readonly asCreateItem: {1410      readonly collectionId: u32;1411      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1412      readonly data: UpDataStructsCreateItemData;1413    } & Struct;1414    readonly isCreateMultipleItems: boolean;1415    readonly asCreateMultipleItems: {1416      readonly collectionId: u32;1417      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1418      readonly itemsData: Vec<UpDataStructsCreateItemData>;1419    } & Struct;1420    readonly isSetCollectionProperties: boolean;1421    readonly asSetCollectionProperties: {1422      readonly collectionId: u32;1423      readonly properties: Vec<UpDataStructsProperty>;1424    } & Struct;1425    readonly isDeleteCollectionProperties: boolean;1426    readonly asDeleteCollectionProperties: {1427      readonly collectionId: u32;1428      readonly propertyKeys: Vec<Bytes>;1429    } & Struct;1430    readonly isSetTokenProperties: boolean;1431    readonly asSetTokenProperties: {1432      readonly collectionId: u32;1433      readonly tokenId: u32;1434      readonly properties: Vec<UpDataStructsProperty>;1435    } & Struct;1436    readonly isDeleteTokenProperties: boolean;1437    readonly asDeleteTokenProperties: {1438      readonly collectionId: u32;1439      readonly tokenId: u32;1440      readonly propertyKeys: Vec<Bytes>;1441    } & Struct;1442    readonly isSetTokenPropertyPermissions: boolean;1443    readonly asSetTokenPropertyPermissions: {1444      readonly collectionId: u32;1445      readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1446    } & Struct;1447    readonly isCreateMultipleItemsEx: boolean;1448    readonly asCreateMultipleItemsEx: {1449      readonly collectionId: u32;1450      readonly data: UpDataStructsCreateItemExData;1451    } & Struct;1452    readonly isSetTransfersEnabledFlag: boolean;1453    readonly asSetTransfersEnabledFlag: {1454      readonly collectionId: u32;1455      readonly value: bool;1456    } & Struct;1457    readonly isBurnItem: boolean;1458    readonly asBurnItem: {1459      readonly collectionId: u32;1460      readonly itemId: u32;1461      readonly value: u128;1462    } & Struct;1463    readonly isBurnFrom: boolean;1464    readonly asBurnFrom: {1465      readonly collectionId: u32;1466      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1467      readonly itemId: u32;1468      readonly value: u128;1469    } & Struct;1470    readonly isTransfer: boolean;1471    readonly asTransfer: {1472      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1473      readonly collectionId: u32;1474      readonly itemId: u32;1475      readonly value: u128;1476    } & Struct;1477    readonly isApprove: boolean;1478    readonly asApprove: {1479      readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1480      readonly collectionId: u32;1481      readonly itemId: u32;1482      readonly amount: u128;1483    } & Struct;1484    readonly isTransferFrom: boolean;1485    readonly asTransferFrom: {1486      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1487      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1488      readonly collectionId: u32;1489      readonly itemId: u32;1490      readonly value: u128;1491    } & Struct;1492    readonly isSetCollectionLimits: boolean;1493    readonly asSetCollectionLimits: {1494      readonly collectionId: u32;1495      readonly newLimit: UpDataStructsCollectionLimits;1496    } & Struct;1497    readonly isSetCollectionPermissions: boolean;1498    readonly asSetCollectionPermissions: {1499      readonly collectionId: u32;1500      readonly newPermission: UpDataStructsCollectionPermissions;1501    } & Struct;1502    readonly isRepartition: boolean;1503    readonly asRepartition: {1504      readonly collectionId: u32;1505      readonly tokenId: u32;1506      readonly amount: u128;1507    } & Struct;1508    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';1509  }15101511  /** @name UpDataStructsCollectionMode (154) */1512  export interface UpDataStructsCollectionMode extends Enum {1513    readonly isNft: boolean;1514    readonly isFungible: boolean;1515    readonly asFungible: u8;1516    readonly isReFungible: boolean;1517    readonly type: 'Nft' | 'Fungible' | 'ReFungible';1518  }15191520  /** @name UpDataStructsCreateCollectionData (155) */1521  export interface UpDataStructsCreateCollectionData extends Struct {1522    readonly mode: UpDataStructsCollectionMode;1523    readonly access: Option<UpDataStructsAccessMode>;1524    readonly name: Vec<u16>;1525    readonly description: Vec<u16>;1526    readonly tokenPrefix: Bytes;1527    readonly pendingSponsor: Option<AccountId32>;1528    readonly limits: Option<UpDataStructsCollectionLimits>;1529    readonly permissions: Option<UpDataStructsCollectionPermissions>;1530    readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1531    readonly properties: Vec<UpDataStructsProperty>;1532  }15331534  /** @name UpDataStructsAccessMode (157) */1535  export interface UpDataStructsAccessMode extends Enum {1536    readonly isNormal: boolean;1537    readonly isAllowList: boolean;1538    readonly type: 'Normal' | 'AllowList';1539  }15401541  /** @name UpDataStructsCollectionLimits (160) */1542  export interface UpDataStructsCollectionLimits extends Struct {1543    readonly accountTokenOwnershipLimit: Option<u32>;1544    readonly sponsoredDataSize: Option<u32>;1545    readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;1546    readonly tokenLimit: Option<u32>;1547    readonly sponsorTransferTimeout: Option<u32>;1548    readonly sponsorApproveTimeout: Option<u32>;1549    readonly ownerCanTransfer: Option<bool>;1550    readonly ownerCanDestroy: Option<bool>;1551    readonly transfersEnabled: Option<bool>;1552  }15531554  /** @name UpDataStructsSponsoringRateLimit (162) */1555  export interface UpDataStructsSponsoringRateLimit extends Enum {1556    readonly isSponsoringDisabled: boolean;1557    readonly isBlocks: boolean;1558    readonly asBlocks: u32;1559    readonly type: 'SponsoringDisabled' | 'Blocks';1560  }15611562  /** @name UpDataStructsCollectionPermissions (165) */1563  export interface UpDataStructsCollectionPermissions extends Struct {1564    readonly access: Option<UpDataStructsAccessMode>;1565    readonly mintMode: Option<bool>;1566    readonly nesting: Option<UpDataStructsNestingPermissions>;1567  }15681569  /** @name UpDataStructsNestingPermissions (167) */1570  export interface UpDataStructsNestingPermissions extends Struct {1571    readonly tokenOwner: bool;1572    readonly collectionAdmin: bool;1573    readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;1574  }15751576  /** @name UpDataStructsOwnerRestrictedSet (169) */1577  export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}15781579  /** @name UpDataStructsPropertyKeyPermission (175) */1580  export interface UpDataStructsPropertyKeyPermission extends Struct {1581    readonly key: Bytes;1582    readonly permission: UpDataStructsPropertyPermission;1583  }15841585  /** @name UpDataStructsPropertyPermission (177) */1586  export interface UpDataStructsPropertyPermission extends Struct {1587    readonly mutable: bool;1588    readonly collectionAdmin: bool;1589    readonly tokenOwner: bool;1590  }15911592  /** @name UpDataStructsProperty (180) */1593  export interface UpDataStructsProperty extends Struct {1594    readonly key: Bytes;1595    readonly value: Bytes;1596  }15971598  /** @name PalletEvmAccountBasicCrossAccountIdRepr (183) */1599  export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1600    readonly isSubstrate: boolean;1601    readonly asSubstrate: AccountId32;1602    readonly isEthereum: boolean;1603    readonly asEthereum: H160;1604    readonly type: 'Substrate' | 'Ethereum';1605  }16061607  /** @name UpDataStructsCreateItemData (185) */1608  export interface UpDataStructsCreateItemData extends Enum {1609    readonly isNft: boolean;1610    readonly asNft: UpDataStructsCreateNftData;1611    readonly isFungible: boolean;1612    readonly asFungible: UpDataStructsCreateFungibleData;1613    readonly isReFungible: boolean;1614    readonly asReFungible: UpDataStructsCreateReFungibleData;1615    readonly type: 'Nft' | 'Fungible' | 'ReFungible';1616  }16171618  /** @name UpDataStructsCreateNftData (186) */1619  export interface UpDataStructsCreateNftData extends Struct {1620    readonly properties: Vec<UpDataStructsProperty>;1621  }16221623  /** @name UpDataStructsCreateFungibleData (187) */1624  export interface UpDataStructsCreateFungibleData extends Struct {1625    readonly value: u128;1626  }16271628  /** @name UpDataStructsCreateReFungibleData (188) */1629  export interface UpDataStructsCreateReFungibleData extends Struct {1630    readonly constData: Bytes;1631    readonly pieces: u128;1632  }16331634  /** @name UpDataStructsCreateItemExData (193) */1635  export interface UpDataStructsCreateItemExData extends Enum {1636    readonly isNft: boolean;1637    readonly asNft: Vec<UpDataStructsCreateNftExData>;1638    readonly isFungible: boolean;1639    readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1640    readonly isRefungibleMultipleItems: boolean;1641    readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;1642    readonly isRefungibleMultipleOwners: boolean;1643    readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;1644    readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';1645  }16461647  /** @name UpDataStructsCreateNftExData (195) */1648  export interface UpDataStructsCreateNftExData extends Struct {1649    readonly properties: Vec<UpDataStructsProperty>;1650    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1651  }16521653  /** @name UpDataStructsCreateRefungibleExData (202) */1654  export interface UpDataStructsCreateRefungibleExData extends Struct {1655    readonly constData: Bytes;1656    readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1657  }16581659  /** @name PalletUniqueSchedulerCall (204) */1660  export interface PalletUniqueSchedulerCall extends Enum {1661    readonly isScheduleNamed: boolean;1662    readonly asScheduleNamed: {1663      readonly id: U8aFixed;1664      readonly when: u32;1665      readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1666      readonly priority: u8;1667      readonly call: FrameSupportScheduleMaybeHashed;1668    } & Struct;1669    readonly isCancelNamed: boolean;1670    readonly asCancelNamed: {1671      readonly id: U8aFixed;1672    } & Struct;1673    readonly isScheduleNamedAfter: boolean;1674    readonly asScheduleNamedAfter: {1675      readonly id: U8aFixed;1676      readonly after: u32;1677      readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1678      readonly priority: u8;1679      readonly call: FrameSupportScheduleMaybeHashed;1680    } & Struct;1681    readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1682  }16831684  /** @name FrameSupportScheduleMaybeHashed (206) */1685  export interface FrameSupportScheduleMaybeHashed extends Enum {1686    readonly isValue: boolean;1687    readonly asValue: Call;1688    readonly isHash: boolean;1689    readonly asHash: H256;1690    readonly type: 'Value' | 'Hash';1691  }16921693  /** @name PalletTemplateTransactionPaymentCall (207) */1694  export type PalletTemplateTransactionPaymentCall = Null;16951696  /** @name PalletStructureCall (208) */1697  export type PalletStructureCall = Null;16981699  /** @name PalletRmrkCoreCall (209) */1700  export interface PalletRmrkCoreCall extends Enum {1701    readonly isCreateCollection: boolean;1702    readonly asCreateCollection: {1703      readonly metadata: Bytes;1704      readonly max: Option<u32>;1705      readonly symbol: Bytes;1706    } & Struct;1707    readonly isDestroyCollection: boolean;1708    readonly asDestroyCollection: {1709      readonly collectionId: u32;1710    } & Struct;1711    readonly isChangeCollectionIssuer: boolean;1712    readonly asChangeCollectionIssuer: {1713      readonly collectionId: u32;1714      readonly newIssuer: MultiAddress;1715    } & Struct;1716    readonly isLockCollection: boolean;1717    readonly asLockCollection: {1718      readonly collectionId: u32;1719    } & Struct;1720    readonly isMintNft: boolean;1721    readonly asMintNft: {1722      readonly owner: Option<AccountId32>;1723      readonly collectionId: u32;1724      readonly recipient: Option<AccountId32>;1725      readonly royaltyAmount: Option<Permill>;1726      readonly metadata: Bytes;1727      readonly transferable: bool;1728      readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1729    } & Struct;1730    readonly isBurnNft: boolean;1731    readonly asBurnNft: {1732      readonly collectionId: u32;1733      readonly nftId: u32;1734      readonly maxBurns: u32;1735    } & Struct;1736    readonly isSend: boolean;1737    readonly asSend: {1738      readonly rmrkCollectionId: u32;1739      readonly rmrkNftId: u32;1740      readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1741    } & Struct;1742    readonly isAcceptNft: boolean;1743    readonly asAcceptNft: {1744      readonly rmrkCollectionId: u32;1745      readonly rmrkNftId: u32;1746      readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1747    } & Struct;1748    readonly isRejectNft: boolean;1749    readonly asRejectNft: {1750      readonly rmrkCollectionId: u32;1751      readonly rmrkNftId: u32;1752    } & Struct;1753    readonly isAcceptResource: boolean;1754    readonly asAcceptResource: {1755      readonly rmrkCollectionId: u32;1756      readonly rmrkNftId: u32;1757      readonly resourceId: u32;1758    } & Struct;1759    readonly isAcceptResourceRemoval: boolean;1760    readonly asAcceptResourceRemoval: {1761      readonly rmrkCollectionId: u32;1762      readonly rmrkNftId: u32;1763      readonly resourceId: u32;1764    } & Struct;1765    readonly isSetProperty: boolean;1766    readonly asSetProperty: {1767      readonly rmrkCollectionId: Compact<u32>;1768      readonly maybeNftId: Option<u32>;1769      readonly key: Bytes;1770      readonly value: Bytes;1771    } & Struct;1772    readonly isSetPriority: boolean;1773    readonly asSetPriority: {1774      readonly rmrkCollectionId: u32;1775      readonly rmrkNftId: u32;1776      readonly priorities: Vec<u32>;1777    } & Struct;1778    readonly isAddBasicResource: boolean;1779    readonly asAddBasicResource: {1780      readonly rmrkCollectionId: u32;1781      readonly nftId: u32;1782      readonly resource: RmrkTraitsResourceBasicResource;1783    } & Struct;1784    readonly isAddComposableResource: boolean;1785    readonly asAddComposableResource: {1786      readonly rmrkCollectionId: u32;1787      readonly nftId: u32;1788      readonly resource: RmrkTraitsResourceComposableResource;1789    } & Struct;1790    readonly isAddSlotResource: boolean;1791    readonly asAddSlotResource: {1792      readonly rmrkCollectionId: u32;1793      readonly nftId: u32;1794      readonly resource: RmrkTraitsResourceSlotResource;1795    } & Struct;1796    readonly isRemoveResource: boolean;1797    readonly asRemoveResource: {1798      readonly rmrkCollectionId: u32;1799      readonly nftId: u32;1800      readonly resourceId: u32;1801    } & Struct;1802    readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1803  }18041805  /** @name RmrkTraitsResourceResourceTypes (215) */1806  export interface RmrkTraitsResourceResourceTypes extends Enum {1807    readonly isBasic: boolean;1808    readonly asBasic: RmrkTraitsResourceBasicResource;1809    readonly isComposable: boolean;1810    readonly asComposable: RmrkTraitsResourceComposableResource;1811    readonly isSlot: boolean;1812    readonly asSlot: RmrkTraitsResourceSlotResource;1813    readonly type: 'Basic' | 'Composable' | 'Slot';1814  }18151816  /** @name RmrkTraitsResourceBasicResource (217) */1817  export interface RmrkTraitsResourceBasicResource extends Struct {1818    readonly src: Option<Bytes>;1819    readonly metadata: Option<Bytes>;1820    readonly license: Option<Bytes>;1821    readonly thumb: Option<Bytes>;1822  }18231824  /** @name RmrkTraitsResourceComposableResource (219) */1825  export interface RmrkTraitsResourceComposableResource extends Struct {1826    readonly parts: Vec<u32>;1827    readonly base: u32;1828    readonly src: Option<Bytes>;1829    readonly metadata: Option<Bytes>;1830    readonly license: Option<Bytes>;1831    readonly thumb: Option<Bytes>;1832  }18331834  /** @name RmrkTraitsResourceSlotResource (220) */1835  export interface RmrkTraitsResourceSlotResource extends Struct {1836    readonly base: u32;1837    readonly src: Option<Bytes>;1838    readonly metadata: Option<Bytes>;1839    readonly slot: u32;1840    readonly license: Option<Bytes>;1841    readonly thumb: Option<Bytes>;1842  }18431844  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (222) */1845  export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {1846    readonly isAccountId: boolean;1847    readonly asAccountId: AccountId32;1848    readonly isCollectionAndNftTuple: boolean;1849    readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;1850    readonly type: 'AccountId' | 'CollectionAndNftTuple';1851  }18521853  /** @name PalletRmrkEquipCall (226) */1854  export interface PalletRmrkEquipCall extends Enum {1855    readonly isCreateBase: boolean;1856    readonly asCreateBase: {1857      readonly baseType: Bytes;1858      readonly symbol: Bytes;1859      readonly parts: Vec<RmrkTraitsPartPartType>;1860    } & Struct;1861    readonly isThemeAdd: boolean;1862    readonly asThemeAdd: {1863      readonly baseId: u32;1864      readonly theme: RmrkTraitsTheme;1865    } & Struct;1866    readonly isEquippable: boolean;1867    readonly asEquippable: {1868      readonly baseId: u32;1869      readonly slotId: u32;1870      readonly equippables: RmrkTraitsPartEquippableList;1871    } & Struct;1872    readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1873  }18741875  /** @name RmrkTraitsPartPartType (229) */1876  export interface RmrkTraitsPartPartType extends Enum {1877    readonly isFixedPart: boolean;1878    readonly asFixedPart: RmrkTraitsPartFixedPart;1879    readonly isSlotPart: boolean;1880    readonly asSlotPart: RmrkTraitsPartSlotPart;1881    readonly type: 'FixedPart' | 'SlotPart';1882  }18831884  /** @name RmrkTraitsPartFixedPart (231) */1885  export interface RmrkTraitsPartFixedPart extends Struct {1886    readonly id: u32;1887    readonly z: u32;1888    readonly src: Bytes;1889  }18901891  /** @name RmrkTraitsPartSlotPart (232) */1892  export interface RmrkTraitsPartSlotPart extends Struct {1893    readonly id: u32;1894    readonly equippable: RmrkTraitsPartEquippableList;1895    readonly src: Bytes;1896    readonly z: u32;1897  }18981899  /** @name RmrkTraitsPartEquippableList (233) */1900  export interface RmrkTraitsPartEquippableList extends Enum {1901    readonly isAll: boolean;1902    readonly isEmpty: boolean;1903    readonly isCustom: boolean;1904    readonly asCustom: Vec<u32>;1905    readonly type: 'All' | 'Empty' | 'Custom';1906  }19071908  /** @name RmrkTraitsTheme (235) */1909  export interface RmrkTraitsTheme extends Struct {1910    readonly name: Bytes;1911    readonly properties: Vec<RmrkTraitsThemeThemeProperty>;1912    readonly inherit: bool;1913  }19141915  /** @name RmrkTraitsThemeThemeProperty (237) */1916  export interface RmrkTraitsThemeThemeProperty extends Struct {1917    readonly key: Bytes;1918    readonly value: Bytes;1919  }19201921  /** @name PalletEvmCall (239) */1922  export interface PalletEvmCall extends Enum {1923    readonly isWithdraw: boolean;1924    readonly asWithdraw: {1925      readonly address: H160;1926      readonly value: u128;1927    } & Struct;1928    readonly isCall: boolean;1929    readonly asCall: {1930      readonly source: H160;1931      readonly target: H160;1932      readonly input: Bytes;1933      readonly value: U256;1934      readonly gasLimit: u64;1935      readonly maxFeePerGas: U256;1936      readonly maxPriorityFeePerGas: Option<U256>;1937      readonly nonce: Option<U256>;1938      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1939    } & Struct;1940    readonly isCreate: boolean;1941    readonly asCreate: {1942      readonly source: H160;1943      readonly init: Bytes;1944      readonly value: U256;1945      readonly gasLimit: u64;1946      readonly maxFeePerGas: U256;1947      readonly maxPriorityFeePerGas: Option<U256>;1948      readonly nonce: Option<U256>;1949      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1950    } & Struct;1951    readonly isCreate2: boolean;1952    readonly asCreate2: {1953      readonly source: H160;1954      readonly init: Bytes;1955      readonly salt: H256;1956      readonly value: U256;1957      readonly gasLimit: u64;1958      readonly maxFeePerGas: U256;1959      readonly maxPriorityFeePerGas: Option<U256>;1960      readonly nonce: Option<U256>;1961      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1962    } & Struct;1963    readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1964  }19651966  /** @name PalletEthereumCall (245) */1967  export interface PalletEthereumCall extends Enum {1968    readonly isTransact: boolean;1969    readonly asTransact: {1970      readonly transaction: EthereumTransactionTransactionV2;1971    } & Struct;1972    readonly type: 'Transact';1973  }19741975  /** @name EthereumTransactionTransactionV2 (246) */1976  export interface EthereumTransactionTransactionV2 extends Enum {1977    readonly isLegacy: boolean;1978    readonly asLegacy: EthereumTransactionLegacyTransaction;1979    readonly isEip2930: boolean;1980    readonly asEip2930: EthereumTransactionEip2930Transaction;1981    readonly isEip1559: boolean;1982    readonly asEip1559: EthereumTransactionEip1559Transaction;1983    readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';1984  }19851986  /** @name EthereumTransactionLegacyTransaction (247) */1987  export interface EthereumTransactionLegacyTransaction extends Struct {1988    readonly nonce: U256;1989    readonly gasPrice: U256;1990    readonly gasLimit: U256;1991    readonly action: EthereumTransactionTransactionAction;1992    readonly value: U256;1993    readonly input: Bytes;1994    readonly signature: EthereumTransactionTransactionSignature;1995  }19961997  /** @name EthereumTransactionTransactionAction (248) */1998  export interface EthereumTransactionTransactionAction extends Enum {1999    readonly isCall: boolean;2000    readonly asCall: H160;2001    readonly isCreate: boolean;2002    readonly type: 'Call' | 'Create';2003  }20042005  /** @name EthereumTransactionTransactionSignature (249) */2006  export interface EthereumTransactionTransactionSignature extends Struct {2007    readonly v: u64;2008    readonly r: H256;2009    readonly s: H256;2010  }20112012  /** @name EthereumTransactionEip2930Transaction (251) */2013  export interface EthereumTransactionEip2930Transaction extends Struct {2014    readonly chainId: u64;2015    readonly nonce: U256;2016    readonly gasPrice: U256;2017    readonly gasLimit: U256;2018    readonly action: EthereumTransactionTransactionAction;2019    readonly value: U256;2020    readonly input: Bytes;2021    readonly accessList: Vec<EthereumTransactionAccessListItem>;2022    readonly oddYParity: bool;2023    readonly r: H256;2024    readonly s: H256;2025  }20262027  /** @name EthereumTransactionAccessListItem (253) */2028  export interface EthereumTransactionAccessListItem extends Struct {2029    readonly address: H160;2030    readonly storageKeys: Vec<H256>;2031  }20322033  /** @name EthereumTransactionEip1559Transaction (254) */2034  export interface EthereumTransactionEip1559Transaction extends Struct {2035    readonly chainId: u64;2036    readonly nonce: U256;2037    readonly maxPriorityFeePerGas: U256;2038    readonly maxFeePerGas: U256;2039    readonly gasLimit: U256;2040    readonly action: EthereumTransactionTransactionAction;2041    readonly value: U256;2042    readonly input: Bytes;2043    readonly accessList: Vec<EthereumTransactionAccessListItem>;2044    readonly oddYParity: bool;2045    readonly r: H256;2046    readonly s: H256;2047  }20482049  /** @name PalletEvmMigrationCall (255) */2050  export interface PalletEvmMigrationCall extends Enum {2051    readonly isBegin: boolean;2052    readonly asBegin: {2053      readonly address: H160;2054    } & Struct;2055    readonly isSetData: boolean;2056    readonly asSetData: {2057      readonly address: H160;2058      readonly data: Vec<ITuple<[H256, H256]>>;2059    } & Struct;2060    readonly isFinish: boolean;2061    readonly asFinish: {2062      readonly address: H160;2063      readonly code: Bytes;2064    } & Struct;2065    readonly type: 'Begin' | 'SetData' | 'Finish';2066  }20672068  /** @name PalletSudoEvent (258) */2069  export interface PalletSudoEvent extends Enum {2070    readonly isSudid: boolean;2071    readonly asSudid: {2072      readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2073    } & Struct;2074    readonly isKeyChanged: boolean;2075    readonly asKeyChanged: {2076      readonly oldSudoer: Option<AccountId32>;2077    } & Struct;2078    readonly isSudoAsDone: boolean;2079    readonly asSudoAsDone: {2080      readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2081    } & Struct;2082    readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';2083  }20842085  /** @name SpRuntimeDispatchError (260) */2086  export interface SpRuntimeDispatchError extends Enum {2087    readonly isOther: boolean;2088    readonly isCannotLookup: boolean;2089    readonly isBadOrigin: boolean;2090    readonly isModule: boolean;2091    readonly asModule: SpRuntimeModuleError;2092    readonly isConsumerRemaining: boolean;2093    readonly isNoProviders: boolean;2094    readonly isTooManyConsumers: boolean;2095    readonly isToken: boolean;2096    readonly asToken: SpRuntimeTokenError;2097    readonly isArithmetic: boolean;2098    readonly asArithmetic: SpRuntimeArithmeticError;2099    readonly isTransactional: boolean;2100    readonly asTransactional: SpRuntimeTransactionalError;2101    readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2102  }21032104  /** @name SpRuntimeModuleError (261) */2105  export interface SpRuntimeModuleError extends Struct {2106    readonly index: u8;2107    readonly error: U8aFixed;2108  }21092110  /** @name SpRuntimeTokenError (262) */2111  export interface SpRuntimeTokenError extends Enum {2112    readonly isNoFunds: boolean;2113    readonly isWouldDie: boolean;2114    readonly isBelowMinimum: boolean;2115    readonly isCannotCreate: boolean;2116    readonly isUnknownAsset: boolean;2117    readonly isFrozen: boolean;2118    readonly isUnsupported: boolean;2119    readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2120  }21212122  /** @name SpRuntimeArithmeticError (263) */2123  export interface SpRuntimeArithmeticError extends Enum {2124    readonly isUnderflow: boolean;2125    readonly isOverflow: boolean;2126    readonly isDivisionByZero: boolean;2127    readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2128  }21292130  /** @name SpRuntimeTransactionalError (264) */2131  export interface SpRuntimeTransactionalError extends Enum {2132    readonly isLimitReached: boolean;2133    readonly isNoLayer: boolean;2134    readonly type: 'LimitReached' | 'NoLayer';2135  }21362137  /** @name PalletSudoError (265) */2138  export interface PalletSudoError extends Enum {2139    readonly isRequireSudo: boolean;2140    readonly type: 'RequireSudo';2141  }21422143  /** @name FrameSystemAccountInfo (266) */2144  export interface FrameSystemAccountInfo extends Struct {2145    readonly nonce: u32;2146    readonly consumers: u32;2147    readonly providers: u32;2148    readonly sufficients: u32;2149    readonly data: PalletBalancesAccountData;2150  }21512152  /** @name FrameSupportWeightsPerDispatchClassU64 (267) */2153  export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {2154    readonly normal: u64;2155    readonly operational: u64;2156    readonly mandatory: u64;2157  }21582159  /** @name SpRuntimeDigest (268) */2160  export interface SpRuntimeDigest extends Struct {2161    readonly logs: Vec<SpRuntimeDigestDigestItem>;2162  }21632164  /** @name SpRuntimeDigestDigestItem (270) */2165  export interface SpRuntimeDigestDigestItem extends Enum {2166    readonly isOther: boolean;2167    readonly asOther: Bytes;2168    readonly isConsensus: boolean;2169    readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2170    readonly isSeal: boolean;2171    readonly asSeal: ITuple<[U8aFixed, Bytes]>;2172    readonly isPreRuntime: boolean;2173    readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2174    readonly isRuntimeEnvironmentUpdated: boolean;2175    readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2176  }21772178  /** @name FrameSystemEventRecord (272) */2179  export interface FrameSystemEventRecord extends Struct {2180    readonly phase: FrameSystemPhase;2181    readonly event: Event;2182    readonly topics: Vec<H256>;2183  }21842185  /** @name FrameSystemEvent (274) */2186  export interface FrameSystemEvent extends Enum {2187    readonly isExtrinsicSuccess: boolean;2188    readonly asExtrinsicSuccess: {2189      readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2190    } & Struct;2191    readonly isExtrinsicFailed: boolean;2192    readonly asExtrinsicFailed: {2193      readonly dispatchError: SpRuntimeDispatchError;2194      readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2195    } & Struct;2196    readonly isCodeUpdated: boolean;2197    readonly isNewAccount: boolean;2198    readonly asNewAccount: {2199      readonly account: AccountId32;2200    } & Struct;2201    readonly isKilledAccount: boolean;2202    readonly asKilledAccount: {2203      readonly account: AccountId32;2204    } & Struct;2205    readonly isRemarked: boolean;2206    readonly asRemarked: {2207      readonly sender: AccountId32;2208      readonly hash_: H256;2209    } & Struct;2210    readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';2211  }22122213  /** @name FrameSupportWeightsDispatchInfo (275) */2214  export interface FrameSupportWeightsDispatchInfo extends Struct {2215    readonly weight: u64;2216    readonly class: FrameSupportWeightsDispatchClass;2217    readonly paysFee: FrameSupportWeightsPays;2218  }22192220  /** @name FrameSupportWeightsDispatchClass (276) */2221  export interface FrameSupportWeightsDispatchClass extends Enum {2222    readonly isNormal: boolean;2223    readonly isOperational: boolean;2224    readonly isMandatory: boolean;2225    readonly type: 'Normal' | 'Operational' | 'Mandatory';2226  }22272228  /** @name FrameSupportWeightsPays (277) */2229  export interface FrameSupportWeightsPays extends Enum {2230    readonly isYes: boolean;2231    readonly isNo: boolean;2232    readonly type: 'Yes' | 'No';2233  }22342235  /** @name OrmlVestingModuleEvent (278) */2236  export interface OrmlVestingModuleEvent extends Enum {2237    readonly isVestingScheduleAdded: boolean;2238    readonly asVestingScheduleAdded: {2239      readonly from: AccountId32;2240      readonly to: AccountId32;2241      readonly vestingSchedule: OrmlVestingVestingSchedule;2242    } & Struct;2243    readonly isClaimed: boolean;2244    readonly asClaimed: {2245      readonly who: AccountId32;2246      readonly amount: u128;2247    } & Struct;2248    readonly isVestingSchedulesUpdated: boolean;2249    readonly asVestingSchedulesUpdated: {2250      readonly who: AccountId32;2251    } & Struct;2252    readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';2253  }22542255  /** @name CumulusPalletXcmpQueueEvent (279) */2256  export interface CumulusPalletXcmpQueueEvent extends Enum {2257    readonly isSuccess: boolean;2258    readonly asSuccess: Option<H256>;2259    readonly isFail: boolean;2260    readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;2261    readonly isBadVersion: boolean;2262    readonly asBadVersion: Option<H256>;2263    readonly isBadFormat: boolean;2264    readonly asBadFormat: Option<H256>;2265    readonly isUpwardMessageSent: boolean;2266    readonly asUpwardMessageSent: Option<H256>;2267    readonly isXcmpMessageSent: boolean;2268    readonly asXcmpMessageSent: Option<H256>;2269    readonly isOverweightEnqueued: boolean;2270    readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;2271    readonly isOverweightServiced: boolean;2272    readonly asOverweightServiced: ITuple<[u64, u64]>;2273    readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';2274  }22752276  /** @name PalletXcmEvent (280) */2277  export interface PalletXcmEvent extends Enum {2278    readonly isAttempted: boolean;2279    readonly asAttempted: XcmV2TraitsOutcome;2280    readonly isSent: boolean;2281    readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;2282    readonly isUnexpectedResponse: boolean;2283    readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;2284    readonly isResponseReady: boolean;2285    readonly asResponseReady: ITuple<[u64, XcmV2Response]>;2286    readonly isNotified: boolean;2287    readonly asNotified: ITuple<[u64, u8, u8]>;2288    readonly isNotifyOverweight: boolean;2289    readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;2290    readonly isNotifyDispatchError: boolean;2291    readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;2292    readonly isNotifyDecodeFailed: boolean;2293    readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2294    readonly isInvalidResponder: boolean;2295    readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2296    readonly isInvalidResponderVersion: boolean;2297    readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2298    readonly isResponseTaken: boolean;2299    readonly asResponseTaken: u64;2300    readonly isAssetsTrapped: boolean;2301    readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2302    readonly isVersionChangeNotified: boolean;2303    readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2304    readonly isSupportedVersionChanged: boolean;2305    readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2306    readonly isNotifyTargetSendFail: boolean;2307    readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2308    readonly isNotifyTargetMigrationFail: boolean;2309    readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2310    readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2311  }23122313  /** @name XcmV2TraitsOutcome (281) */2314  export interface XcmV2TraitsOutcome extends Enum {2315    readonly isComplete: boolean;2316    readonly asComplete: u64;2317    readonly isIncomplete: boolean;2318    readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;2319    readonly isError: boolean;2320    readonly asError: XcmV2TraitsError;2321    readonly type: 'Complete' | 'Incomplete' | 'Error';2322  }23232324  /** @name CumulusPalletXcmEvent (283) */2325  export interface CumulusPalletXcmEvent extends Enum {2326    readonly isInvalidFormat: boolean;2327    readonly asInvalidFormat: U8aFixed;2328    readonly isUnsupportedVersion: boolean;2329    readonly asUnsupportedVersion: U8aFixed;2330    readonly isExecutedDownward: boolean;2331    readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;2332    readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';2333  }23342335  /** @name CumulusPalletDmpQueueEvent (284) */2336  export interface CumulusPalletDmpQueueEvent extends Enum {2337    readonly isInvalidFormat: boolean;2338    readonly asInvalidFormat: {2339      readonly messageId: U8aFixed;2340    } & Struct;2341    readonly isUnsupportedVersion: boolean;2342    readonly asUnsupportedVersion: {2343      readonly messageId: U8aFixed;2344    } & Struct;2345    readonly isExecutedDownward: boolean;2346    readonly asExecutedDownward: {2347      readonly messageId: U8aFixed;2348      readonly outcome: XcmV2TraitsOutcome;2349    } & Struct;2350    readonly isWeightExhausted: boolean;2351    readonly asWeightExhausted: {2352      readonly messageId: U8aFixed;2353      readonly remainingWeight: u64;2354      readonly requiredWeight: u64;2355    } & Struct;2356    readonly isOverweightEnqueued: boolean;2357    readonly asOverweightEnqueued: {2358      readonly messageId: U8aFixed;2359      readonly overweightIndex: u64;2360      readonly requiredWeight: u64;2361    } & Struct;2362    readonly isOverweightServiced: boolean;2363    readonly asOverweightServiced: {2364      readonly overweightIndex: u64;2365      readonly weightUsed: u64;2366    } & Struct;2367    readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';2368  }23692370  /** @name PalletUniqueRawEvent (285) */2371  export interface PalletUniqueRawEvent extends Enum {2372    readonly isCollectionSponsorRemoved: boolean;2373    readonly asCollectionSponsorRemoved: u32;2374    readonly isCollectionAdminAdded: boolean;2375    readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2376    readonly isCollectionOwnedChanged: boolean;2377    readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;2378    readonly isCollectionSponsorSet: boolean;2379    readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;2380    readonly isSponsorshipConfirmed: boolean;2381    readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;2382    readonly isCollectionAdminRemoved: boolean;2383    readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2384    readonly isAllowListAddressRemoved: boolean;2385    readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2386    readonly isAllowListAddressAdded: boolean;2387    readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2388    readonly isCollectionLimitSet: boolean;2389    readonly asCollectionLimitSet: u32;2390    readonly isCollectionPermissionSet: boolean;2391    readonly asCollectionPermissionSet: u32;2392    readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';2393  }23942395  /** @name PalletUniqueSchedulerEvent (286) */2396  export interface PalletUniqueSchedulerEvent extends Enum {2397    readonly isScheduled: boolean;2398    readonly asScheduled: {2399      readonly when: u32;2400      readonly index: u32;2401    } & Struct;2402    readonly isCanceled: boolean;2403    readonly asCanceled: {2404      readonly when: u32;2405      readonly index: u32;2406    } & Struct;2407    readonly isDispatched: boolean;2408    readonly asDispatched: {2409      readonly task: ITuple<[u32, u32]>;2410      readonly id: Option<U8aFixed>;2411      readonly result: Result<Null, SpRuntimeDispatchError>;2412    } & Struct;2413    readonly isCallLookupFailed: boolean;2414    readonly asCallLookupFailed: {2415      readonly task: ITuple<[u32, u32]>;2416      readonly id: Option<U8aFixed>;2417      readonly error: FrameSupportScheduleLookupError;2418    } & Struct;2419    readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';2420  }24212422  /** @name FrameSupportScheduleLookupError (288) */2423  export interface FrameSupportScheduleLookupError extends Enum {2424    readonly isUnknown: boolean;2425    readonly isBadFormat: boolean;2426    readonly type: 'Unknown' | 'BadFormat';2427  }24282429  /** @name PalletCommonEvent (289) */2430  export interface PalletCommonEvent extends Enum {2431    readonly isCollectionCreated: boolean;2432    readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;2433    readonly isCollectionDestroyed: boolean;2434    readonly asCollectionDestroyed: u32;2435    readonly isItemCreated: boolean;2436    readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2437    readonly isItemDestroyed: boolean;2438    readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2439    readonly isTransfer: boolean;2440    readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2441    readonly isApproved: boolean;2442    readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2443    readonly isCollectionPropertySet: boolean;2444    readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;2445    readonly isCollectionPropertyDeleted: boolean;2446    readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;2447    readonly isTokenPropertySet: boolean;2448    readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;2449    readonly isTokenPropertyDeleted: boolean;2450    readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;2451    readonly isPropertyPermissionSet: boolean;2452    readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;2453    readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';2454  }24552456  /** @name PalletStructureEvent (290) */2457  export interface PalletStructureEvent extends Enum {2458    readonly isExecuted: boolean;2459    readonly asExecuted: Result<Null, SpRuntimeDispatchError>;2460    readonly type: 'Executed';2461  }24622463  /** @name PalletRmrkCoreEvent (291) */2464  export interface PalletRmrkCoreEvent extends Enum {2465    readonly isCollectionCreated: boolean;2466    readonly asCollectionCreated: {2467      readonly issuer: AccountId32;2468      readonly collectionId: u32;2469    } & Struct;2470    readonly isCollectionDestroyed: boolean;2471    readonly asCollectionDestroyed: {2472      readonly issuer: AccountId32;2473      readonly collectionId: u32;2474    } & Struct;2475    readonly isIssuerChanged: boolean;2476    readonly asIssuerChanged: {2477      readonly oldIssuer: AccountId32;2478      readonly newIssuer: AccountId32;2479      readonly collectionId: u32;2480    } & Struct;2481    readonly isCollectionLocked: boolean;2482    readonly asCollectionLocked: {2483      readonly issuer: AccountId32;2484      readonly collectionId: u32;2485    } & Struct;2486    readonly isNftMinted: boolean;2487    readonly asNftMinted: {2488      readonly owner: AccountId32;2489      readonly collectionId: u32;2490      readonly nftId: u32;2491    } & Struct;2492    readonly isNftBurned: boolean;2493    readonly asNftBurned: {2494      readonly owner: AccountId32;2495      readonly nftId: u32;2496    } & Struct;2497    readonly isNftSent: boolean;2498    readonly asNftSent: {2499      readonly sender: AccountId32;2500      readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2501      readonly collectionId: u32;2502      readonly nftId: u32;2503      readonly approvalRequired: bool;2504    } & Struct;2505    readonly isNftAccepted: boolean;2506    readonly asNftAccepted: {2507      readonly sender: AccountId32;2508      readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2509      readonly collectionId: u32;2510      readonly nftId: u32;2511    } & Struct;2512    readonly isNftRejected: boolean;2513    readonly asNftRejected: {2514      readonly sender: AccountId32;2515      readonly collectionId: u32;2516      readonly nftId: u32;2517    } & Struct;2518    readonly isPropertySet: boolean;2519    readonly asPropertySet: {2520      readonly collectionId: u32;2521      readonly maybeNftId: Option<u32>;2522      readonly key: Bytes;2523      readonly value: Bytes;2524    } & Struct;2525    readonly isResourceAdded: boolean;2526    readonly asResourceAdded: {2527      readonly nftId: u32;2528      readonly resourceId: u32;2529    } & Struct;2530    readonly isResourceRemoval: boolean;2531    readonly asResourceRemoval: {2532      readonly nftId: u32;2533      readonly resourceId: u32;2534    } & Struct;2535    readonly isResourceAccepted: boolean;2536    readonly asResourceAccepted: {2537      readonly nftId: u32;2538      readonly resourceId: u32;2539    } & Struct;2540    readonly isResourceRemovalAccepted: boolean;2541    readonly asResourceRemovalAccepted: {2542      readonly nftId: u32;2543      readonly resourceId: u32;2544    } & Struct;2545    readonly isPrioritySet: boolean;2546    readonly asPrioritySet: {2547      readonly collectionId: u32;2548      readonly nftId: u32;2549    } & Struct;2550    readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';2551  }25522553  /** @name PalletRmrkEquipEvent (292) */2554  export interface PalletRmrkEquipEvent extends Enum {2555    readonly isBaseCreated: boolean;2556    readonly asBaseCreated: {2557      readonly issuer: AccountId32;2558      readonly baseId: u32;2559    } & Struct;2560    readonly isEquippablesUpdated: boolean;2561    readonly asEquippablesUpdated: {2562      readonly baseId: u32;2563      readonly slotId: u32;2564    } & Struct;2565    readonly type: 'BaseCreated' | 'EquippablesUpdated';2566  }25672568  /** @name PalletEvmEvent (293) */2569  export interface PalletEvmEvent extends Enum {2570    readonly isLog: boolean;2571    readonly asLog: EthereumLog;2572    readonly isCreated: boolean;2573    readonly asCreated: H160;2574    readonly isCreatedFailed: boolean;2575    readonly asCreatedFailed: H160;2576    readonly isExecuted: boolean;2577    readonly asExecuted: H160;2578    readonly isExecutedFailed: boolean;2579    readonly asExecutedFailed: H160;2580    readonly isBalanceDeposit: boolean;2581    readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;2582    readonly isBalanceWithdraw: boolean;2583    readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;2584    readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';2585  }25862587  /** @name EthereumLog (294) */2588  export interface EthereumLog extends Struct {2589    readonly address: H160;2590    readonly topics: Vec<H256>;2591    readonly data: Bytes;2592  }25932594  /** @name PalletEthereumEvent (295) */2595  export interface PalletEthereumEvent extends Enum {2596    readonly isExecuted: boolean;2597    readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;2598    readonly type: 'Executed';2599  }26002601  /** @name EvmCoreErrorExitReason (296) */2602  export interface EvmCoreErrorExitReason extends Enum {2603    readonly isSucceed: boolean;2604    readonly asSucceed: EvmCoreErrorExitSucceed;2605    readonly isError: boolean;2606    readonly asError: EvmCoreErrorExitError;2607    readonly isRevert: boolean;2608    readonly asRevert: EvmCoreErrorExitRevert;2609    readonly isFatal: boolean;2610    readonly asFatal: EvmCoreErrorExitFatal;2611    readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';2612  }26132614  /** @name EvmCoreErrorExitSucceed (297) */2615  export interface EvmCoreErrorExitSucceed extends Enum {2616    readonly isStopped: boolean;2617    readonly isReturned: boolean;2618    readonly isSuicided: boolean;2619    readonly type: 'Stopped' | 'Returned' | 'Suicided';2620  }26212622  /** @name EvmCoreErrorExitError (298) */2623  export interface EvmCoreErrorExitError extends Enum {2624    readonly isStackUnderflow: boolean;2625    readonly isStackOverflow: boolean;2626    readonly isInvalidJump: boolean;2627    readonly isInvalidRange: boolean;2628    readonly isDesignatedInvalid: boolean;2629    readonly isCallTooDeep: boolean;2630    readonly isCreateCollision: boolean;2631    readonly isCreateContractLimit: boolean;2632    readonly isOutOfOffset: boolean;2633    readonly isOutOfGas: boolean;2634    readonly isOutOfFund: boolean;2635    readonly isPcUnderflow: boolean;2636    readonly isCreateEmpty: boolean;2637    readonly isOther: boolean;2638    readonly asOther: Text;2639    readonly isInvalidCode: boolean;2640    readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';2641  }26422643  /** @name EvmCoreErrorExitRevert (301) */2644  export interface EvmCoreErrorExitRevert extends Enum {2645    readonly isReverted: boolean;2646    readonly type: 'Reverted';2647  }26482649  /** @name EvmCoreErrorExitFatal (302) */2650  export interface EvmCoreErrorExitFatal extends Enum {2651    readonly isNotSupported: boolean;2652    readonly isUnhandledInterrupt: boolean;2653    readonly isCallErrorAsFatal: boolean;2654    readonly asCallErrorAsFatal: EvmCoreErrorExitError;2655    readonly isOther: boolean;2656    readonly asOther: Text;2657    readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';2658  }26592660  /** @name FrameSystemPhase (303) */2661  export interface FrameSystemPhase extends Enum {2662    readonly isApplyExtrinsic: boolean;2663    readonly asApplyExtrinsic: u32;2664    readonly isFinalization: boolean;2665    readonly isInitialization: boolean;2666    readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';2667  }26682669  /** @name FrameSystemLastRuntimeUpgradeInfo (305) */2670  export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {2671    readonly specVersion: Compact<u32>;2672    readonly specName: Text;2673  }26742675  /** @name FrameSystemLimitsBlockWeights (306) */2676  export interface FrameSystemLimitsBlockWeights extends Struct {2677    readonly baseBlock: u64;2678    readonly maxBlock: u64;2679    readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;2680  }26812682  /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (307) */2683  export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {2684    readonly normal: FrameSystemLimitsWeightsPerClass;2685    readonly operational: FrameSystemLimitsWeightsPerClass;2686    readonly mandatory: FrameSystemLimitsWeightsPerClass;2687  }26882689  /** @name FrameSystemLimitsWeightsPerClass (308) */2690  export interface FrameSystemLimitsWeightsPerClass extends Struct {2691    readonly baseExtrinsic: u64;2692    readonly maxExtrinsic: Option<u64>;2693    readonly maxTotal: Option<u64>;2694    readonly reserved: Option<u64>;2695  }26962697  /** @name FrameSystemLimitsBlockLength (310) */2698  export interface FrameSystemLimitsBlockLength extends Struct {2699    readonly max: FrameSupportWeightsPerDispatchClassU32;2700  }27012702  /** @name FrameSupportWeightsPerDispatchClassU32 (311) */2703  export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {2704    readonly normal: u32;2705    readonly operational: u32;2706    readonly mandatory: u32;2707  }27082709  /** @name FrameSupportWeightsRuntimeDbWeight (312) */2710  export interface FrameSupportWeightsRuntimeDbWeight extends Struct {2711    readonly read: u64;2712    readonly write: u64;2713  }27142715  /** @name SpVersionRuntimeVersion (313) */2716  export interface SpVersionRuntimeVersion extends Struct {2717    readonly specName: Text;2718    readonly implName: Text;2719    readonly authoringVersion: u32;2720    readonly specVersion: u32;2721    readonly implVersion: u32;2722    readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2723    readonly transactionVersion: u32;2724    readonly stateVersion: u8;2725  }27262727  /** @name FrameSystemError (317) */2728  export interface FrameSystemError extends Enum {2729    readonly isInvalidSpecName: boolean;2730    readonly isSpecVersionNeedsToIncrease: boolean;2731    readonly isFailedToExtractRuntimeVersion: boolean;2732    readonly isNonDefaultComposite: boolean;2733    readonly isNonZeroRefCount: boolean;2734    readonly isCallFiltered: boolean;2735    readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';2736  }27372738  /** @name OrmlVestingModuleError (319) */2739  export interface OrmlVestingModuleError extends Enum {2740    readonly isZeroVestingPeriod: boolean;2741    readonly isZeroVestingPeriodCount: boolean;2742    readonly isInsufficientBalanceToLock: boolean;2743    readonly isTooManyVestingSchedules: boolean;2744    readonly isAmountLow: boolean;2745    readonly isMaxVestingSchedulesExceeded: boolean;2746    readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';2747  }27482749  /** @name CumulusPalletXcmpQueueInboundChannelDetails (321) */2750  export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {2751    readonly sender: u32;2752    readonly state: CumulusPalletXcmpQueueInboundState;2753    readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;2754  }27552756  /** @name CumulusPalletXcmpQueueInboundState (322) */2757  export interface CumulusPalletXcmpQueueInboundState extends Enum {2758    readonly isOk: boolean;2759    readonly isSuspended: boolean;2760    readonly type: 'Ok' | 'Suspended';2761  }27622763  /** @name PolkadotParachainPrimitivesXcmpMessageFormat (325) */2764  export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2765    readonly isConcatenatedVersionedXcm: boolean;2766    readonly isConcatenatedEncodedBlob: boolean;2767    readonly isSignals: boolean;2768    readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2769  }27702771  /** @name CumulusPalletXcmpQueueOutboundChannelDetails (328) */2772  export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {2773    readonly recipient: u32;2774    readonly state: CumulusPalletXcmpQueueOutboundState;2775    readonly signalsExist: bool;2776    readonly firstIndex: u16;2777    readonly lastIndex: u16;2778  }27792780  /** @name CumulusPalletXcmpQueueOutboundState (329) */2781  export interface CumulusPalletXcmpQueueOutboundState extends Enum {2782    readonly isOk: boolean;2783    readonly isSuspended: boolean;2784    readonly type: 'Ok' | 'Suspended';2785  }27862787  /** @name CumulusPalletXcmpQueueQueueConfigData (331) */2788  export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {2789    readonly suspendThreshold: u32;2790    readonly dropThreshold: u32;2791    readonly resumeThreshold: u32;2792    readonly thresholdWeight: u64;2793    readonly weightRestrictDecay: u64;2794    readonly xcmpMaxIndividualWeight: u64;2795  }27962797  /** @name CumulusPalletXcmpQueueError (333) */2798  export interface CumulusPalletXcmpQueueError extends Enum {2799    readonly isFailedToSend: boolean;2800    readonly isBadXcmOrigin: boolean;2801    readonly isBadXcm: boolean;2802    readonly isBadOverweightIndex: boolean;2803    readonly isWeightOverLimit: boolean;2804    readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';2805  }28062807  /** @name PalletXcmError (334) */2808  export interface PalletXcmError extends Enum {2809    readonly isUnreachable: boolean;2810    readonly isSendFailure: boolean;2811    readonly isFiltered: boolean;2812    readonly isUnweighableMessage: boolean;2813    readonly isDestinationNotInvertible: boolean;2814    readonly isEmpty: boolean;2815    readonly isCannotReanchor: boolean;2816    readonly isTooManyAssets: boolean;2817    readonly isInvalidOrigin: boolean;2818    readonly isBadVersion: boolean;2819    readonly isBadLocation: boolean;2820    readonly isNoSubscription: boolean;2821    readonly isAlreadySubscribed: boolean;2822    readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';2823  }28242825  /** @name CumulusPalletXcmError (335) */2826  export type CumulusPalletXcmError = Null;28272828  /** @name CumulusPalletDmpQueueConfigData (336) */2829  export interface CumulusPalletDmpQueueConfigData extends Struct {2830    readonly maxIndividual: u64;2831  }28322833  /** @name CumulusPalletDmpQueuePageIndexData (337) */2834  export interface CumulusPalletDmpQueuePageIndexData extends Struct {2835    readonly beginUsed: u32;2836    readonly endUsed: u32;2837    readonly overweightCount: u64;2838  }28392840  /** @name CumulusPalletDmpQueueError (340) */2841  export interface CumulusPalletDmpQueueError extends Enum {2842    readonly isUnknown: boolean;2843    readonly isOverLimit: boolean;2844    readonly type: 'Unknown' | 'OverLimit';2845  }28462847  /** @name PalletUniqueError (344) */2848  export interface PalletUniqueError extends Enum {2849    readonly isCollectionDecimalPointLimitExceeded: boolean;2850    readonly isConfirmUnsetSponsorFail: boolean;2851    readonly isEmptyArgument: boolean;2852    readonly isRepartitionCalledOnNonRefungibleCollection: boolean;2853    readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';2854  }28552856  /** @name PalletUniqueSchedulerScheduledV3 (347) */2857  export interface PalletUniqueSchedulerScheduledV3 extends Struct {2858    readonly maybeId: Option<U8aFixed>;2859    readonly priority: u8;2860    readonly call: FrameSupportScheduleMaybeHashed;2861    readonly maybePeriodic: Option<ITuple<[u32, u32]>>;2862    readonly origin: OpalRuntimeOriginCaller;2863  }28642865  /** @name OpalRuntimeOriginCaller (348) */2866  export interface OpalRuntimeOriginCaller extends Enum {2867    readonly isVoid: boolean;2868    readonly isSystem: boolean;2869    readonly asSystem: FrameSupportDispatchRawOrigin;2870    readonly isPolkadotXcm: boolean;2871    readonly asPolkadotXcm: PalletXcmOrigin;2872    readonly isCumulusXcm: boolean;2873    readonly asCumulusXcm: CumulusPalletXcmOrigin;2874    readonly isEthereum: boolean;2875    readonly asEthereum: PalletEthereumRawOrigin;2876    readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';2877  }28782879  /** @name FrameSupportDispatchRawOrigin (349) */2880  export interface FrameSupportDispatchRawOrigin extends Enum {2881    readonly isRoot: boolean;2882    readonly isSigned: boolean;2883    readonly asSigned: AccountId32;2884    readonly isNone: boolean;2885    readonly type: 'Root' | 'Signed' | 'None';2886  }28872888  /** @name PalletXcmOrigin (350) */2889  export interface PalletXcmOrigin extends Enum {2890    readonly isXcm: boolean;2891    readonly asXcm: XcmV1MultiLocation;2892    readonly isResponse: boolean;2893    readonly asResponse: XcmV1MultiLocation;2894    readonly type: 'Xcm' | 'Response';2895  }28962897  /** @name CumulusPalletXcmOrigin (351) */2898  export interface CumulusPalletXcmOrigin extends Enum {2899    readonly isRelay: boolean;2900    readonly isSiblingParachain: boolean;2901    readonly asSiblingParachain: u32;2902    readonly type: 'Relay' | 'SiblingParachain';2903  }29042905  /** @name PalletEthereumRawOrigin (352) */2906  export interface PalletEthereumRawOrigin extends Enum {2907    readonly isEthereumTransaction: boolean;2908    readonly asEthereumTransaction: H160;2909    readonly type: 'EthereumTransaction';2910  }29112912  /** @name SpCoreVoid (353) */2913  export type SpCoreVoid = Null;29142915  /** @name PalletUniqueSchedulerError (354) */2916  export interface PalletUniqueSchedulerError extends Enum {2917    readonly isFailedToSchedule: boolean;2918    readonly isNotFound: boolean;2919    readonly isTargetBlockNumberInPast: boolean;2920    readonly isRescheduleNoChange: boolean;2921    readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';2922  }29232924  /** @name UpDataStructsCollection (355) */2925  export interface UpDataStructsCollection extends Struct {2926    readonly owner: AccountId32;2927    readonly mode: UpDataStructsCollectionMode;2928    readonly name: Vec<u16>;2929    readonly description: Vec<u16>;2930    readonly tokenPrefix: Bytes;2931    readonly sponsorship: UpDataStructsSponsorshipState;2932    readonly limits: UpDataStructsCollectionLimits;2933    readonly permissions: UpDataStructsCollectionPermissions;2934    readonly externalCollection: bool;2935  }29362937  /** @name UpDataStructsSponsorshipState (356) */2938  export interface UpDataStructsSponsorshipState extends Enum {2939    readonly isDisabled: boolean;2940    readonly isUnconfirmed: boolean;2941    readonly asUnconfirmed: AccountId32;2942    readonly isConfirmed: boolean;2943    readonly asConfirmed: AccountId32;2944    readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2945  }29462947  /** @name UpDataStructsProperties (357) */2948  export interface UpDataStructsProperties extends Struct {2949    readonly map: UpDataStructsPropertiesMapBoundedVec;2950    readonly consumedSpace: u32;2951    readonly spaceLimit: u32;2952  }29532954  /** @name UpDataStructsPropertiesMapBoundedVec (358) */2955  export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}29562957  /** @name UpDataStructsPropertiesMapPropertyPermission (363) */2958  export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}29592960  /** @name UpDataStructsCollectionStats (370) */2961  export interface UpDataStructsCollectionStats extends Struct {2962    readonly created: u32;2963    readonly destroyed: u32;2964    readonly alive: u32;2965  }29662967  /** @name UpDataStructsTokenChild (371) */2968  export interface UpDataStructsTokenChild extends Struct {2969    readonly token: u32;2970    readonly collection: u32;2971  }29722973  /** @name PhantomTypeUpDataStructs (372) */2974  export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}29752976  /** @name UpDataStructsTokenData (374) */2977  export interface UpDataStructsTokenData extends Struct {2978    readonly properties: Vec<UpDataStructsProperty>;2979    readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2980    readonly pieces: u128;2981  }29822983  /** @name UpDataStructsRpcCollection (376) */2984  export interface UpDataStructsRpcCollection extends Struct {2985    readonly owner: AccountId32;2986    readonly mode: UpDataStructsCollectionMode;2987    readonly name: Vec<u16>;2988    readonly description: Vec<u16>;2989    readonly tokenPrefix: Bytes;2990    readonly sponsorship: UpDataStructsSponsorshipState;2991    readonly limits: UpDataStructsCollectionLimits;2992    readonly permissions: UpDataStructsCollectionPermissions;2993    readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2994    readonly properties: Vec<UpDataStructsProperty>;2995    readonly readOnly: bool;2996  }29972998  /** @name RmrkTraitsCollectionCollectionInfo (377) */2999  export interface RmrkTraitsCollectionCollectionInfo extends Struct {3000    readonly issuer: AccountId32;3001    readonly metadata: Bytes;3002    readonly max: Option<u32>;3003    readonly symbol: Bytes;3004    readonly nftsCount: u32;3005  }30063007  /** @name RmrkTraitsNftNftInfo (378) */3008  export interface RmrkTraitsNftNftInfo extends Struct {3009    readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;3010    readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;3011    readonly metadata: Bytes;3012    readonly equipped: bool;3013    readonly pending: bool;3014  }30153016  /** @name RmrkTraitsNftRoyaltyInfo (380) */3017  export interface RmrkTraitsNftRoyaltyInfo extends Struct {3018    readonly recipient: AccountId32;3019    readonly amount: Permill;3020  }30213022  /** @name RmrkTraitsResourceResourceInfo (381) */3023  export interface RmrkTraitsResourceResourceInfo extends Struct {3024    readonly id: u32;3025    readonly resource: RmrkTraitsResourceResourceTypes;3026    readonly pending: bool;3027    readonly pendingRemoval: bool;3028  }30293030  /** @name RmrkTraitsPropertyPropertyInfo (382) */3031  export interface RmrkTraitsPropertyPropertyInfo extends Struct {3032    readonly key: Bytes;3033    readonly value: Bytes;3034  }30353036  /** @name RmrkTraitsBaseBaseInfo (383) */3037  export interface RmrkTraitsBaseBaseInfo extends Struct {3038    readonly issuer: AccountId32;3039    readonly baseType: Bytes;3040    readonly symbol: Bytes;3041  }30423043  /** @name RmrkTraitsNftNftChild (384) */3044  export interface RmrkTraitsNftNftChild extends Struct {3045    readonly collectionId: u32;3046    readonly nftId: u32;3047  }30483049  /** @name PalletCommonError (386) */3050  export interface PalletCommonError extends Enum {3051    readonly isCollectionNotFound: boolean;3052    readonly isMustBeTokenOwner: boolean;3053    readonly isNoPermission: boolean;3054    readonly isCantDestroyNotEmptyCollection: boolean;3055    readonly isPublicMintingNotAllowed: boolean;3056    readonly isAddressNotInAllowlist: boolean;3057    readonly isCollectionNameLimitExceeded: boolean;3058    readonly isCollectionDescriptionLimitExceeded: boolean;3059    readonly isCollectionTokenPrefixLimitExceeded: boolean;3060    readonly isTotalCollectionsLimitExceeded: boolean;3061    readonly isCollectionAdminCountExceeded: boolean;3062    readonly isCollectionLimitBoundsExceeded: boolean;3063    readonly isOwnerPermissionsCantBeReverted: boolean;3064    readonly isTransferNotAllowed: boolean;3065    readonly isAccountTokenLimitExceeded: boolean;3066    readonly isCollectionTokenLimitExceeded: boolean;3067    readonly isMetadataFlagFrozen: boolean;3068    readonly isTokenNotFound: boolean;3069    readonly isTokenValueTooLow: boolean;3070    readonly isApprovedValueTooLow: boolean;3071    readonly isCantApproveMoreThanOwned: boolean;3072    readonly isAddressIsZero: boolean;3073    readonly isUnsupportedOperation: boolean;3074    readonly isNotSufficientFounds: boolean;3075    readonly isUserIsNotAllowedToNest: boolean;3076    readonly isSourceCollectionIsNotAllowedToNest: boolean;3077    readonly isCollectionFieldSizeExceeded: boolean;3078    readonly isNoSpaceForProperty: boolean;3079    readonly isPropertyLimitReached: boolean;3080    readonly isPropertyKeyIsTooLong: boolean;3081    readonly isInvalidCharacterInPropertyKey: boolean;3082    readonly isEmptyPropertyKey: boolean;3083    readonly isCollectionIsExternal: boolean;3084    readonly isCollectionIsInternal: boolean;3085    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';3086  }30873088  /** @name PalletFungibleError (388) */3089  export interface PalletFungibleError extends Enum {3090    readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;3091    readonly isFungibleItemsHaveNoId: boolean;3092    readonly isFungibleItemsDontHaveData: boolean;3093    readonly isFungibleDisallowsNesting: boolean;3094    readonly isSettingPropertiesNotAllowed: boolean;3095    readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3096  }30973098  /** @name PalletRefungibleItemData (389) */3099  export interface PalletRefungibleItemData extends Struct {3100    readonly constData: Bytes;3101  }31023103  /** @name PalletRefungibleError (393) */3104  export interface PalletRefungibleError extends Enum {3105    readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;3106    readonly isWrongRefungiblePieces: boolean;3107    readonly isRepartitionWhileNotOwningAllPieces: boolean;3108    readonly isRefungibleDisallowsNesting: boolean;3109    readonly isSettingPropertiesNotAllowed: boolean;3110    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3111  }31123113  /** @name PalletNonfungibleItemData (394) */3114  export interface PalletNonfungibleItemData extends Struct {3115    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;3116  }31173118  /** @name UpDataStructsPropertyScope (396) */3119  export interface UpDataStructsPropertyScope extends Enum {3120    readonly isNone: boolean;3121    readonly isRmrk: boolean;3122    readonly type: 'None' | 'Rmrk';3123  }31243125  /** @name PalletNonfungibleError (398) */3126  export interface PalletNonfungibleError extends Enum {3127    readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;3128    readonly isNonfungibleItemsHaveNoAmount: boolean;3129    readonly isCantBurnNftWithChildren: boolean;3130    readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';3131  }31323133  /** @name PalletStructureError (399) */3134  export interface PalletStructureError extends Enum {3135    readonly isOuroborosDetected: boolean;3136    readonly isDepthLimit: boolean;3137    readonly isBreadthLimit: boolean;3138    readonly isTokenNotFound: boolean;3139    readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';3140  }31413142  /** @name PalletRmrkCoreError (400) */3143  export interface PalletRmrkCoreError extends Enum {3144    readonly isCorruptedCollectionType: boolean;3145    readonly isNftTypeEncodeError: boolean;3146    readonly isRmrkPropertyKeyIsTooLong: boolean;3147    readonly isRmrkPropertyValueIsTooLong: boolean;3148    readonly isRmrkPropertyIsNotFound: boolean;3149    readonly isUnableToDecodeRmrkData: boolean;3150    readonly isCollectionNotEmpty: boolean;3151    readonly isNoAvailableCollectionId: boolean;3152    readonly isNoAvailableNftId: boolean;3153    readonly isCollectionUnknown: boolean;3154    readonly isNoPermission: boolean;3155    readonly isNonTransferable: boolean;3156    readonly isCollectionFullOrLocked: boolean;3157    readonly isResourceDoesntExist: boolean;3158    readonly isCannotSendToDescendentOrSelf: boolean;3159    readonly isCannotAcceptNonOwnedNft: boolean;3160    readonly isCannotRejectNonOwnedNft: boolean;3161    readonly isCannotRejectNonPendingNft: boolean;3162    readonly isResourceNotPending: boolean;3163    readonly isNoAvailableResourceId: boolean;3164    readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';3165  }31663167  /** @name PalletRmrkEquipError (402) */3168  export interface PalletRmrkEquipError extends Enum {3169    readonly isPermissionError: boolean;3170    readonly isNoAvailableBaseId: boolean;3171    readonly isNoAvailablePartId: boolean;3172    readonly isBaseDoesntExist: boolean;3173    readonly isNeedsDefaultThemeFirst: boolean;3174    readonly isPartDoesntExist: boolean;3175    readonly isNoEquippableOnFixedPart: boolean;3176    readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';3177  }31783179  /** @name PalletEvmError (405) */3180  export interface PalletEvmError extends Enum {3181    readonly isBalanceLow: boolean;3182    readonly isFeeOverflow: boolean;3183    readonly isPaymentOverflow: boolean;3184    readonly isWithdrawFailed: boolean;3185    readonly isGasPriceTooLow: boolean;3186    readonly isInvalidNonce: boolean;3187    readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';3188  }31893190  /** @name FpRpcTransactionStatus (408) */3191  export interface FpRpcTransactionStatus extends Struct {3192    readonly transactionHash: H256;3193    readonly transactionIndex: u32;3194    readonly from: H160;3195    readonly to: Option<H160>;3196    readonly contractAddress: Option<H160>;3197    readonly logs: Vec<EthereumLog>;3198    readonly logsBloom: EthbloomBloom;3199  }32003201  /** @name EthbloomBloom (410) */3202  export interface EthbloomBloom extends U8aFixed {}32033204  /** @name EthereumReceiptReceiptV3 (412) */3205  export interface EthereumReceiptReceiptV3 extends Enum {3206    readonly isLegacy: boolean;3207    readonly asLegacy: EthereumReceiptEip658ReceiptData;3208    readonly isEip2930: boolean;3209    readonly asEip2930: EthereumReceiptEip658ReceiptData;3210    readonly isEip1559: boolean;3211    readonly asEip1559: EthereumReceiptEip658ReceiptData;3212    readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';3213  }32143215  /** @name EthereumReceiptEip658ReceiptData (413) */3216  export interface EthereumReceiptEip658ReceiptData extends Struct {3217    readonly statusCode: u8;3218    readonly usedGas: U256;3219    readonly logsBloom: EthbloomBloom;3220    readonly logs: Vec<EthereumLog>;3221  }32223223  /** @name EthereumBlock (414) */3224  export interface EthereumBlock extends Struct {3225    readonly header: EthereumHeader;3226    readonly transactions: Vec<EthereumTransactionTransactionV2>;3227    readonly ommers: Vec<EthereumHeader>;3228  }32293230  /** @name EthereumHeader (415) */3231  export interface EthereumHeader extends Struct {3232    readonly parentHash: H256;3233    readonly ommersHash: H256;3234    readonly beneficiary: H160;3235    readonly stateRoot: H256;3236    readonly transactionsRoot: H256;3237    readonly receiptsRoot: H256;3238    readonly logsBloom: EthbloomBloom;3239    readonly difficulty: U256;3240    readonly number: U256;3241    readonly gasLimit: U256;3242    readonly gasUsed: U256;3243    readonly timestamp: u64;3244    readonly extraData: Bytes;3245    readonly mixHash: H256;3246    readonly nonce: EthereumTypesHashH64;3247  }32483249  /** @name EthereumTypesHashH64 (416) */3250  export interface EthereumTypesHashH64 extends U8aFixed {}32513252  /** @name PalletEthereumError (421) */3253  export interface PalletEthereumError extends Enum {3254    readonly isInvalidSignature: boolean;3255    readonly isPreLogExists: boolean;3256    readonly type: 'InvalidSignature' | 'PreLogExists';3257  }32583259  /** @name PalletEvmCoderSubstrateError (422) */3260  export interface PalletEvmCoderSubstrateError extends Enum {3261    readonly isOutOfGas: boolean;3262    readonly isOutOfFund: boolean;3263    readonly type: 'OutOfGas' | 'OutOfFund';3264  }32653266  /** @name PalletEvmContractHelpersSponsoringModeT (423) */3267  export interface PalletEvmContractHelpersSponsoringModeT extends Enum {3268    readonly isDisabled: boolean;3269    readonly isAllowlisted: boolean;3270    readonly isGenerous: boolean;3271    readonly type: 'Disabled' | 'Allowlisted' | 'Generous';3272  }32733274  /** @name PalletEvmContractHelpersError (425) */3275  export interface PalletEvmContractHelpersError extends Enum {3276    readonly isNoPermission: boolean;3277    readonly type: 'NoPermission';3278  }32793280  /** @name PalletEvmMigrationError (426) */3281  export interface PalletEvmMigrationError extends Enum {3282    readonly isAccountNotEmpty: boolean;3283    readonly isAccountIsNotMigrating: boolean;3284    readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';3285  }32863287  /** @name SpRuntimeMultiSignature (428) */3288  export interface SpRuntimeMultiSignature extends Enum {3289    readonly isEd25519: boolean;3290    readonly asEd25519: SpCoreEd25519Signature;3291    readonly isSr25519: boolean;3292    readonly asSr25519: SpCoreSr25519Signature;3293    readonly isEcdsa: boolean;3294    readonly asEcdsa: SpCoreEcdsaSignature;3295    readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';3296  }32973298  /** @name SpCoreEd25519Signature (429) */3299  export interface SpCoreEd25519Signature extends U8aFixed {}33003301  /** @name SpCoreSr25519Signature (431) */3302  export interface SpCoreSr25519Signature extends U8aFixed {}33033304  /** @name SpCoreEcdsaSignature (432) */3305  export interface SpCoreEcdsaSignature extends U8aFixed {}33063307  /** @name FrameSystemExtensionsCheckSpecVersion (435) */3308  export type FrameSystemExtensionsCheckSpecVersion = Null;33093310  /** @name FrameSystemExtensionsCheckGenesis (436) */3311  export type FrameSystemExtensionsCheckGenesis = Null;33123313  /** @name FrameSystemExtensionsCheckNonce (439) */3314  export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}33153316  /** @name FrameSystemExtensionsCheckWeight (440) */3317  export type FrameSystemExtensionsCheckWeight = Null;33183319  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (441) */3320  export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}33213322  /** @name OpalRuntimeRuntime (442) */3323  export type OpalRuntimeRuntime = Null;33243325  /** @name PalletEthereumFakeTransactionFinalizer (443) */3326  export type PalletEthereumFakeTransactionFinalizer = Null;33273328} // declare module
after · tests/src/interfaces/types-lookup.ts
1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34declare module '@polkadot/types/lookup' {5  import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';6  import type { ITuple } from '@polkadot/types-codec/types';7  import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';8  import type { Event } from '@polkadot/types/interfaces/system';910  /** @name PolkadotPrimitivesV2PersistedValidationData (2) */11  export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {12    readonly parentHead: Bytes;13    readonly relayParentNumber: u32;14    readonly relayParentStorageRoot: H256;15    readonly maxPovSize: u32;16  }1718  /** @name PolkadotPrimitivesV2UpgradeRestriction (9) */19  export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {20    readonly isPresent: boolean;21    readonly type: 'Present';22  }2324  /** @name SpTrieStorageProof (10) */25  export interface SpTrieStorageProof extends Struct {26    readonly trieNodes: BTreeSet<Bytes>;27  }2829  /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (13) */30  export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {31    readonly dmqMqcHead: H256;32    readonly relayDispatchQueueSize: ITuple<[u32, u32]>;33    readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;34    readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;35  }3637  /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (18) */38  export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {39    readonly maxCapacity: u32;40    readonly maxTotalSize: u32;41    readonly maxMessageSize: u32;42    readonly msgCount: u32;43    readonly totalSize: u32;44    readonly mqcHead: Option<H256>;45  }4647  /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (20) */48  export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {49    readonly maxCodeSize: u32;50    readonly maxHeadDataSize: u32;51    readonly maxUpwardQueueCount: u32;52    readonly maxUpwardQueueSize: u32;53    readonly maxUpwardMessageSize: u32;54    readonly maxUpwardMessageNumPerCandidate: u32;55    readonly hrmpMaxMessageNumPerCandidate: u32;56    readonly validationUpgradeCooldown: u32;57    readonly validationUpgradeDelay: u32;58  }5960  /** @name PolkadotCorePrimitivesOutboundHrmpMessage (26) */61  export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {62    readonly recipient: u32;63    readonly data: Bytes;64  }6566  /** @name CumulusPalletParachainSystemCall (28) */67  export interface CumulusPalletParachainSystemCall extends Enum {68    readonly isSetValidationData: boolean;69    readonly asSetValidationData: {70      readonly data: CumulusPrimitivesParachainInherentParachainInherentData;71    } & Struct;72    readonly isSudoSendUpwardMessage: boolean;73    readonly asSudoSendUpwardMessage: {74      readonly message: Bytes;75    } & Struct;76    readonly isAuthorizeUpgrade: boolean;77    readonly asAuthorizeUpgrade: {78      readonly codeHash: H256;79    } & Struct;80    readonly isEnactAuthorizedUpgrade: boolean;81    readonly asEnactAuthorizedUpgrade: {82      readonly code: Bytes;83    } & Struct;84    readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';85  }8687  /** @name CumulusPrimitivesParachainInherentParachainInherentData (29) */88  export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {89    readonly validationData: PolkadotPrimitivesV2PersistedValidationData;90    readonly relayChainState: SpTrieStorageProof;91    readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;92    readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;93  }9495  /** @name PolkadotCorePrimitivesInboundDownwardMessage (31) */96  export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {97    readonly sentAt: u32;98    readonly msg: Bytes;99  }100101  /** @name PolkadotCorePrimitivesInboundHrmpMessage (34) */102  export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {103    readonly sentAt: u32;104    readonly data: Bytes;105  }106107  /** @name CumulusPalletParachainSystemEvent (37) */108  export 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: u64;126      readonly dmqHead: H256;127    } & Struct;128    readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';129  }130131  /** @name CumulusPalletParachainSystemError (38) */132  export interface CumulusPalletParachainSystemError extends Enum {133    readonly isOverlappingUpgrades: boolean;134    readonly isProhibitedByPolkadot: boolean;135    readonly isTooBig: boolean;136    readonly isValidationDataNotAvailable: boolean;137    readonly isHostConfigurationNotAvailable: boolean;138    readonly isNotScheduled: boolean;139    readonly isNothingAuthorized: boolean;140    readonly isUnauthorized: boolean;141    readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';142  }143144  /** @name PalletBalancesAccountData (41) */145  export interface PalletBalancesAccountData extends Struct {146    readonly free: u128;147    readonly reserved: u128;148    readonly miscFrozen: u128;149    readonly feeFrozen: u128;150  }151152  /** @name PalletBalancesBalanceLock (43) */153  export interface PalletBalancesBalanceLock extends Struct {154    readonly id: U8aFixed;155    readonly amount: u128;156    readonly reasons: PalletBalancesReasons;157  }158159  /** @name PalletBalancesReasons (45) */160  export interface PalletBalancesReasons extends Enum {161    readonly isFee: boolean;162    readonly isMisc: boolean;163    readonly isAll: boolean;164    readonly type: 'Fee' | 'Misc' | 'All';165  }166167  /** @name PalletBalancesReserveData (48) */168  export interface PalletBalancesReserveData extends Struct {169    readonly id: U8aFixed;170    readonly amount: u128;171  }172173  /** @name PalletBalancesReleases (51) */174  export interface PalletBalancesReleases extends Enum {175    readonly isV100: boolean;176    readonly isV200: boolean;177    readonly type: 'V100' | 'V200';178  }179180  /** @name PalletBalancesCall (52) */181  export interface PalletBalancesCall extends Enum {182    readonly isTransfer: boolean;183    readonly asTransfer: {184      readonly dest: MultiAddress;185      readonly value: Compact<u128>;186    } & Struct;187    readonly isSetBalance: boolean;188    readonly asSetBalance: {189      readonly who: MultiAddress;190      readonly newFree: Compact<u128>;191      readonly newReserved: Compact<u128>;192    } & Struct;193    readonly isForceTransfer: boolean;194    readonly asForceTransfer: {195      readonly source: MultiAddress;196      readonly dest: MultiAddress;197      readonly value: Compact<u128>;198    } & Struct;199    readonly isTransferKeepAlive: boolean;200    readonly asTransferKeepAlive: {201      readonly dest: MultiAddress;202      readonly value: Compact<u128>;203    } & Struct;204    readonly isTransferAll: boolean;205    readonly asTransferAll: {206      readonly dest: MultiAddress;207      readonly keepAlive: bool;208    } & Struct;209    readonly isForceUnreserve: boolean;210    readonly asForceUnreserve: {211      readonly who: MultiAddress;212      readonly amount: u128;213    } & Struct;214    readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';215  }216217  /** @name PalletBalancesEvent (58) */218  export interface PalletBalancesEvent extends Enum {219    readonly isEndowed: boolean;220    readonly asEndowed: {221      readonly account: AccountId32;222      readonly freeBalance: u128;223    } & Struct;224    readonly isDustLost: boolean;225    readonly asDustLost: {226      readonly account: AccountId32;227      readonly amount: u128;228    } & Struct;229    readonly isTransfer: boolean;230    readonly asTransfer: {231      readonly from: AccountId32;232      readonly to: AccountId32;233      readonly amount: u128;234    } & Struct;235    readonly isBalanceSet: boolean;236    readonly asBalanceSet: {237      readonly who: AccountId32;238      readonly free: u128;239      readonly reserved: u128;240    } & Struct;241    readonly isReserved: boolean;242    readonly asReserved: {243      readonly who: AccountId32;244      readonly amount: u128;245    } & Struct;246    readonly isUnreserved: boolean;247    readonly asUnreserved: {248      readonly who: AccountId32;249      readonly amount: u128;250    } & Struct;251    readonly isReserveRepatriated: boolean;252    readonly asReserveRepatriated: {253      readonly from: AccountId32;254      readonly to: AccountId32;255      readonly amount: u128;256      readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;257    } & Struct;258    readonly isDeposit: boolean;259    readonly asDeposit: {260      readonly who: AccountId32;261      readonly amount: u128;262    } & Struct;263    readonly isWithdraw: boolean;264    readonly asWithdraw: {265      readonly who: AccountId32;266      readonly amount: u128;267    } & Struct;268    readonly isSlashed: boolean;269    readonly asSlashed: {270      readonly who: AccountId32;271      readonly amount: u128;272    } & Struct;273    readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';274  }275276  /** @name FrameSupportTokensMiscBalanceStatus (59) */277  export interface FrameSupportTokensMiscBalanceStatus extends Enum {278    readonly isFree: boolean;279    readonly isReserved: boolean;280    readonly type: 'Free' | 'Reserved';281  }282283  /** @name PalletBalancesError (60) */284  export interface PalletBalancesError extends Enum {285    readonly isVestingBalance: boolean;286    readonly isLiquidityRestrictions: boolean;287    readonly isInsufficientBalance: boolean;288    readonly isExistentialDeposit: boolean;289    readonly isKeepAlive: boolean;290    readonly isExistingVestingSchedule: boolean;291    readonly isDeadAccount: boolean;292    readonly isTooManyReserves: boolean;293    readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';294  }295296  /** @name PalletTimestampCall (63) */297  export interface PalletTimestampCall extends Enum {298    readonly isSet: boolean;299    readonly asSet: {300      readonly now: Compact<u64>;301    } & Struct;302    readonly type: 'Set';303  }304305  /** @name PalletTransactionPaymentReleases (66) */306  export interface PalletTransactionPaymentReleases extends Enum {307    readonly isV1Ancient: boolean;308    readonly isV2: boolean;309    readonly type: 'V1Ancient' | 'V2';310  }311312  /** @name PalletTreasuryProposal (67) */313  export interface PalletTreasuryProposal extends Struct {314    readonly proposer: AccountId32;315    readonly value: u128;316    readonly beneficiary: AccountId32;317    readonly bond: u128;318  }319320  /** @name PalletTreasuryCall (70) */321  export interface PalletTreasuryCall extends Enum {322    readonly isProposeSpend: boolean;323    readonly asProposeSpend: {324      readonly value: Compact<u128>;325      readonly beneficiary: MultiAddress;326    } & Struct;327    readonly isRejectProposal: boolean;328    readonly asRejectProposal: {329      readonly proposalId: Compact<u32>;330    } & Struct;331    readonly isApproveProposal: boolean;332    readonly asApproveProposal: {333      readonly proposalId: Compact<u32>;334    } & Struct;335    readonly isRemoveApproval: boolean;336    readonly asRemoveApproval: {337      readonly proposalId: Compact<u32>;338    } & Struct;339    readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';340  }341342  /** @name PalletTreasuryEvent (72) */343  export interface PalletTreasuryEvent extends Enum {344    readonly isProposed: boolean;345    readonly asProposed: {346      readonly proposalIndex: u32;347    } & Struct;348    readonly isSpending: boolean;349    readonly asSpending: {350      readonly budgetRemaining: u128;351    } & Struct;352    readonly isAwarded: boolean;353    readonly asAwarded: {354      readonly proposalIndex: u32;355      readonly award: u128;356      readonly account: AccountId32;357    } & Struct;358    readonly isRejected: boolean;359    readonly asRejected: {360      readonly proposalIndex: u32;361      readonly slashed: u128;362    } & Struct;363    readonly isBurnt: boolean;364    readonly asBurnt: {365      readonly burntFunds: u128;366    } & Struct;367    readonly isRollover: boolean;368    readonly asRollover: {369      readonly rolloverBalance: u128;370    } & Struct;371    readonly isDeposit: boolean;372    readonly asDeposit: {373      readonly value: u128;374    } & Struct;375    readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';376  }377378  /** @name FrameSupportPalletId (75) */379  export interface FrameSupportPalletId extends U8aFixed {}380381  /** @name PalletTreasuryError (76) */382  export interface PalletTreasuryError extends Enum {383    readonly isInsufficientProposersBalance: boolean;384    readonly isInvalidIndex: boolean;385    readonly isTooManyApprovals: boolean;386    readonly isProposalNotApproved: boolean;387    readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';388  }389390  /** @name PalletSudoCall (77) */391  export interface PalletSudoCall extends Enum {392    readonly isSudo: boolean;393    readonly asSudo: {394      readonly call: Call;395    } & Struct;396    readonly isSudoUncheckedWeight: boolean;397    readonly asSudoUncheckedWeight: {398      readonly call: Call;399      readonly weight: u64;400    } & Struct;401    readonly isSetKey: boolean;402    readonly asSetKey: {403      readonly new_: MultiAddress;404    } & Struct;405    readonly isSudoAs: boolean;406    readonly asSudoAs: {407      readonly who: MultiAddress;408      readonly call: Call;409    } & Struct;410    readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';411  }412413  /** @name FrameSystemCall (79) */414  export interface FrameSystemCall extends Enum {415    readonly isFillBlock: boolean;416    readonly asFillBlock: {417      readonly ratio: Perbill;418    } & Struct;419    readonly isRemark: boolean;420    readonly asRemark: {421      readonly remark: Bytes;422    } & Struct;423    readonly isSetHeapPages: boolean;424    readonly asSetHeapPages: {425      readonly pages: u64;426    } & Struct;427    readonly isSetCode: boolean;428    readonly asSetCode: {429      readonly code: Bytes;430    } & Struct;431    readonly isSetCodeWithoutChecks: boolean;432    readonly asSetCodeWithoutChecks: {433      readonly code: Bytes;434    } & Struct;435    readonly isSetStorage: boolean;436    readonly asSetStorage: {437      readonly items: Vec<ITuple<[Bytes, Bytes]>>;438    } & Struct;439    readonly isKillStorage: boolean;440    readonly asKillStorage: {441      readonly keys_: Vec<Bytes>;442    } & Struct;443    readonly isKillPrefix: boolean;444    readonly asKillPrefix: {445      readonly prefix: Bytes;446      readonly subkeys: u32;447    } & Struct;448    readonly isRemarkWithEvent: boolean;449    readonly asRemarkWithEvent: {450      readonly remark: Bytes;451    } & Struct;452    readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';453  }454455  /** @name OrmlVestingModuleCall (83) */456  export interface OrmlVestingModuleCall extends Enum {457    readonly isClaim: boolean;458    readonly isVestedTransfer: boolean;459    readonly asVestedTransfer: {460      readonly dest: MultiAddress;461      readonly schedule: OrmlVestingVestingSchedule;462    } & Struct;463    readonly isUpdateVestingSchedules: boolean;464    readonly asUpdateVestingSchedules: {465      readonly who: MultiAddress;466      readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;467    } & Struct;468    readonly isClaimFor: boolean;469    readonly asClaimFor: {470      readonly dest: MultiAddress;471    } & Struct;472    readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';473  }474475  /** @name OrmlVestingVestingSchedule (84) */476  export interface OrmlVestingVestingSchedule extends Struct {477    readonly start: u32;478    readonly period: u32;479    readonly periodCount: u32;480    readonly perPeriod: Compact<u128>;481  }482483  /** @name CumulusPalletXcmpQueueCall (86) */484  export interface CumulusPalletXcmpQueueCall extends Enum {485    readonly isServiceOverweight: boolean;486    readonly asServiceOverweight: {487      readonly index: u64;488      readonly weightLimit: u64;489    } & Struct;490    readonly isSuspendXcmExecution: boolean;491    readonly isResumeXcmExecution: boolean;492    readonly isUpdateSuspendThreshold: boolean;493    readonly asUpdateSuspendThreshold: {494      readonly new_: u32;495    } & Struct;496    readonly isUpdateDropThreshold: boolean;497    readonly asUpdateDropThreshold: {498      readonly new_: u32;499    } & Struct;500    readonly isUpdateResumeThreshold: boolean;501    readonly asUpdateResumeThreshold: {502      readonly new_: u32;503    } & Struct;504    readonly isUpdateThresholdWeight: boolean;505    readonly asUpdateThresholdWeight: {506      readonly new_: u64;507    } & Struct;508    readonly isUpdateWeightRestrictDecay: boolean;509    readonly asUpdateWeightRestrictDecay: {510      readonly new_: u64;511    } & Struct;512    readonly isUpdateXcmpMaxIndividualWeight: boolean;513    readonly asUpdateXcmpMaxIndividualWeight: {514      readonly new_: u64;515    } & Struct;516    readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';517  }518519  /** @name PalletXcmCall (87) */520  export interface PalletXcmCall extends Enum {521    readonly isSend: boolean;522    readonly asSend: {523      readonly dest: XcmVersionedMultiLocation;524      readonly message: XcmVersionedXcm;525    } & Struct;526    readonly isTeleportAssets: boolean;527    readonly asTeleportAssets: {528      readonly dest: XcmVersionedMultiLocation;529      readonly beneficiary: XcmVersionedMultiLocation;530      readonly assets: XcmVersionedMultiAssets;531      readonly feeAssetItem: u32;532    } & Struct;533    readonly isReserveTransferAssets: boolean;534    readonly asReserveTransferAssets: {535      readonly dest: XcmVersionedMultiLocation;536      readonly beneficiary: XcmVersionedMultiLocation;537      readonly assets: XcmVersionedMultiAssets;538      readonly feeAssetItem: u32;539    } & Struct;540    readonly isExecute: boolean;541    readonly asExecute: {542      readonly message: XcmVersionedXcm;543      readonly maxWeight: u64;544    } & Struct;545    readonly isForceXcmVersion: boolean;546    readonly asForceXcmVersion: {547      readonly location: XcmV1MultiLocation;548      readonly xcmVersion: u32;549    } & Struct;550    readonly isForceDefaultXcmVersion: boolean;551    readonly asForceDefaultXcmVersion: {552      readonly maybeXcmVersion: Option<u32>;553    } & Struct;554    readonly isForceSubscribeVersionNotify: boolean;555    readonly asForceSubscribeVersionNotify: {556      readonly location: XcmVersionedMultiLocation;557    } & Struct;558    readonly isForceUnsubscribeVersionNotify: boolean;559    readonly asForceUnsubscribeVersionNotify: {560      readonly location: XcmVersionedMultiLocation;561    } & Struct;562    readonly isLimitedReserveTransferAssets: boolean;563    readonly asLimitedReserveTransferAssets: {564      readonly dest: XcmVersionedMultiLocation;565      readonly beneficiary: XcmVersionedMultiLocation;566      readonly assets: XcmVersionedMultiAssets;567      readonly feeAssetItem: u32;568      readonly weightLimit: XcmV2WeightLimit;569    } & Struct;570    readonly isLimitedTeleportAssets: boolean;571    readonly asLimitedTeleportAssets: {572      readonly dest: XcmVersionedMultiLocation;573      readonly beneficiary: XcmVersionedMultiLocation;574      readonly assets: XcmVersionedMultiAssets;575      readonly feeAssetItem: u32;576      readonly weightLimit: XcmV2WeightLimit;577    } & Struct;578    readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';579  }580581  /** @name XcmVersionedMultiLocation (88) */582  export interface XcmVersionedMultiLocation extends Enum {583    readonly isV0: boolean;584    readonly asV0: XcmV0MultiLocation;585    readonly isV1: boolean;586    readonly asV1: XcmV1MultiLocation;587    readonly type: 'V0' | 'V1';588  }589590  /** @name XcmV0MultiLocation (89) */591  export interface XcmV0MultiLocation extends Enum {592    readonly isNull: boolean;593    readonly isX1: boolean;594    readonly asX1: XcmV0Junction;595    readonly isX2: boolean;596    readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;597    readonly isX3: boolean;598    readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;599    readonly isX4: boolean;600    readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;601    readonly isX5: boolean;602    readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;603    readonly isX6: boolean;604    readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;605    readonly isX7: boolean;606    readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;607    readonly isX8: boolean;608    readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;609    readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';610  }611612  /** @name XcmV0Junction (90) */613  export interface XcmV0Junction extends Enum {614    readonly isParent: boolean;615    readonly isParachain: boolean;616    readonly asParachain: Compact<u32>;617    readonly isAccountId32: boolean;618    readonly asAccountId32: {619      readonly network: XcmV0JunctionNetworkId;620      readonly id: U8aFixed;621    } & Struct;622    readonly isAccountIndex64: boolean;623    readonly asAccountIndex64: {624      readonly network: XcmV0JunctionNetworkId;625      readonly index: Compact<u64>;626    } & Struct;627    readonly isAccountKey20: boolean;628    readonly asAccountKey20: {629      readonly network: XcmV0JunctionNetworkId;630      readonly key: U8aFixed;631    } & Struct;632    readonly isPalletInstance: boolean;633    readonly asPalletInstance: u8;634    readonly isGeneralIndex: boolean;635    readonly asGeneralIndex: Compact<u128>;636    readonly isGeneralKey: boolean;637    readonly asGeneralKey: Bytes;638    readonly isOnlyChild: boolean;639    readonly isPlurality: boolean;640    readonly asPlurality: {641      readonly id: XcmV0JunctionBodyId;642      readonly part: XcmV0JunctionBodyPart;643    } & Struct;644    readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';645  }646647  /** @name XcmV0JunctionNetworkId (91) */648  export interface XcmV0JunctionNetworkId extends Enum {649    readonly isAny: boolean;650    readonly isNamed: boolean;651    readonly asNamed: Bytes;652    readonly isPolkadot: boolean;653    readonly isKusama: boolean;654    readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';655  }656657  /** @name XcmV0JunctionBodyId (92) */658  export interface XcmV0JunctionBodyId extends Enum {659    readonly isUnit: boolean;660    readonly isNamed: boolean;661    readonly asNamed: Bytes;662    readonly isIndex: boolean;663    readonly asIndex: Compact<u32>;664    readonly isExecutive: boolean;665    readonly isTechnical: boolean;666    readonly isLegislative: boolean;667    readonly isJudicial: boolean;668    readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';669  }670671  /** @name XcmV0JunctionBodyPart (93) */672  export interface XcmV0JunctionBodyPart extends Enum {673    readonly isVoice: boolean;674    readonly isMembers: boolean;675    readonly asMembers: {676      readonly count: Compact<u32>;677    } & Struct;678    readonly isFraction: boolean;679    readonly asFraction: {680      readonly nom: Compact<u32>;681      readonly denom: Compact<u32>;682    } & Struct;683    readonly isAtLeastProportion: boolean;684    readonly asAtLeastProportion: {685      readonly nom: Compact<u32>;686      readonly denom: Compact<u32>;687    } & Struct;688    readonly isMoreThanProportion: boolean;689    readonly asMoreThanProportion: {690      readonly nom: Compact<u32>;691      readonly denom: Compact<u32>;692    } & Struct;693    readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';694  }695696  /** @name XcmV1MultiLocation (94) */697  export interface XcmV1MultiLocation extends Struct {698    readonly parents: u8;699    readonly interior: XcmV1MultilocationJunctions;700  }701702  /** @name XcmV1MultilocationJunctions (95) */703  export interface XcmV1MultilocationJunctions extends Enum {704    readonly isHere: boolean;705    readonly isX1: boolean;706    readonly asX1: XcmV1Junction;707    readonly isX2: boolean;708    readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;709    readonly isX3: boolean;710    readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;711    readonly isX4: boolean;712    readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;713    readonly isX5: boolean;714    readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;715    readonly isX6: boolean;716    readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;717    readonly isX7: boolean;718    readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;719    readonly isX8: boolean;720    readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;721    readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';722  }723724  /** @name XcmV1Junction (96) */725  export interface XcmV1Junction extends Enum {726    readonly isParachain: boolean;727    readonly asParachain: Compact<u32>;728    readonly isAccountId32: boolean;729    readonly asAccountId32: {730      readonly network: XcmV0JunctionNetworkId;731      readonly id: U8aFixed;732    } & Struct;733    readonly isAccountIndex64: boolean;734    readonly asAccountIndex64: {735      readonly network: XcmV0JunctionNetworkId;736      readonly index: Compact<u64>;737    } & Struct;738    readonly isAccountKey20: boolean;739    readonly asAccountKey20: {740      readonly network: XcmV0JunctionNetworkId;741      readonly key: U8aFixed;742    } & Struct;743    readonly isPalletInstance: boolean;744    readonly asPalletInstance: u8;745    readonly isGeneralIndex: boolean;746    readonly asGeneralIndex: Compact<u128>;747    readonly isGeneralKey: boolean;748    readonly asGeneralKey: Bytes;749    readonly isOnlyChild: boolean;750    readonly isPlurality: boolean;751    readonly asPlurality: {752      readonly id: XcmV0JunctionBodyId;753      readonly part: XcmV0JunctionBodyPart;754    } & Struct;755    readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';756  }757758  /** @name XcmVersionedXcm (97) */759  export interface XcmVersionedXcm extends Enum {760    readonly isV0: boolean;761    readonly asV0: XcmV0Xcm;762    readonly isV1: boolean;763    readonly asV1: XcmV1Xcm;764    readonly isV2: boolean;765    readonly asV2: XcmV2Xcm;766    readonly type: 'V0' | 'V1' | 'V2';767  }768769  /** @name XcmV0Xcm (98) */770  export interface XcmV0Xcm extends Enum {771    readonly isWithdrawAsset: boolean;772    readonly asWithdrawAsset: {773      readonly assets: Vec<XcmV0MultiAsset>;774      readonly effects: Vec<XcmV0Order>;775    } & Struct;776    readonly isReserveAssetDeposit: boolean;777    readonly asReserveAssetDeposit: {778      readonly assets: Vec<XcmV0MultiAsset>;779      readonly effects: Vec<XcmV0Order>;780    } & Struct;781    readonly isTeleportAsset: boolean;782    readonly asTeleportAsset: {783      readonly assets: Vec<XcmV0MultiAsset>;784      readonly effects: Vec<XcmV0Order>;785    } & Struct;786    readonly isQueryResponse: boolean;787    readonly asQueryResponse: {788      readonly queryId: Compact<u64>;789      readonly response: XcmV0Response;790    } & Struct;791    readonly isTransferAsset: boolean;792    readonly asTransferAsset: {793      readonly assets: Vec<XcmV0MultiAsset>;794      readonly dest: XcmV0MultiLocation;795    } & Struct;796    readonly isTransferReserveAsset: boolean;797    readonly asTransferReserveAsset: {798      readonly assets: Vec<XcmV0MultiAsset>;799      readonly dest: XcmV0MultiLocation;800      readonly effects: Vec<XcmV0Order>;801    } & Struct;802    readonly isTransact: boolean;803    readonly asTransact: {804      readonly originType: XcmV0OriginKind;805      readonly requireWeightAtMost: u64;806      readonly call: XcmDoubleEncoded;807    } & Struct;808    readonly isHrmpNewChannelOpenRequest: boolean;809    readonly asHrmpNewChannelOpenRequest: {810      readonly sender: Compact<u32>;811      readonly maxMessageSize: Compact<u32>;812      readonly maxCapacity: Compact<u32>;813    } & Struct;814    readonly isHrmpChannelAccepted: boolean;815    readonly asHrmpChannelAccepted: {816      readonly recipient: Compact<u32>;817    } & Struct;818    readonly isHrmpChannelClosing: boolean;819    readonly asHrmpChannelClosing: {820      readonly initiator: Compact<u32>;821      readonly sender: Compact<u32>;822      readonly recipient: Compact<u32>;823    } & Struct;824    readonly isRelayedFrom: boolean;825    readonly asRelayedFrom: {826      readonly who: XcmV0MultiLocation;827      readonly message: XcmV0Xcm;828    } & Struct;829    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';830  }831832  /** @name XcmV0MultiAsset (100) */833  export interface XcmV0MultiAsset extends Enum {834    readonly isNone: boolean;835    readonly isAll: boolean;836    readonly isAllFungible: boolean;837    readonly isAllNonFungible: boolean;838    readonly isAllAbstractFungible: boolean;839    readonly asAllAbstractFungible: {840      readonly id: Bytes;841    } & Struct;842    readonly isAllAbstractNonFungible: boolean;843    readonly asAllAbstractNonFungible: {844      readonly class: Bytes;845    } & Struct;846    readonly isAllConcreteFungible: boolean;847    readonly asAllConcreteFungible: {848      readonly id: XcmV0MultiLocation;849    } & Struct;850    readonly isAllConcreteNonFungible: boolean;851    readonly asAllConcreteNonFungible: {852      readonly class: XcmV0MultiLocation;853    } & Struct;854    readonly isAbstractFungible: boolean;855    readonly asAbstractFungible: {856      readonly id: Bytes;857      readonly amount: Compact<u128>;858    } & Struct;859    readonly isAbstractNonFungible: boolean;860    readonly asAbstractNonFungible: {861      readonly class: Bytes;862      readonly instance: XcmV1MultiassetAssetInstance;863    } & Struct;864    readonly isConcreteFungible: boolean;865    readonly asConcreteFungible: {866      readonly id: XcmV0MultiLocation;867      readonly amount: Compact<u128>;868    } & Struct;869    readonly isConcreteNonFungible: boolean;870    readonly asConcreteNonFungible: {871      readonly class: XcmV0MultiLocation;872      readonly instance: XcmV1MultiassetAssetInstance;873    } & Struct;874    readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';875  }876877  /** @name XcmV1MultiassetAssetInstance (101) */878  export interface XcmV1MultiassetAssetInstance extends Enum {879    readonly isUndefined: boolean;880    readonly isIndex: boolean;881    readonly asIndex: Compact<u128>;882    readonly isArray4: boolean;883    readonly asArray4: U8aFixed;884    readonly isArray8: boolean;885    readonly asArray8: U8aFixed;886    readonly isArray16: boolean;887    readonly asArray16: U8aFixed;888    readonly isArray32: boolean;889    readonly asArray32: U8aFixed;890    readonly isBlob: boolean;891    readonly asBlob: Bytes;892    readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';893  }894895  /** @name XcmV0Order (104) */896  export interface XcmV0Order extends Enum {897    readonly isNull: boolean;898    readonly isDepositAsset: boolean;899    readonly asDepositAsset: {900      readonly assets: Vec<XcmV0MultiAsset>;901      readonly dest: XcmV0MultiLocation;902    } & Struct;903    readonly isDepositReserveAsset: boolean;904    readonly asDepositReserveAsset: {905      readonly assets: Vec<XcmV0MultiAsset>;906      readonly dest: XcmV0MultiLocation;907      readonly effects: Vec<XcmV0Order>;908    } & Struct;909    readonly isExchangeAsset: boolean;910    readonly asExchangeAsset: {911      readonly give: Vec<XcmV0MultiAsset>;912      readonly receive: Vec<XcmV0MultiAsset>;913    } & Struct;914    readonly isInitiateReserveWithdraw: boolean;915    readonly asInitiateReserveWithdraw: {916      readonly assets: Vec<XcmV0MultiAsset>;917      readonly reserve: XcmV0MultiLocation;918      readonly effects: Vec<XcmV0Order>;919    } & Struct;920    readonly isInitiateTeleport: boolean;921    readonly asInitiateTeleport: {922      readonly assets: Vec<XcmV0MultiAsset>;923      readonly dest: XcmV0MultiLocation;924      readonly effects: Vec<XcmV0Order>;925    } & Struct;926    readonly isQueryHolding: boolean;927    readonly asQueryHolding: {928      readonly queryId: Compact<u64>;929      readonly dest: XcmV0MultiLocation;930      readonly assets: Vec<XcmV0MultiAsset>;931    } & Struct;932    readonly isBuyExecution: boolean;933    readonly asBuyExecution: {934      readonly fees: XcmV0MultiAsset;935      readonly weight: u64;936      readonly debt: u64;937      readonly haltOnError: bool;938      readonly xcm: Vec<XcmV0Xcm>;939    } & Struct;940    readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';941  }942943  /** @name XcmV0Response (106) */944  export interface XcmV0Response extends Enum {945    readonly isAssets: boolean;946    readonly asAssets: Vec<XcmV0MultiAsset>;947    readonly type: 'Assets';948  }949950  /** @name XcmV0OriginKind (107) */951  export interface XcmV0OriginKind extends Enum {952    readonly isNative: boolean;953    readonly isSovereignAccount: boolean;954    readonly isSuperuser: boolean;955    readonly isXcm: boolean;956    readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';957  }958959  /** @name XcmDoubleEncoded (108) */960  export interface XcmDoubleEncoded extends Struct {961    readonly encoded: Bytes;962  }963964  /** @name XcmV1Xcm (109) */965  export interface XcmV1Xcm extends Enum {966    readonly isWithdrawAsset: boolean;967    readonly asWithdrawAsset: {968      readonly assets: XcmV1MultiassetMultiAssets;969      readonly effects: Vec<XcmV1Order>;970    } & Struct;971    readonly isReserveAssetDeposited: boolean;972    readonly asReserveAssetDeposited: {973      readonly assets: XcmV1MultiassetMultiAssets;974      readonly effects: Vec<XcmV1Order>;975    } & Struct;976    readonly isReceiveTeleportedAsset: boolean;977    readonly asReceiveTeleportedAsset: {978      readonly assets: XcmV1MultiassetMultiAssets;979      readonly effects: Vec<XcmV1Order>;980    } & Struct;981    readonly isQueryResponse: boolean;982    readonly asQueryResponse: {983      readonly queryId: Compact<u64>;984      readonly response: XcmV1Response;985    } & Struct;986    readonly isTransferAsset: boolean;987    readonly asTransferAsset: {988      readonly assets: XcmV1MultiassetMultiAssets;989      readonly beneficiary: XcmV1MultiLocation;990    } & Struct;991    readonly isTransferReserveAsset: boolean;992    readonly asTransferReserveAsset: {993      readonly assets: XcmV1MultiassetMultiAssets;994      readonly dest: XcmV1MultiLocation;995      readonly effects: Vec<XcmV1Order>;996    } & Struct;997    readonly isTransact: boolean;998    readonly asTransact: {999      readonly originType: XcmV0OriginKind;1000      readonly requireWeightAtMost: u64;1001      readonly call: XcmDoubleEncoded;1002    } & Struct;1003    readonly isHrmpNewChannelOpenRequest: boolean;1004    readonly asHrmpNewChannelOpenRequest: {1005      readonly sender: Compact<u32>;1006      readonly maxMessageSize: Compact<u32>;1007      readonly maxCapacity: Compact<u32>;1008    } & Struct;1009    readonly isHrmpChannelAccepted: boolean;1010    readonly asHrmpChannelAccepted: {1011      readonly recipient: Compact<u32>;1012    } & Struct;1013    readonly isHrmpChannelClosing: boolean;1014    readonly asHrmpChannelClosing: {1015      readonly initiator: Compact<u32>;1016      readonly sender: Compact<u32>;1017      readonly recipient: Compact<u32>;1018    } & Struct;1019    readonly isRelayedFrom: boolean;1020    readonly asRelayedFrom: {1021      readonly who: XcmV1MultilocationJunctions;1022      readonly message: XcmV1Xcm;1023    } & Struct;1024    readonly isSubscribeVersion: boolean;1025    readonly asSubscribeVersion: {1026      readonly queryId: Compact<u64>;1027      readonly maxResponseWeight: Compact<u64>;1028    } & Struct;1029    readonly isUnsubscribeVersion: boolean;1030    readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';1031  }10321033  /** @name XcmV1MultiassetMultiAssets (110) */1034  export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}10351036  /** @name XcmV1MultiAsset (112) */1037  export interface XcmV1MultiAsset extends Struct {1038    readonly id: XcmV1MultiassetAssetId;1039    readonly fun: XcmV1MultiassetFungibility;1040  }10411042  /** @name XcmV1MultiassetAssetId (113) */1043  export interface XcmV1MultiassetAssetId extends Enum {1044    readonly isConcrete: boolean;1045    readonly asConcrete: XcmV1MultiLocation;1046    readonly isAbstract: boolean;1047    readonly asAbstract: Bytes;1048    readonly type: 'Concrete' | 'Abstract';1049  }10501051  /** @name XcmV1MultiassetFungibility (114) */1052  export interface XcmV1MultiassetFungibility extends Enum {1053    readonly isFungible: boolean;1054    readonly asFungible: Compact<u128>;1055    readonly isNonFungible: boolean;1056    readonly asNonFungible: XcmV1MultiassetAssetInstance;1057    readonly type: 'Fungible' | 'NonFungible';1058  }10591060  /** @name XcmV1Order (116) */1061  export interface XcmV1Order extends Enum {1062    readonly isNoop: boolean;1063    readonly isDepositAsset: boolean;1064    readonly asDepositAsset: {1065      readonly assets: XcmV1MultiassetMultiAssetFilter;1066      readonly maxAssets: u32;1067      readonly beneficiary: XcmV1MultiLocation;1068    } & Struct;1069    readonly isDepositReserveAsset: boolean;1070    readonly asDepositReserveAsset: {1071      readonly assets: XcmV1MultiassetMultiAssetFilter;1072      readonly maxAssets: u32;1073      readonly dest: XcmV1MultiLocation;1074      readonly effects: Vec<XcmV1Order>;1075    } & Struct;1076    readonly isExchangeAsset: boolean;1077    readonly asExchangeAsset: {1078      readonly give: XcmV1MultiassetMultiAssetFilter;1079      readonly receive: XcmV1MultiassetMultiAssets;1080    } & Struct;1081    readonly isInitiateReserveWithdraw: boolean;1082    readonly asInitiateReserveWithdraw: {1083      readonly assets: XcmV1MultiassetMultiAssetFilter;1084      readonly reserve: XcmV1MultiLocation;1085      readonly effects: Vec<XcmV1Order>;1086    } & Struct;1087    readonly isInitiateTeleport: boolean;1088    readonly asInitiateTeleport: {1089      readonly assets: XcmV1MultiassetMultiAssetFilter;1090      readonly dest: XcmV1MultiLocation;1091      readonly effects: Vec<XcmV1Order>;1092    } & Struct;1093    readonly isQueryHolding: boolean;1094    readonly asQueryHolding: {1095      readonly queryId: Compact<u64>;1096      readonly dest: XcmV1MultiLocation;1097      readonly assets: XcmV1MultiassetMultiAssetFilter;1098    } & Struct;1099    readonly isBuyExecution: boolean;1100    readonly asBuyExecution: {1101      readonly fees: XcmV1MultiAsset;1102      readonly weight: u64;1103      readonly debt: u64;1104      readonly haltOnError: bool;1105      readonly instructions: Vec<XcmV1Xcm>;1106    } & Struct;1107    readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';1108  }11091110  /** @name XcmV1MultiassetMultiAssetFilter (117) */1111  export interface XcmV1MultiassetMultiAssetFilter extends Enum {1112    readonly isDefinite: boolean;1113    readonly asDefinite: XcmV1MultiassetMultiAssets;1114    readonly isWild: boolean;1115    readonly asWild: XcmV1MultiassetWildMultiAsset;1116    readonly type: 'Definite' | 'Wild';1117  }11181119  /** @name XcmV1MultiassetWildMultiAsset (118) */1120  export interface XcmV1MultiassetWildMultiAsset extends Enum {1121    readonly isAll: boolean;1122    readonly isAllOf: boolean;1123    readonly asAllOf: {1124      readonly id: XcmV1MultiassetAssetId;1125      readonly fun: XcmV1MultiassetWildFungibility;1126    } & Struct;1127    readonly type: 'All' | 'AllOf';1128  }11291130  /** @name XcmV1MultiassetWildFungibility (119) */1131  export interface XcmV1MultiassetWildFungibility extends Enum {1132    readonly isFungible: boolean;1133    readonly isNonFungible: boolean;1134    readonly type: 'Fungible' | 'NonFungible';1135  }11361137  /** @name XcmV1Response (121) */1138  export interface XcmV1Response extends Enum {1139    readonly isAssets: boolean;1140    readonly asAssets: XcmV1MultiassetMultiAssets;1141    readonly isVersion: boolean;1142    readonly asVersion: u32;1143    readonly type: 'Assets' | 'Version';1144  }11451146  /** @name XcmV2Xcm (122) */1147  export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}11481149  /** @name XcmV2Instruction (124) */1150  export interface XcmV2Instruction extends Enum {1151    readonly isWithdrawAsset: boolean;1152    readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;1153    readonly isReserveAssetDeposited: boolean;1154    readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;1155    readonly isReceiveTeleportedAsset: boolean;1156    readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;1157    readonly isQueryResponse: boolean;1158    readonly asQueryResponse: {1159      readonly queryId: Compact<u64>;1160      readonly response: XcmV2Response;1161      readonly maxWeight: Compact<u64>;1162    } & Struct;1163    readonly isTransferAsset: boolean;1164    readonly asTransferAsset: {1165      readonly assets: XcmV1MultiassetMultiAssets;1166      readonly beneficiary: XcmV1MultiLocation;1167    } & Struct;1168    readonly isTransferReserveAsset: boolean;1169    readonly asTransferReserveAsset: {1170      readonly assets: XcmV1MultiassetMultiAssets;1171      readonly dest: XcmV1MultiLocation;1172      readonly xcm: XcmV2Xcm;1173    } & Struct;1174    readonly isTransact: boolean;1175    readonly asTransact: {1176      readonly originType: XcmV0OriginKind;1177      readonly requireWeightAtMost: Compact<u64>;1178      readonly call: XcmDoubleEncoded;1179    } & Struct;1180    readonly isHrmpNewChannelOpenRequest: boolean;1181    readonly asHrmpNewChannelOpenRequest: {1182      readonly sender: Compact<u32>;1183      readonly maxMessageSize: Compact<u32>;1184      readonly maxCapacity: Compact<u32>;1185    } & Struct;1186    readonly isHrmpChannelAccepted: boolean;1187    readonly asHrmpChannelAccepted: {1188      readonly recipient: Compact<u32>;1189    } & Struct;1190    readonly isHrmpChannelClosing: boolean;1191    readonly asHrmpChannelClosing: {1192      readonly initiator: Compact<u32>;1193      readonly sender: Compact<u32>;1194      readonly recipient: Compact<u32>;1195    } & Struct;1196    readonly isClearOrigin: boolean;1197    readonly isDescendOrigin: boolean;1198    readonly asDescendOrigin: XcmV1MultilocationJunctions;1199    readonly isReportError: boolean;1200    readonly asReportError: {1201      readonly queryId: Compact<u64>;1202      readonly dest: XcmV1MultiLocation;1203      readonly maxResponseWeight: Compact<u64>;1204    } & Struct;1205    readonly isDepositAsset: boolean;1206    readonly asDepositAsset: {1207      readonly assets: XcmV1MultiassetMultiAssetFilter;1208      readonly maxAssets: Compact<u32>;1209      readonly beneficiary: XcmV1MultiLocation;1210    } & Struct;1211    readonly isDepositReserveAsset: boolean;1212    readonly asDepositReserveAsset: {1213      readonly assets: XcmV1MultiassetMultiAssetFilter;1214      readonly maxAssets: Compact<u32>;1215      readonly dest: XcmV1MultiLocation;1216      readonly xcm: XcmV2Xcm;1217    } & Struct;1218    readonly isExchangeAsset: boolean;1219    readonly asExchangeAsset: {1220      readonly give: XcmV1MultiassetMultiAssetFilter;1221      readonly receive: XcmV1MultiassetMultiAssets;1222    } & Struct;1223    readonly isInitiateReserveWithdraw: boolean;1224    readonly asInitiateReserveWithdraw: {1225      readonly assets: XcmV1MultiassetMultiAssetFilter;1226      readonly reserve: XcmV1MultiLocation;1227      readonly xcm: XcmV2Xcm;1228    } & Struct;1229    readonly isInitiateTeleport: boolean;1230    readonly asInitiateTeleport: {1231      readonly assets: XcmV1MultiassetMultiAssetFilter;1232      readonly dest: XcmV1MultiLocation;1233      readonly xcm: XcmV2Xcm;1234    } & Struct;1235    readonly isQueryHolding: boolean;1236    readonly asQueryHolding: {1237      readonly queryId: Compact<u64>;1238      readonly dest: XcmV1MultiLocation;1239      readonly assets: XcmV1MultiassetMultiAssetFilter;1240      readonly maxResponseWeight: Compact<u64>;1241    } & Struct;1242    readonly isBuyExecution: boolean;1243    readonly asBuyExecution: {1244      readonly fees: XcmV1MultiAsset;1245      readonly weightLimit: XcmV2WeightLimit;1246    } & Struct;1247    readonly isRefundSurplus: boolean;1248    readonly isSetErrorHandler: boolean;1249    readonly asSetErrorHandler: XcmV2Xcm;1250    readonly isSetAppendix: boolean;1251    readonly asSetAppendix: XcmV2Xcm;1252    readonly isClearError: boolean;1253    readonly isClaimAsset: boolean;1254    readonly asClaimAsset: {1255      readonly assets: XcmV1MultiassetMultiAssets;1256      readonly ticket: XcmV1MultiLocation;1257    } & Struct;1258    readonly isTrap: boolean;1259    readonly asTrap: Compact<u64>;1260    readonly isSubscribeVersion: boolean;1261    readonly asSubscribeVersion: {1262      readonly queryId: Compact<u64>;1263      readonly maxResponseWeight: Compact<u64>;1264    } & Struct;1265    readonly isUnsubscribeVersion: boolean;1266    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';1267  }12681269  /** @name XcmV2Response (125) */1270  export interface XcmV2Response extends Enum {1271    readonly isNull: boolean;1272    readonly isAssets: boolean;1273    readonly asAssets: XcmV1MultiassetMultiAssets;1274    readonly isExecutionResult: boolean;1275    readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;1276    readonly isVersion: boolean;1277    readonly asVersion: u32;1278    readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';1279  }12801281  /** @name XcmV2TraitsError (128) */1282  export interface XcmV2TraitsError extends Enum {1283    readonly isOverflow: boolean;1284    readonly isUnimplemented: boolean;1285    readonly isUntrustedReserveLocation: boolean;1286    readonly isUntrustedTeleportLocation: boolean;1287    readonly isMultiLocationFull: boolean;1288    readonly isMultiLocationNotInvertible: boolean;1289    readonly isBadOrigin: boolean;1290    readonly isInvalidLocation: boolean;1291    readonly isAssetNotFound: boolean;1292    readonly isFailedToTransactAsset: boolean;1293    readonly isNotWithdrawable: boolean;1294    readonly isLocationCannotHold: boolean;1295    readonly isExceedsMaxMessageSize: boolean;1296    readonly isDestinationUnsupported: boolean;1297    readonly isTransport: boolean;1298    readonly isUnroutable: boolean;1299    readonly isUnknownClaim: boolean;1300    readonly isFailedToDecode: boolean;1301    readonly isMaxWeightInvalid: boolean;1302    readonly isNotHoldingFees: boolean;1303    readonly isTooExpensive: boolean;1304    readonly isTrap: boolean;1305    readonly asTrap: u64;1306    readonly isUnhandledXcmVersion: boolean;1307    readonly isWeightLimitReached: boolean;1308    readonly asWeightLimitReached: u64;1309    readonly isBarrier: boolean;1310    readonly isWeightNotComputable: boolean;1311    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';1312  }13131314  /** @name XcmV2WeightLimit (129) */1315  export interface XcmV2WeightLimit extends Enum {1316    readonly isUnlimited: boolean;1317    readonly isLimited: boolean;1318    readonly asLimited: Compact<u64>;1319    readonly type: 'Unlimited' | 'Limited';1320  }13211322  /** @name XcmVersionedMultiAssets (130) */1323  export interface XcmVersionedMultiAssets extends Enum {1324    readonly isV0: boolean;1325    readonly asV0: Vec<XcmV0MultiAsset>;1326    readonly isV1: boolean;1327    readonly asV1: XcmV1MultiassetMultiAssets;1328    readonly type: 'V0' | 'V1';1329  }13301331  /** @name CumulusPalletXcmCall (145) */1332  export type CumulusPalletXcmCall = Null;13331334  /** @name CumulusPalletDmpQueueCall (146) */1335  export interface CumulusPalletDmpQueueCall extends Enum {1336    readonly isServiceOverweight: boolean;1337    readonly asServiceOverweight: {1338      readonly index: u64;1339      readonly weightLimit: u64;1340    } & Struct;1341    readonly type: 'ServiceOverweight';1342  }13431344  /** @name PalletInflationCall (147) */1345  export interface PalletInflationCall extends Enum {1346    readonly isStartInflation: boolean;1347    readonly asStartInflation: {1348      readonly inflationStartRelayBlock: u32;1349    } & Struct;1350    readonly type: 'StartInflation';1351  }13521353  /** @name PalletUniqueCall (148) */1354  export interface PalletUniqueCall extends Enum {1355    readonly isCreateCollection: boolean;1356    readonly asCreateCollection: {1357      readonly collectionName: Vec<u16>;1358      readonly collectionDescription: Vec<u16>;1359      readonly tokenPrefix: Bytes;1360      readonly mode: UpDataStructsCollectionMode;1361    } & Struct;1362    readonly isCreateCollectionEx: boolean;1363    readonly asCreateCollectionEx: {1364      readonly data: UpDataStructsCreateCollectionData;1365    } & Struct;1366    readonly isDestroyCollection: boolean;1367    readonly asDestroyCollection: {1368      readonly collectionId: u32;1369    } & Struct;1370    readonly isAddToAllowList: boolean;1371    readonly asAddToAllowList: {1372      readonly collectionId: u32;1373      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1374    } & Struct;1375    readonly isRemoveFromAllowList: boolean;1376    readonly asRemoveFromAllowList: {1377      readonly collectionId: u32;1378      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1379    } & Struct;1380    readonly isChangeCollectionOwner: boolean;1381    readonly asChangeCollectionOwner: {1382      readonly collectionId: u32;1383      readonly newOwner: AccountId32;1384    } & Struct;1385    readonly isAddCollectionAdmin: boolean;1386    readonly asAddCollectionAdmin: {1387      readonly collectionId: u32;1388      readonly newAdmin: PalletEvmAccountBasicCrossAccountIdRepr;1389    } & Struct;1390    readonly isRemoveCollectionAdmin: boolean;1391    readonly asRemoveCollectionAdmin: {1392      readonly collectionId: u32;1393      readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1394    } & Struct;1395    readonly isSetCollectionSponsor: boolean;1396    readonly asSetCollectionSponsor: {1397      readonly collectionId: u32;1398      readonly newSponsor: AccountId32;1399    } & Struct;1400    readonly isConfirmSponsorship: boolean;1401    readonly asConfirmSponsorship: {1402      readonly collectionId: u32;1403    } & Struct;1404    readonly isRemoveCollectionSponsor: boolean;1405    readonly asRemoveCollectionSponsor: {1406      readonly collectionId: u32;1407    } & Struct;1408    readonly isCreateItem: boolean;1409    readonly asCreateItem: {1410      readonly collectionId: u32;1411      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1412      readonly data: UpDataStructsCreateItemData;1413    } & Struct;1414    readonly isCreateMultipleItems: boolean;1415    readonly asCreateMultipleItems: {1416      readonly collectionId: u32;1417      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1418      readonly itemsData: Vec<UpDataStructsCreateItemData>;1419    } & Struct;1420    readonly isSetCollectionProperties: boolean;1421    readonly asSetCollectionProperties: {1422      readonly collectionId: u32;1423      readonly properties: Vec<UpDataStructsProperty>;1424    } & Struct;1425    readonly isDeleteCollectionProperties: boolean;1426    readonly asDeleteCollectionProperties: {1427      readonly collectionId: u32;1428      readonly propertyKeys: Vec<Bytes>;1429    } & Struct;1430    readonly isSetTokenProperties: boolean;1431    readonly asSetTokenProperties: {1432      readonly collectionId: u32;1433      readonly tokenId: u32;1434      readonly properties: Vec<UpDataStructsProperty>;1435    } & Struct;1436    readonly isDeleteTokenProperties: boolean;1437    readonly asDeleteTokenProperties: {1438      readonly collectionId: u32;1439      readonly tokenId: u32;1440      readonly propertyKeys: Vec<Bytes>;1441    } & Struct;1442    readonly isSetTokenPropertyPermissions: boolean;1443    readonly asSetTokenPropertyPermissions: {1444      readonly collectionId: u32;1445      readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1446    } & Struct;1447    readonly isCreateMultipleItemsEx: boolean;1448    readonly asCreateMultipleItemsEx: {1449      readonly collectionId: u32;1450      readonly data: UpDataStructsCreateItemExData;1451    } & Struct;1452    readonly isSetTransfersEnabledFlag: boolean;1453    readonly asSetTransfersEnabledFlag: {1454      readonly collectionId: u32;1455      readonly value: bool;1456    } & Struct;1457    readonly isBurnItem: boolean;1458    readonly asBurnItem: {1459      readonly collectionId: u32;1460      readonly itemId: u32;1461      readonly value: u128;1462    } & Struct;1463    readonly isBurnFrom: boolean;1464    readonly asBurnFrom: {1465      readonly collectionId: u32;1466      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1467      readonly itemId: u32;1468      readonly value: u128;1469    } & Struct;1470    readonly isTransfer: boolean;1471    readonly asTransfer: {1472      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1473      readonly collectionId: u32;1474      readonly itemId: u32;1475      readonly value: u128;1476    } & Struct;1477    readonly isApprove: boolean;1478    readonly asApprove: {1479      readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1480      readonly collectionId: u32;1481      readonly itemId: u32;1482      readonly amount: u128;1483    } & Struct;1484    readonly isTransferFrom: boolean;1485    readonly asTransferFrom: {1486      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1487      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1488      readonly collectionId: u32;1489      readonly itemId: u32;1490      readonly value: u128;1491    } & Struct;1492    readonly isSetCollectionLimits: boolean;1493    readonly asSetCollectionLimits: {1494      readonly collectionId: u32;1495      readonly newLimit: UpDataStructsCollectionLimits;1496    } & Struct;1497    readonly isSetCollectionPermissions: boolean;1498    readonly asSetCollectionPermissions: {1499      readonly collectionId: u32;1500      readonly newPermission: UpDataStructsCollectionPermissions;1501    } & Struct;1502    readonly isRepartition: boolean;1503    readonly asRepartition: {1504      readonly collectionId: u32;1505      readonly tokenId: u32;1506      readonly amount: u128;1507    } & Struct;1508    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';1509  }15101511  /** @name UpDataStructsCollectionMode (154) */1512  export interface UpDataStructsCollectionMode extends Enum {1513    readonly isNft: boolean;1514    readonly isFungible: boolean;1515    readonly asFungible: u8;1516    readonly isReFungible: boolean;1517    readonly type: 'Nft' | 'Fungible' | 'ReFungible';1518  }15191520  /** @name UpDataStructsCreateCollectionData (155) */1521  export interface UpDataStructsCreateCollectionData extends Struct {1522    readonly mode: UpDataStructsCollectionMode;1523    readonly access: Option<UpDataStructsAccessMode>;1524    readonly name: Vec<u16>;1525    readonly description: Vec<u16>;1526    readonly tokenPrefix: Bytes;1527    readonly pendingSponsor: Option<AccountId32>;1528    readonly limits: Option<UpDataStructsCollectionLimits>;1529    readonly permissions: Option<UpDataStructsCollectionPermissions>;1530    readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1531    readonly properties: Vec<UpDataStructsProperty>;1532  }15331534  /** @name UpDataStructsAccessMode (157) */1535  export interface UpDataStructsAccessMode extends Enum {1536    readonly isNormal: boolean;1537    readonly isAllowList: boolean;1538    readonly type: 'Normal' | 'AllowList';1539  }15401541  /** @name UpDataStructsCollectionLimits (160) */1542  export interface UpDataStructsCollectionLimits extends Struct {1543    readonly accountTokenOwnershipLimit: Option<u32>;1544    readonly sponsoredDataSize: Option<u32>;1545    readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;1546    readonly tokenLimit: Option<u32>;1547    readonly sponsorTransferTimeout: Option<u32>;1548    readonly sponsorApproveTimeout: Option<u32>;1549    readonly ownerCanTransfer: Option<bool>;1550    readonly ownerCanDestroy: Option<bool>;1551    readonly transfersEnabled: Option<bool>;1552  }15531554  /** @name UpDataStructsSponsoringRateLimit (162) */1555  export interface UpDataStructsSponsoringRateLimit extends Enum {1556    readonly isSponsoringDisabled: boolean;1557    readonly isBlocks: boolean;1558    readonly asBlocks: u32;1559    readonly type: 'SponsoringDisabled' | 'Blocks';1560  }15611562  /** @name UpDataStructsCollectionPermissions (165) */1563  export interface UpDataStructsCollectionPermissions extends Struct {1564    readonly access: Option<UpDataStructsAccessMode>;1565    readonly mintMode: Option<bool>;1566    readonly nesting: Option<UpDataStructsNestingPermissions>;1567  }15681569  /** @name UpDataStructsNestingPermissions (167) */1570  export interface UpDataStructsNestingPermissions extends Struct {1571    readonly tokenOwner: bool;1572    readonly collectionAdmin: bool;1573    readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;1574  }15751576  /** @name UpDataStructsOwnerRestrictedSet (169) */1577  export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}15781579  /** @name UpDataStructsPropertyKeyPermission (175) */1580  export interface UpDataStructsPropertyKeyPermission extends Struct {1581    readonly key: Bytes;1582    readonly permission: UpDataStructsPropertyPermission;1583  }15841585  /** @name UpDataStructsPropertyPermission (177) */1586  export interface UpDataStructsPropertyPermission extends Struct {1587    readonly mutable: bool;1588    readonly collectionAdmin: bool;1589    readonly tokenOwner: bool;1590  }15911592  /** @name UpDataStructsProperty (180) */1593  export interface UpDataStructsProperty extends Struct {1594    readonly key: Bytes;1595    readonly value: Bytes;1596  }15971598  /** @name PalletEvmAccountBasicCrossAccountIdRepr (183) */1599  export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1600    readonly isSubstrate: boolean;1601    readonly asSubstrate: AccountId32;1602    readonly isEthereum: boolean;1603    readonly asEthereum: H160;1604    readonly type: 'Substrate' | 'Ethereum';1605  }16061607  /** @name UpDataStructsCreateItemData (185) */1608  export interface UpDataStructsCreateItemData extends Enum {1609    readonly isNft: boolean;1610    readonly asNft: UpDataStructsCreateNftData;1611    readonly isFungible: boolean;1612    readonly asFungible: UpDataStructsCreateFungibleData;1613    readonly isReFungible: boolean;1614    readonly asReFungible: UpDataStructsCreateReFungibleData;1615    readonly type: 'Nft' | 'Fungible' | 'ReFungible';1616  }16171618  /** @name UpDataStructsCreateNftData (186) */1619  export interface UpDataStructsCreateNftData extends Struct {1620    readonly properties: Vec<UpDataStructsProperty>;1621  }16221623  /** @name UpDataStructsCreateFungibleData (187) */1624  export interface UpDataStructsCreateFungibleData extends Struct {1625    readonly value: u128;1626  }16271628  /** @name UpDataStructsCreateReFungibleData (188) */1629  export interface UpDataStructsCreateReFungibleData extends Struct {1630    readonly constData: Bytes;1631    readonly pieces: u128;1632    readonly properties: Vec<UpDataStructsProperty>;1633  }16341635  /** @name UpDataStructsCreateItemExData (193) */1636  export interface UpDataStructsCreateItemExData extends Enum {1637    readonly isNft: boolean;1638    readonly asNft: Vec<UpDataStructsCreateNftExData>;1639    readonly isFungible: boolean;1640    readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1641    readonly isRefungibleMultipleItems: boolean;1642    readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;1643    readonly isRefungibleMultipleOwners: boolean;1644    readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;1645    readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';1646  }16471648  /** @name UpDataStructsCreateNftExData (195) */1649  export interface UpDataStructsCreateNftExData extends Struct {1650    readonly properties: Vec<UpDataStructsProperty>;1651    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1652  }16531654  /** @name UpDataStructsCreateRefungibleExData (202) */1655  export interface UpDataStructsCreateRefungibleExData extends Struct {1656    readonly constData: Bytes;1657    readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1658    readonly properties: Vec<UpDataStructsProperty>;1659  }16601661  /** @name PalletUniqueSchedulerCall (204) */1662  export interface PalletUniqueSchedulerCall extends Enum {1663    readonly isScheduleNamed: boolean;1664    readonly asScheduleNamed: {1665      readonly id: U8aFixed;1666      readonly when: u32;1667      readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1668      readonly priority: u8;1669      readonly call: FrameSupportScheduleMaybeHashed;1670    } & Struct;1671    readonly isCancelNamed: boolean;1672    readonly asCancelNamed: {1673      readonly id: U8aFixed;1674    } & Struct;1675    readonly isScheduleNamedAfter: boolean;1676    readonly asScheduleNamedAfter: {1677      readonly id: U8aFixed;1678      readonly after: u32;1679      readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1680      readonly priority: u8;1681      readonly call: FrameSupportScheduleMaybeHashed;1682    } & Struct;1683    readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1684  }16851686  /** @name FrameSupportScheduleMaybeHashed (206) */1687  export interface FrameSupportScheduleMaybeHashed extends Enum {1688    readonly isValue: boolean;1689    readonly asValue: Call;1690    readonly isHash: boolean;1691    readonly asHash: H256;1692    readonly type: 'Value' | 'Hash';1693  }16941695  /** @name PalletTemplateTransactionPaymentCall (207) */1696  export type PalletTemplateTransactionPaymentCall = Null;16971698  /** @name PalletStructureCall (208) */1699  export type PalletStructureCall = Null;17001701  /** @name PalletRmrkCoreCall (209) */1702  export interface PalletRmrkCoreCall extends Enum {1703    readonly isCreateCollection: boolean;1704    readonly asCreateCollection: {1705      readonly metadata: Bytes;1706      readonly max: Option<u32>;1707      readonly symbol: Bytes;1708    } & Struct;1709    readonly isDestroyCollection: boolean;1710    readonly asDestroyCollection: {1711      readonly collectionId: u32;1712    } & Struct;1713    readonly isChangeCollectionIssuer: boolean;1714    readonly asChangeCollectionIssuer: {1715      readonly collectionId: u32;1716      readonly newIssuer: MultiAddress;1717    } & Struct;1718    readonly isLockCollection: boolean;1719    readonly asLockCollection: {1720      readonly collectionId: u32;1721    } & Struct;1722    readonly isMintNft: boolean;1723    readonly asMintNft: {1724      readonly owner: Option<AccountId32>;1725      readonly collectionId: u32;1726      readonly recipient: Option<AccountId32>;1727      readonly royaltyAmount: Option<Permill>;1728      readonly metadata: Bytes;1729      readonly transferable: bool;1730      readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1731    } & Struct;1732    readonly isBurnNft: boolean;1733    readonly asBurnNft: {1734      readonly collectionId: u32;1735      readonly nftId: u32;1736      readonly maxBurns: u32;1737    } & Struct;1738    readonly isSend: boolean;1739    readonly asSend: {1740      readonly rmrkCollectionId: u32;1741      readonly rmrkNftId: u32;1742      readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1743    } & Struct;1744    readonly isAcceptNft: boolean;1745    readonly asAcceptNft: {1746      readonly rmrkCollectionId: u32;1747      readonly rmrkNftId: u32;1748      readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1749    } & Struct;1750    readonly isRejectNft: boolean;1751    readonly asRejectNft: {1752      readonly rmrkCollectionId: u32;1753      readonly rmrkNftId: u32;1754    } & Struct;1755    readonly isAcceptResource: boolean;1756    readonly asAcceptResource: {1757      readonly rmrkCollectionId: u32;1758      readonly rmrkNftId: u32;1759      readonly resourceId: u32;1760    } & Struct;1761    readonly isAcceptResourceRemoval: boolean;1762    readonly asAcceptResourceRemoval: {1763      readonly rmrkCollectionId: u32;1764      readonly rmrkNftId: u32;1765      readonly resourceId: u32;1766    } & Struct;1767    readonly isSetProperty: boolean;1768    readonly asSetProperty: {1769      readonly rmrkCollectionId: Compact<u32>;1770      readonly maybeNftId: Option<u32>;1771      readonly key: Bytes;1772      readonly value: Bytes;1773    } & Struct;1774    readonly isSetPriority: boolean;1775    readonly asSetPriority: {1776      readonly rmrkCollectionId: u32;1777      readonly rmrkNftId: u32;1778      readonly priorities: Vec<u32>;1779    } & Struct;1780    readonly isAddBasicResource: boolean;1781    readonly asAddBasicResource: {1782      readonly rmrkCollectionId: u32;1783      readonly nftId: u32;1784      readonly resource: RmrkTraitsResourceBasicResource;1785    } & Struct;1786    readonly isAddComposableResource: boolean;1787    readonly asAddComposableResource: {1788      readonly rmrkCollectionId: u32;1789      readonly nftId: u32;1790      readonly resource: RmrkTraitsResourceComposableResource;1791    } & Struct;1792    readonly isAddSlotResource: boolean;1793    readonly asAddSlotResource: {1794      readonly rmrkCollectionId: u32;1795      readonly nftId: u32;1796      readonly resource: RmrkTraitsResourceSlotResource;1797    } & Struct;1798    readonly isRemoveResource: boolean;1799    readonly asRemoveResource: {1800      readonly rmrkCollectionId: u32;1801      readonly nftId: u32;1802      readonly resourceId: u32;1803    } & Struct;1804    readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1805  }18061807  /** @name RmrkTraitsResourceResourceTypes (215) */1808  export interface RmrkTraitsResourceResourceTypes extends Enum {1809    readonly isBasic: boolean;1810    readonly asBasic: RmrkTraitsResourceBasicResource;1811    readonly isComposable: boolean;1812    readonly asComposable: RmrkTraitsResourceComposableResource;1813    readonly isSlot: boolean;1814    readonly asSlot: RmrkTraitsResourceSlotResource;1815    readonly type: 'Basic' | 'Composable' | 'Slot';1816  }18171818  /** @name RmrkTraitsResourceBasicResource (217) */1819  export interface RmrkTraitsResourceBasicResource extends Struct {1820    readonly src: Option<Bytes>;1821    readonly metadata: Option<Bytes>;1822    readonly license: Option<Bytes>;1823    readonly thumb: Option<Bytes>;1824  }18251826  /** @name RmrkTraitsResourceComposableResource (219) */1827  export interface RmrkTraitsResourceComposableResource extends Struct {1828    readonly parts: Vec<u32>;1829    readonly base: u32;1830    readonly src: Option<Bytes>;1831    readonly metadata: Option<Bytes>;1832    readonly license: Option<Bytes>;1833    readonly thumb: Option<Bytes>;1834  }18351836  /** @name RmrkTraitsResourceSlotResource (220) */1837  export interface RmrkTraitsResourceSlotResource extends Struct {1838    readonly base: u32;1839    readonly src: Option<Bytes>;1840    readonly metadata: Option<Bytes>;1841    readonly slot: u32;1842    readonly license: Option<Bytes>;1843    readonly thumb: Option<Bytes>;1844  }18451846  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (222) */1847  export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {1848    readonly isAccountId: boolean;1849    readonly asAccountId: AccountId32;1850    readonly isCollectionAndNftTuple: boolean;1851    readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;1852    readonly type: 'AccountId' | 'CollectionAndNftTuple';1853  }18541855  /** @name PalletRmrkEquipCall (226) */1856  export interface PalletRmrkEquipCall extends Enum {1857    readonly isCreateBase: boolean;1858    readonly asCreateBase: {1859      readonly baseType: Bytes;1860      readonly symbol: Bytes;1861      readonly parts: Vec<RmrkTraitsPartPartType>;1862    } & Struct;1863    readonly isThemeAdd: boolean;1864    readonly asThemeAdd: {1865      readonly baseId: u32;1866      readonly theme: RmrkTraitsTheme;1867    } & Struct;1868    readonly isEquippable: boolean;1869    readonly asEquippable: {1870      readonly baseId: u32;1871      readonly slotId: u32;1872      readonly equippables: RmrkTraitsPartEquippableList;1873    } & Struct;1874    readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1875  }18761877  /** @name RmrkTraitsPartPartType (229) */1878  export interface RmrkTraitsPartPartType extends Enum {1879    readonly isFixedPart: boolean;1880    readonly asFixedPart: RmrkTraitsPartFixedPart;1881    readonly isSlotPart: boolean;1882    readonly asSlotPart: RmrkTraitsPartSlotPart;1883    readonly type: 'FixedPart' | 'SlotPart';1884  }18851886  /** @name RmrkTraitsPartFixedPart (231) */1887  export interface RmrkTraitsPartFixedPart extends Struct {1888    readonly id: u32;1889    readonly z: u32;1890    readonly src: Bytes;1891  }18921893  /** @name RmrkTraitsPartSlotPart (232) */1894  export interface RmrkTraitsPartSlotPart extends Struct {1895    readonly id: u32;1896    readonly equippable: RmrkTraitsPartEquippableList;1897    readonly src: Bytes;1898    readonly z: u32;1899  }19001901  /** @name RmrkTraitsPartEquippableList (233) */1902  export interface RmrkTraitsPartEquippableList extends Enum {1903    readonly isAll: boolean;1904    readonly isEmpty: boolean;1905    readonly isCustom: boolean;1906    readonly asCustom: Vec<u32>;1907    readonly type: 'All' | 'Empty' | 'Custom';1908  }19091910  /** @name RmrkTraitsTheme (235) */1911  export interface RmrkTraitsTheme extends Struct {1912    readonly name: Bytes;1913    readonly properties: Vec<RmrkTraitsThemeThemeProperty>;1914    readonly inherit: bool;1915  }19161917  /** @name RmrkTraitsThemeThemeProperty (237) */1918  export interface RmrkTraitsThemeThemeProperty extends Struct {1919    readonly key: Bytes;1920    readonly value: Bytes;1921  }19221923  /** @name PalletEvmCall (239) */1924  export interface PalletEvmCall extends Enum {1925    readonly isWithdraw: boolean;1926    readonly asWithdraw: {1927      readonly address: H160;1928      readonly value: u128;1929    } & Struct;1930    readonly isCall: boolean;1931    readonly asCall: {1932      readonly source: H160;1933      readonly target: H160;1934      readonly input: Bytes;1935      readonly value: U256;1936      readonly gasLimit: u64;1937      readonly maxFeePerGas: U256;1938      readonly maxPriorityFeePerGas: Option<U256>;1939      readonly nonce: Option<U256>;1940      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1941    } & Struct;1942    readonly isCreate: boolean;1943    readonly asCreate: {1944      readonly source: H160;1945      readonly init: Bytes;1946      readonly value: U256;1947      readonly gasLimit: u64;1948      readonly maxFeePerGas: U256;1949      readonly maxPriorityFeePerGas: Option<U256>;1950      readonly nonce: Option<U256>;1951      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1952    } & Struct;1953    readonly isCreate2: boolean;1954    readonly asCreate2: {1955      readonly source: H160;1956      readonly init: Bytes;1957      readonly salt: H256;1958      readonly value: U256;1959      readonly gasLimit: u64;1960      readonly maxFeePerGas: U256;1961      readonly maxPriorityFeePerGas: Option<U256>;1962      readonly nonce: Option<U256>;1963      readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1964    } & Struct;1965    readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1966  }19671968  /** @name PalletEthereumCall (245) */1969  export interface PalletEthereumCall extends Enum {1970    readonly isTransact: boolean;1971    readonly asTransact: {1972      readonly transaction: EthereumTransactionTransactionV2;1973    } & Struct;1974    readonly type: 'Transact';1975  }19761977  /** @name EthereumTransactionTransactionV2 (246) */1978  export interface EthereumTransactionTransactionV2 extends Enum {1979    readonly isLegacy: boolean;1980    readonly asLegacy: EthereumTransactionLegacyTransaction;1981    readonly isEip2930: boolean;1982    readonly asEip2930: EthereumTransactionEip2930Transaction;1983    readonly isEip1559: boolean;1984    readonly asEip1559: EthereumTransactionEip1559Transaction;1985    readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';1986  }19871988  /** @name EthereumTransactionLegacyTransaction (247) */1989  export interface EthereumTransactionLegacyTransaction extends Struct {1990    readonly nonce: U256;1991    readonly gasPrice: U256;1992    readonly gasLimit: U256;1993    readonly action: EthereumTransactionTransactionAction;1994    readonly value: U256;1995    readonly input: Bytes;1996    readonly signature: EthereumTransactionTransactionSignature;1997  }19981999  /** @name EthereumTransactionTransactionAction (248) */2000  export interface EthereumTransactionTransactionAction extends Enum {2001    readonly isCall: boolean;2002    readonly asCall: H160;2003    readonly isCreate: boolean;2004    readonly type: 'Call' | 'Create';2005  }20062007  /** @name EthereumTransactionTransactionSignature (249) */2008  export interface EthereumTransactionTransactionSignature extends Struct {2009    readonly v: u64;2010    readonly r: H256;2011    readonly s: H256;2012  }20132014  /** @name EthereumTransactionEip2930Transaction (251) */2015  export interface EthereumTransactionEip2930Transaction extends Struct {2016    readonly chainId: u64;2017    readonly nonce: U256;2018    readonly gasPrice: U256;2019    readonly gasLimit: U256;2020    readonly action: EthereumTransactionTransactionAction;2021    readonly value: U256;2022    readonly input: Bytes;2023    readonly accessList: Vec<EthereumTransactionAccessListItem>;2024    readonly oddYParity: bool;2025    readonly r: H256;2026    readonly s: H256;2027  }20282029  /** @name EthereumTransactionAccessListItem (253) */2030  export interface EthereumTransactionAccessListItem extends Struct {2031    readonly address: H160;2032    readonly storageKeys: Vec<H256>;2033  }20342035  /** @name EthereumTransactionEip1559Transaction (254) */2036  export interface EthereumTransactionEip1559Transaction extends Struct {2037    readonly chainId: u64;2038    readonly nonce: U256;2039    readonly maxPriorityFeePerGas: U256;2040    readonly maxFeePerGas: U256;2041    readonly gasLimit: U256;2042    readonly action: EthereumTransactionTransactionAction;2043    readonly value: U256;2044    readonly input: Bytes;2045    readonly accessList: Vec<EthereumTransactionAccessListItem>;2046    readonly oddYParity: bool;2047    readonly r: H256;2048    readonly s: H256;2049  }20502051  /** @name PalletEvmMigrationCall (255) */2052  export interface PalletEvmMigrationCall extends Enum {2053    readonly isBegin: boolean;2054    readonly asBegin: {2055      readonly address: H160;2056    } & Struct;2057    readonly isSetData: boolean;2058    readonly asSetData: {2059      readonly address: H160;2060      readonly data: Vec<ITuple<[H256, H256]>>;2061    } & Struct;2062    readonly isFinish: boolean;2063    readonly asFinish: {2064      readonly address: H160;2065      readonly code: Bytes;2066    } & Struct;2067    readonly type: 'Begin' | 'SetData' | 'Finish';2068  }20692070  /** @name PalletSudoEvent (258) */2071  export interface PalletSudoEvent extends Enum {2072    readonly isSudid: boolean;2073    readonly asSudid: {2074      readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2075    } & Struct;2076    readonly isKeyChanged: boolean;2077    readonly asKeyChanged: {2078      readonly oldSudoer: Option<AccountId32>;2079    } & Struct;2080    readonly isSudoAsDone: boolean;2081    readonly asSudoAsDone: {2082      readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2083    } & Struct;2084    readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';2085  }20862087  /** @name SpRuntimeDispatchError (260) */2088  export interface SpRuntimeDispatchError extends Enum {2089    readonly isOther: boolean;2090    readonly isCannotLookup: boolean;2091    readonly isBadOrigin: boolean;2092    readonly isModule: boolean;2093    readonly asModule: SpRuntimeModuleError;2094    readonly isConsumerRemaining: boolean;2095    readonly isNoProviders: boolean;2096    readonly isTooManyConsumers: boolean;2097    readonly isToken: boolean;2098    readonly asToken: SpRuntimeTokenError;2099    readonly isArithmetic: boolean;2100    readonly asArithmetic: SpRuntimeArithmeticError;2101    readonly isTransactional: boolean;2102    readonly asTransactional: SpRuntimeTransactionalError;2103    readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2104  }21052106  /** @name SpRuntimeModuleError (261) */2107  export interface SpRuntimeModuleError extends Struct {2108    readonly index: u8;2109    readonly error: U8aFixed;2110  }21112112  /** @name SpRuntimeTokenError (262) */2113  export interface SpRuntimeTokenError extends Enum {2114    readonly isNoFunds: boolean;2115    readonly isWouldDie: boolean;2116    readonly isBelowMinimum: boolean;2117    readonly isCannotCreate: boolean;2118    readonly isUnknownAsset: boolean;2119    readonly isFrozen: boolean;2120    readonly isUnsupported: boolean;2121    readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2122  }21232124  /** @name SpRuntimeArithmeticError (263) */2125  export interface SpRuntimeArithmeticError extends Enum {2126    readonly isUnderflow: boolean;2127    readonly isOverflow: boolean;2128    readonly isDivisionByZero: boolean;2129    readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2130  }21312132  /** @name SpRuntimeTransactionalError (264) */2133  export interface SpRuntimeTransactionalError extends Enum {2134    readonly isLimitReached: boolean;2135    readonly isNoLayer: boolean;2136    readonly type: 'LimitReached' | 'NoLayer';2137  }21382139  /** @name PalletSudoError (265) */2140  export interface PalletSudoError extends Enum {2141    readonly isRequireSudo: boolean;2142    readonly type: 'RequireSudo';2143  }21442145  /** @name FrameSystemAccountInfo (266) */2146  export interface FrameSystemAccountInfo extends Struct {2147    readonly nonce: u32;2148    readonly consumers: u32;2149    readonly providers: u32;2150    readonly sufficients: u32;2151    readonly data: PalletBalancesAccountData;2152  }21532154  /** @name FrameSupportWeightsPerDispatchClassU64 (267) */2155  export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {2156    readonly normal: u64;2157    readonly operational: u64;2158    readonly mandatory: u64;2159  }21602161  /** @name SpRuntimeDigest (268) */2162  export interface SpRuntimeDigest extends Struct {2163    readonly logs: Vec<SpRuntimeDigestDigestItem>;2164  }21652166  /** @name SpRuntimeDigestDigestItem (270) */2167  export interface SpRuntimeDigestDigestItem extends Enum {2168    readonly isOther: boolean;2169    readonly asOther: Bytes;2170    readonly isConsensus: boolean;2171    readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2172    readonly isSeal: boolean;2173    readonly asSeal: ITuple<[U8aFixed, Bytes]>;2174    readonly isPreRuntime: boolean;2175    readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2176    readonly isRuntimeEnvironmentUpdated: boolean;2177    readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2178  }21792180  /** @name FrameSystemEventRecord (272) */2181  export interface FrameSystemEventRecord extends Struct {2182    readonly phase: FrameSystemPhase;2183    readonly event: Event;2184    readonly topics: Vec<H256>;2185  }21862187  /** @name FrameSystemEvent (274) */2188  export interface FrameSystemEvent extends Enum {2189    readonly isExtrinsicSuccess: boolean;2190    readonly asExtrinsicSuccess: {2191      readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2192    } & Struct;2193    readonly isExtrinsicFailed: boolean;2194    readonly asExtrinsicFailed: {2195      readonly dispatchError: SpRuntimeDispatchError;2196      readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2197    } & Struct;2198    readonly isCodeUpdated: boolean;2199    readonly isNewAccount: boolean;2200    readonly asNewAccount: {2201      readonly account: AccountId32;2202    } & Struct;2203    readonly isKilledAccount: boolean;2204    readonly asKilledAccount: {2205      readonly account: AccountId32;2206    } & Struct;2207    readonly isRemarked: boolean;2208    readonly asRemarked: {2209      readonly sender: AccountId32;2210      readonly hash_: H256;2211    } & Struct;2212    readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';2213  }22142215  /** @name FrameSupportWeightsDispatchInfo (275) */2216  export interface FrameSupportWeightsDispatchInfo extends Struct {2217    readonly weight: u64;2218    readonly class: FrameSupportWeightsDispatchClass;2219    readonly paysFee: FrameSupportWeightsPays;2220  }22212222  /** @name FrameSupportWeightsDispatchClass (276) */2223  export interface FrameSupportWeightsDispatchClass extends Enum {2224    readonly isNormal: boolean;2225    readonly isOperational: boolean;2226    readonly isMandatory: boolean;2227    readonly type: 'Normal' | 'Operational' | 'Mandatory';2228  }22292230  /** @name FrameSupportWeightsPays (277) */2231  export interface FrameSupportWeightsPays extends Enum {2232    readonly isYes: boolean;2233    readonly isNo: boolean;2234    readonly type: 'Yes' | 'No';2235  }22362237  /** @name OrmlVestingModuleEvent (278) */2238  export interface OrmlVestingModuleEvent extends Enum {2239    readonly isVestingScheduleAdded: boolean;2240    readonly asVestingScheduleAdded: {2241      readonly from: AccountId32;2242      readonly to: AccountId32;2243      readonly vestingSchedule: OrmlVestingVestingSchedule;2244    } & Struct;2245    readonly isClaimed: boolean;2246    readonly asClaimed: {2247      readonly who: AccountId32;2248      readonly amount: u128;2249    } & Struct;2250    readonly isVestingSchedulesUpdated: boolean;2251    readonly asVestingSchedulesUpdated: {2252      readonly who: AccountId32;2253    } & Struct;2254    readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';2255  }22562257  /** @name CumulusPalletXcmpQueueEvent (279) */2258  export interface CumulusPalletXcmpQueueEvent extends Enum {2259    readonly isSuccess: boolean;2260    readonly asSuccess: Option<H256>;2261    readonly isFail: boolean;2262    readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;2263    readonly isBadVersion: boolean;2264    readonly asBadVersion: Option<H256>;2265    readonly isBadFormat: boolean;2266    readonly asBadFormat: Option<H256>;2267    readonly isUpwardMessageSent: boolean;2268    readonly asUpwardMessageSent: Option<H256>;2269    readonly isXcmpMessageSent: boolean;2270    readonly asXcmpMessageSent: Option<H256>;2271    readonly isOverweightEnqueued: boolean;2272    readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;2273    readonly isOverweightServiced: boolean;2274    readonly asOverweightServiced: ITuple<[u64, u64]>;2275    readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';2276  }22772278  /** @name PalletXcmEvent (280) */2279  export interface PalletXcmEvent extends Enum {2280    readonly isAttempted: boolean;2281    readonly asAttempted: XcmV2TraitsOutcome;2282    readonly isSent: boolean;2283    readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;2284    readonly isUnexpectedResponse: boolean;2285    readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;2286    readonly isResponseReady: boolean;2287    readonly asResponseReady: ITuple<[u64, XcmV2Response]>;2288    readonly isNotified: boolean;2289    readonly asNotified: ITuple<[u64, u8, u8]>;2290    readonly isNotifyOverweight: boolean;2291    readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;2292    readonly isNotifyDispatchError: boolean;2293    readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;2294    readonly isNotifyDecodeFailed: boolean;2295    readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2296    readonly isInvalidResponder: boolean;2297    readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2298    readonly isInvalidResponderVersion: boolean;2299    readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2300    readonly isResponseTaken: boolean;2301    readonly asResponseTaken: u64;2302    readonly isAssetsTrapped: boolean;2303    readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2304    readonly isVersionChangeNotified: boolean;2305    readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2306    readonly isSupportedVersionChanged: boolean;2307    readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2308    readonly isNotifyTargetSendFail: boolean;2309    readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2310    readonly isNotifyTargetMigrationFail: boolean;2311    readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2312    readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2313  }23142315  /** @name XcmV2TraitsOutcome (281) */2316  export interface XcmV2TraitsOutcome extends Enum {2317    readonly isComplete: boolean;2318    readonly asComplete: u64;2319    readonly isIncomplete: boolean;2320    readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;2321    readonly isError: boolean;2322    readonly asError: XcmV2TraitsError;2323    readonly type: 'Complete' | 'Incomplete' | 'Error';2324  }23252326  /** @name CumulusPalletXcmEvent (283) */2327  export interface CumulusPalletXcmEvent extends Enum {2328    readonly isInvalidFormat: boolean;2329    readonly asInvalidFormat: U8aFixed;2330    readonly isUnsupportedVersion: boolean;2331    readonly asUnsupportedVersion: U8aFixed;2332    readonly isExecutedDownward: boolean;2333    readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;2334    readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';2335  }23362337  /** @name CumulusPalletDmpQueueEvent (284) */2338  export interface CumulusPalletDmpQueueEvent extends Enum {2339    readonly isInvalidFormat: boolean;2340    readonly asInvalidFormat: {2341      readonly messageId: U8aFixed;2342    } & Struct;2343    readonly isUnsupportedVersion: boolean;2344    readonly asUnsupportedVersion: {2345      readonly messageId: U8aFixed;2346    } & Struct;2347    readonly isExecutedDownward: boolean;2348    readonly asExecutedDownward: {2349      readonly messageId: U8aFixed;2350      readonly outcome: XcmV2TraitsOutcome;2351    } & Struct;2352    readonly isWeightExhausted: boolean;2353    readonly asWeightExhausted: {2354      readonly messageId: U8aFixed;2355      readonly remainingWeight: u64;2356      readonly requiredWeight: u64;2357    } & Struct;2358    readonly isOverweightEnqueued: boolean;2359    readonly asOverweightEnqueued: {2360      readonly messageId: U8aFixed;2361      readonly overweightIndex: u64;2362      readonly requiredWeight: u64;2363    } & Struct;2364    readonly isOverweightServiced: boolean;2365    readonly asOverweightServiced: {2366      readonly overweightIndex: u64;2367      readonly weightUsed: u64;2368    } & Struct;2369    readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';2370  }23712372  /** @name PalletUniqueRawEvent (285) */2373  export interface PalletUniqueRawEvent extends Enum {2374    readonly isCollectionSponsorRemoved: boolean;2375    readonly asCollectionSponsorRemoved: u32;2376    readonly isCollectionAdminAdded: boolean;2377    readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2378    readonly isCollectionOwnedChanged: boolean;2379    readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;2380    readonly isCollectionSponsorSet: boolean;2381    readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;2382    readonly isSponsorshipConfirmed: boolean;2383    readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;2384    readonly isCollectionAdminRemoved: boolean;2385    readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2386    readonly isAllowListAddressRemoved: boolean;2387    readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2388    readonly isAllowListAddressAdded: boolean;2389    readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2390    readonly isCollectionLimitSet: boolean;2391    readonly asCollectionLimitSet: u32;2392    readonly isCollectionPermissionSet: boolean;2393    readonly asCollectionPermissionSet: u32;2394    readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';2395  }23962397  /** @name PalletUniqueSchedulerEvent (286) */2398  export interface PalletUniqueSchedulerEvent extends Enum {2399    readonly isScheduled: boolean;2400    readonly asScheduled: {2401      readonly when: u32;2402      readonly index: u32;2403    } & Struct;2404    readonly isCanceled: boolean;2405    readonly asCanceled: {2406      readonly when: u32;2407      readonly index: u32;2408    } & Struct;2409    readonly isDispatched: boolean;2410    readonly asDispatched: {2411      readonly task: ITuple<[u32, u32]>;2412      readonly id: Option<U8aFixed>;2413      readonly result: Result<Null, SpRuntimeDispatchError>;2414    } & Struct;2415    readonly isCallLookupFailed: boolean;2416    readonly asCallLookupFailed: {2417      readonly task: ITuple<[u32, u32]>;2418      readonly id: Option<U8aFixed>;2419      readonly error: FrameSupportScheduleLookupError;2420    } & Struct;2421    readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';2422  }24232424  /** @name FrameSupportScheduleLookupError (288) */2425  export interface FrameSupportScheduleLookupError extends Enum {2426    readonly isUnknown: boolean;2427    readonly isBadFormat: boolean;2428    readonly type: 'Unknown' | 'BadFormat';2429  }24302431  /** @name PalletCommonEvent (289) */2432  export interface PalletCommonEvent extends Enum {2433    readonly isCollectionCreated: boolean;2434    readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;2435    readonly isCollectionDestroyed: boolean;2436    readonly asCollectionDestroyed: u32;2437    readonly isItemCreated: boolean;2438    readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2439    readonly isItemDestroyed: boolean;2440    readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2441    readonly isTransfer: boolean;2442    readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2443    readonly isApproved: boolean;2444    readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2445    readonly isCollectionPropertySet: boolean;2446    readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;2447    readonly isCollectionPropertyDeleted: boolean;2448    readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;2449    readonly isTokenPropertySet: boolean;2450    readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;2451    readonly isTokenPropertyDeleted: boolean;2452    readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;2453    readonly isPropertyPermissionSet: boolean;2454    readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;2455    readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';2456  }24572458  /** @name PalletStructureEvent (290) */2459  export interface PalletStructureEvent extends Enum {2460    readonly isExecuted: boolean;2461    readonly asExecuted: Result<Null, SpRuntimeDispatchError>;2462    readonly type: 'Executed';2463  }24642465  /** @name PalletRmrkCoreEvent (291) */2466  export interface PalletRmrkCoreEvent extends Enum {2467    readonly isCollectionCreated: boolean;2468    readonly asCollectionCreated: {2469      readonly issuer: AccountId32;2470      readonly collectionId: u32;2471    } & Struct;2472    readonly isCollectionDestroyed: boolean;2473    readonly asCollectionDestroyed: {2474      readonly issuer: AccountId32;2475      readonly collectionId: u32;2476    } & Struct;2477    readonly isIssuerChanged: boolean;2478    readonly asIssuerChanged: {2479      readonly oldIssuer: AccountId32;2480      readonly newIssuer: AccountId32;2481      readonly collectionId: u32;2482    } & Struct;2483    readonly isCollectionLocked: boolean;2484    readonly asCollectionLocked: {2485      readonly issuer: AccountId32;2486      readonly collectionId: u32;2487    } & Struct;2488    readonly isNftMinted: boolean;2489    readonly asNftMinted: {2490      readonly owner: AccountId32;2491      readonly collectionId: u32;2492      readonly nftId: u32;2493    } & Struct;2494    readonly isNftBurned: boolean;2495    readonly asNftBurned: {2496      readonly owner: AccountId32;2497      readonly nftId: u32;2498    } & Struct;2499    readonly isNftSent: boolean;2500    readonly asNftSent: {2501      readonly sender: AccountId32;2502      readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2503      readonly collectionId: u32;2504      readonly nftId: u32;2505      readonly approvalRequired: bool;2506    } & Struct;2507    readonly isNftAccepted: boolean;2508    readonly asNftAccepted: {2509      readonly sender: AccountId32;2510      readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2511      readonly collectionId: u32;2512      readonly nftId: u32;2513    } & Struct;2514    readonly isNftRejected: boolean;2515    readonly asNftRejected: {2516      readonly sender: AccountId32;2517      readonly collectionId: u32;2518      readonly nftId: u32;2519    } & Struct;2520    readonly isPropertySet: boolean;2521    readonly asPropertySet: {2522      readonly collectionId: u32;2523      readonly maybeNftId: Option<u32>;2524      readonly key: Bytes;2525      readonly value: Bytes;2526    } & Struct;2527    readonly isResourceAdded: boolean;2528    readonly asResourceAdded: {2529      readonly nftId: u32;2530      readonly resourceId: u32;2531    } & Struct;2532    readonly isResourceRemoval: boolean;2533    readonly asResourceRemoval: {2534      readonly nftId: u32;2535      readonly resourceId: u32;2536    } & Struct;2537    readonly isResourceAccepted: boolean;2538    readonly asResourceAccepted: {2539      readonly nftId: u32;2540      readonly resourceId: u32;2541    } & Struct;2542    readonly isResourceRemovalAccepted: boolean;2543    readonly asResourceRemovalAccepted: {2544      readonly nftId: u32;2545      readonly resourceId: u32;2546    } & Struct;2547    readonly isPrioritySet: boolean;2548    readonly asPrioritySet: {2549      readonly collectionId: u32;2550      readonly nftId: u32;2551    } & Struct;2552    readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';2553  }25542555  /** @name PalletRmrkEquipEvent (292) */2556  export interface PalletRmrkEquipEvent extends Enum {2557    readonly isBaseCreated: boolean;2558    readonly asBaseCreated: {2559      readonly issuer: AccountId32;2560      readonly baseId: u32;2561    } & Struct;2562    readonly isEquippablesUpdated: boolean;2563    readonly asEquippablesUpdated: {2564      readonly baseId: u32;2565      readonly slotId: u32;2566    } & Struct;2567    readonly type: 'BaseCreated' | 'EquippablesUpdated';2568  }25692570  /** @name PalletEvmEvent (293) */2571  export interface PalletEvmEvent extends Enum {2572    readonly isLog: boolean;2573    readonly asLog: EthereumLog;2574    readonly isCreated: boolean;2575    readonly asCreated: H160;2576    readonly isCreatedFailed: boolean;2577    readonly asCreatedFailed: H160;2578    readonly isExecuted: boolean;2579    readonly asExecuted: H160;2580    readonly isExecutedFailed: boolean;2581    readonly asExecutedFailed: H160;2582    readonly isBalanceDeposit: boolean;2583    readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;2584    readonly isBalanceWithdraw: boolean;2585    readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;2586    readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';2587  }25882589  /** @name EthereumLog (294) */2590  export interface EthereumLog extends Struct {2591    readonly address: H160;2592    readonly topics: Vec<H256>;2593    readonly data: Bytes;2594  }25952596  /** @name PalletEthereumEvent (295) */2597  export interface PalletEthereumEvent extends Enum {2598    readonly isExecuted: boolean;2599    readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;2600    readonly type: 'Executed';2601  }26022603  /** @name EvmCoreErrorExitReason (296) */2604  export interface EvmCoreErrorExitReason extends Enum {2605    readonly isSucceed: boolean;2606    readonly asSucceed: EvmCoreErrorExitSucceed;2607    readonly isError: boolean;2608    readonly asError: EvmCoreErrorExitError;2609    readonly isRevert: boolean;2610    readonly asRevert: EvmCoreErrorExitRevert;2611    readonly isFatal: boolean;2612    readonly asFatal: EvmCoreErrorExitFatal;2613    readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';2614  }26152616  /** @name EvmCoreErrorExitSucceed (297) */2617  export interface EvmCoreErrorExitSucceed extends Enum {2618    readonly isStopped: boolean;2619    readonly isReturned: boolean;2620    readonly isSuicided: boolean;2621    readonly type: 'Stopped' | 'Returned' | 'Suicided';2622  }26232624  /** @name EvmCoreErrorExitError (298) */2625  export interface EvmCoreErrorExitError extends Enum {2626    readonly isStackUnderflow: boolean;2627    readonly isStackOverflow: boolean;2628    readonly isInvalidJump: boolean;2629    readonly isInvalidRange: boolean;2630    readonly isDesignatedInvalid: boolean;2631    readonly isCallTooDeep: boolean;2632    readonly isCreateCollision: boolean;2633    readonly isCreateContractLimit: boolean;2634    readonly isOutOfOffset: boolean;2635    readonly isOutOfGas: boolean;2636    readonly isOutOfFund: boolean;2637    readonly isPcUnderflow: boolean;2638    readonly isCreateEmpty: boolean;2639    readonly isOther: boolean;2640    readonly asOther: Text;2641    readonly isInvalidCode: boolean;2642    readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';2643  }26442645  /** @name EvmCoreErrorExitRevert (301) */2646  export interface EvmCoreErrorExitRevert extends Enum {2647    readonly isReverted: boolean;2648    readonly type: 'Reverted';2649  }26502651  /** @name EvmCoreErrorExitFatal (302) */2652  export interface EvmCoreErrorExitFatal extends Enum {2653    readonly isNotSupported: boolean;2654    readonly isUnhandledInterrupt: boolean;2655    readonly isCallErrorAsFatal: boolean;2656    readonly asCallErrorAsFatal: EvmCoreErrorExitError;2657    readonly isOther: boolean;2658    readonly asOther: Text;2659    readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';2660  }26612662  /** @name FrameSystemPhase (303) */2663  export interface FrameSystemPhase extends Enum {2664    readonly isApplyExtrinsic: boolean;2665    readonly asApplyExtrinsic: u32;2666    readonly isFinalization: boolean;2667    readonly isInitialization: boolean;2668    readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';2669  }26702671  /** @name FrameSystemLastRuntimeUpgradeInfo (305) */2672  export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {2673    readonly specVersion: Compact<u32>;2674    readonly specName: Text;2675  }26762677  /** @name FrameSystemLimitsBlockWeights (306) */2678  export interface FrameSystemLimitsBlockWeights extends Struct {2679    readonly baseBlock: u64;2680    readonly maxBlock: u64;2681    readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;2682  }26832684  /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (307) */2685  export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {2686    readonly normal: FrameSystemLimitsWeightsPerClass;2687    readonly operational: FrameSystemLimitsWeightsPerClass;2688    readonly mandatory: FrameSystemLimitsWeightsPerClass;2689  }26902691  /** @name FrameSystemLimitsWeightsPerClass (308) */2692  export interface FrameSystemLimitsWeightsPerClass extends Struct {2693    readonly baseExtrinsic: u64;2694    readonly maxExtrinsic: Option<u64>;2695    readonly maxTotal: Option<u64>;2696    readonly reserved: Option<u64>;2697  }26982699  /** @name FrameSystemLimitsBlockLength (310) */2700  export interface FrameSystemLimitsBlockLength extends Struct {2701    readonly max: FrameSupportWeightsPerDispatchClassU32;2702  }27032704  /** @name FrameSupportWeightsPerDispatchClassU32 (311) */2705  export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {2706    readonly normal: u32;2707    readonly operational: u32;2708    readonly mandatory: u32;2709  }27102711  /** @name FrameSupportWeightsRuntimeDbWeight (312) */2712  export interface FrameSupportWeightsRuntimeDbWeight extends Struct {2713    readonly read: u64;2714    readonly write: u64;2715  }27162717  /** @name SpVersionRuntimeVersion (313) */2718  export interface SpVersionRuntimeVersion extends Struct {2719    readonly specName: Text;2720    readonly implName: Text;2721    readonly authoringVersion: u32;2722    readonly specVersion: u32;2723    readonly implVersion: u32;2724    readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2725    readonly transactionVersion: u32;2726    readonly stateVersion: u8;2727  }27282729  /** @name FrameSystemError (317) */2730  export interface FrameSystemError extends Enum {2731    readonly isInvalidSpecName: boolean;2732    readonly isSpecVersionNeedsToIncrease: boolean;2733    readonly isFailedToExtractRuntimeVersion: boolean;2734    readonly isNonDefaultComposite: boolean;2735    readonly isNonZeroRefCount: boolean;2736    readonly isCallFiltered: boolean;2737    readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';2738  }27392740  /** @name OrmlVestingModuleError (319) */2741  export interface OrmlVestingModuleError extends Enum {2742    readonly isZeroVestingPeriod: boolean;2743    readonly isZeroVestingPeriodCount: boolean;2744    readonly isInsufficientBalanceToLock: boolean;2745    readonly isTooManyVestingSchedules: boolean;2746    readonly isAmountLow: boolean;2747    readonly isMaxVestingSchedulesExceeded: boolean;2748    readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';2749  }27502751  /** @name CumulusPalletXcmpQueueInboundChannelDetails (321) */2752  export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {2753    readonly sender: u32;2754    readonly state: CumulusPalletXcmpQueueInboundState;2755    readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;2756  }27572758  /** @name CumulusPalletXcmpQueueInboundState (322) */2759  export interface CumulusPalletXcmpQueueInboundState extends Enum {2760    readonly isOk: boolean;2761    readonly isSuspended: boolean;2762    readonly type: 'Ok' | 'Suspended';2763  }27642765  /** @name PolkadotParachainPrimitivesXcmpMessageFormat (325) */2766  export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2767    readonly isConcatenatedVersionedXcm: boolean;2768    readonly isConcatenatedEncodedBlob: boolean;2769    readonly isSignals: boolean;2770    readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2771  }27722773  /** @name CumulusPalletXcmpQueueOutboundChannelDetails (328) */2774  export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {2775    readonly recipient: u32;2776    readonly state: CumulusPalletXcmpQueueOutboundState;2777    readonly signalsExist: bool;2778    readonly firstIndex: u16;2779    readonly lastIndex: u16;2780  }27812782  /** @name CumulusPalletXcmpQueueOutboundState (329) */2783  export interface CumulusPalletXcmpQueueOutboundState extends Enum {2784    readonly isOk: boolean;2785    readonly isSuspended: boolean;2786    readonly type: 'Ok' | 'Suspended';2787  }27882789  /** @name CumulusPalletXcmpQueueQueueConfigData (331) */2790  export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {2791    readonly suspendThreshold: u32;2792    readonly dropThreshold: u32;2793    readonly resumeThreshold: u32;2794    readonly thresholdWeight: u64;2795    readonly weightRestrictDecay: u64;2796    readonly xcmpMaxIndividualWeight: u64;2797  }27982799  /** @name CumulusPalletXcmpQueueError (333) */2800  export interface CumulusPalletXcmpQueueError extends Enum {2801    readonly isFailedToSend: boolean;2802    readonly isBadXcmOrigin: boolean;2803    readonly isBadXcm: boolean;2804    readonly isBadOverweightIndex: boolean;2805    readonly isWeightOverLimit: boolean;2806    readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';2807  }28082809  /** @name PalletXcmError (334) */2810  export interface PalletXcmError extends Enum {2811    readonly isUnreachable: boolean;2812    readonly isSendFailure: boolean;2813    readonly isFiltered: boolean;2814    readonly isUnweighableMessage: boolean;2815    readonly isDestinationNotInvertible: boolean;2816    readonly isEmpty: boolean;2817    readonly isCannotReanchor: boolean;2818    readonly isTooManyAssets: boolean;2819    readonly isInvalidOrigin: boolean;2820    readonly isBadVersion: boolean;2821    readonly isBadLocation: boolean;2822    readonly isNoSubscription: boolean;2823    readonly isAlreadySubscribed: boolean;2824    readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';2825  }28262827  /** @name CumulusPalletXcmError (335) */2828  export type CumulusPalletXcmError = Null;28292830  /** @name CumulusPalletDmpQueueConfigData (336) */2831  export interface CumulusPalletDmpQueueConfigData extends Struct {2832    readonly maxIndividual: u64;2833  }28342835  /** @name CumulusPalletDmpQueuePageIndexData (337) */2836  export interface CumulusPalletDmpQueuePageIndexData extends Struct {2837    readonly beginUsed: u32;2838    readonly endUsed: u32;2839    readonly overweightCount: u64;2840  }28412842  /** @name CumulusPalletDmpQueueError (340) */2843  export interface CumulusPalletDmpQueueError extends Enum {2844    readonly isUnknown: boolean;2845    readonly isOverLimit: boolean;2846    readonly type: 'Unknown' | 'OverLimit';2847  }28482849  /** @name PalletUniqueError (344) */2850  export interface PalletUniqueError extends Enum {2851    readonly isCollectionDecimalPointLimitExceeded: boolean;2852    readonly isConfirmUnsetSponsorFail: boolean;2853    readonly isEmptyArgument: boolean;2854    readonly isRepartitionCalledOnNonRefungibleCollection: boolean;2855    readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';2856  }28572858  /** @name PalletUniqueSchedulerScheduledV3 (347) */2859  export interface PalletUniqueSchedulerScheduledV3 extends Struct {2860    readonly maybeId: Option<U8aFixed>;2861    readonly priority: u8;2862    readonly call: FrameSupportScheduleMaybeHashed;2863    readonly maybePeriodic: Option<ITuple<[u32, u32]>>;2864    readonly origin: OpalRuntimeOriginCaller;2865  }28662867  /** @name OpalRuntimeOriginCaller (348) */2868  export interface OpalRuntimeOriginCaller extends Enum {2869    readonly isVoid: boolean;2870    readonly isSystem: boolean;2871    readonly asSystem: FrameSupportDispatchRawOrigin;2872    readonly isPolkadotXcm: boolean;2873    readonly asPolkadotXcm: PalletXcmOrigin;2874    readonly isCumulusXcm: boolean;2875    readonly asCumulusXcm: CumulusPalletXcmOrigin;2876    readonly isEthereum: boolean;2877    readonly asEthereum: PalletEthereumRawOrigin;2878    readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';2879  }28802881  /** @name FrameSupportDispatchRawOrigin (349) */2882  export interface FrameSupportDispatchRawOrigin extends Enum {2883    readonly isRoot: boolean;2884    readonly isSigned: boolean;2885    readonly asSigned: AccountId32;2886    readonly isNone: boolean;2887    readonly type: 'Root' | 'Signed' | 'None';2888  }28892890  /** @name PalletXcmOrigin (350) */2891  export interface PalletXcmOrigin extends Enum {2892    readonly isXcm: boolean;2893    readonly asXcm: XcmV1MultiLocation;2894    readonly isResponse: boolean;2895    readonly asResponse: XcmV1MultiLocation;2896    readonly type: 'Xcm' | 'Response';2897  }28982899  /** @name CumulusPalletXcmOrigin (351) */2900  export interface CumulusPalletXcmOrigin extends Enum {2901    readonly isRelay: boolean;2902    readonly isSiblingParachain: boolean;2903    readonly asSiblingParachain: u32;2904    readonly type: 'Relay' | 'SiblingParachain';2905  }29062907  /** @name PalletEthereumRawOrigin (352) */2908  export interface PalletEthereumRawOrigin extends Enum {2909    readonly isEthereumTransaction: boolean;2910    readonly asEthereumTransaction: H160;2911    readonly type: 'EthereumTransaction';2912  }29132914  /** @name SpCoreVoid (353) */2915  export type SpCoreVoid = Null;29162917  /** @name PalletUniqueSchedulerError (354) */2918  export interface PalletUniqueSchedulerError extends Enum {2919    readonly isFailedToSchedule: boolean;2920    readonly isNotFound: boolean;2921    readonly isTargetBlockNumberInPast: boolean;2922    readonly isRescheduleNoChange: boolean;2923    readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';2924  }29252926  /** @name UpDataStructsCollection (355) */2927  export interface UpDataStructsCollection extends Struct {2928    readonly owner: AccountId32;2929    readonly mode: UpDataStructsCollectionMode;2930    readonly name: Vec<u16>;2931    readonly description: Vec<u16>;2932    readonly tokenPrefix: Bytes;2933    readonly sponsorship: UpDataStructsSponsorshipState;2934    readonly limits: UpDataStructsCollectionLimits;2935    readonly permissions: UpDataStructsCollectionPermissions;2936    readonly externalCollection: bool;2937  }29382939  /** @name UpDataStructsSponsorshipState (356) */2940  export interface UpDataStructsSponsorshipState extends Enum {2941    readonly isDisabled: boolean;2942    readonly isUnconfirmed: boolean;2943    readonly asUnconfirmed: AccountId32;2944    readonly isConfirmed: boolean;2945    readonly asConfirmed: AccountId32;2946    readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2947  }29482949  /** @name UpDataStructsProperties (357) */2950  export interface UpDataStructsProperties extends Struct {2951    readonly map: UpDataStructsPropertiesMapBoundedVec;2952    readonly consumedSpace: u32;2953    readonly spaceLimit: u32;2954  }29552956  /** @name UpDataStructsPropertiesMapBoundedVec (358) */2957  export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}29582959  /** @name UpDataStructsPropertiesMapPropertyPermission (363) */2960  export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}29612962  /** @name UpDataStructsCollectionStats (370) */2963  export interface UpDataStructsCollectionStats extends Struct {2964    readonly created: u32;2965    readonly destroyed: u32;2966    readonly alive: u32;2967  }29682969  /** @name UpDataStructsTokenChild (371) */2970  export interface UpDataStructsTokenChild extends Struct {2971    readonly token: u32;2972    readonly collection: u32;2973  }29742975  /** @name PhantomTypeUpDataStructs (372) */2976  export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}29772978  /** @name UpDataStructsTokenData (374) */2979  export interface UpDataStructsTokenData extends Struct {2980    readonly properties: Vec<UpDataStructsProperty>;2981    readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2982    readonly pieces: u128;2983  }29842985  /** @name UpDataStructsRpcCollection (376) */2986  export interface UpDataStructsRpcCollection extends Struct {2987    readonly owner: AccountId32;2988    readonly mode: UpDataStructsCollectionMode;2989    readonly name: Vec<u16>;2990    readonly description: Vec<u16>;2991    readonly tokenPrefix: Bytes;2992    readonly sponsorship: UpDataStructsSponsorshipState;2993    readonly limits: UpDataStructsCollectionLimits;2994    readonly permissions: UpDataStructsCollectionPermissions;2995    readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2996    readonly properties: Vec<UpDataStructsProperty>;2997    readonly readOnly: bool;2998  }29993000  /** @name RmrkTraitsCollectionCollectionInfo (377) */3001  export interface RmrkTraitsCollectionCollectionInfo extends Struct {3002    readonly issuer: AccountId32;3003    readonly metadata: Bytes;3004    readonly max: Option<u32>;3005    readonly symbol: Bytes;3006    readonly nftsCount: u32;3007  }30083009  /** @name RmrkTraitsNftNftInfo (378) */3010  export interface RmrkTraitsNftNftInfo extends Struct {3011    readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;3012    readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;3013    readonly metadata: Bytes;3014    readonly equipped: bool;3015    readonly pending: bool;3016  }30173018  /** @name RmrkTraitsNftRoyaltyInfo (380) */3019  export interface RmrkTraitsNftRoyaltyInfo extends Struct {3020    readonly recipient: AccountId32;3021    readonly amount: Permill;3022  }30233024  /** @name RmrkTraitsResourceResourceInfo (381) */3025  export interface RmrkTraitsResourceResourceInfo extends Struct {3026    readonly id: u32;3027    readonly resource: RmrkTraitsResourceResourceTypes;3028    readonly pending: bool;3029    readonly pendingRemoval: bool;3030  }30313032  /** @name RmrkTraitsPropertyPropertyInfo (382) */3033  export interface RmrkTraitsPropertyPropertyInfo extends Struct {3034    readonly key: Bytes;3035    readonly value: Bytes;3036  }30373038  /** @name RmrkTraitsBaseBaseInfo (383) */3039  export interface RmrkTraitsBaseBaseInfo extends Struct {3040    readonly issuer: AccountId32;3041    readonly baseType: Bytes;3042    readonly symbol: Bytes;3043  }30443045  /** @name RmrkTraitsNftNftChild (384) */3046  export interface RmrkTraitsNftNftChild extends Struct {3047    readonly collectionId: u32;3048    readonly nftId: u32;3049  }30503051  /** @name PalletCommonError (386) */3052  export interface PalletCommonError extends Enum {3053    readonly isCollectionNotFound: boolean;3054    readonly isMustBeTokenOwner: boolean;3055    readonly isNoPermission: boolean;3056    readonly isCantDestroyNotEmptyCollection: boolean;3057    readonly isPublicMintingNotAllowed: boolean;3058    readonly isAddressNotInAllowlist: boolean;3059    readonly isCollectionNameLimitExceeded: boolean;3060    readonly isCollectionDescriptionLimitExceeded: boolean;3061    readonly isCollectionTokenPrefixLimitExceeded: boolean;3062    readonly isTotalCollectionsLimitExceeded: boolean;3063    readonly isCollectionAdminCountExceeded: boolean;3064    readonly isCollectionLimitBoundsExceeded: boolean;3065    readonly isOwnerPermissionsCantBeReverted: boolean;3066    readonly isTransferNotAllowed: boolean;3067    readonly isAccountTokenLimitExceeded: boolean;3068    readonly isCollectionTokenLimitExceeded: boolean;3069    readonly isMetadataFlagFrozen: boolean;3070    readonly isTokenNotFound: boolean;3071    readonly isTokenValueTooLow: boolean;3072    readonly isApprovedValueTooLow: boolean;3073    readonly isCantApproveMoreThanOwned: boolean;3074    readonly isAddressIsZero: boolean;3075    readonly isUnsupportedOperation: boolean;3076    readonly isNotSufficientFounds: boolean;3077    readonly isUserIsNotAllowedToNest: boolean;3078    readonly isSourceCollectionIsNotAllowedToNest: boolean;3079    readonly isCollectionFieldSizeExceeded: boolean;3080    readonly isNoSpaceForProperty: boolean;3081    readonly isPropertyLimitReached: boolean;3082    readonly isPropertyKeyIsTooLong: boolean;3083    readonly isInvalidCharacterInPropertyKey: boolean;3084    readonly isEmptyPropertyKey: boolean;3085    readonly isCollectionIsExternal: boolean;3086    readonly isCollectionIsInternal: boolean;3087    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';3088  }30893090  /** @name PalletFungibleError (388) */3091  export interface PalletFungibleError extends Enum {3092    readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;3093    readonly isFungibleItemsHaveNoId: boolean;3094    readonly isFungibleItemsDontHaveData: boolean;3095    readonly isFungibleDisallowsNesting: boolean;3096    readonly isSettingPropertiesNotAllowed: boolean;3097    readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3098  }30993100  /** @name PalletRefungibleItemData (389) */3101  export interface PalletRefungibleItemData extends Struct {3102    readonly constData: Bytes;3103  }31043105  /** @name PalletRefungibleError (393) */3106  export interface PalletRefungibleError extends Enum {3107    readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;3108    readonly isWrongRefungiblePieces: boolean;3109    readonly isRepartitionWhileNotOwningAllPieces: boolean;3110    readonly isRefungibleDisallowsNesting: boolean;3111    readonly isSettingPropertiesNotAllowed: boolean;3112    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3113  }31143115  /** @name PalletNonfungibleItemData (394) */3116  export interface PalletNonfungibleItemData extends Struct {3117    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;3118  }31193120  /** @name UpDataStructsPropertyScope (396) */3121  export interface UpDataStructsPropertyScope extends Enum {3122    readonly isNone: boolean;3123    readonly isRmrk: boolean;3124    readonly type: 'None' | 'Rmrk';3125  }31263127  /** @name PalletNonfungibleError (398) */3128  export interface PalletNonfungibleError extends Enum {3129    readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;3130    readonly isNonfungibleItemsHaveNoAmount: boolean;3131    readonly isCantBurnNftWithChildren: boolean;3132    readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';3133  }31343135  /** @name PalletStructureError (399) */3136  export interface PalletStructureError extends Enum {3137    readonly isOuroborosDetected: boolean;3138    readonly isDepthLimit: boolean;3139    readonly isBreadthLimit: boolean;3140    readonly isTokenNotFound: boolean;3141    readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';3142  }31433144  /** @name PalletRmrkCoreError (400) */3145  export interface PalletRmrkCoreError extends Enum {3146    readonly isCorruptedCollectionType: boolean;3147    readonly isNftTypeEncodeError: boolean;3148    readonly isRmrkPropertyKeyIsTooLong: boolean;3149    readonly isRmrkPropertyValueIsTooLong: boolean;3150    readonly isRmrkPropertyIsNotFound: boolean;3151    readonly isUnableToDecodeRmrkData: boolean;3152    readonly isCollectionNotEmpty: boolean;3153    readonly isNoAvailableCollectionId: boolean;3154    readonly isNoAvailableNftId: boolean;3155    readonly isCollectionUnknown: boolean;3156    readonly isNoPermission: boolean;3157    readonly isNonTransferable: boolean;3158    readonly isCollectionFullOrLocked: boolean;3159    readonly isResourceDoesntExist: boolean;3160    readonly isCannotSendToDescendentOrSelf: boolean;3161    readonly isCannotAcceptNonOwnedNft: boolean;3162    readonly isCannotRejectNonOwnedNft: boolean;3163    readonly isCannotRejectNonPendingNft: boolean;3164    readonly isResourceNotPending: boolean;3165    readonly isNoAvailableResourceId: boolean;3166    readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';3167  }31683169  /** @name PalletRmrkEquipError (402) */3170  export interface PalletRmrkEquipError extends Enum {3171    readonly isPermissionError: boolean;3172    readonly isNoAvailableBaseId: boolean;3173    readonly isNoAvailablePartId: boolean;3174    readonly isBaseDoesntExist: boolean;3175    readonly isNeedsDefaultThemeFirst: boolean;3176    readonly isPartDoesntExist: boolean;3177    readonly isNoEquippableOnFixedPart: boolean;3178    readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';3179  }31803181  /** @name PalletEvmError (405) */3182  export interface PalletEvmError extends Enum {3183    readonly isBalanceLow: boolean;3184    readonly isFeeOverflow: boolean;3185    readonly isPaymentOverflow: boolean;3186    readonly isWithdrawFailed: boolean;3187    readonly isGasPriceTooLow: boolean;3188    readonly isInvalidNonce: boolean;3189    readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';3190  }31913192  /** @name FpRpcTransactionStatus (408) */3193  export interface FpRpcTransactionStatus extends Struct {3194    readonly transactionHash: H256;3195    readonly transactionIndex: u32;3196    readonly from: H160;3197    readonly to: Option<H160>;3198    readonly contractAddress: Option<H160>;3199    readonly logs: Vec<EthereumLog>;3200    readonly logsBloom: EthbloomBloom;3201  }32023203  /** @name EthbloomBloom (410) */3204  export interface EthbloomBloom extends U8aFixed {}32053206  /** @name EthereumReceiptReceiptV3 (412) */3207  export interface EthereumReceiptReceiptV3 extends Enum {3208    readonly isLegacy: boolean;3209    readonly asLegacy: EthereumReceiptEip658ReceiptData;3210    readonly isEip2930: boolean;3211    readonly asEip2930: EthereumReceiptEip658ReceiptData;3212    readonly isEip1559: boolean;3213    readonly asEip1559: EthereumReceiptEip658ReceiptData;3214    readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';3215  }32163217  /** @name EthereumReceiptEip658ReceiptData (413) */3218  export interface EthereumReceiptEip658ReceiptData extends Struct {3219    readonly statusCode: u8;3220    readonly usedGas: U256;3221    readonly logsBloom: EthbloomBloom;3222    readonly logs: Vec<EthereumLog>;3223  }32243225  /** @name EthereumBlock (414) */3226  export interface EthereumBlock extends Struct {3227    readonly header: EthereumHeader;3228    readonly transactions: Vec<EthereumTransactionTransactionV2>;3229    readonly ommers: Vec<EthereumHeader>;3230  }32313232  /** @name EthereumHeader (415) */3233  export interface EthereumHeader extends Struct {3234    readonly parentHash: H256;3235    readonly ommersHash: H256;3236    readonly beneficiary: H160;3237    readonly stateRoot: H256;3238    readonly transactionsRoot: H256;3239    readonly receiptsRoot: H256;3240    readonly logsBloom: EthbloomBloom;3241    readonly difficulty: U256;3242    readonly number: U256;3243    readonly gasLimit: U256;3244    readonly gasUsed: U256;3245    readonly timestamp: u64;3246    readonly extraData: Bytes;3247    readonly mixHash: H256;3248    readonly nonce: EthereumTypesHashH64;3249  }32503251  /** @name EthereumTypesHashH64 (416) */3252  export interface EthereumTypesHashH64 extends U8aFixed {}32533254  /** @name PalletEthereumError (421) */3255  export interface PalletEthereumError extends Enum {3256    readonly isInvalidSignature: boolean;3257    readonly isPreLogExists: boolean;3258    readonly type: 'InvalidSignature' | 'PreLogExists';3259  }32603261  /** @name PalletEvmCoderSubstrateError (422) */3262  export interface PalletEvmCoderSubstrateError extends Enum {3263    readonly isOutOfGas: boolean;3264    readonly isOutOfFund: boolean;3265    readonly type: 'OutOfGas' | 'OutOfFund';3266  }32673268  /** @name PalletEvmContractHelpersSponsoringModeT (423) */3269  export interface PalletEvmContractHelpersSponsoringModeT extends Enum {3270    readonly isDisabled: boolean;3271    readonly isAllowlisted: boolean;3272    readonly isGenerous: boolean;3273    readonly type: 'Disabled' | 'Allowlisted' | 'Generous';3274  }32753276  /** @name PalletEvmContractHelpersError (425) */3277  export interface PalletEvmContractHelpersError extends Enum {3278    readonly isNoPermission: boolean;3279    readonly type: 'NoPermission';3280  }32813282  /** @name PalletEvmMigrationError (426) */3283  export interface PalletEvmMigrationError extends Enum {3284    readonly isAccountNotEmpty: boolean;3285    readonly isAccountIsNotMigrating: boolean;3286    readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';3287  }32883289  /** @name SpRuntimeMultiSignature (428) */3290  export interface SpRuntimeMultiSignature extends Enum {3291    readonly isEd25519: boolean;3292    readonly asEd25519: SpCoreEd25519Signature;3293    readonly isSr25519: boolean;3294    readonly asSr25519: SpCoreSr25519Signature;3295    readonly isEcdsa: boolean;3296    readonly asEcdsa: SpCoreEcdsaSignature;3297    readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';3298  }32993300  /** @name SpCoreEd25519Signature (429) */3301  export interface SpCoreEd25519Signature extends U8aFixed {}33023303  /** @name SpCoreSr25519Signature (431) */3304  export interface SpCoreSr25519Signature extends U8aFixed {}33053306  /** @name SpCoreEcdsaSignature (432) */3307  export interface SpCoreEcdsaSignature extends U8aFixed {}33083309  /** @name FrameSystemExtensionsCheckSpecVersion (435) */3310  export type FrameSystemExtensionsCheckSpecVersion = Null;33113312  /** @name FrameSystemExtensionsCheckGenesis (436) */3313  export type FrameSystemExtensionsCheckGenesis = Null;33143315  /** @name FrameSystemExtensionsCheckNonce (439) */3316  export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}33173318  /** @name FrameSystemExtensionsCheckWeight (440) */3319  export type FrameSystemExtensionsCheckWeight = Null;33203321  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (441) */3322  export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}33233324  /** @name OpalRuntimeRuntime (442) */3325  export type OpalRuntimeRuntime = Null;33263327  /** @name PalletEthereumFakeTransactionFinalizer (443) */3328  export type PalletEthereumFakeTransactionFinalizer = Null;33293330} // declare module
modifiedtests/src/interfaces/unique/definitions.tsdiffbeforeafterboth
--- a/tests/src/interfaces/unique/definitions.ts
+++ b/tests/src/interfaces/unique/definitions.ts
@@ -63,6 +63,11 @@
       [collectionParam, tokenParam], 
       `Option<${CROSS_ACCOUNT_ID_TYPE}>`,
     ),
+    tokenOwners: fun(
+      'Returns 10 tokens owners in no particular order', 
+      [collectionParam, tokenParam], 
+      `Vec<${CROSS_ACCOUNT_ID_TYPE}>`
+    ),
     tokenChildren: fun(
       'Get tokens nested directly into the token', 
       [collectionParam, tokenParam], 
@@ -85,6 +90,17 @@
       'Vec<UpDataStructsPropertyKeyPermission>',
     ),
 
+    constMetadata: fun(
+      'Get token constant metadata', 
+      [collectionParam, tokenParam], 
+      'Vec<u8>',
+    ),
+    variableMetadata: fun(
+      'Get token variable metadata', 
+      [collectionParam, tokenParam], 
+      'Vec<u8>',
+    ),
+
     tokenData: fun(
       'Get token data, including properties, optionally limited to the provided keys, and total pieces for an RFT',
       [collectionParam, tokenParam, propertyKeysParam],
@@ -128,7 +144,11 @@
       'bool',
     ),
 
-    lastTokenId: fun('Get the last token ID created in a collection', [collectionParam], 'u32'),
+    lastTokenId: fun(
+      'Get the last token ID created in a collection', 
+      [collectionParam], 
+      'u32',
+    ),
     collectionById: fun(
       'Get a collection by the specified ID', 
       [collectionParam], 
modifiedtests/src/nesting/properties.test.tsdiffbeforeafterboth
--- a/tests/src/nesting/properties.test.ts
+++ b/tests/src/nesting/properties.test.ts
@@ -2,6 +2,7 @@
 import usingApi, {executeTransaction} from '../substrate/substrate-api';
 import {
   addCollectionAdminExpectSuccess,
+  CollectionMode,
   createCollectionExpectSuccess,
   setCollectionPermissionsExpectSuccess,
   createItemExpectSuccess,
@@ -23,9 +24,9 @@
     });
   });
 
-  it('Makes sure collectionById supplies required fields', async () => {
+  async function testMakeSureSuppliesRequired(mode: CollectionMode) {
     await usingApi(async api => {
-      const collectionId = await createCollectionExpectSuccess();
+      const collectionId = await createCollectionExpectSuccess({mode: mode});
 
       const collectionOption = await api.rpc.unique.collectionById(collectionId);
       expect(collectionOption.isSome).to.be.true;
@@ -57,7 +58,15 @@
       expect(collection.tokenPropertyPermissions.toHuman()).to.be.deep.equal(propertyPermissions);
       expect(collection.properties.toHuman()).to.be.deep.equal(collectionProperties);
     });
+  }
+
+  it('Makes sure collectionById supplies required fields for NFT', async () => {
+    await testMakeSureSuppliesRequired({type: 'NFT'});
   });
+
+  it('Makes sure collectionById supplies required fields for ReFungible', async () => {
+    await testMakeSureSuppliesRequired({type: 'ReFungible'});
+  });
 });
 
 // ---------- COLLECTION PROPERTIES
@@ -79,9 +88,10 @@
     });
   });
 
-  it('Sets properties for a collection', async () => {
+
+  async function testSetsPropertiesForCollection(mode: string) {
     await usingApi(async api => {
-      const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: 'NFT'}));
+      const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: mode}));
       const {collectionId} = getCreateCollectionResult(events);
 
       // As owner
@@ -106,48 +116,54 @@
         {key: 'black_hole', value: ''},
       ]);
     });
+  }
+  it('Sets properties for a NFT collection', async () => {
+    await testSetsPropertiesForCollection('NFT');
   });
+  it('Sets properties for a ReFungible collection', async () => {
+    await testSetsPropertiesForCollection('ReFungible');
+  });
 
-  it('Check valid names for collection properties keys', async () => {
+  async function testCheckValidNames(mode: string) {
     await usingApi(async api => {
-      const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: 'NFT'}));
+      const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: mode}));
       const {collectionId} = getCreateCollectionResult(events);
-
+  
       // alpha symbols
       await expect(executeTransaction(
         api, 
         bob, 
         api.tx.unique.setCollectionProperties(collectionId, [{key: 'alpha'}]), 
       )).to.not.be.rejected;
-
+  
       // numeric symbols
       await expect(executeTransaction(
         api, 
         bob, 
         api.tx.unique.setCollectionProperties(collectionId, [{key: '123'}]), 
       )).to.not.be.rejected;
-
+  
       // underscore symbol
       await expect(executeTransaction(
         api, 
         bob, 
         api.tx.unique.setCollectionProperties(collectionId, [{key: 'black_hole'}]), 
       )).to.not.be.rejected;
-
+  
       // dash symbol
       await expect(executeTransaction(
         api, 
         bob, 
         api.tx.unique.setCollectionProperties(collectionId, [{key: 'semi-automatic'}]), 
       )).to.not.be.rejected;
-
+  
       // underscore symbol
       await expect(executeTransaction(
         api, 
         bob, 
         api.tx.unique.setCollectionProperties(collectionId, [{key: 'build.rs'}]), 
       )).to.not.be.rejected;
-
+  
       const propertyKeys = ['alpha', '123', 'black_hole', 'semi-automatic', 'build.rs'];
       const properties = (await api.rpc.unique.collectionProperties(collectionId, propertyKeys)).toHuman();
       expect(properties).to.be.deep.equal([
@@ -158,54 +174,72 @@
         {key: 'build.rs', value: ''},
       ]);
     });
+  }
+  it('Check valid names for NFT collection properties keys', async () => {
+    await testCheckValidNames('NFT');
+  });
+  it('Check valid names for ReFungible collection properties keys', async () => {
+    await testCheckValidNames('ReFungible');
   });
 
-  it('Changes properties of a collection', async () => {
+  async function testChangesProperties(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black_hole'}]), 
       )).to.not.be.rejected;
-
+  
       // Mutate the properties
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'bonded'}, {key: 'black_hole', value: 'LIGO'}]), 
       )).to.not.be.rejected;
-
+  
       const properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black_hole'])).toHuman();
       expect(properties).to.be.deep.equal([
         {key: 'electron', value: 'bonded'},
         {key: 'black_hole', value: 'LIGO'},
       ]);
     });
+  }
+  it('Changes properties of a NFT collection', async () => {
+    await testChangesProperties({type: 'NFT'});
+  });
+  it('Changes properties of a ReFungible collection', async () => {
+    await testChangesProperties({type: 'ReFungible'});
   });
 
-  it('Deletes properties of a collection', async () => {
+  async function testDeleteProperties(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}]), 
       )).to.not.be.rejected;
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.deleteCollectionProperties(collection, ['electron']), 
       )).to.not.be.rejected;
-
+  
       const properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black_hole'])).toHuman();
       expect(properties).to.be.deep.equal([
         {key: 'black_hole', value: 'LIGO'},
       ]);
-    });
+    });  
+  }
+  it('Deletes properties of a NFT collection', async () => {
+    await testDeleteProperties({type: 'NFT'});
+  });
+  it('Deletes properties of a ReFungible collection', async () => {
+    await testDeleteProperties({type: 'ReFungible'});
   });
 });
 
@@ -217,10 +251,10 @@
     });
   });
   
-  it('Fails to set properties in a collection if not its onwer/administrator', async () => {
+  async function testFailsSetPropertiesIfNotOwnerOrAdmin(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         bob, 
@@ -230,14 +264,20 @@
       const properties = (await api.query.common.collectionProperties(collection)).toJSON();
       expect(properties.map).to.be.empty;
       expect(properties.consumedSpace).to.equal(0);
-    });
+    });  
+  }
+  it('Fails to set properties in a NFT collection if not its onwer/administrator', async () => {
+    await testFailsSetPropertiesIfNotOwnerOrAdmin({type: 'NFT'});
   });
+  it('Fails to set properties in a ReFungible collection if not its onwer/administrator', async () => {
+    await testFailsSetPropertiesIfNotOwnerOrAdmin({type: 'ReFungible'});
+  });
   
-  it('Fails to set properties that exceed the limits', async () => {
+  async function testFailsSetPropertiesThatExeedLimits(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
+      const collection = await createCollectionExpectSuccess({mode: mode});
       const spaceLimit = (await api.query.common.collectionProperties(collection)).toJSON().spaceLimit as number; 
-
+  
       // Mute the general tx parsing error, too many bytes to process
       {
         console.error = () => {};
@@ -247,10 +287,10 @@
           api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))}]), 
         )).to.be.rejected;
       }
-
+  
       let properties = (await api.rpc.unique.collectionProperties(collection, ['electron'])).toJSON();
       expect(properties).to.be.empty;
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
@@ -259,16 +299,22 @@
           {key: 'black_hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))}, 
         ]), 
       )).to.be.rejectedWith(/common\.NoSpaceForProperty/);
-
+  
       properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black hole'])).toJSON();
       expect(properties).to.be.empty;
-    });
+    });  
+  }
+  it('Fails to set properties that exceed the limits (NFT)', async () => {
+    await testFailsSetPropertiesThatExeedLimits({type: 'NFT'});
+  });
+  it('Fails to set properties that exceed the limits (ReFungible)', async () => {
+    await testFailsSetPropertiesThatExeedLimits({type: 'ReFungible'});
   });
   
-  it('Fails to set more properties than it is allowed', async () => {
+  async function testFailsSetMorePropertiesThanAllowed(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       const propertiesToBeSet = [];
       for (let i = 0; i < 65; i++) {
         propertiesToBeSet.push({
@@ -276,29 +322,35 @@
           value: Math.random() > 0.5 ? 'high' : 'low',
         });
       }
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setCollectionProperties(collection, propertiesToBeSet), 
       )).to.be.rejectedWith(/common\.PropertyLimitReached/);
-
+  
       const properties = (await api.query.common.collectionProperties(collection)).toJSON();
       expect(properties.map).to.be.empty;
       expect(properties.consumedSpace).to.equal(0);
-    });
+    });  
+  }
+  it('Fails to set more properties than it is allowed (NFT)', async () => {
+    await testFailsSetMorePropertiesThanAllowed({type: 'NFT'});
   });
-
-  it('Fails to set properties with invalid names', async () => {
+  it('Fails to set more properties than it is allowed (ReFungible)', async () => {
+    await testFailsSetMorePropertiesThanAllowed({type: 'ReFungible'});
+  });
+  
+  async function testFailsSetPropertiesWithInvalidNames(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       const invalidProperties = [
         [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}],
         [{key: 'Mr/Sandman', value: 'Bring me a gene'}],
         [{key: 'déjà vu', value: 'hmm...'}],
       ];
-
+  
       for (let i = 0; i < invalidProperties.length; i++) {
         await expect(executeTransaction(
           api, 
@@ -306,13 +358,13 @@
           api.tx.unique.setCollectionProperties(collection, invalidProperties[i]), 
         ), `on rejecting the new badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
       }
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setCollectionProperties(collection, [{key: '', value: 'nothing must not exist'}]), 
       ), 'on rejecting an unnamed property').to.be.rejectedWith(/common\.EmptyPropertyKey/);
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
@@ -320,14 +372,14 @@
           {key: 'CRISPR-Cas9', value: 'rewriting nature!'},
         ]), 
       ), 'on setting the correctly-but-still-badly-named property').to.not.be.rejected;
-
+  
       const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat('CRISPR-Cas9').concat('');
-
+  
       const properties = (await api.rpc.unique.collectionProperties(collection, keys)).toHuman();
       expect(properties).to.be.deep.equal([
         {key: 'CRISPR-Cas9', value: 'rewriting nature!'},
       ]);
-
+  
       for (let i = 0; i < invalidProperties.length; i++) {
         await expect(executeTransaction(
           api, 
@@ -336,7 +388,13 @@
         ), `on trying to delete the non-existent badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
       }
     });
+  }
+  it('Fails to set properties with invalid names (NFT)', async () => {
+    await testFailsSetPropertiesWithInvalidNames({type: 'NFT'});
   });
+  it('Fails to set properties with invalid names (ReFungible)', async () => {
+    await testFailsSetPropertiesWithInvalidNames({type: 'ReFungible'});
+  });
 });
 
 // ---------- ACCESS RIGHTS
@@ -357,54 +415,66 @@
     });
   });
   
-  it('Sets access rights to properties of a collection', async () => {
+  async function testSetsAccessRightsToProperties(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true}}]), 
       )).to.not.be.rejected;
-
+  
       await addCollectionAdminExpectSuccess(alice, collection, bob.address);
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]), 
       )).to.not.be.rejected;
-
+  
       const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery', 'mindgame'])).toHuman();
       expect(propertyRights).to.be.deep.equal([
         {key: 'skullduggery', permission: {'mutable': true, 'collectionAdmin': false, 'tokenOwner': false}},
         {key: 'mindgame', permission: {'mutable': false, 'collectionAdmin': true, 'tokenOwner': false}},
       ]);
-    });
+    });  
+  }
+  it('Sets access rights to properties of a collection (NFT)', async () => {
+    await testSetsAccessRightsToProperties({type: 'NFT'});
   });
+  it('Sets access rights to properties of a collection (ReFungible)', async () => {
+    await testSetsAccessRightsToProperties({type: 'ReFungible'});
+  });
   
-  it('Changes access rights to properties of a collection', async () => {
+  async function testChangesAccessRightsToProperty(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]), 
       )).to.not.be.rejected;
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), 
       )).to.not.be.rejected;
-
+  
       const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toHuman();
       expect(propertyRights).to.be.deep.equal([
         {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
       ]);
     });
+  }
+  it('Changes access rights to properties of a NFT collection', async () => {
+    await testChangesAccessRightsToProperty({type: 'NFT'});
   });
+  it('Changes access rights to properties of a ReFungible collection', async () => {
+    await testChangesAccessRightsToProperty({type: 'ReFungible'});
+  });
 });
 
 describe('Negative Integration Test: Access Rights to Token Properties', () => {
@@ -415,25 +485,31 @@
     });
   });
 
-  it('Prevents from setting access rights to properties of a collection if not an onwer/admin', async () => {
+  async function testPreventsFromSettingAccessRightsNotAdminOrOwner(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         bob, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]), 
       )).to.be.rejectedWith(/common\.NoPermission/);
-
+  
       const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toJSON();
       expect(propertyRights).to.be.empty;
     });
+  }
+  it('Prevents from setting access rights to properties of a NFT collection if not an onwer/admin', async () => {
+    await testPreventsFromSettingAccessRightsNotAdminOrOwner({type: 'NFT'});
   });
+  it('Prevents from setting access rights to properties of a ReFungible collection if not an onwer/admin', async () => {
+    await testPreventsFromSettingAccessRightsNotAdminOrOwner({type: 'ReFungible'});
+  });
 
-  it('Prevents from adding too many possible properties', async () => {
+  async function testPreventFromAddingTooManyPossibleProperties(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       const constitution = [];
       for (let i = 0; i < 65; i++) {
         constitution.push({
@@ -441,51 +517,63 @@
           permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {},
         });
       }
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, constitution), 
       )).to.be.rejectedWith(/common\.PropertyLimitReached/);
-
+  
       const propertyRights = (await api.query.common.collectionPropertyPermissions(collection)).toJSON();
       expect(propertyRights).to.be.empty;
-    });
+    });  
+  }
+  it('Prevents from adding too many possible properties (NFT)', async () => {
+    await testPreventFromAddingTooManyPossibleProperties({type: 'NFT'});
   });
+  it('Prevents from adding too many possible properties (ReFungible)', async () => {
+    await testPreventFromAddingTooManyPossibleProperties({type: 'ReFungible'});
+  });
 
-  it('Prevents access rights to be modified if constant', async () => {
+  async function testPreventAccessRightsModifiedIfConstant(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), 
       )).to.not.be.rejected;
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {}}]), 
       )).to.be.rejectedWith(/common\.NoPermission/);
-
+  
       const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toHuman();
       expect(propertyRights).to.deep.equal([
         {key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
       ]);
-    });
+    });  
+  }
+  it('Prevents access rights to be modified if constant (NFT)', async () => {
+    await testPreventAccessRightsModifiedIfConstant({type: 'NFT'});
+  });
+  it('Prevents access rights to be modified if constant (ReFungible)', async () => {
+    await testPreventAccessRightsModifiedIfConstant({type: 'ReFungible'});
   });
 
-  it('Prevents adding properties with invalid names', async () => {
+  async function testPreventsAddingPropertiesWithInvalidNames(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-
+      const collection = await createCollectionExpectSuccess({mode: mode});
+  
       const invalidProperties = [
         [{key: 'skullduggery', permission: {tokenOwner: true}}, {key: 'im possible', permission: {collectionAdmin: true}}],
         [{key: 'G#4', permission: {tokenOwner: true}}],
         [{key: 'HÆMILTON', permission: {mutable: false, collectionAdmin: true, tokenOwner: true}}],
       ];
-
+  
       for (let i = 0; i < invalidProperties.length; i++) {
         await expect(executeTransaction(
           api, 
@@ -493,13 +581,13 @@
           api.tx.unique.setTokenPropertyPermissions(collection, invalidProperties[i]), 
         ), `on setting the new badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
       }
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: '', permission: {}}]), 
       ), 'on rejecting an unnamed property').to.be.rejectedWith(/common\.EmptyPropertyKey/);
-
+  
       const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string
       await expect(executeTransaction(
         api, 
@@ -508,30 +596,33 @@
           {key: correctKey, permission: {collectionAdmin: true}},
         ]), 
       ), 'on setting the correctly-but-still-badly-named property').to.not.be.rejected;
-
+  
       const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat(correctKey).concat('');
-
+  
       const propertyRights = (await api.rpc.unique.propertyPermissions(collection, keys)).toHuman();
       expect(propertyRights).to.be.deep.equal([
         {key: correctKey, permission: {mutable: false, collectionAdmin: true, tokenOwner: false}},
       ]);
     });
+  }
+  it('Prevents adding properties with invalid names (NFT)', async () => {
+    await testPreventsAddingPropertiesWithInvalidNames({type: 'NFT'});
+  });
+  it('Prevents adding properties with invalid names (ReFungible)', async () => {
+    await testPreventsAddingPropertiesWithInvalidNames({type: 'ReFungible'});
   });
 });
 
 // ---------- TOKEN PROPERTIES
 
 describe('Integration Test: Token Properties', () => {
-  let collection: number;
-  let token: number;
-  let nestedToken: number;
   let permissions: {permission: any, signers: IKeyringPair[]}[];
 
   before(async () => {
     await usingApi(async (api, privateKeyWrapper) => {
-      alice = privateKeyWrapper('//Alice');
-      bob = privateKeyWrapper('//Bob');
-      charlie = privateKeyWrapper('//Charlie');
+      alice = privateKeyWrapper('//Alice'); // collection owner
+      bob = privateKeyWrapper('//Bob'); // collection admin
+      charlie = privateKeyWrapper('//Charlie'); // token owner
 
       permissions = [
         {permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]},
@@ -543,36 +634,34 @@
       ];
     });
   });
-
-  beforeEach(async () => {
-    await usingApi(async () => {
-      collection = await createCollectionExpectSuccess();
-      await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
-
-      token = await createItemExpectSuccess(alice, collection, 'NFT');
-      nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
-
-      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
-      await transferExpectSuccess(collection, token, alice, charlie);
-    });
-  });
   
-  it('Reads yet empty properties of a token', async () => {
+  async function testReadsYetEmptyProperties(mode: CollectionMode) {
     await usingApi(async api => {
-      const collection = await createCollectionExpectSuccess();
-      const token = await createItemExpectSuccess(alice, collection, 'NFT');
+      const collection = await createCollectionExpectSuccess({mode: mode});
+      const token = await createItemExpectSuccess(alice, collection, mode.type);
   
       const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
       expect(properties.map).to.be.empty;
       expect(properties.consumedSpace).to.be.equal(0);
-
+  
       const tokenData = (await api.rpc.unique.tokenData(collection, token, ['anything'])).toJSON().properties;
       expect(tokenData).to.be.empty;
     });
+  }
+  it('Reads yet empty properties of a token (NFT)', async () => {
+    await testReadsYetEmptyProperties({type: 'NFT'});
   });
+  it('Reads yet empty properties of a token (ReFungible)', async () => {
+    await testReadsYetEmptyProperties({type: 'ReFungible'});
+  });
 
-  it('Assigns properties to a token according to permissions', async () => {
+  async function testAssignPropertiesAccordingToPermissions(mode: CollectionMode, pieces: number) {
     await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess({mode: mode});
+      const token = await createItemExpectSuccess(alice, collection, mode.type);
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+      await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
+
       const propertyKeys: string[] = [];
       let i = 0;
       for (const permission of permissions) {
@@ -603,10 +692,21 @@
         expect(tokensData[i].value).to.be.equal('Serotonin increase');
       }
     });
+  }
+  it('Assigns properties to a token according to permissions (NFT)', async () => {
+    await testAssignPropertiesAccordingToPermissions({type: 'NFT'}, 1);
+  });
+  it('Assigns properties to a token according to permissions (ReFungible)', async () => {
+    await testAssignPropertiesAccordingToPermissions({type: 'ReFungible'}, 100);
   });
 
-  it('Changes properties of a token according to permissions', async () => {
+  async function testChangesPropertiesAccordingPermission(mode: CollectionMode, pieces: number) {
     await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess({mode: mode});
+      const token = await createItemExpectSuccess(alice, collection, mode.type);
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+      await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
+
       const propertyKeys: string[] = [];
       let i = 0;
       for (const permission of permissions) {
@@ -615,29 +715,29 @@
         for (const signer of permission.signers) {
           const key = i + '_' + signer.address;
           propertyKeys.push(key);
-
+  
           await expect(executeTransaction(
             api, 
             alice, 
             api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]), 
           ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
-
+  
           await expect(executeTransaction(
             api, 
             signer, 
             api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]), 
           ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
-
+  
           await expect(executeTransaction(
             api, 
             signer, 
             api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin stable'}]), 
           ), `on changing property ${i} by ${signer.address}`).to.not.be.rejected;
         }
-
+  
         i++;
       }
-
+  
       const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toHuman() as any[];
       const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toHuman().properties as any[];
       for (let i = 0; i < properties.length; i++) {
@@ -645,32 +745,43 @@
         expect(tokensData[i].value).to.be.equal('Serotonin stable');
       }
     });
+  }
+  it('Changes properties of a token according to permissions (NFT)', async () => {
+    await testChangesPropertiesAccordingPermission({type: 'NFT'}, 1);
   });
+  it('Changes properties of a token according to permissions (ReFungible)', async () => {
+    await testChangesPropertiesAccordingPermission({type: 'ReFungible'}, 100);
+  });
 
-  it('Deletes properties of a token according to permissions', async () => {
+  async function testDeletePropertiesAccordingPermission(mode: CollectionMode, pieces: number) {
     await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess({mode: mode});
+      const token = await createItemExpectSuccess(alice, collection, mode.type);
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+      await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
+
       const propertyKeys: string[] = [];
       let i = 0;
-
+  
       for (const permission of permissions) {
         if (!permission.permission.mutable) continue;
         
         for (const signer of permission.signers) {
           const key = i + '_' + signer.address;
           propertyKeys.push(key);
-
+  
           await expect(executeTransaction(
             api, 
             alice, 
             api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]), 
           ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
-
+  
           await expect(executeTransaction(
             api, 
             signer, 
             api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]), 
           ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
-
+  
           await expect(executeTransaction(
             api, 
             signer, 
@@ -680,17 +791,30 @@
         
         i++;
       }
-
+  
       const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toJSON() as any[];
       expect(properties).to.be.empty;
       const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toJSON().properties as any[];
       expect(tokensData).to.be.empty;
       expect((await api.query.nonfungible.tokenProperties(collection, token)).toJSON().consumedSpace).to.be.equal(0);
     });
+  }
+  it('Deletes properties of a token according to permissions (NFT)', async () => {
+    await testDeletePropertiesAccordingPermission({type: 'NFT'}, 1);
   });
+  it('Deletes properties of a token according to permissions (ReFungible)', async () => {
+    await testDeletePropertiesAccordingPermission({type: 'ReFungible'}, 100);
+  });
 
   it('Assigns properties to a nested token according to permissions', async () => {
     await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+      await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
+      const token = await createItemExpectSuccess(alice, collection, 'NFT');
+      const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+      await transferExpectSuccess(collection, token, alice, charlie);
+
       const propertyKeys: string[] = [];
       let i = 0;
       for (const permission of permissions) {
@@ -725,6 +849,13 @@
 
   it('Changes properties of a nested token according to permissions', async () => {
     await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+      await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
+      const token = await createItemExpectSuccess(alice, collection, 'NFT');
+      const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+      await transferExpectSuccess(collection, token, alice, charlie);
+
       const propertyKeys: string[] = [];
       let i = 0;
       for (const permission of permissions) {
@@ -767,6 +898,13 @@
 
   it('Deletes properties of a nested token according to permissions', async () => {
     await usingApi(async api => {
+      const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+      await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
+      const token = await createItemExpectSuccess(alice, collection, 'NFT');
+      const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+      await transferExpectSuccess(collection, token, alice, charlie);
+
       const propertyKeys: string[] = [];
       let i = 0;
 
@@ -832,11 +970,11 @@
     });
   });
 
-  beforeEach(async () => {
-    collection = await createCollectionExpectSuccess();
-    token = await createItemExpectSuccess(alice, collection, 'NFT');
+  async function prepare(mode: CollectionMode, pieces: number) {
+    collection = await createCollectionExpectSuccess({mode: mode});
+    token = await createItemExpectSuccess(alice, collection, mode.type);
     await addCollectionAdminExpectSuccess(alice, collection, bob.address);
-    await transferExpectSuccess(collection, token, alice, charlie);
+    await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
         
     await usingApi(async api => {
       let i = 0;
@@ -848,71 +986,89 @@
           alice, 
           api.tx.unique.setTokenPropertyPermissions(collection, [{key: `${i}`, permission: passage.permission}]), 
         ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
-
+  
         await expect(executeTransaction(
           api, 
           signer, 
           api.tx.unique.setTokenProperties(collection, token, [{key: `${i}`, value: 'Serotonin increase'}]), 
         ), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
-
+  
         i++;
       }
-
+  
       originalSpace = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON().consumedSpace as number;
-    });
-  });
+    }); 
+  }
 
-  it('Forbids changing/deleting properties of a token if the user is outside of permissions', async () => {
+  async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(mode: CollectionMode, pieces: number) {
+    await prepare(mode, pieces);
+  
     await usingApi(async api => {
       let i = -1;
       for (const forbiddance of constitution) {
         i++;
         if (!forbiddance.permission.mutable) continue;
-
+  
         await expect(executeTransaction(
           api, 
           forbiddance.sinner, 
           api.tx.unique.setTokenProperties(collection, token, [{key: `${i}`, value: 'Serotonin down'}]), 
         ), `on failing to change property ${i} by ${forbiddance.sinner.address}`).to.be.rejectedWith(/common\.NoPermission/);
-
+  
         await expect(executeTransaction(
           api, 
           forbiddance.sinner, 
           api.tx.unique.deleteTokenProperties(collection, token, [`${i}`]), 
         ), `on failing to delete property ${i} by ${forbiddance.sinner.address}`).to.be.rejectedWith(/common\.NoPermission/);
       }
-
+  
       const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
       expect(properties.consumedSpace).to.be.equal(originalSpace);
     });
+  }
+  it('Forbids changing/deleting properties of a token if the user is outside of permissions (NFT)', async () => {
+    await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions({type: 'NFT'}, 1);
   });
+  it('Forbids changing/deleting properties of a token if the user is outside of permissions (ReFungible)', async () => {
+    await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions({type: 'ReFungible'}, 100);
+  });
 
-  it('Forbids changing/deleting properties of a token if the property is permanent (immutable)', async () => {
+  async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(mode: CollectionMode, pieces: number) {
+    await prepare(mode, pieces);
+    
     await usingApi(async api => {
       let i = -1;
       for (const permission of constitution) {
         i++;
         if (permission.permission.mutable) continue;
-
+  
         await expect(executeTransaction(
           api, 
           permission.signers[0], 
           api.tx.unique.setTokenProperties(collection, token, [{key: `${i}`, value: 'Serotonin down'}]), 
         ), `on failing to change property ${i} by ${permission.signers[0].address}`).to.be.rejectedWith(/common\.NoPermission/);
-
+  
         await expect(executeTransaction(
           api, 
           permission.signers[0], 
           api.tx.unique.deleteTokenProperties(collection, token, [i.toString()]), 
         ), `on failing to delete property ${i} by ${permission.signers[0].address}`).to.be.rejectedWith(/common\.NoPermission/);
       }
-
+  
       const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
       expect(properties.consumedSpace).to.be.equal(originalSpace);
-    });
+    });  
+  }
+  it('Forbids changing/deleting properties of a token if the property is permanent (immutable) (NFT)', async () => {
+    await testForbidsChangingDeletingPropertiesIfPropertyImmutable({type: 'NFT'}, 1);
   });
+  it('Forbids changing/deleting properties of a token if the property is permanent (immutable) (ReFungible)', async () => {
+    await testForbidsChangingDeletingPropertiesIfPropertyImmutable({type: 'ReFungible'}, 100);
+  });
+
+  async function testForbidsAddingPropertiesIfPropertyNotDeclared(mode: CollectionMode, pieces: number) {
+    await prepare(mode, pieces);
 
-  it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission', async () => {
     await usingApi(async api => {
       await expect(executeTransaction(
         api, 
@@ -925,20 +1081,28 @@
         alice, 
         api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'now-existent', permission: {}}]), 
       ), 'on setting a new non-permitted property').to.not.be.rejected;
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
         api.tx.unique.setTokenProperties(collection, token, [{key: 'now-existent', value: 'I exist!'}]), 
       ), 'on failing to add a property forbidden by the \'None\' permission').to.be.rejectedWith(/common\.NoPermission/);
-
+  
       expect((await api.rpc.unique.tokenProperties(collection, token, ['non-existent', 'now-existent'])).toJSON()).to.be.empty;
       const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
       expect(properties.consumedSpace).to.be.equal(originalSpace);
     });
+  }
+  it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (NFT)', async () => {
+    await testForbidsAddingPropertiesIfPropertyNotDeclared({type: 'NFT'}, 1);
+  });
+  it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (ReFungible)', async () => {
+    await testForbidsAddingPropertiesIfPropertyNotDeclared({type: 'ReFungible'}, 100);
   });
 
-  it('Forbids adding too many properties to a token', async () => {
+  async function testForbidsAddingTooManyProperties(mode: CollectionMode, pieces: number) {
+    await prepare(mode, pieces);
+
     await usingApi(async api => {
       await expect(executeTransaction(
         api, 
@@ -948,7 +1112,7 @@
           {key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}},
         ]), 
       ), 'on setting a new non-permitted property').to.not.be.rejected;
-
+  
       // Mute the general tx parsing error
       {
         console.error = () => {};
@@ -958,7 +1122,7 @@
           api.tx.unique.setCollectionProperties(collection, [{key: 'a_holy_book', value: 'word '.repeat(6554)}]), 
         )).to.be.rejected;
       }
-
+  
       await expect(executeTransaction(
         api, 
         alice, 
@@ -967,10 +1131,107 @@
           {key: 'young_years', value: 'neverending'.repeat(1490)},
         ]), 
       )).to.be.rejectedWith(/common\.NoSpaceForProperty/);
-
+  
       expect((await api.rpc.unique.tokenProperties(collection, token, ['a_holy_book', 'young_years'])).toJSON()).to.be.empty;
       const propertiesMap = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
       expect(propertiesMap.consumedSpace).to.be.equal(originalSpace);
     });
+  }
+  it('Forbids adding too many properties to a token (NFT)', async () => {
+    await testForbidsAddingTooManyProperties({type: 'NFT'}, 1);
+  });
+  it('Forbids adding too many properties to a token (ReFungible)', async () => {
+    await testForbidsAddingTooManyProperties({type: 'ReFungible'}, 100);
+  });
+});
+
+describe('ReFungible token properties permissions tests', () => {
+  let collection: number;
+  let token: number;
+
+  before(async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      alice = privateKeyWrapper('//Alice');
+      bob = privateKeyWrapper('//Bob');
+      charlie = privateKeyWrapper('//Charlie');
+    });
+  });
+
+  beforeEach(async () => {
+    await usingApi(async api => {
+      collection = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
+      token = await createItemExpectSuccess(alice, collection, 'ReFungible');
+      await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'key', permission: {mutable:true, tokenOwner: true}}]), 
+      )).to.not.be.rejected;
+    });
+  });
+
+  it('Forbids add token property with tokenOwher==true but signer have\'t all pieces', async () => {
+    await usingApi(async api => {
+      await transferExpectSuccess(collection, token, alice, charlie, 33, 'ReFungible');
+  
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [
+          {key: 'key', value: 'word'}, 
+        ]), 
+      )).to.be.rejectedWith(/common\.NoPermission/);
+    });
+  });
+
+  it('Forbids mutate token property with tokenOwher==true but signer have\'t all pieces', async () => {
+    await usingApi(async api => {
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'key', permission: {mutable:true, tokenOwner: true}}]), 
+      )).to.not.be.rejected;
+  
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [
+          {key: 'key', value: 'word'}, 
+        ]), 
+      )).to.be.not.rejected;
+
+      await transferExpectSuccess(collection, token, alice, charlie, 33, 'ReFungible');
+  
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [
+          {key: 'key', value: 'bad word'}, 
+        ]), 
+      )).to.be.rejectedWith(/common\.NoPermission/);
+    });
+  });
+
+  it('Forbids delete token property with tokenOwher==true but signer have\'t all pieces', async () => {
+    await usingApi(async api => {
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.setTokenProperties(collection, token, [
+          {key: 'key', value: 'word'}, 
+        ]), 
+      )).to.be.not.rejected;
+
+      await transferExpectSuccess(collection, token, alice, charlie, 33, 'ReFungible');
+  
+      await expect(executeTransaction(
+        api, 
+        alice, 
+        api.tx.unique.deleteTokenProperties(collection, token, [
+          'key',
+        ]), 
+      )).to.be.rejectedWith(/common\.NoPermission/);
+    });
   });
 });
modifiedtests/src/refungible.test.tsdiffbeforeafterboth
--- a/tests/src/refungible.test.ts
+++ b/tests/src/refungible.test.ts
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
-import {default as usingApi} from './substrate/substrate-api';
+import {default as usingApi, submitTransactionAsync} from './substrate/substrate-api';
 import {IKeyringPair} from '@polkadot/types/types';
 import {
   createCollectionExpectSuccess,
@@ -30,6 +30,12 @@
   transfer,
   burnItem,
   repartitionRFT,
+  createCollectionWithPropsExpectSuccess,
+  getDetailedCollectionInfo,
+  normalizeAccountId,
+  CrossAccountId,
+  getCreateItemsResult,
+  getDestroyItemsResult,
 } from './util/helpers';
 
 import chai from 'chai';
@@ -51,14 +57,14 @@
   it('Create refungible collection and token', async () => {
     await usingApi(async api => {
       const createCollectionResult = await createCollection(api, alice, {mode: {type: 'ReFungible'}});
-      expect(createCollectionResult.success).to.be.true;    
+      expect(createCollectionResult.success).to.be.true;
       const collectionId  = createCollectionResult.collectionId;
-
+      
       const itemCountBefore = await getLastTokenId(api, collectionId);
       const result = await createRefungibleToken(api, alice, collectionId, 100n);
-
+      
       const itemCountAfter = await getLastTokenId(api, collectionId);
-
+      
       // What to expect
       // tslint:disable-next-line:no-unused-expression
       expect(result.success).to.be.true;
@@ -67,7 +73,43 @@
       expect(itemCountAfter.toString()).to.be.equal(result.itemId.toString());
     });
   });
-
+  
+  it('RPC method tokenOnewrs for refungible collection and token', async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+      
+      const createCollectionResult = await createCollection(api, alice, {mode: {type: 'ReFungible'}});
+      const collectionId = createCollectionResult.collectionId;
+      
+      const result = await createRefungibleToken(api, alice, collectionId, 10_000n);
+      const aliceTokenId = result.itemId;
+      
+      
+      await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+      await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+      
+      for (let i = 0; i < 7; i++) {
+        await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 50*(i+1));
+      } 
+      
+      const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+      const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+      
+      const aliceID = normalizeAccountId(alice);
+      const bobId = normalizeAccountId(bob);
+      
+      // What to expect
+      // tslint:disable-next-line:no-unused-expression
+      expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+      expect(owners.length).to.be.equal(10);
+      
+      const eleven = privateKeyWrapper('11');
+      expect(await transfer(api, collectionId, aliceTokenId, alice, eleven, 10n)).to.be.true;
+      expect((await api.rpc.unique.tokenOwners(collectionId, aliceTokenId)).length).to.be.equal(10);
+    });
+  });
+  
   it('Transfer token pieces', async () => {
     await usingApi(async api => {
       const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
@@ -186,4 +228,67 @@
       await expect(transfer(api, collectionId, tokenId, bob, alice, 160n)).to.eventually.be.rejected;
     });
   });
+
+  it('Repartition with increased amount', async () => {
+    await usingApi(async api => {
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+      const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n)).itemId;
+
+      const tx = api.tx.unique.repartition(collectionId, tokenId, 200n);
+      const events = await submitTransactionAsync(alice, tx);
+      const substrateEvents = getCreateItemsResult(events);
+      expect(substrateEvents).to.include.deep.members([
+        {
+          success: true,
+          collectionId,
+          itemId: tokenId,
+          recipient: {Substrate: alice.address},
+          amount: 100,
+        },
+      ]);
+    });
+  });
+
+  it('Repartition with decreased amount', async () => {
+    await usingApi(async api => {
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+      const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n)).itemId;
+
+      const tx = api.tx.unique.repartition(collectionId, tokenId, 50n);
+      const events = await submitTransactionAsync(alice, tx);
+      const substrateEvents = getDestroyItemsResult(events);
+      expect(substrateEvents).to.include.deep.members([
+        {
+          success: true,
+          collectionId,
+          itemId: tokenId,
+          owner: {Substrate: alice.address},
+          amount: 50,
+        },
+      ]);
+    });
+  });
+});
+
+describe('Test Refungible properties:', () => {
+  before(async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      alice = privateKeyWrapper('//Alice');
+      bob = privateKeyWrapper('//Bob');
+    });
+  });
+  
+  it('Сreate new collection with properties', async () => {
+    await usingApi(async api => {
+      const properties = [{key: 'key1', value: 'val1'}];
+      const propertyPermissions = [{key: 'key1', permission: {tokenOwner: true, mutable: false, collectionAdmin: true}}];
+      const collectionId = await createCollectionWithPropsExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'ReFungible'},
+        properties: properties,
+        propPerm: propertyPermissions, 
+      });
+      const collection = (await getDetailedCollectionInfo(api, collectionId))!;
+      expect(collection.properties.toHuman()).to.be.deep.equal(properties);
+      expect(collection.tokenPropertyPermissions.toHuman()).to.be.deep.equal(propertyPermissions);
+    });
+  });
 });
modifiedtests/src/rpc.test.tsdiffbeforeafterboth
--- a/tests/src/rpc.test.ts
+++ b/tests/src/rpc.test.ts
@@ -1,12 +1,57 @@
+import {IKeyringPair} from '@polkadot/types/types';
 import {expect} from 'chai';
 import usingApi from './substrate/substrate-api';
-import {createCollectionExpectSuccess, getTokenOwner} from './util/helpers';
+import {createCollection, createCollectionExpectSuccess, createFungibleItemExpectSuccess, CrossAccountId, getTokenOwner, normalizeAccountId, transfer, U128_MAX} from './util/helpers';
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
 
-describe('getTokenOwner', () => {
+
+describe('integration test: RPC methods', () => {
+  before(async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      alice = privateKeyWrapper('//Alice');
+      bob = privateKeyWrapper('//Bob');
+    });
+  });
+
+  
   it('returns None for fungible collection', async () => {
     await usingApi(async api => {
       const collection = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
       await expect(getTokenOwner(api, collection, 0)).to.be.rejectedWith(/^owner == null$/);
     });
   });
+  
+  it('RPC method tokenOwners for fungible collection and token', async () => {
+    await usingApi(async (api, privateKeyWrapper) => {
+      const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+      const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+      
+      const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+      const collectionId = createCollectionResult.collectionId;
+      const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+     
+      await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+      await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+            
+      for (let i = 0; i < 7; i++) {
+        await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 1);
+      } 
+      
+      const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+      const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+      const aliceID = normalizeAccountId(alice);
+      const bobId = normalizeAccountId(bob);
+
+      // What to expect
+      // tslint:disable-next-line:no-unused-expression
+      expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+      expect(owners.length == 10).to.be.true;
+      
+      const eleven = privateKeyWrapper('11');
+      expect(await transfer(api, collectionId, aliceTokenId, alice, eleven, 10n)).to.be.true;
+      expect((await api.rpc.unique.tokenOwners(collectionId, aliceTokenId)).length).to.be.equal(10);
+    });
+  });
 });
\ No newline at end of file
modifiedtests/src/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -103,6 +103,15 @@
   collectionId: number;
   itemId: number;
   recipient?: CrossAccountId;
+  amount?: number;
+}
+
+interface DestroyItemResult {
+  success: boolean;
+  collectionId: number;
+  itemId: number;
+  owner: CrossAccountId;
+  amount: number;
 }
 
 interface TransferResult {
@@ -220,12 +229,14 @@
     const collectionId = parseInt(data[0].toString(), 10);
     const itemId = parseInt(data[1].toString(), 10);
     const recipient = normalizeAccountId(data[2].toJSON() as any);
+    const amount = parseInt(data[3].toString(), 10);
 
     const itemRes: CreateItemResult = {
       success: true,
       collectionId,
       itemId,
       recipient,
+      amount,
     };
 
     results.push(itemRes);
@@ -255,6 +266,31 @@
   return result;
 }
 
+export function getDestroyItemsResult(events: EventRecord[]): DestroyItemResult[] {
+  const results: DestroyItemResult[] = [];
+  
+  const genericResult = getGenericResult<DestroyItemResult[]>(events, 'common', 'ItemDestroyed', (data) => {
+    const collectionId = parseInt(data[0].toString(), 10);
+    const itemId = parseInt(data[1].toString(), 10);
+    const owner = normalizeAccountId(data[2].toJSON() as any);
+    const amount = parseInt(data[3].toString(), 10);
+
+    const itemRes: DestroyItemResult = {
+      success: true,
+      collectionId,
+      itemId,
+      owner,
+      amount,
+    };
+
+    results.push(itemRes);
+    return results;
+  });
+
+  if (!genericResult.success) return [];
+  return results;
+}
+
 export function getTransferResult(api: ApiPromise, events: EventRecord[]): TransferResult {
   for (const {event} of events) {
     if (api.events.common.Transfer.is(event)) {
@@ -284,7 +320,7 @@
   type: 'ReFungible';
 }
 
-type CollectionMode = Nft | Fungible | ReFungible;
+export type CollectionMode = Nft | Fungible | ReFungible;
 
 export type Property = {
   key: any,
@@ -1414,7 +1450,7 @@
       tx = api.tx.unique.createItem(collectionId, to, createData as any);
     }
 
-    const events = await submitTransactionAsync(sender, tx);
+    const events = await executeTransaction(api, sender, tx);
     const result = getCreateItemResult(events);
 
     const itemCountAfter = await getLastTokenId(api, collectionId);