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
before · tests/src/interfaces/default/types.ts
1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';5import type { ITuple } from '@polkadot/types-codec/types';6import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';7import type { Event } from '@polkadot/types/interfaces/system';89/** @name CumulusPalletDmpQueueCall */10export interface CumulusPalletDmpQueueCall extends Enum {11  readonly isServiceOverweight: boolean;12  readonly asServiceOverweight: {13    readonly index: u64;14    readonly weightLimit: u64;15  } & Struct;16  readonly type: 'ServiceOverweight';17}1819/** @name CumulusPalletDmpQueueConfigData */20export interface CumulusPalletDmpQueueConfigData extends Struct {21  readonly maxIndividual: u64;22}2324/** @name CumulusPalletDmpQueueError */25export interface CumulusPalletDmpQueueError extends Enum {26  readonly isUnknown: boolean;27  readonly isOverLimit: boolean;28  readonly type: 'Unknown' | 'OverLimit';29}3031/** @name CumulusPalletDmpQueueEvent */32export interface CumulusPalletDmpQueueEvent extends Enum {33  readonly isInvalidFormat: boolean;34  readonly asInvalidFormat: {35    readonly messageId: U8aFixed;36  } & Struct;37  readonly isUnsupportedVersion: boolean;38  readonly asUnsupportedVersion: {39    readonly messageId: U8aFixed;40  } & Struct;41  readonly isExecutedDownward: boolean;42  readonly asExecutedDownward: {43    readonly messageId: U8aFixed;44    readonly outcome: XcmV2TraitsOutcome;45  } & Struct;46  readonly isWeightExhausted: boolean;47  readonly asWeightExhausted: {48    readonly messageId: U8aFixed;49    readonly remainingWeight: u64;50    readonly requiredWeight: u64;51  } & Struct;52  readonly isOverweightEnqueued: boolean;53  readonly asOverweightEnqueued: {54    readonly messageId: U8aFixed;55    readonly overweightIndex: u64;56    readonly requiredWeight: u64;57  } & Struct;58  readonly isOverweightServiced: boolean;59  readonly asOverweightServiced: {60    readonly overweightIndex: u64;61    readonly weightUsed: u64;62  } & Struct;63  readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';64}6566/** @name CumulusPalletDmpQueuePageIndexData */67export interface CumulusPalletDmpQueuePageIndexData extends Struct {68  readonly beginUsed: u32;69  readonly endUsed: u32;70  readonly overweightCount: u64;71}7273/** @name CumulusPalletParachainSystemCall */74export interface CumulusPalletParachainSystemCall extends Enum {75  readonly isSetValidationData: boolean;76  readonly asSetValidationData: {77    readonly data: CumulusPrimitivesParachainInherentParachainInherentData;78  } & Struct;79  readonly isSudoSendUpwardMessage: boolean;80  readonly asSudoSendUpwardMessage: {81    readonly message: Bytes;82  } & Struct;83  readonly isAuthorizeUpgrade: boolean;84  readonly asAuthorizeUpgrade: {85    readonly codeHash: H256;86  } & Struct;87  readonly isEnactAuthorizedUpgrade: boolean;88  readonly asEnactAuthorizedUpgrade: {89    readonly code: Bytes;90  } & Struct;91  readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';92}9394/** @name CumulusPalletParachainSystemError */95export interface CumulusPalletParachainSystemError extends Enum {96  readonly isOverlappingUpgrades: boolean;97  readonly isProhibitedByPolkadot: boolean;98  readonly isTooBig: boolean;99  readonly isValidationDataNotAvailable: boolean;100  readonly isHostConfigurationNotAvailable: boolean;101  readonly isNotScheduled: boolean;102  readonly isNothingAuthorized: boolean;103  readonly isUnauthorized: boolean;104  readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';105}106107/** @name CumulusPalletParachainSystemEvent */108export interface CumulusPalletParachainSystemEvent extends Enum {109  readonly isValidationFunctionStored: boolean;110  readonly isValidationFunctionApplied: boolean;111  readonly asValidationFunctionApplied: {112    readonly relayChainBlockNum: u32;113  } & Struct;114  readonly isValidationFunctionDiscarded: boolean;115  readonly isUpgradeAuthorized: boolean;116  readonly asUpgradeAuthorized: {117    readonly codeHash: H256;118  } & Struct;119  readonly isDownwardMessagesReceived: boolean;120  readonly asDownwardMessagesReceived: {121    readonly count: u32;122  } & Struct;123  readonly isDownwardMessagesProcessed: boolean;124  readonly asDownwardMessagesProcessed: {125    readonly weightUsed: u64;126    readonly dmqHead: H256;127  } & Struct;128  readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';129}130131/** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot */132export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {133  readonly dmqMqcHead: H256;134  readonly relayDispatchQueueSize: ITuple<[u32, u32]>;135  readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;136  readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;137}138139/** @name CumulusPalletXcmCall */140export interface CumulusPalletXcmCall extends Null {}141142/** @name CumulusPalletXcmError */143export interface CumulusPalletXcmError extends Null {}144145/** @name CumulusPalletXcmEvent */146export interface CumulusPalletXcmEvent extends Enum {147  readonly isInvalidFormat: boolean;148  readonly asInvalidFormat: U8aFixed;149  readonly isUnsupportedVersion: boolean;150  readonly asUnsupportedVersion: U8aFixed;151  readonly isExecutedDownward: boolean;152  readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;153  readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';154}155156/** @name CumulusPalletXcmOrigin */157export interface CumulusPalletXcmOrigin extends Enum {158  readonly isRelay: boolean;159  readonly isSiblingParachain: boolean;160  readonly asSiblingParachain: u32;161  readonly type: 'Relay' | 'SiblingParachain';162}163164/** @name CumulusPalletXcmpQueueCall */165export interface CumulusPalletXcmpQueueCall extends Enum {166  readonly isServiceOverweight: boolean;167  readonly asServiceOverweight: {168    readonly index: u64;169    readonly weightLimit: u64;170  } & Struct;171  readonly isSuspendXcmExecution: boolean;172  readonly isResumeXcmExecution: boolean;173  readonly isUpdateSuspendThreshold: boolean;174  readonly asUpdateSuspendThreshold: {175    readonly new_: u32;176  } & Struct;177  readonly isUpdateDropThreshold: boolean;178  readonly asUpdateDropThreshold: {179    readonly new_: u32;180  } & Struct;181  readonly isUpdateResumeThreshold: boolean;182  readonly asUpdateResumeThreshold: {183    readonly new_: u32;184  } & Struct;185  readonly isUpdateThresholdWeight: boolean;186  readonly asUpdateThresholdWeight: {187    readonly new_: u64;188  } & Struct;189  readonly isUpdateWeightRestrictDecay: boolean;190  readonly asUpdateWeightRestrictDecay: {191    readonly new_: u64;192  } & Struct;193  readonly isUpdateXcmpMaxIndividualWeight: boolean;194  readonly asUpdateXcmpMaxIndividualWeight: {195    readonly new_: u64;196  } & Struct;197  readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';198}199200/** @name CumulusPalletXcmpQueueError */201export interface CumulusPalletXcmpQueueError extends Enum {202  readonly isFailedToSend: boolean;203  readonly isBadXcmOrigin: boolean;204  readonly isBadXcm: boolean;205  readonly isBadOverweightIndex: boolean;206  readonly isWeightOverLimit: boolean;207  readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';208}209210/** @name CumulusPalletXcmpQueueEvent */211export interface CumulusPalletXcmpQueueEvent extends Enum {212  readonly isSuccess: boolean;213  readonly asSuccess: Option<H256>;214  readonly isFail: boolean;215  readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;216  readonly isBadVersion: boolean;217  readonly asBadVersion: Option<H256>;218  readonly isBadFormat: boolean;219  readonly asBadFormat: Option<H256>;220  readonly isUpwardMessageSent: boolean;221  readonly asUpwardMessageSent: Option<H256>;222  readonly isXcmpMessageSent: boolean;223  readonly asXcmpMessageSent: Option<H256>;224  readonly isOverweightEnqueued: boolean;225  readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;226  readonly isOverweightServiced: boolean;227  readonly asOverweightServiced: ITuple<[u64, u64]>;228  readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';229}230231/** @name CumulusPalletXcmpQueueInboundChannelDetails */232export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {233  readonly sender: u32;234  readonly state: CumulusPalletXcmpQueueInboundState;235  readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;236}237238/** @name CumulusPalletXcmpQueueInboundState */239export interface CumulusPalletXcmpQueueInboundState extends Enum {240  readonly isOk: boolean;241  readonly isSuspended: boolean;242  readonly type: 'Ok' | 'Suspended';243}244245/** @name CumulusPalletXcmpQueueOutboundChannelDetails */246export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {247  readonly recipient: u32;248  readonly state: CumulusPalletXcmpQueueOutboundState;249  readonly signalsExist: bool;250  readonly firstIndex: u16;251  readonly lastIndex: u16;252}253254/** @name CumulusPalletXcmpQueueOutboundState */255export interface CumulusPalletXcmpQueueOutboundState extends Enum {256  readonly isOk: boolean;257  readonly isSuspended: boolean;258  readonly type: 'Ok' | 'Suspended';259}260261/** @name CumulusPalletXcmpQueueQueueConfigData */262export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {263  readonly suspendThreshold: u32;264  readonly dropThreshold: u32;265  readonly resumeThreshold: u32;266  readonly thresholdWeight: u64;267  readonly weightRestrictDecay: u64;268  readonly xcmpMaxIndividualWeight: u64;269}270271/** @name CumulusPrimitivesParachainInherentParachainInherentData */272export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {273  readonly validationData: PolkadotPrimitivesV2PersistedValidationData;274  readonly relayChainState: SpTrieStorageProof;275  readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;276  readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;277}278279/** @name EthbloomBloom */280export interface EthbloomBloom extends U8aFixed {}281282/** @name EthereumBlock */283export interface EthereumBlock extends Struct {284  readonly header: EthereumHeader;285  readonly transactions: Vec<EthereumTransactionTransactionV2>;286  readonly ommers: Vec<EthereumHeader>;287}288289/** @name EthereumHeader */290export interface EthereumHeader extends Struct {291  readonly parentHash: H256;292  readonly ommersHash: H256;293  readonly beneficiary: H160;294  readonly stateRoot: H256;295  readonly transactionsRoot: H256;296  readonly receiptsRoot: H256;297  readonly logsBloom: EthbloomBloom;298  readonly difficulty: U256;299  readonly number: U256;300  readonly gasLimit: U256;301  readonly gasUsed: U256;302  readonly timestamp: u64;303  readonly extraData: Bytes;304  readonly mixHash: H256;305  readonly nonce: EthereumTypesHashH64;306}307308/** @name EthereumLog */309export interface EthereumLog extends Struct {310  readonly address: H160;311  readonly topics: Vec<H256>;312  readonly data: Bytes;313}314315/** @name EthereumReceiptEip658ReceiptData */316export interface EthereumReceiptEip658ReceiptData extends Struct {317  readonly statusCode: u8;318  readonly usedGas: U256;319  readonly logsBloom: EthbloomBloom;320  readonly logs: Vec<EthereumLog>;321}322323/** @name EthereumReceiptReceiptV3 */324export interface EthereumReceiptReceiptV3 extends Enum {325  readonly isLegacy: boolean;326  readonly asLegacy: EthereumReceiptEip658ReceiptData;327  readonly isEip2930: boolean;328  readonly asEip2930: EthereumReceiptEip658ReceiptData;329  readonly isEip1559: boolean;330  readonly asEip1559: EthereumReceiptEip658ReceiptData;331  readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';332}333334/** @name EthereumTransactionAccessListItem */335export interface EthereumTransactionAccessListItem extends Struct {336  readonly address: H160;337  readonly storageKeys: Vec<H256>;338}339340/** @name EthereumTransactionEip1559Transaction */341export interface EthereumTransactionEip1559Transaction extends Struct {342  readonly chainId: u64;343  readonly nonce: U256;344  readonly maxPriorityFeePerGas: U256;345  readonly maxFeePerGas: U256;346  readonly gasLimit: U256;347  readonly action: EthereumTransactionTransactionAction;348  readonly value: U256;349  readonly input: Bytes;350  readonly accessList: Vec<EthereumTransactionAccessListItem>;351  readonly oddYParity: bool;352  readonly r: H256;353  readonly s: H256;354}355356/** @name EthereumTransactionEip2930Transaction */357export interface EthereumTransactionEip2930Transaction extends Struct {358  readonly chainId: u64;359  readonly nonce: U256;360  readonly gasPrice: U256;361  readonly gasLimit: U256;362  readonly action: EthereumTransactionTransactionAction;363  readonly value: U256;364  readonly input: Bytes;365  readonly accessList: Vec<EthereumTransactionAccessListItem>;366  readonly oddYParity: bool;367  readonly r: H256;368  readonly s: H256;369}370371/** @name EthereumTransactionLegacyTransaction */372export interface EthereumTransactionLegacyTransaction extends Struct {373  readonly nonce: U256;374  readonly gasPrice: U256;375  readonly gasLimit: U256;376  readonly action: EthereumTransactionTransactionAction;377  readonly value: U256;378  readonly input: Bytes;379  readonly signature: EthereumTransactionTransactionSignature;380}381382/** @name EthereumTransactionTransactionAction */383export interface EthereumTransactionTransactionAction extends Enum {384  readonly isCall: boolean;385  readonly asCall: H160;386  readonly isCreate: boolean;387  readonly type: 'Call' | 'Create';388}389390/** @name EthereumTransactionTransactionSignature */391export interface EthereumTransactionTransactionSignature extends Struct {392  readonly v: u64;393  readonly r: H256;394  readonly s: H256;395}396397/** @name EthereumTransactionTransactionV2 */398export interface EthereumTransactionTransactionV2 extends Enum {399  readonly isLegacy: boolean;400  readonly asLegacy: EthereumTransactionLegacyTransaction;401  readonly isEip2930: boolean;402  readonly asEip2930: EthereumTransactionEip2930Transaction;403  readonly isEip1559: boolean;404  readonly asEip1559: EthereumTransactionEip1559Transaction;405  readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';406}407408/** @name EthereumTypesHashH64 */409export interface EthereumTypesHashH64 extends U8aFixed {}410411/** @name EvmCoreErrorExitError */412export interface EvmCoreErrorExitError extends Enum {413  readonly isStackUnderflow: boolean;414  readonly isStackOverflow: boolean;415  readonly isInvalidJump: boolean;416  readonly isInvalidRange: boolean;417  readonly isDesignatedInvalid: boolean;418  readonly isCallTooDeep: boolean;419  readonly isCreateCollision: boolean;420  readonly isCreateContractLimit: boolean;421  readonly isOutOfOffset: boolean;422  readonly isOutOfGas: boolean;423  readonly isOutOfFund: boolean;424  readonly isPcUnderflow: boolean;425  readonly isCreateEmpty: boolean;426  readonly isOther: boolean;427  readonly asOther: Text;428  readonly isInvalidCode: boolean;429  readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';430}431432/** @name EvmCoreErrorExitFatal */433export interface EvmCoreErrorExitFatal extends Enum {434  readonly isNotSupported: boolean;435  readonly isUnhandledInterrupt: boolean;436  readonly isCallErrorAsFatal: boolean;437  readonly asCallErrorAsFatal: EvmCoreErrorExitError;438  readonly isOther: boolean;439  readonly asOther: Text;440  readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';441}442443/** @name EvmCoreErrorExitReason */444export interface EvmCoreErrorExitReason extends Enum {445  readonly isSucceed: boolean;446  readonly asSucceed: EvmCoreErrorExitSucceed;447  readonly isError: boolean;448  readonly asError: EvmCoreErrorExitError;449  readonly isRevert: boolean;450  readonly asRevert: EvmCoreErrorExitRevert;451  readonly isFatal: boolean;452  readonly asFatal: EvmCoreErrorExitFatal;453  readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';454}455456/** @name EvmCoreErrorExitRevert */457export interface EvmCoreErrorExitRevert extends Enum {458  readonly isReverted: boolean;459  readonly type: 'Reverted';460}461462/** @name EvmCoreErrorExitSucceed */463export interface EvmCoreErrorExitSucceed extends Enum {464  readonly isStopped: boolean;465  readonly isReturned: boolean;466  readonly isSuicided: boolean;467  readonly type: 'Stopped' | 'Returned' | 'Suicided';468}469470/** @name FpRpcTransactionStatus */471export interface FpRpcTransactionStatus extends Struct {472  readonly transactionHash: H256;473  readonly transactionIndex: u32;474  readonly from: H160;475  readonly to: Option<H160>;476  readonly contractAddress: Option<H160>;477  readonly logs: Vec<EthereumLog>;478  readonly logsBloom: EthbloomBloom;479}480481/** @name FrameSupportDispatchRawOrigin */482export interface FrameSupportDispatchRawOrigin extends Enum {483  readonly isRoot: boolean;484  readonly isSigned: boolean;485  readonly asSigned: AccountId32;486  readonly isNone: boolean;487  readonly type: 'Root' | 'Signed' | 'None';488}489490/** @name FrameSupportPalletId */491export interface FrameSupportPalletId extends U8aFixed {}492493/** @name FrameSupportScheduleLookupError */494export interface FrameSupportScheduleLookupError extends Enum {495  readonly isUnknown: boolean;496  readonly isBadFormat: boolean;497  readonly type: 'Unknown' | 'BadFormat';498}499500/** @name FrameSupportScheduleMaybeHashed */501export interface FrameSupportScheduleMaybeHashed extends Enum {502  readonly isValue: boolean;503  readonly asValue: Call;504  readonly isHash: boolean;505  readonly asHash: H256;506  readonly type: 'Value' | 'Hash';507}508509/** @name FrameSupportTokensMiscBalanceStatus */510export interface FrameSupportTokensMiscBalanceStatus extends Enum {511  readonly isFree: boolean;512  readonly isReserved: boolean;513  readonly type: 'Free' | 'Reserved';514}515516/** @name FrameSupportWeightsDispatchClass */517export interface FrameSupportWeightsDispatchClass extends Enum {518  readonly isNormal: boolean;519  readonly isOperational: boolean;520  readonly isMandatory: boolean;521  readonly type: 'Normal' | 'Operational' | 'Mandatory';522}523524/** @name FrameSupportWeightsDispatchInfo */525export interface FrameSupportWeightsDispatchInfo extends Struct {526  readonly weight: u64;527  readonly class: FrameSupportWeightsDispatchClass;528  readonly paysFee: FrameSupportWeightsPays;529}530531/** @name FrameSupportWeightsPays */532export interface FrameSupportWeightsPays extends Enum {533  readonly isYes: boolean;534  readonly isNo: boolean;535  readonly type: 'Yes' | 'No';536}537538/** @name FrameSupportWeightsPerDispatchClassU32 */539export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {540  readonly normal: u32;541  readonly operational: u32;542  readonly mandatory: u32;543}544545/** @name FrameSupportWeightsPerDispatchClassU64 */546export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {547  readonly normal: u64;548  readonly operational: u64;549  readonly mandatory: u64;550}551552/** @name FrameSupportWeightsPerDispatchClassWeightsPerClass */553export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {554  readonly normal: FrameSystemLimitsWeightsPerClass;555  readonly operational: FrameSystemLimitsWeightsPerClass;556  readonly mandatory: FrameSystemLimitsWeightsPerClass;557}558559/** @name FrameSupportWeightsRuntimeDbWeight */560export interface FrameSupportWeightsRuntimeDbWeight extends Struct {561  readonly read: u64;562  readonly write: u64;563}564565/** @name FrameSystemAccountInfo */566export interface FrameSystemAccountInfo extends Struct {567  readonly nonce: u32;568  readonly consumers: u32;569  readonly providers: u32;570  readonly sufficients: u32;571  readonly data: PalletBalancesAccountData;572}573574/** @name FrameSystemCall */575export interface FrameSystemCall extends Enum {576  readonly isFillBlock: boolean;577  readonly asFillBlock: {578    readonly ratio: Perbill;579  } & Struct;580  readonly isRemark: boolean;581  readonly asRemark: {582    readonly remark: Bytes;583  } & Struct;584  readonly isSetHeapPages: boolean;585  readonly asSetHeapPages: {586    readonly pages: u64;587  } & Struct;588  readonly isSetCode: boolean;589  readonly asSetCode: {590    readonly code: Bytes;591  } & Struct;592  readonly isSetCodeWithoutChecks: boolean;593  readonly asSetCodeWithoutChecks: {594    readonly code: Bytes;595  } & Struct;596  readonly isSetStorage: boolean;597  readonly asSetStorage: {598    readonly items: Vec<ITuple<[Bytes, Bytes]>>;599  } & Struct;600  readonly isKillStorage: boolean;601  readonly asKillStorage: {602    readonly keys_: Vec<Bytes>;603  } & Struct;604  readonly isKillPrefix: boolean;605  readonly asKillPrefix: {606    readonly prefix: Bytes;607    readonly subkeys: u32;608  } & Struct;609  readonly isRemarkWithEvent: boolean;610  readonly asRemarkWithEvent: {611    readonly remark: Bytes;612  } & Struct;613  readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';614}615616/** @name FrameSystemError */617export interface FrameSystemError extends Enum {618  readonly isInvalidSpecName: boolean;619  readonly isSpecVersionNeedsToIncrease: boolean;620  readonly isFailedToExtractRuntimeVersion: boolean;621  readonly isNonDefaultComposite: boolean;622  readonly isNonZeroRefCount: boolean;623  readonly isCallFiltered: boolean;624  readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';625}626627/** @name FrameSystemEvent */628export interface FrameSystemEvent extends Enum {629  readonly isExtrinsicSuccess: boolean;630  readonly asExtrinsicSuccess: {631    readonly dispatchInfo: FrameSupportWeightsDispatchInfo;632  } & Struct;633  readonly isExtrinsicFailed: boolean;634  readonly asExtrinsicFailed: {635    readonly dispatchError: SpRuntimeDispatchError;636    readonly dispatchInfo: FrameSupportWeightsDispatchInfo;637  } & Struct;638  readonly isCodeUpdated: boolean;639  readonly isNewAccount: boolean;640  readonly asNewAccount: {641    readonly account: AccountId32;642  } & Struct;643  readonly isKilledAccount: boolean;644  readonly asKilledAccount: {645    readonly account: AccountId32;646  } & Struct;647  readonly isRemarked: boolean;648  readonly asRemarked: {649    readonly sender: AccountId32;650    readonly hash_: H256;651  } & Struct;652  readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';653}654655/** @name FrameSystemEventRecord */656export interface FrameSystemEventRecord extends Struct {657  readonly phase: FrameSystemPhase;658  readonly event: Event;659  readonly topics: Vec<H256>;660}661662/** @name FrameSystemExtensionsCheckGenesis */663export interface FrameSystemExtensionsCheckGenesis extends Null {}664665/** @name FrameSystemExtensionsCheckNonce */666export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}667668/** @name FrameSystemExtensionsCheckSpecVersion */669export interface FrameSystemExtensionsCheckSpecVersion extends Null {}670671/** @name FrameSystemExtensionsCheckWeight */672export interface FrameSystemExtensionsCheckWeight extends Null {}673674/** @name FrameSystemLastRuntimeUpgradeInfo */675export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {676  readonly specVersion: Compact<u32>;677  readonly specName: Text;678}679680/** @name FrameSystemLimitsBlockLength */681export interface FrameSystemLimitsBlockLength extends Struct {682  readonly max: FrameSupportWeightsPerDispatchClassU32;683}684685/** @name FrameSystemLimitsBlockWeights */686export interface FrameSystemLimitsBlockWeights extends Struct {687  readonly baseBlock: u64;688  readonly maxBlock: u64;689  readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;690}691692/** @name FrameSystemLimitsWeightsPerClass */693export interface FrameSystemLimitsWeightsPerClass extends Struct {694  readonly baseExtrinsic: u64;695  readonly maxExtrinsic: Option<u64>;696  readonly maxTotal: Option<u64>;697  readonly reserved: Option<u64>;698}699700/** @name FrameSystemPhase */701export interface FrameSystemPhase extends Enum {702  readonly isApplyExtrinsic: boolean;703  readonly asApplyExtrinsic: u32;704  readonly isFinalization: boolean;705  readonly isInitialization: boolean;706  readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';707}708709/** @name OpalRuntimeOriginCaller */710export interface OpalRuntimeOriginCaller extends Enum {711  readonly isVoid: boolean;712  readonly asVoid: SpCoreVoid;713  readonly isSystem: boolean;714  readonly asSystem: FrameSupportDispatchRawOrigin;715  readonly isPolkadotXcm: boolean;716  readonly asPolkadotXcm: PalletXcmOrigin;717  readonly isCumulusXcm: boolean;718  readonly asCumulusXcm: CumulusPalletXcmOrigin;719  readonly isEthereum: boolean;720  readonly asEthereum: PalletEthereumRawOrigin;721  readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';722}723724/** @name OpalRuntimeRuntime */725export interface OpalRuntimeRuntime extends Null {}726727/** @name OrmlVestingModuleCall */728export interface OrmlVestingModuleCall extends Enum {729  readonly isClaim: boolean;730  readonly isVestedTransfer: boolean;731  readonly asVestedTransfer: {732    readonly dest: MultiAddress;733    readonly schedule: OrmlVestingVestingSchedule;734  } & Struct;735  readonly isUpdateVestingSchedules: boolean;736  readonly asUpdateVestingSchedules: {737    readonly who: MultiAddress;738    readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;739  } & Struct;740  readonly isClaimFor: boolean;741  readonly asClaimFor: {742    readonly dest: MultiAddress;743  } & Struct;744  readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';745}746747/** @name OrmlVestingModuleError */748export interface OrmlVestingModuleError extends Enum {749  readonly isZeroVestingPeriod: boolean;750  readonly isZeroVestingPeriodCount: boolean;751  readonly isInsufficientBalanceToLock: boolean;752  readonly isTooManyVestingSchedules: boolean;753  readonly isAmountLow: boolean;754  readonly isMaxVestingSchedulesExceeded: boolean;755  readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';756}757758/** @name OrmlVestingModuleEvent */759export interface OrmlVestingModuleEvent extends Enum {760  readonly isVestingScheduleAdded: boolean;761  readonly asVestingScheduleAdded: {762    readonly from: AccountId32;763    readonly to: AccountId32;764    readonly vestingSchedule: OrmlVestingVestingSchedule;765  } & Struct;766  readonly isClaimed: boolean;767  readonly asClaimed: {768    readonly who: AccountId32;769    readonly amount: u128;770  } & Struct;771  readonly isVestingSchedulesUpdated: boolean;772  readonly asVestingSchedulesUpdated: {773    readonly who: AccountId32;774  } & Struct;775  readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';776}777778/** @name OrmlVestingVestingSchedule */779export interface OrmlVestingVestingSchedule extends Struct {780  readonly start: u32;781  readonly period: u32;782  readonly periodCount: u32;783  readonly perPeriod: Compact<u128>;784}785786/** @name PalletBalancesAccountData */787export interface PalletBalancesAccountData extends Struct {788  readonly free: u128;789  readonly reserved: u128;790  readonly miscFrozen: u128;791  readonly feeFrozen: u128;792}793794/** @name PalletBalancesBalanceLock */795export interface PalletBalancesBalanceLock extends Struct {796  readonly id: U8aFixed;797  readonly amount: u128;798  readonly reasons: PalletBalancesReasons;799}800801/** @name PalletBalancesCall */802export interface PalletBalancesCall extends Enum {803  readonly isTransfer: boolean;804  readonly asTransfer: {805    readonly dest: MultiAddress;806    readonly value: Compact<u128>;807  } & Struct;808  readonly isSetBalance: boolean;809  readonly asSetBalance: {810    readonly who: MultiAddress;811    readonly newFree: Compact<u128>;812    readonly newReserved: Compact<u128>;813  } & Struct;814  readonly isForceTransfer: boolean;815  readonly asForceTransfer: {816    readonly source: MultiAddress;817    readonly dest: MultiAddress;818    readonly value: Compact<u128>;819  } & Struct;820  readonly isTransferKeepAlive: boolean;821  readonly asTransferKeepAlive: {822    readonly dest: MultiAddress;823    readonly value: Compact<u128>;824  } & Struct;825  readonly isTransferAll: boolean;826  readonly asTransferAll: {827    readonly dest: MultiAddress;828    readonly keepAlive: bool;829  } & Struct;830  readonly isForceUnreserve: boolean;831  readonly asForceUnreserve: {832    readonly who: MultiAddress;833    readonly amount: u128;834  } & Struct;835  readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';836}837838/** @name PalletBalancesError */839export interface PalletBalancesError extends Enum {840  readonly isVestingBalance: boolean;841  readonly isLiquidityRestrictions: boolean;842  readonly isInsufficientBalance: boolean;843  readonly isExistentialDeposit: boolean;844  readonly isKeepAlive: boolean;845  readonly isExistingVestingSchedule: boolean;846  readonly isDeadAccount: boolean;847  readonly isTooManyReserves: boolean;848  readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';849}850851/** @name PalletBalancesEvent */852export interface PalletBalancesEvent extends Enum {853  readonly isEndowed: boolean;854  readonly asEndowed: {855    readonly account: AccountId32;856    readonly freeBalance: u128;857  } & Struct;858  readonly isDustLost: boolean;859  readonly asDustLost: {860    readonly account: AccountId32;861    readonly amount: u128;862  } & Struct;863  readonly isTransfer: boolean;864  readonly asTransfer: {865    readonly from: AccountId32;866    readonly to: AccountId32;867    readonly amount: u128;868  } & Struct;869  readonly isBalanceSet: boolean;870  readonly asBalanceSet: {871    readonly who: AccountId32;872    readonly free: u128;873    readonly reserved: u128;874  } & Struct;875  readonly isReserved: boolean;876  readonly asReserved: {877    readonly who: AccountId32;878    readonly amount: u128;879  } & Struct;880  readonly isUnreserved: boolean;881  readonly asUnreserved: {882    readonly who: AccountId32;883    readonly amount: u128;884  } & Struct;885  readonly isReserveRepatriated: boolean;886  readonly asReserveRepatriated: {887    readonly from: AccountId32;888    readonly to: AccountId32;889    readonly amount: u128;890    readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;891  } & Struct;892  readonly isDeposit: boolean;893  readonly asDeposit: {894    readonly who: AccountId32;895    readonly amount: u128;896  } & Struct;897  readonly isWithdraw: boolean;898  readonly asWithdraw: {899    readonly who: AccountId32;900    readonly amount: u128;901  } & Struct;902  readonly isSlashed: boolean;903  readonly asSlashed: {904    readonly who: AccountId32;905    readonly amount: u128;906  } & Struct;907  readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';908}909910/** @name PalletBalancesReasons */911export interface PalletBalancesReasons extends Enum {912  readonly isFee: boolean;913  readonly isMisc: boolean;914  readonly isAll: boolean;915  readonly type: 'Fee' | 'Misc' | 'All';916}917918/** @name PalletBalancesReleases */919export interface PalletBalancesReleases extends Enum {920  readonly isV100: boolean;921  readonly isV200: boolean;922  readonly type: 'V100' | 'V200';923}924925/** @name PalletBalancesReserveData */926export interface PalletBalancesReserveData extends Struct {927  readonly id: U8aFixed;928  readonly amount: u128;929}930931/** @name PalletCommonError */932export interface PalletCommonError extends Enum {933  readonly isCollectionNotFound: boolean;934  readonly isMustBeTokenOwner: boolean;935  readonly isNoPermission: boolean;936  readonly isCantDestroyNotEmptyCollection: boolean;937  readonly isPublicMintingNotAllowed: boolean;938  readonly isAddressNotInAllowlist: boolean;939  readonly isCollectionNameLimitExceeded: boolean;940  readonly isCollectionDescriptionLimitExceeded: boolean;941  readonly isCollectionTokenPrefixLimitExceeded: boolean;942  readonly isTotalCollectionsLimitExceeded: boolean;943  readonly isCollectionAdminCountExceeded: boolean;944  readonly isCollectionLimitBoundsExceeded: boolean;945  readonly isOwnerPermissionsCantBeReverted: boolean;946  readonly isTransferNotAllowed: boolean;947  readonly isAccountTokenLimitExceeded: boolean;948  readonly isCollectionTokenLimitExceeded: boolean;949  readonly isMetadataFlagFrozen: boolean;950  readonly isTokenNotFound: boolean;951  readonly isTokenValueTooLow: boolean;952  readonly isApprovedValueTooLow: boolean;953  readonly isCantApproveMoreThanOwned: boolean;954  readonly isAddressIsZero: boolean;955  readonly isUnsupportedOperation: boolean;956  readonly isNotSufficientFounds: boolean;957  readonly isUserIsNotAllowedToNest: boolean;958  readonly isSourceCollectionIsNotAllowedToNest: boolean;959  readonly isCollectionFieldSizeExceeded: boolean;960  readonly isNoSpaceForProperty: boolean;961  readonly isPropertyLimitReached: boolean;962  readonly isPropertyKeyIsTooLong: boolean;963  readonly isInvalidCharacterInPropertyKey: boolean;964  readonly isEmptyPropertyKey: boolean;965  readonly isCollectionIsExternal: boolean;966  readonly isCollectionIsInternal: boolean;967  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';968}969970/** @name PalletCommonEvent */971export interface PalletCommonEvent extends Enum {972  readonly isCollectionCreated: boolean;973  readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;974  readonly isCollectionDestroyed: boolean;975  readonly asCollectionDestroyed: u32;976  readonly isItemCreated: boolean;977  readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;978  readonly isItemDestroyed: boolean;979  readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;980  readonly isTransfer: boolean;981  readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;982  readonly isApproved: boolean;983  readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;984  readonly isCollectionPropertySet: boolean;985  readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;986  readonly isCollectionPropertyDeleted: boolean;987  readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;988  readonly isTokenPropertySet: boolean;989  readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;990  readonly isTokenPropertyDeleted: boolean;991  readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;992  readonly isPropertyPermissionSet: boolean;993  readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;994  readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';995}996997/** @name PalletEthereumCall */998export interface PalletEthereumCall extends Enum {999  readonly isTransact: boolean;1000  readonly asTransact: {1001    readonly transaction: EthereumTransactionTransactionV2;1002  } & Struct;1003  readonly type: 'Transact';1004}10051006/** @name PalletEthereumError */1007export interface PalletEthereumError extends Enum {1008  readonly isInvalidSignature: boolean;1009  readonly isPreLogExists: boolean;1010  readonly type: 'InvalidSignature' | 'PreLogExists';1011}10121013/** @name PalletEthereumEvent */1014export interface PalletEthereumEvent extends Enum {1015  readonly isExecuted: boolean;1016  readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;1017  readonly type: 'Executed';1018}10191020/** @name PalletEthereumFakeTransactionFinalizer */1021export interface PalletEthereumFakeTransactionFinalizer extends Null {}10221023/** @name PalletEthereumRawOrigin */1024export interface PalletEthereumRawOrigin extends Enum {1025  readonly isEthereumTransaction: boolean;1026  readonly asEthereumTransaction: H160;1027  readonly type: 'EthereumTransaction';1028}10291030/** @name PalletEvmAccountBasicCrossAccountIdRepr */1031export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1032  readonly isSubstrate: boolean;1033  readonly asSubstrate: AccountId32;1034  readonly isEthereum: boolean;1035  readonly asEthereum: H160;1036  readonly type: 'Substrate' | 'Ethereum';1037}10381039/** @name PalletEvmCall */1040export interface PalletEvmCall extends Enum {1041  readonly isWithdraw: boolean;1042  readonly asWithdraw: {1043    readonly address: H160;1044    readonly value: u128;1045  } & Struct;1046  readonly isCall: boolean;1047  readonly asCall: {1048    readonly source: H160;1049    readonly target: H160;1050    readonly input: Bytes;1051    readonly value: U256;1052    readonly gasLimit: u64;1053    readonly maxFeePerGas: U256;1054    readonly maxPriorityFeePerGas: Option<U256>;1055    readonly nonce: Option<U256>;1056    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1057  } & Struct;1058  readonly isCreate: boolean;1059  readonly asCreate: {1060    readonly source: H160;1061    readonly init: Bytes;1062    readonly value: U256;1063    readonly gasLimit: u64;1064    readonly maxFeePerGas: U256;1065    readonly maxPriorityFeePerGas: Option<U256>;1066    readonly nonce: Option<U256>;1067    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1068  } & Struct;1069  readonly isCreate2: boolean;1070  readonly asCreate2: {1071    readonly source: H160;1072    readonly init: Bytes;1073    readonly salt: H256;1074    readonly value: U256;1075    readonly gasLimit: u64;1076    readonly maxFeePerGas: U256;1077    readonly maxPriorityFeePerGas: Option<U256>;1078    readonly nonce: Option<U256>;1079    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1080  } & Struct;1081  readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1082}10831084/** @name PalletEvmCoderSubstrateError */1085export interface PalletEvmCoderSubstrateError extends Enum {1086  readonly isOutOfGas: boolean;1087  readonly isOutOfFund: boolean;1088  readonly type: 'OutOfGas' | 'OutOfFund';1089}10901091/** @name PalletEvmContractHelpersError */1092export interface PalletEvmContractHelpersError extends Enum {1093  readonly isNoPermission: boolean;1094  readonly type: 'NoPermission';1095}10961097/** @name PalletEvmContractHelpersSponsoringModeT */1098export interface PalletEvmContractHelpersSponsoringModeT extends Enum {1099  readonly isDisabled: boolean;1100  readonly isAllowlisted: boolean;1101  readonly isGenerous: boolean;1102  readonly type: 'Disabled' | 'Allowlisted' | 'Generous';1103}11041105/** @name PalletEvmError */1106export interface PalletEvmError extends Enum {1107  readonly isBalanceLow: boolean;1108  readonly isFeeOverflow: boolean;1109  readonly isPaymentOverflow: boolean;1110  readonly isWithdrawFailed: boolean;1111  readonly isGasPriceTooLow: boolean;1112  readonly isInvalidNonce: boolean;1113  readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';1114}11151116/** @name PalletEvmEvent */1117export interface PalletEvmEvent extends Enum {1118  readonly isLog: boolean;1119  readonly asLog: EthereumLog;1120  readonly isCreated: boolean;1121  readonly asCreated: H160;1122  readonly isCreatedFailed: boolean;1123  readonly asCreatedFailed: H160;1124  readonly isExecuted: boolean;1125  readonly asExecuted: H160;1126  readonly isExecutedFailed: boolean;1127  readonly asExecutedFailed: H160;1128  readonly isBalanceDeposit: boolean;1129  readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;1130  readonly isBalanceWithdraw: boolean;1131  readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;1132  readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';1133}11341135/** @name PalletEvmMigrationCall */1136export interface PalletEvmMigrationCall extends Enum {1137  readonly isBegin: boolean;1138  readonly asBegin: {1139    readonly address: H160;1140  } & Struct;1141  readonly isSetData: boolean;1142  readonly asSetData: {1143    readonly address: H160;1144    readonly data: Vec<ITuple<[H256, H256]>>;1145  } & Struct;1146  readonly isFinish: boolean;1147  readonly asFinish: {1148    readonly address: H160;1149    readonly code: Bytes;1150  } & Struct;1151  readonly type: 'Begin' | 'SetData' | 'Finish';1152}11531154/** @name PalletEvmMigrationError */1155export interface PalletEvmMigrationError extends Enum {1156  readonly isAccountNotEmpty: boolean;1157  readonly isAccountIsNotMigrating: boolean;1158  readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';1159}11601161/** @name PalletFungibleError */1162export interface PalletFungibleError extends Enum {1163  readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;1164  readonly isFungibleItemsHaveNoId: boolean;1165  readonly isFungibleItemsDontHaveData: boolean;1166  readonly isFungibleDisallowsNesting: boolean;1167  readonly isSettingPropertiesNotAllowed: boolean;1168  readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1169}11701171/** @name PalletInflationCall */1172export interface PalletInflationCall extends Enum {1173  readonly isStartInflation: boolean;1174  readonly asStartInflation: {1175    readonly inflationStartRelayBlock: u32;1176  } & Struct;1177  readonly type: 'StartInflation';1178}11791180/** @name PalletNonfungibleError */1181export interface PalletNonfungibleError extends Enum {1182  readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;1183  readonly isNonfungibleItemsHaveNoAmount: boolean;1184  readonly isCantBurnNftWithChildren: boolean;1185  readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';1186}11871188/** @name PalletNonfungibleItemData */1189export interface PalletNonfungibleItemData extends Struct {1190  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1191}11921193/** @name PalletRefungibleError */1194export interface PalletRefungibleError extends Enum {1195  readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;1196  readonly isWrongRefungiblePieces: boolean;1197  readonly isRepartitionWhileNotOwningAllPieces: boolean;1198  readonly isRefungibleDisallowsNesting: boolean;1199  readonly isSettingPropertiesNotAllowed: boolean;1200  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1201}12021203/** @name PalletRefungibleItemData */1204export interface PalletRefungibleItemData extends Struct {1205  readonly constData: Bytes;1206}12071208/** @name PalletRmrkCoreCall */1209export interface PalletRmrkCoreCall extends Enum {1210  readonly isCreateCollection: boolean;1211  readonly asCreateCollection: {1212    readonly metadata: Bytes;1213    readonly max: Option<u32>;1214    readonly symbol: Bytes;1215  } & Struct;1216  readonly isDestroyCollection: boolean;1217  readonly asDestroyCollection: {1218    readonly collectionId: u32;1219  } & Struct;1220  readonly isChangeCollectionIssuer: boolean;1221  readonly asChangeCollectionIssuer: {1222    readonly collectionId: u32;1223    readonly newIssuer: MultiAddress;1224  } & Struct;1225  readonly isLockCollection: boolean;1226  readonly asLockCollection: {1227    readonly collectionId: u32;1228  } & Struct;1229  readonly isMintNft: boolean;1230  readonly asMintNft: {1231    readonly owner: Option<AccountId32>;1232    readonly collectionId: u32;1233    readonly recipient: Option<AccountId32>;1234    readonly royaltyAmount: Option<Permill>;1235    readonly metadata: Bytes;1236    readonly transferable: bool;1237    readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1238  } & Struct;1239  readonly isBurnNft: boolean;1240  readonly asBurnNft: {1241    readonly collectionId: u32;1242    readonly nftId: u32;1243    readonly maxBurns: u32;1244  } & Struct;1245  readonly isSend: boolean;1246  readonly asSend: {1247    readonly rmrkCollectionId: u32;1248    readonly rmrkNftId: u32;1249    readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1250  } & Struct;1251  readonly isAcceptNft: boolean;1252  readonly asAcceptNft: {1253    readonly rmrkCollectionId: u32;1254    readonly rmrkNftId: u32;1255    readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1256  } & Struct;1257  readonly isRejectNft: boolean;1258  readonly asRejectNft: {1259    readonly rmrkCollectionId: u32;1260    readonly rmrkNftId: u32;1261  } & Struct;1262  readonly isAcceptResource: boolean;1263  readonly asAcceptResource: {1264    readonly rmrkCollectionId: u32;1265    readonly rmrkNftId: u32;1266    readonly resourceId: u32;1267  } & Struct;1268  readonly isAcceptResourceRemoval: boolean;1269  readonly asAcceptResourceRemoval: {1270    readonly rmrkCollectionId: u32;1271    readonly rmrkNftId: u32;1272    readonly resourceId: u32;1273  } & Struct;1274  readonly isSetProperty: boolean;1275  readonly asSetProperty: {1276    readonly rmrkCollectionId: Compact<u32>;1277    readonly maybeNftId: Option<u32>;1278    readonly key: Bytes;1279    readonly value: Bytes;1280  } & Struct;1281  readonly isSetPriority: boolean;1282  readonly asSetPriority: {1283    readonly rmrkCollectionId: u32;1284    readonly rmrkNftId: u32;1285    readonly priorities: Vec<u32>;1286  } & Struct;1287  readonly isAddBasicResource: boolean;1288  readonly asAddBasicResource: {1289    readonly rmrkCollectionId: u32;1290    readonly nftId: u32;1291    readonly resource: RmrkTraitsResourceBasicResource;1292  } & Struct;1293  readonly isAddComposableResource: boolean;1294  readonly asAddComposableResource: {1295    readonly rmrkCollectionId: u32;1296    readonly nftId: u32;1297    readonly resource: RmrkTraitsResourceComposableResource;1298  } & Struct;1299  readonly isAddSlotResource: boolean;1300  readonly asAddSlotResource: {1301    readonly rmrkCollectionId: u32;1302    readonly nftId: u32;1303    readonly resource: RmrkTraitsResourceSlotResource;1304  } & Struct;1305  readonly isRemoveResource: boolean;1306  readonly asRemoveResource: {1307    readonly rmrkCollectionId: u32;1308    readonly nftId: u32;1309    readonly resourceId: u32;1310  } & Struct;1311  readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1312}13131314/** @name PalletRmrkCoreError */1315export interface PalletRmrkCoreError extends Enum {1316  readonly isCorruptedCollectionType: boolean;1317  readonly isNftTypeEncodeError: boolean;1318  readonly isRmrkPropertyKeyIsTooLong: boolean;1319  readonly isRmrkPropertyValueIsTooLong: boolean;1320  readonly isRmrkPropertyIsNotFound: boolean;1321  readonly isUnableToDecodeRmrkData: boolean;1322  readonly isCollectionNotEmpty: boolean;1323  readonly isNoAvailableCollectionId: boolean;1324  readonly isNoAvailableNftId: boolean;1325  readonly isCollectionUnknown: boolean;1326  readonly isNoPermission: boolean;1327  readonly isNonTransferable: boolean;1328  readonly isCollectionFullOrLocked: boolean;1329  readonly isResourceDoesntExist: boolean;1330  readonly isCannotSendToDescendentOrSelf: boolean;1331  readonly isCannotAcceptNonOwnedNft: boolean;1332  readonly isCannotRejectNonOwnedNft: boolean;1333  readonly isCannotRejectNonPendingNft: boolean;1334  readonly isResourceNotPending: boolean;1335  readonly isNoAvailableResourceId: boolean;1336  readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';1337}13381339/** @name PalletRmrkCoreEvent */1340export interface PalletRmrkCoreEvent extends Enum {1341  readonly isCollectionCreated: boolean;1342  readonly asCollectionCreated: {1343    readonly issuer: AccountId32;1344    readonly collectionId: u32;1345  } & Struct;1346  readonly isCollectionDestroyed: boolean;1347  readonly asCollectionDestroyed: {1348    readonly issuer: AccountId32;1349    readonly collectionId: u32;1350  } & Struct;1351  readonly isIssuerChanged: boolean;1352  readonly asIssuerChanged: {1353    readonly oldIssuer: AccountId32;1354    readonly newIssuer: AccountId32;1355    readonly collectionId: u32;1356  } & Struct;1357  readonly isCollectionLocked: boolean;1358  readonly asCollectionLocked: {1359    readonly issuer: AccountId32;1360    readonly collectionId: u32;1361  } & Struct;1362  readonly isNftMinted: boolean;1363  readonly asNftMinted: {1364    readonly owner: AccountId32;1365    readonly collectionId: u32;1366    readonly nftId: u32;1367  } & Struct;1368  readonly isNftBurned: boolean;1369  readonly asNftBurned: {1370    readonly owner: AccountId32;1371    readonly nftId: u32;1372  } & Struct;1373  readonly isNftSent: boolean;1374  readonly asNftSent: {1375    readonly sender: AccountId32;1376    readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1377    readonly collectionId: u32;1378    readonly nftId: u32;1379    readonly approvalRequired: bool;1380  } & Struct;1381  readonly isNftAccepted: boolean;1382  readonly asNftAccepted: {1383    readonly sender: AccountId32;1384    readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1385    readonly collectionId: u32;1386    readonly nftId: u32;1387  } & Struct;1388  readonly isNftRejected: boolean;1389  readonly asNftRejected: {1390    readonly sender: AccountId32;1391    readonly collectionId: u32;1392    readonly nftId: u32;1393  } & Struct;1394  readonly isPropertySet: boolean;1395  readonly asPropertySet: {1396    readonly collectionId: u32;1397    readonly maybeNftId: Option<u32>;1398    readonly key: Bytes;1399    readonly value: Bytes;1400  } & Struct;1401  readonly isResourceAdded: boolean;1402  readonly asResourceAdded: {1403    readonly nftId: u32;1404    readonly resourceId: u32;1405  } & Struct;1406  readonly isResourceRemoval: boolean;1407  readonly asResourceRemoval: {1408    readonly nftId: u32;1409    readonly resourceId: u32;1410  } & Struct;1411  readonly isResourceAccepted: boolean;1412  readonly asResourceAccepted: {1413    readonly nftId: u32;1414    readonly resourceId: u32;1415  } & Struct;1416  readonly isResourceRemovalAccepted: boolean;1417  readonly asResourceRemovalAccepted: {1418    readonly nftId: u32;1419    readonly resourceId: u32;1420  } & Struct;1421  readonly isPrioritySet: boolean;1422  readonly asPrioritySet: {1423    readonly collectionId: u32;1424    readonly nftId: u32;1425  } & Struct;1426  readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';1427}14281429/** @name PalletRmrkEquipCall */1430export interface PalletRmrkEquipCall extends Enum {1431  readonly isCreateBase: boolean;1432  readonly asCreateBase: {1433    readonly baseType: Bytes;1434    readonly symbol: Bytes;1435    readonly parts: Vec<RmrkTraitsPartPartType>;1436  } & Struct;1437  readonly isThemeAdd: boolean;1438  readonly asThemeAdd: {1439    readonly baseId: u32;1440    readonly theme: RmrkTraitsTheme;1441  } & Struct;1442  readonly isEquippable: boolean;1443  readonly asEquippable: {1444    readonly baseId: u32;1445    readonly slotId: u32;1446    readonly equippables: RmrkTraitsPartEquippableList;1447  } & Struct;1448  readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1449}14501451/** @name PalletRmrkEquipError */1452export interface PalletRmrkEquipError extends Enum {1453  readonly isPermissionError: boolean;1454  readonly isNoAvailableBaseId: boolean;1455  readonly isNoAvailablePartId: boolean;1456  readonly isBaseDoesntExist: boolean;1457  readonly isNeedsDefaultThemeFirst: boolean;1458  readonly isPartDoesntExist: boolean;1459  readonly isNoEquippableOnFixedPart: boolean;1460  readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';1461}14621463/** @name PalletRmrkEquipEvent */1464export interface PalletRmrkEquipEvent extends Enum {1465  readonly isBaseCreated: boolean;1466  readonly asBaseCreated: {1467    readonly issuer: AccountId32;1468    readonly baseId: u32;1469  } & Struct;1470  readonly isEquippablesUpdated: boolean;1471  readonly asEquippablesUpdated: {1472    readonly baseId: u32;1473    readonly slotId: u32;1474  } & Struct;1475  readonly type: 'BaseCreated' | 'EquippablesUpdated';1476}14771478/** @name PalletStructureCall */1479export interface PalletStructureCall extends Null {}14801481/** @name PalletStructureError */1482export interface PalletStructureError extends Enum {1483  readonly isOuroborosDetected: boolean;1484  readonly isDepthLimit: boolean;1485  readonly isBreadthLimit: boolean;1486  readonly isTokenNotFound: boolean;1487  readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';1488}14891490/** @name PalletStructureEvent */1491export interface PalletStructureEvent extends Enum {1492  readonly isExecuted: boolean;1493  readonly asExecuted: Result<Null, SpRuntimeDispatchError>;1494  readonly type: 'Executed';1495}14961497/** @name PalletSudoCall */1498export interface PalletSudoCall extends Enum {1499  readonly isSudo: boolean;1500  readonly asSudo: {1501    readonly call: Call;1502  } & Struct;1503  readonly isSudoUncheckedWeight: boolean;1504  readonly asSudoUncheckedWeight: {1505    readonly call: Call;1506    readonly weight: u64;1507  } & Struct;1508  readonly isSetKey: boolean;1509  readonly asSetKey: {1510    readonly new_: MultiAddress;1511  } & Struct;1512  readonly isSudoAs: boolean;1513  readonly asSudoAs: {1514    readonly who: MultiAddress;1515    readonly call: Call;1516  } & Struct;1517  readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';1518}15191520/** @name PalletSudoError */1521export interface PalletSudoError extends Enum {1522  readonly isRequireSudo: boolean;1523  readonly type: 'RequireSudo';1524}15251526/** @name PalletSudoEvent */1527export interface PalletSudoEvent extends Enum {1528  readonly isSudid: boolean;1529  readonly asSudid: {1530    readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1531  } & Struct;1532  readonly isKeyChanged: boolean;1533  readonly asKeyChanged: {1534    readonly oldSudoer: Option<AccountId32>;1535  } & Struct;1536  readonly isSudoAsDone: boolean;1537  readonly asSudoAsDone: {1538    readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1539  } & Struct;1540  readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';1541}15421543/** @name PalletTemplateTransactionPaymentCall */1544export interface PalletTemplateTransactionPaymentCall extends Null {}15451546/** @name PalletTemplateTransactionPaymentChargeTransactionPayment */1547export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}15481549/** @name PalletTimestampCall */1550export interface PalletTimestampCall extends Enum {1551  readonly isSet: boolean;1552  readonly asSet: {1553    readonly now: Compact<u64>;1554  } & Struct;1555  readonly type: 'Set';1556}15571558/** @name PalletTransactionPaymentReleases */1559export interface PalletTransactionPaymentReleases extends Enum {1560  readonly isV1Ancient: boolean;1561  readonly isV2: boolean;1562  readonly type: 'V1Ancient' | 'V2';1563}15641565/** @name PalletTreasuryCall */1566export interface PalletTreasuryCall extends Enum {1567  readonly isProposeSpend: boolean;1568  readonly asProposeSpend: {1569    readonly value: Compact<u128>;1570    readonly beneficiary: MultiAddress;1571  } & Struct;1572  readonly isRejectProposal: boolean;1573  readonly asRejectProposal: {1574    readonly proposalId: Compact<u32>;1575  } & Struct;1576  readonly isApproveProposal: boolean;1577  readonly asApproveProposal: {1578    readonly proposalId: Compact<u32>;1579  } & Struct;1580  readonly isRemoveApproval: boolean;1581  readonly asRemoveApproval: {1582    readonly proposalId: Compact<u32>;1583  } & Struct;1584  readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';1585}15861587/** @name PalletTreasuryError */1588export interface PalletTreasuryError extends Enum {1589  readonly isInsufficientProposersBalance: boolean;1590  readonly isInvalidIndex: boolean;1591  readonly isTooManyApprovals: boolean;1592  readonly isProposalNotApproved: boolean;1593  readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';1594}15951596/** @name PalletTreasuryEvent */1597export interface PalletTreasuryEvent extends Enum {1598  readonly isProposed: boolean;1599  readonly asProposed: {1600    readonly proposalIndex: u32;1601  } & Struct;1602  readonly isSpending: boolean;1603  readonly asSpending: {1604    readonly budgetRemaining: u128;1605  } & Struct;1606  readonly isAwarded: boolean;1607  readonly asAwarded: {1608    readonly proposalIndex: u32;1609    readonly award: u128;1610    readonly account: AccountId32;1611  } & Struct;1612  readonly isRejected: boolean;1613  readonly asRejected: {1614    readonly proposalIndex: u32;1615    readonly slashed: u128;1616  } & Struct;1617  readonly isBurnt: boolean;1618  readonly asBurnt: {1619    readonly burntFunds: u128;1620  } & Struct;1621  readonly isRollover: boolean;1622  readonly asRollover: {1623    readonly rolloverBalance: u128;1624  } & Struct;1625  readonly isDeposit: boolean;1626  readonly asDeposit: {1627    readonly value: u128;1628  } & Struct;1629  readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';1630}16311632/** @name PalletTreasuryProposal */1633export interface PalletTreasuryProposal extends Struct {1634  readonly proposer: AccountId32;1635  readonly value: u128;1636  readonly beneficiary: AccountId32;1637  readonly bond: u128;1638}16391640/** @name PalletUniqueCall */1641export interface PalletUniqueCall extends Enum {1642  readonly isCreateCollection: boolean;1643  readonly asCreateCollection: {1644    readonly collectionName: Vec<u16>;1645    readonly collectionDescription: Vec<u16>;1646    readonly tokenPrefix: Bytes;1647    readonly mode: UpDataStructsCollectionMode;1648  } & Struct;1649  readonly isCreateCollectionEx: boolean;1650  readonly asCreateCollectionEx: {1651    readonly data: UpDataStructsCreateCollectionData;1652  } & Struct;1653  readonly isDestroyCollection: boolean;1654  readonly asDestroyCollection: {1655    readonly collectionId: u32;1656  } & Struct;1657  readonly isAddToAllowList: boolean;1658  readonly asAddToAllowList: {1659    readonly collectionId: u32;1660    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1661  } & Struct;1662  readonly isRemoveFromAllowList: boolean;1663  readonly asRemoveFromAllowList: {1664    readonly collectionId: u32;1665    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1666  } & Struct;1667  readonly isChangeCollectionOwner: boolean;1668  readonly asChangeCollectionOwner: {1669    readonly collectionId: u32;1670    readonly newOwner: AccountId32;1671  } & Struct;1672  readonly isAddCollectionAdmin: boolean;1673  readonly asAddCollectionAdmin: {1674    readonly collectionId: u32;1675    readonly newAdmin: PalletEvmAccountBasicCrossAccountIdRepr;1676  } & Struct;1677  readonly isRemoveCollectionAdmin: boolean;1678  readonly asRemoveCollectionAdmin: {1679    readonly collectionId: u32;1680    readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1681  } & Struct;1682  readonly isSetCollectionSponsor: boolean;1683  readonly asSetCollectionSponsor: {1684    readonly collectionId: u32;1685    readonly newSponsor: AccountId32;1686  } & Struct;1687  readonly isConfirmSponsorship: boolean;1688  readonly asConfirmSponsorship: {1689    readonly collectionId: u32;1690  } & Struct;1691  readonly isRemoveCollectionSponsor: boolean;1692  readonly asRemoveCollectionSponsor: {1693    readonly collectionId: u32;1694  } & Struct;1695  readonly isCreateItem: boolean;1696  readonly asCreateItem: {1697    readonly collectionId: u32;1698    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1699    readonly data: UpDataStructsCreateItemData;1700  } & Struct;1701  readonly isCreateMultipleItems: boolean;1702  readonly asCreateMultipleItems: {1703    readonly collectionId: u32;1704    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1705    readonly itemsData: Vec<UpDataStructsCreateItemData>;1706  } & Struct;1707  readonly isSetCollectionProperties: boolean;1708  readonly asSetCollectionProperties: {1709    readonly collectionId: u32;1710    readonly properties: Vec<UpDataStructsProperty>;1711  } & Struct;1712  readonly isDeleteCollectionProperties: boolean;1713  readonly asDeleteCollectionProperties: {1714    readonly collectionId: u32;1715    readonly propertyKeys: Vec<Bytes>;1716  } & Struct;1717  readonly isSetTokenProperties: boolean;1718  readonly asSetTokenProperties: {1719    readonly collectionId: u32;1720    readonly tokenId: u32;1721    readonly properties: Vec<UpDataStructsProperty>;1722  } & Struct;1723  readonly isDeleteTokenProperties: boolean;1724  readonly asDeleteTokenProperties: {1725    readonly collectionId: u32;1726    readonly tokenId: u32;1727    readonly propertyKeys: Vec<Bytes>;1728  } & Struct;1729  readonly isSetTokenPropertyPermissions: boolean;1730  readonly asSetTokenPropertyPermissions: {1731    readonly collectionId: u32;1732    readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1733  } & Struct;1734  readonly isCreateMultipleItemsEx: boolean;1735  readonly asCreateMultipleItemsEx: {1736    readonly collectionId: u32;1737    readonly data: UpDataStructsCreateItemExData;1738  } & Struct;1739  readonly isSetTransfersEnabledFlag: boolean;1740  readonly asSetTransfersEnabledFlag: {1741    readonly collectionId: u32;1742    readonly value: bool;1743  } & Struct;1744  readonly isBurnItem: boolean;1745  readonly asBurnItem: {1746    readonly collectionId: u32;1747    readonly itemId: u32;1748    readonly value: u128;1749  } & Struct;1750  readonly isBurnFrom: boolean;1751  readonly asBurnFrom: {1752    readonly collectionId: u32;1753    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1754    readonly itemId: u32;1755    readonly value: u128;1756  } & Struct;1757  readonly isTransfer: boolean;1758  readonly asTransfer: {1759    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1760    readonly collectionId: u32;1761    readonly itemId: u32;1762    readonly value: u128;1763  } & Struct;1764  readonly isApprove: boolean;1765  readonly asApprove: {1766    readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1767    readonly collectionId: u32;1768    readonly itemId: u32;1769    readonly amount: u128;1770  } & Struct;1771  readonly isTransferFrom: boolean;1772  readonly asTransferFrom: {1773    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1774    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1775    readonly collectionId: u32;1776    readonly itemId: u32;1777    readonly value: u128;1778  } & Struct;1779  readonly isSetCollectionLimits: boolean;1780  readonly asSetCollectionLimits: {1781    readonly collectionId: u32;1782    readonly newLimit: UpDataStructsCollectionLimits;1783  } & Struct;1784  readonly isSetCollectionPermissions: boolean;1785  readonly asSetCollectionPermissions: {1786    readonly collectionId: u32;1787    readonly newPermission: UpDataStructsCollectionPermissions;1788  } & Struct;1789  readonly isRepartition: boolean;1790  readonly asRepartition: {1791    readonly collectionId: u32;1792    readonly tokenId: u32;1793    readonly amount: u128;1794  } & Struct;1795  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';1796}17971798/** @name PalletUniqueError */1799export interface PalletUniqueError extends Enum {1800  readonly isCollectionDecimalPointLimitExceeded: boolean;1801  readonly isConfirmUnsetSponsorFail: boolean;1802  readonly isEmptyArgument: boolean;1803  readonly isRepartitionCalledOnNonRefungibleCollection: boolean;1804  readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';1805}18061807/** @name PalletUniqueRawEvent */1808export interface PalletUniqueRawEvent extends Enum {1809  readonly isCollectionSponsorRemoved: boolean;1810  readonly asCollectionSponsorRemoved: u32;1811  readonly isCollectionAdminAdded: boolean;1812  readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1813  readonly isCollectionOwnedChanged: boolean;1814  readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;1815  readonly isCollectionSponsorSet: boolean;1816  readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;1817  readonly isSponsorshipConfirmed: boolean;1818  readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;1819  readonly isCollectionAdminRemoved: boolean;1820  readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1821  readonly isAllowListAddressRemoved: boolean;1822  readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1823  readonly isAllowListAddressAdded: boolean;1824  readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1825  readonly isCollectionLimitSet: boolean;1826  readonly asCollectionLimitSet: u32;1827  readonly isCollectionPermissionSet: boolean;1828  readonly asCollectionPermissionSet: u32;1829  readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';1830}18311832/** @name PalletUniqueSchedulerCall */1833export interface PalletUniqueSchedulerCall extends Enum {1834  readonly isScheduleNamed: boolean;1835  readonly asScheduleNamed: {1836    readonly id: U8aFixed;1837    readonly when: u32;1838    readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1839    readonly priority: u8;1840    readonly call: FrameSupportScheduleMaybeHashed;1841  } & Struct;1842  readonly isCancelNamed: boolean;1843  readonly asCancelNamed: {1844    readonly id: U8aFixed;1845  } & Struct;1846  readonly isScheduleNamedAfter: boolean;1847  readonly asScheduleNamedAfter: {1848    readonly id: U8aFixed;1849    readonly after: u32;1850    readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1851    readonly priority: u8;1852    readonly call: FrameSupportScheduleMaybeHashed;1853  } & Struct;1854  readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1855}18561857/** @name PalletUniqueSchedulerError */1858export interface PalletUniqueSchedulerError extends Enum {1859  readonly isFailedToSchedule: boolean;1860  readonly isNotFound: boolean;1861  readonly isTargetBlockNumberInPast: boolean;1862  readonly isRescheduleNoChange: boolean;1863  readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';1864}18651866/** @name PalletUniqueSchedulerEvent */1867export interface PalletUniqueSchedulerEvent extends Enum {1868  readonly isScheduled: boolean;1869  readonly asScheduled: {1870    readonly when: u32;1871    readonly index: u32;1872  } & Struct;1873  readonly isCanceled: boolean;1874  readonly asCanceled: {1875    readonly when: u32;1876    readonly index: u32;1877  } & Struct;1878  readonly isDispatched: boolean;1879  readonly asDispatched: {1880    readonly task: ITuple<[u32, u32]>;1881    readonly id: Option<U8aFixed>;1882    readonly result: Result<Null, SpRuntimeDispatchError>;1883  } & Struct;1884  readonly isCallLookupFailed: boolean;1885  readonly asCallLookupFailed: {1886    readonly task: ITuple<[u32, u32]>;1887    readonly id: Option<U8aFixed>;1888    readonly error: FrameSupportScheduleLookupError;1889  } & Struct;1890  readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';1891}18921893/** @name PalletUniqueSchedulerScheduledV3 */1894export interface PalletUniqueSchedulerScheduledV3 extends Struct {1895  readonly maybeId: Option<U8aFixed>;1896  readonly priority: u8;1897  readonly call: FrameSupportScheduleMaybeHashed;1898  readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1899  readonly origin: OpalRuntimeOriginCaller;1900}19011902/** @name PalletXcmCall */1903export interface PalletXcmCall extends Enum {1904  readonly isSend: boolean;1905  readonly asSend: {1906    readonly dest: XcmVersionedMultiLocation;1907    readonly message: XcmVersionedXcm;1908  } & Struct;1909  readonly isTeleportAssets: boolean;1910  readonly asTeleportAssets: {1911    readonly dest: XcmVersionedMultiLocation;1912    readonly beneficiary: XcmVersionedMultiLocation;1913    readonly assets: XcmVersionedMultiAssets;1914    readonly feeAssetItem: u32;1915  } & Struct;1916  readonly isReserveTransferAssets: boolean;1917  readonly asReserveTransferAssets: {1918    readonly dest: XcmVersionedMultiLocation;1919    readonly beneficiary: XcmVersionedMultiLocation;1920    readonly assets: XcmVersionedMultiAssets;1921    readonly feeAssetItem: u32;1922  } & Struct;1923  readonly isExecute: boolean;1924  readonly asExecute: {1925    readonly message: XcmVersionedXcm;1926    readonly maxWeight: u64;1927  } & Struct;1928  readonly isForceXcmVersion: boolean;1929  readonly asForceXcmVersion: {1930    readonly location: XcmV1MultiLocation;1931    readonly xcmVersion: u32;1932  } & Struct;1933  readonly isForceDefaultXcmVersion: boolean;1934  readonly asForceDefaultXcmVersion: {1935    readonly maybeXcmVersion: Option<u32>;1936  } & Struct;1937  readonly isForceSubscribeVersionNotify: boolean;1938  readonly asForceSubscribeVersionNotify: {1939    readonly location: XcmVersionedMultiLocation;1940  } & Struct;1941  readonly isForceUnsubscribeVersionNotify: boolean;1942  readonly asForceUnsubscribeVersionNotify: {1943    readonly location: XcmVersionedMultiLocation;1944  } & Struct;1945  readonly isLimitedReserveTransferAssets: boolean;1946  readonly asLimitedReserveTransferAssets: {1947    readonly dest: XcmVersionedMultiLocation;1948    readonly beneficiary: XcmVersionedMultiLocation;1949    readonly assets: XcmVersionedMultiAssets;1950    readonly feeAssetItem: u32;1951    readonly weightLimit: XcmV2WeightLimit;1952  } & Struct;1953  readonly isLimitedTeleportAssets: boolean;1954  readonly asLimitedTeleportAssets: {1955    readonly dest: XcmVersionedMultiLocation;1956    readonly beneficiary: XcmVersionedMultiLocation;1957    readonly assets: XcmVersionedMultiAssets;1958    readonly feeAssetItem: u32;1959    readonly weightLimit: XcmV2WeightLimit;1960  } & Struct;1961  readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';1962}19631964/** @name PalletXcmError */1965export interface PalletXcmError extends Enum {1966  readonly isUnreachable: boolean;1967  readonly isSendFailure: boolean;1968  readonly isFiltered: boolean;1969  readonly isUnweighableMessage: boolean;1970  readonly isDestinationNotInvertible: boolean;1971  readonly isEmpty: boolean;1972  readonly isCannotReanchor: boolean;1973  readonly isTooManyAssets: boolean;1974  readonly isInvalidOrigin: boolean;1975  readonly isBadVersion: boolean;1976  readonly isBadLocation: boolean;1977  readonly isNoSubscription: boolean;1978  readonly isAlreadySubscribed: boolean;1979  readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';1980}19811982/** @name PalletXcmEvent */1983export interface PalletXcmEvent extends Enum {1984  readonly isAttempted: boolean;1985  readonly asAttempted: XcmV2TraitsOutcome;1986  readonly isSent: boolean;1987  readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;1988  readonly isUnexpectedResponse: boolean;1989  readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;1990  readonly isResponseReady: boolean;1991  readonly asResponseReady: ITuple<[u64, XcmV2Response]>;1992  readonly isNotified: boolean;1993  readonly asNotified: ITuple<[u64, u8, u8]>;1994  readonly isNotifyOverweight: boolean;1995  readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;1996  readonly isNotifyDispatchError: boolean;1997  readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;1998  readonly isNotifyDecodeFailed: boolean;1999  readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2000  readonly isInvalidResponder: boolean;2001  readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2002  readonly isInvalidResponderVersion: boolean;2003  readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2004  readonly isResponseTaken: boolean;2005  readonly asResponseTaken: u64;2006  readonly isAssetsTrapped: boolean;2007  readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2008  readonly isVersionChangeNotified: boolean;2009  readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2010  readonly isSupportedVersionChanged: boolean;2011  readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2012  readonly isNotifyTargetSendFail: boolean;2013  readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2014  readonly isNotifyTargetMigrationFail: boolean;2015  readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2016  readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2017}20182019/** @name PalletXcmOrigin */2020export interface PalletXcmOrigin extends Enum {2021  readonly isXcm: boolean;2022  readonly asXcm: XcmV1MultiLocation;2023  readonly isResponse: boolean;2024  readonly asResponse: XcmV1MultiLocation;2025  readonly type: 'Xcm' | 'Response';2026}20272028/** @name PhantomTypeUpDataStructs */2029export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}20302031/** @name PolkadotCorePrimitivesInboundDownwardMessage */2032export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {2033  readonly sentAt: u32;2034  readonly msg: Bytes;2035}20362037/** @name PolkadotCorePrimitivesInboundHrmpMessage */2038export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {2039  readonly sentAt: u32;2040  readonly data: Bytes;2041}20422043/** @name PolkadotCorePrimitivesOutboundHrmpMessage */2044export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {2045  readonly recipient: u32;2046  readonly data: Bytes;2047}20482049/** @name PolkadotParachainPrimitivesXcmpMessageFormat */2050export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2051  readonly isConcatenatedVersionedXcm: boolean;2052  readonly isConcatenatedEncodedBlob: boolean;2053  readonly isSignals: boolean;2054  readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2055}20562057/** @name PolkadotPrimitivesV2AbridgedHostConfiguration */2058export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {2059  readonly maxCodeSize: u32;2060  readonly maxHeadDataSize: u32;2061  readonly maxUpwardQueueCount: u32;2062  readonly maxUpwardQueueSize: u32;2063  readonly maxUpwardMessageSize: u32;2064  readonly maxUpwardMessageNumPerCandidate: u32;2065  readonly hrmpMaxMessageNumPerCandidate: u32;2066  readonly validationUpgradeCooldown: u32;2067  readonly validationUpgradeDelay: u32;2068}20692070/** @name PolkadotPrimitivesV2AbridgedHrmpChannel */2071export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {2072  readonly maxCapacity: u32;2073  readonly maxTotalSize: u32;2074  readonly maxMessageSize: u32;2075  readonly msgCount: u32;2076  readonly totalSize: u32;2077  readonly mqcHead: Option<H256>;2078}20792080/** @name PolkadotPrimitivesV2PersistedValidationData */2081export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {2082  readonly parentHead: Bytes;2083  readonly relayParentNumber: u32;2084  readonly relayParentStorageRoot: H256;2085  readonly maxPovSize: u32;2086}20872088/** @name PolkadotPrimitivesV2UpgradeRestriction */2089export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {2090  readonly isPresent: boolean;2091  readonly type: 'Present';2092}20932094/** @name RmrkTraitsBaseBaseInfo */2095export interface RmrkTraitsBaseBaseInfo extends Struct {2096  readonly issuer: AccountId32;2097  readonly baseType: Bytes;2098  readonly symbol: Bytes;2099}21002101/** @name RmrkTraitsCollectionCollectionInfo */2102export interface RmrkTraitsCollectionCollectionInfo extends Struct {2103  readonly issuer: AccountId32;2104  readonly metadata: Bytes;2105  readonly max: Option<u32>;2106  readonly symbol: Bytes;2107  readonly nftsCount: u32;2108}21092110/** @name RmrkTraitsNftAccountIdOrCollectionNftTuple */2111export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {2112  readonly isAccountId: boolean;2113  readonly asAccountId: AccountId32;2114  readonly isCollectionAndNftTuple: boolean;2115  readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;2116  readonly type: 'AccountId' | 'CollectionAndNftTuple';2117}21182119/** @name RmrkTraitsNftNftChild */2120export interface RmrkTraitsNftNftChild extends Struct {2121  readonly collectionId: u32;2122  readonly nftId: u32;2123}21242125/** @name RmrkTraitsNftNftInfo */2126export interface RmrkTraitsNftNftInfo extends Struct {2127  readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2128  readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;2129  readonly metadata: Bytes;2130  readonly equipped: bool;2131  readonly pending: bool;2132}21332134/** @name RmrkTraitsNftRoyaltyInfo */2135export interface RmrkTraitsNftRoyaltyInfo extends Struct {2136  readonly recipient: AccountId32;2137  readonly amount: Permill;2138}21392140/** @name RmrkTraitsPartEquippableList */2141export interface RmrkTraitsPartEquippableList extends Enum {2142  readonly isAll: boolean;2143  readonly isEmpty: boolean;2144  readonly isCustom: boolean;2145  readonly asCustom: Vec<u32>;2146  readonly type: 'All' | 'Empty' | 'Custom';2147}21482149/** @name RmrkTraitsPartFixedPart */2150export interface RmrkTraitsPartFixedPart extends Struct {2151  readonly id: u32;2152  readonly z: u32;2153  readonly src: Bytes;2154}21552156/** @name RmrkTraitsPartPartType */2157export interface RmrkTraitsPartPartType extends Enum {2158  readonly isFixedPart: boolean;2159  readonly asFixedPart: RmrkTraitsPartFixedPart;2160  readonly isSlotPart: boolean;2161  readonly asSlotPart: RmrkTraitsPartSlotPart;2162  readonly type: 'FixedPart' | 'SlotPart';2163}21642165/** @name RmrkTraitsPartSlotPart */2166export interface RmrkTraitsPartSlotPart extends Struct {2167  readonly id: u32;2168  readonly equippable: RmrkTraitsPartEquippableList;2169  readonly src: Bytes;2170  readonly z: u32;2171}21722173/** @name RmrkTraitsPropertyPropertyInfo */2174export interface RmrkTraitsPropertyPropertyInfo extends Struct {2175  readonly key: Bytes;2176  readonly value: Bytes;2177}21782179/** @name RmrkTraitsResourceBasicResource */2180export interface RmrkTraitsResourceBasicResource extends Struct {2181  readonly src: Option<Bytes>;2182  readonly metadata: Option<Bytes>;2183  readonly license: Option<Bytes>;2184  readonly thumb: Option<Bytes>;2185}21862187/** @name RmrkTraitsResourceComposableResource */2188export interface RmrkTraitsResourceComposableResource extends Struct {2189  readonly parts: Vec<u32>;2190  readonly base: u32;2191  readonly src: Option<Bytes>;2192  readonly metadata: Option<Bytes>;2193  readonly license: Option<Bytes>;2194  readonly thumb: Option<Bytes>;2195}21962197/** @name RmrkTraitsResourceResourceInfo */2198export interface RmrkTraitsResourceResourceInfo extends Struct {2199  readonly id: u32;2200  readonly resource: RmrkTraitsResourceResourceTypes;2201  readonly pending: bool;2202  readonly pendingRemoval: bool;2203}22042205/** @name RmrkTraitsResourceResourceTypes */2206export interface RmrkTraitsResourceResourceTypes extends Enum {2207  readonly isBasic: boolean;2208  readonly asBasic: RmrkTraitsResourceBasicResource;2209  readonly isComposable: boolean;2210  readonly asComposable: RmrkTraitsResourceComposableResource;2211  readonly isSlot: boolean;2212  readonly asSlot: RmrkTraitsResourceSlotResource;2213  readonly type: 'Basic' | 'Composable' | 'Slot';2214}22152216/** @name RmrkTraitsResourceSlotResource */2217export interface RmrkTraitsResourceSlotResource extends Struct {2218  readonly base: u32;2219  readonly src: Option<Bytes>;2220  readonly metadata: Option<Bytes>;2221  readonly slot: u32;2222  readonly license: Option<Bytes>;2223  readonly thumb: Option<Bytes>;2224}22252226/** @name RmrkTraitsTheme */2227export interface RmrkTraitsTheme extends Struct {2228  readonly name: Bytes;2229  readonly properties: Vec<RmrkTraitsThemeThemeProperty>;2230  readonly inherit: bool;2231}22322233/** @name RmrkTraitsThemeThemeProperty */2234export interface RmrkTraitsThemeThemeProperty extends Struct {2235  readonly key: Bytes;2236  readonly value: Bytes;2237}22382239/** @name SpCoreEcdsaSignature */2240export interface SpCoreEcdsaSignature extends U8aFixed {}22412242/** @name SpCoreEd25519Signature */2243export interface SpCoreEd25519Signature extends U8aFixed {}22442245/** @name SpCoreSr25519Signature */2246export interface SpCoreSr25519Signature extends U8aFixed {}22472248/** @name SpCoreVoid */2249export interface SpCoreVoid extends Null {}22502251/** @name SpRuntimeArithmeticError */2252export interface SpRuntimeArithmeticError extends Enum {2253  readonly isUnderflow: boolean;2254  readonly isOverflow: boolean;2255  readonly isDivisionByZero: boolean;2256  readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2257}22582259/** @name SpRuntimeDigest */2260export interface SpRuntimeDigest extends Struct {2261  readonly logs: Vec<SpRuntimeDigestDigestItem>;2262}22632264/** @name SpRuntimeDigestDigestItem */2265export interface SpRuntimeDigestDigestItem extends Enum {2266  readonly isOther: boolean;2267  readonly asOther: Bytes;2268  readonly isConsensus: boolean;2269  readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2270  readonly isSeal: boolean;2271  readonly asSeal: ITuple<[U8aFixed, Bytes]>;2272  readonly isPreRuntime: boolean;2273  readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2274  readonly isRuntimeEnvironmentUpdated: boolean;2275  readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2276}22772278/** @name SpRuntimeDispatchError */2279export interface SpRuntimeDispatchError extends Enum {2280  readonly isOther: boolean;2281  readonly isCannotLookup: boolean;2282  readonly isBadOrigin: boolean;2283  readonly isModule: boolean;2284  readonly asModule: SpRuntimeModuleError;2285  readonly isConsumerRemaining: boolean;2286  readonly isNoProviders: boolean;2287  readonly isTooManyConsumers: boolean;2288  readonly isToken: boolean;2289  readonly asToken: SpRuntimeTokenError;2290  readonly isArithmetic: boolean;2291  readonly asArithmetic: SpRuntimeArithmeticError;2292  readonly isTransactional: boolean;2293  readonly asTransactional: SpRuntimeTransactionalError;2294  readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2295}22962297/** @name SpRuntimeModuleError */2298export interface SpRuntimeModuleError extends Struct {2299  readonly index: u8;2300  readonly error: U8aFixed;2301}23022303/** @name SpRuntimeMultiSignature */2304export interface SpRuntimeMultiSignature extends Enum {2305  readonly isEd25519: boolean;2306  readonly asEd25519: SpCoreEd25519Signature;2307  readonly isSr25519: boolean;2308  readonly asSr25519: SpCoreSr25519Signature;2309  readonly isEcdsa: boolean;2310  readonly asEcdsa: SpCoreEcdsaSignature;2311  readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';2312}23132314/** @name SpRuntimeTokenError */2315export interface SpRuntimeTokenError extends Enum {2316  readonly isNoFunds: boolean;2317  readonly isWouldDie: boolean;2318  readonly isBelowMinimum: boolean;2319  readonly isCannotCreate: boolean;2320  readonly isUnknownAsset: boolean;2321  readonly isFrozen: boolean;2322  readonly isUnsupported: boolean;2323  readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2324}23252326/** @name SpRuntimeTransactionalError */2327export interface SpRuntimeTransactionalError extends Enum {2328  readonly isLimitReached: boolean;2329  readonly isNoLayer: boolean;2330  readonly type: 'LimitReached' | 'NoLayer';2331}23322333/** @name SpTrieStorageProof */2334export interface SpTrieStorageProof extends Struct {2335  readonly trieNodes: BTreeSet<Bytes>;2336}23372338/** @name SpVersionRuntimeVersion */2339export interface SpVersionRuntimeVersion extends Struct {2340  readonly specName: Text;2341  readonly implName: Text;2342  readonly authoringVersion: u32;2343  readonly specVersion: u32;2344  readonly implVersion: u32;2345  readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2346  readonly transactionVersion: u32;2347  readonly stateVersion: u8;2348}23492350/** @name UpDataStructsAccessMode */2351export interface UpDataStructsAccessMode extends Enum {2352  readonly isNormal: boolean;2353  readonly isAllowList: boolean;2354  readonly type: 'Normal' | 'AllowList';2355}23562357/** @name UpDataStructsCollection */2358export interface UpDataStructsCollection extends Struct {2359  readonly owner: AccountId32;2360  readonly mode: UpDataStructsCollectionMode;2361  readonly name: Vec<u16>;2362  readonly description: Vec<u16>;2363  readonly tokenPrefix: Bytes;2364  readonly sponsorship: UpDataStructsSponsorshipState;2365  readonly limits: UpDataStructsCollectionLimits;2366  readonly permissions: UpDataStructsCollectionPermissions;2367  readonly externalCollection: bool;2368}23692370/** @name UpDataStructsCollectionLimits */2371export interface UpDataStructsCollectionLimits extends Struct {2372  readonly accountTokenOwnershipLimit: Option<u32>;2373  readonly sponsoredDataSize: Option<u32>;2374  readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;2375  readonly tokenLimit: Option<u32>;2376  readonly sponsorTransferTimeout: Option<u32>;2377  readonly sponsorApproveTimeout: Option<u32>;2378  readonly ownerCanTransfer: Option<bool>;2379  readonly ownerCanDestroy: Option<bool>;2380  readonly transfersEnabled: Option<bool>;2381}23822383/** @name UpDataStructsCollectionMode */2384export interface UpDataStructsCollectionMode extends Enum {2385  readonly isNft: boolean;2386  readonly isFungible: boolean;2387  readonly asFungible: u8;2388  readonly isReFungible: boolean;2389  readonly type: 'Nft' | 'Fungible' | 'ReFungible';2390}23912392/** @name UpDataStructsCollectionPermissions */2393export interface UpDataStructsCollectionPermissions extends Struct {2394  readonly access: Option<UpDataStructsAccessMode>;2395  readonly mintMode: Option<bool>;2396  readonly nesting: Option<UpDataStructsNestingPermissions>;2397}23982399/** @name UpDataStructsCollectionStats */2400export interface UpDataStructsCollectionStats extends Struct {2401  readonly created: u32;2402  readonly destroyed: u32;2403  readonly alive: u32;2404}24052406/** @name UpDataStructsCreateCollectionData */2407export interface UpDataStructsCreateCollectionData extends Struct {2408  readonly mode: UpDataStructsCollectionMode;2409  readonly access: Option<UpDataStructsAccessMode>;2410  readonly name: Vec<u16>;2411  readonly description: Vec<u16>;2412  readonly tokenPrefix: Bytes;2413  readonly pendingSponsor: Option<AccountId32>;2414  readonly limits: Option<UpDataStructsCollectionLimits>;2415  readonly permissions: Option<UpDataStructsCollectionPermissions>;2416  readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2417  readonly properties: Vec<UpDataStructsProperty>;2418}24192420/** @name UpDataStructsCreateFungibleData */2421export interface UpDataStructsCreateFungibleData extends Struct {2422  readonly value: u128;2423}24242425/** @name UpDataStructsCreateItemData */2426export interface UpDataStructsCreateItemData extends Enum {2427  readonly isNft: boolean;2428  readonly asNft: UpDataStructsCreateNftData;2429  readonly isFungible: boolean;2430  readonly asFungible: UpDataStructsCreateFungibleData;2431  readonly isReFungible: boolean;2432  readonly asReFungible: UpDataStructsCreateReFungibleData;2433  readonly type: 'Nft' | 'Fungible' | 'ReFungible';2434}24352436/** @name UpDataStructsCreateItemExData */2437export interface UpDataStructsCreateItemExData extends Enum {2438  readonly isNft: boolean;2439  readonly asNft: Vec<UpDataStructsCreateNftExData>;2440  readonly isFungible: boolean;2441  readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr,u128>;2442  readonly isRefungibleMultipleItems: boolean;2443  readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;2444  readonly isRefungibleMultipleOwners: boolean;2445  readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;2446  readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';2447}24482449/** @name UpDataStructsCreateNftData */2450export interface UpDataStructsCreateNftData extends Struct {2451  readonly properties: Vec<UpDataStructsProperty>;2452}24532454/** @name UpDataStructsCreateNftExData */2455export interface UpDataStructsCreateNftExData extends Struct {2456  readonly properties: Vec<UpDataStructsProperty>;2457  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2458}24592460/** @name UpDataStructsCreateReFungibleData */2461export interface UpDataStructsCreateReFungibleData extends Struct {2462  readonly constData: Bytes;2463  readonly pieces: u128;2464}24652466/** @name UpDataStructsCreateRefungibleExData */2467export interface UpDataStructsCreateRefungibleExData extends Struct {2468  readonly constData: Bytes;2469  readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2470}24712472/** @name UpDataStructsNestingPermissions */2473export interface UpDataStructsNestingPermissions extends Struct {2474  readonly tokenOwner: bool;2475  readonly collectionAdmin: bool;2476  readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;2477}24782479/** @name UpDataStructsOwnerRestrictedSet */2480export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}24812482/** @name UpDataStructsProperties */2483export interface UpDataStructsProperties extends Struct {2484  readonly map: UpDataStructsPropertiesMapBoundedVec;2485  readonly consumedSpace: u32;2486  readonly spaceLimit: u32;2487}24882489/** @name UpDataStructsPropertiesMapBoundedVec */2490export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}24912492/** @name UpDataStructsPropertiesMapPropertyPermission */2493export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}24942495/** @name UpDataStructsProperty */2496export interface UpDataStructsProperty extends Struct {2497  readonly key: Bytes;2498  readonly value: Bytes;2499}25002501/** @name UpDataStructsPropertyKeyPermission */2502export interface UpDataStructsPropertyKeyPermission extends Struct {2503  readonly key: Bytes;2504  readonly permission: UpDataStructsPropertyPermission;2505}25062507/** @name UpDataStructsPropertyPermission */2508export interface UpDataStructsPropertyPermission extends Struct {2509  readonly mutable: bool;2510  readonly collectionAdmin: bool;2511  readonly tokenOwner: bool;2512}25132514/** @name UpDataStructsPropertyScope */2515export interface UpDataStructsPropertyScope extends Enum {2516  readonly isNone: boolean;2517  readonly isRmrk: boolean;2518  readonly type: 'None' | 'Rmrk';2519}25202521/** @name UpDataStructsRpcCollection */2522export interface UpDataStructsRpcCollection extends Struct {2523  readonly owner: AccountId32;2524  readonly mode: UpDataStructsCollectionMode;2525  readonly name: Vec<u16>;2526  readonly description: Vec<u16>;2527  readonly tokenPrefix: Bytes;2528  readonly sponsorship: UpDataStructsSponsorshipState;2529  readonly limits: UpDataStructsCollectionLimits;2530  readonly permissions: UpDataStructsCollectionPermissions;2531  readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2532  readonly properties: Vec<UpDataStructsProperty>;2533  readonly readOnly: bool;2534}25352536/** @name UpDataStructsSponsoringRateLimit */2537export interface UpDataStructsSponsoringRateLimit extends Enum {2538  readonly isSponsoringDisabled: boolean;2539  readonly isBlocks: boolean;2540  readonly asBlocks: u32;2541  readonly type: 'SponsoringDisabled' | 'Blocks';2542}25432544/** @name UpDataStructsSponsorshipState */2545export interface UpDataStructsSponsorshipState extends Enum {2546  readonly isDisabled: boolean;2547  readonly isUnconfirmed: boolean;2548  readonly asUnconfirmed: AccountId32;2549  readonly isConfirmed: boolean;2550  readonly asConfirmed: AccountId32;2551  readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2552}25532554/** @name UpDataStructsTokenChild */2555export interface UpDataStructsTokenChild extends Struct {2556  readonly token: u32;2557  readonly collection: u32;2558}25592560/** @name UpDataStructsTokenData */2561export interface UpDataStructsTokenData extends Struct {2562  readonly properties: Vec<UpDataStructsProperty>;2563  readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2564  readonly pieces: u128;2565}25662567/** @name XcmDoubleEncoded */2568export interface XcmDoubleEncoded extends Struct {2569  readonly encoded: Bytes;2570}25712572/** @name XcmV0Junction */2573export interface XcmV0Junction extends Enum {2574  readonly isParent: boolean;2575  readonly isParachain: boolean;2576  readonly asParachain: Compact<u32>;2577  readonly isAccountId32: boolean;2578  readonly asAccountId32: {2579    readonly network: XcmV0JunctionNetworkId;2580    readonly id: U8aFixed;2581  } & Struct;2582  readonly isAccountIndex64: boolean;2583  readonly asAccountIndex64: {2584    readonly network: XcmV0JunctionNetworkId;2585    readonly index: Compact<u64>;2586  } & Struct;2587  readonly isAccountKey20: boolean;2588  readonly asAccountKey20: {2589    readonly network: XcmV0JunctionNetworkId;2590    readonly key: U8aFixed;2591  } & Struct;2592  readonly isPalletInstance: boolean;2593  readonly asPalletInstance: u8;2594  readonly isGeneralIndex: boolean;2595  readonly asGeneralIndex: Compact<u128>;2596  readonly isGeneralKey: boolean;2597  readonly asGeneralKey: Bytes;2598  readonly isOnlyChild: boolean;2599  readonly isPlurality: boolean;2600  readonly asPlurality: {2601    readonly id: XcmV0JunctionBodyId;2602    readonly part: XcmV0JunctionBodyPart;2603  } & Struct;2604  readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2605}26062607/** @name XcmV0JunctionBodyId */2608export interface XcmV0JunctionBodyId extends Enum {2609  readonly isUnit: boolean;2610  readonly isNamed: boolean;2611  readonly asNamed: Bytes;2612  readonly isIndex: boolean;2613  readonly asIndex: Compact<u32>;2614  readonly isExecutive: boolean;2615  readonly isTechnical: boolean;2616  readonly isLegislative: boolean;2617  readonly isJudicial: boolean;2618  readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';2619}26202621/** @name XcmV0JunctionBodyPart */2622export interface XcmV0JunctionBodyPart extends Enum {2623  readonly isVoice: boolean;2624  readonly isMembers: boolean;2625  readonly asMembers: {2626    readonly count: Compact<u32>;2627  } & Struct;2628  readonly isFraction: boolean;2629  readonly asFraction: {2630    readonly nom: Compact<u32>;2631    readonly denom: Compact<u32>;2632  } & Struct;2633  readonly isAtLeastProportion: boolean;2634  readonly asAtLeastProportion: {2635    readonly nom: Compact<u32>;2636    readonly denom: Compact<u32>;2637  } & Struct;2638  readonly isMoreThanProportion: boolean;2639  readonly asMoreThanProportion: {2640    readonly nom: Compact<u32>;2641    readonly denom: Compact<u32>;2642  } & Struct;2643  readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';2644}26452646/** @name XcmV0JunctionNetworkId */2647export interface XcmV0JunctionNetworkId extends Enum {2648  readonly isAny: boolean;2649  readonly isNamed: boolean;2650  readonly asNamed: Bytes;2651  readonly isPolkadot: boolean;2652  readonly isKusama: boolean;2653  readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';2654}26552656/** @name XcmV0MultiAsset */2657export interface XcmV0MultiAsset extends Enum {2658  readonly isNone: boolean;2659  readonly isAll: boolean;2660  readonly isAllFungible: boolean;2661  readonly isAllNonFungible: boolean;2662  readonly isAllAbstractFungible: boolean;2663  readonly asAllAbstractFungible: {2664    readonly id: Bytes;2665  } & Struct;2666  readonly isAllAbstractNonFungible: boolean;2667  readonly asAllAbstractNonFungible: {2668    readonly class: Bytes;2669  } & Struct;2670  readonly isAllConcreteFungible: boolean;2671  readonly asAllConcreteFungible: {2672    readonly id: XcmV0MultiLocation;2673  } & Struct;2674  readonly isAllConcreteNonFungible: boolean;2675  readonly asAllConcreteNonFungible: {2676    readonly class: XcmV0MultiLocation;2677  } & Struct;2678  readonly isAbstractFungible: boolean;2679  readonly asAbstractFungible: {2680    readonly id: Bytes;2681    readonly amount: Compact<u128>;2682  } & Struct;2683  readonly isAbstractNonFungible: boolean;2684  readonly asAbstractNonFungible: {2685    readonly class: Bytes;2686    readonly instance: XcmV1MultiassetAssetInstance;2687  } & Struct;2688  readonly isConcreteFungible: boolean;2689  readonly asConcreteFungible: {2690    readonly id: XcmV0MultiLocation;2691    readonly amount: Compact<u128>;2692  } & Struct;2693  readonly isConcreteNonFungible: boolean;2694  readonly asConcreteNonFungible: {2695    readonly class: XcmV0MultiLocation;2696    readonly instance: XcmV1MultiassetAssetInstance;2697  } & Struct;2698  readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';2699}27002701/** @name XcmV0MultiLocation */2702export interface XcmV0MultiLocation extends Enum {2703  readonly isNull: boolean;2704  readonly isX1: boolean;2705  readonly asX1: XcmV0Junction;2706  readonly isX2: boolean;2707  readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;2708  readonly isX3: boolean;2709  readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2710  readonly isX4: boolean;2711  readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2712  readonly isX5: boolean;2713  readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2714  readonly isX6: boolean;2715  readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2716  readonly isX7: boolean;2717  readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2718  readonly isX8: boolean;2719  readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2720  readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2721}27222723/** @name XcmV0Order */2724export interface XcmV0Order extends Enum {2725  readonly isNull: boolean;2726  readonly isDepositAsset: boolean;2727  readonly asDepositAsset: {2728    readonly assets: Vec<XcmV0MultiAsset>;2729    readonly dest: XcmV0MultiLocation;2730  } & Struct;2731  readonly isDepositReserveAsset: boolean;2732  readonly asDepositReserveAsset: {2733    readonly assets: Vec<XcmV0MultiAsset>;2734    readonly dest: XcmV0MultiLocation;2735    readonly effects: Vec<XcmV0Order>;2736  } & Struct;2737  readonly isExchangeAsset: boolean;2738  readonly asExchangeAsset: {2739    readonly give: Vec<XcmV0MultiAsset>;2740    readonly receive: Vec<XcmV0MultiAsset>;2741  } & Struct;2742  readonly isInitiateReserveWithdraw: boolean;2743  readonly asInitiateReserveWithdraw: {2744    readonly assets: Vec<XcmV0MultiAsset>;2745    readonly reserve: XcmV0MultiLocation;2746    readonly effects: Vec<XcmV0Order>;2747  } & Struct;2748  readonly isInitiateTeleport: boolean;2749  readonly asInitiateTeleport: {2750    readonly assets: Vec<XcmV0MultiAsset>;2751    readonly dest: XcmV0MultiLocation;2752    readonly effects: Vec<XcmV0Order>;2753  } & Struct;2754  readonly isQueryHolding: boolean;2755  readonly asQueryHolding: {2756    readonly queryId: Compact<u64>;2757    readonly dest: XcmV0MultiLocation;2758    readonly assets: Vec<XcmV0MultiAsset>;2759  } & Struct;2760  readonly isBuyExecution: boolean;2761  readonly asBuyExecution: {2762    readonly fees: XcmV0MultiAsset;2763    readonly weight: u64;2764    readonly debt: u64;2765    readonly haltOnError: bool;2766    readonly xcm: Vec<XcmV0Xcm>;2767  } & Struct;2768  readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';2769}27702771/** @name XcmV0OriginKind */2772export interface XcmV0OriginKind extends Enum {2773  readonly isNative: boolean;2774  readonly isSovereignAccount: boolean;2775  readonly isSuperuser: boolean;2776  readonly isXcm: boolean;2777  readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';2778}27792780/** @name XcmV0Response */2781export interface XcmV0Response extends Enum {2782  readonly isAssets: boolean;2783  readonly asAssets: Vec<XcmV0MultiAsset>;2784  readonly type: 'Assets';2785}27862787/** @name XcmV0Xcm */2788export interface XcmV0Xcm extends Enum {2789  readonly isWithdrawAsset: boolean;2790  readonly asWithdrawAsset: {2791    readonly assets: Vec<XcmV0MultiAsset>;2792    readonly effects: Vec<XcmV0Order>;2793  } & Struct;2794  readonly isReserveAssetDeposit: boolean;2795  readonly asReserveAssetDeposit: {2796    readonly assets: Vec<XcmV0MultiAsset>;2797    readonly effects: Vec<XcmV0Order>;2798  } & Struct;2799  readonly isTeleportAsset: boolean;2800  readonly asTeleportAsset: {2801    readonly assets: Vec<XcmV0MultiAsset>;2802    readonly effects: Vec<XcmV0Order>;2803  } & Struct;2804  readonly isQueryResponse: boolean;2805  readonly asQueryResponse: {2806    readonly queryId: Compact<u64>;2807    readonly response: XcmV0Response;2808  } & Struct;2809  readonly isTransferAsset: boolean;2810  readonly asTransferAsset: {2811    readonly assets: Vec<XcmV0MultiAsset>;2812    readonly dest: XcmV0MultiLocation;2813  } & Struct;2814  readonly isTransferReserveAsset: boolean;2815  readonly asTransferReserveAsset: {2816    readonly assets: Vec<XcmV0MultiAsset>;2817    readonly dest: XcmV0MultiLocation;2818    readonly effects: Vec<XcmV0Order>;2819  } & Struct;2820  readonly isTransact: boolean;2821  readonly asTransact: {2822    readonly originType: XcmV0OriginKind;2823    readonly requireWeightAtMost: u64;2824    readonly call: XcmDoubleEncoded;2825  } & Struct;2826  readonly isHrmpNewChannelOpenRequest: boolean;2827  readonly asHrmpNewChannelOpenRequest: {2828    readonly sender: Compact<u32>;2829    readonly maxMessageSize: Compact<u32>;2830    readonly maxCapacity: Compact<u32>;2831  } & Struct;2832  readonly isHrmpChannelAccepted: boolean;2833  readonly asHrmpChannelAccepted: {2834    readonly recipient: Compact<u32>;2835  } & Struct;2836  readonly isHrmpChannelClosing: boolean;2837  readonly asHrmpChannelClosing: {2838    readonly initiator: Compact<u32>;2839    readonly sender: Compact<u32>;2840    readonly recipient: Compact<u32>;2841  } & Struct;2842  readonly isRelayedFrom: boolean;2843  readonly asRelayedFrom: {2844    readonly who: XcmV0MultiLocation;2845    readonly message: XcmV0Xcm;2846  } & Struct;2847  readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';2848}28492850/** @name XcmV1Junction */2851export interface XcmV1Junction extends Enum {2852  readonly isParachain: boolean;2853  readonly asParachain: Compact<u32>;2854  readonly isAccountId32: boolean;2855  readonly asAccountId32: {2856    readonly network: XcmV0JunctionNetworkId;2857    readonly id: U8aFixed;2858  } & Struct;2859  readonly isAccountIndex64: boolean;2860  readonly asAccountIndex64: {2861    readonly network: XcmV0JunctionNetworkId;2862    readonly index: Compact<u64>;2863  } & Struct;2864  readonly isAccountKey20: boolean;2865  readonly asAccountKey20: {2866    readonly network: XcmV0JunctionNetworkId;2867    readonly key: U8aFixed;2868  } & Struct;2869  readonly isPalletInstance: boolean;2870  readonly asPalletInstance: u8;2871  readonly isGeneralIndex: boolean;2872  readonly asGeneralIndex: Compact<u128>;2873  readonly isGeneralKey: boolean;2874  readonly asGeneralKey: Bytes;2875  readonly isOnlyChild: boolean;2876  readonly isPlurality: boolean;2877  readonly asPlurality: {2878    readonly id: XcmV0JunctionBodyId;2879    readonly part: XcmV0JunctionBodyPart;2880  } & Struct;2881  readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2882}28832884/** @name XcmV1MultiAsset */2885export interface XcmV1MultiAsset extends Struct {2886  readonly id: XcmV1MultiassetAssetId;2887  readonly fun: XcmV1MultiassetFungibility;2888}28892890/** @name XcmV1MultiassetAssetId */2891export interface XcmV1MultiassetAssetId extends Enum {2892  readonly isConcrete: boolean;2893  readonly asConcrete: XcmV1MultiLocation;2894  readonly isAbstract: boolean;2895  readonly asAbstract: Bytes;2896  readonly type: 'Concrete' | 'Abstract';2897}28982899/** @name XcmV1MultiassetAssetInstance */2900export interface XcmV1MultiassetAssetInstance extends Enum {2901  readonly isUndefined: boolean;2902  readonly isIndex: boolean;2903  readonly asIndex: Compact<u128>;2904  readonly isArray4: boolean;2905  readonly asArray4: U8aFixed;2906  readonly isArray8: boolean;2907  readonly asArray8: U8aFixed;2908  readonly isArray16: boolean;2909  readonly asArray16: U8aFixed;2910  readonly isArray32: boolean;2911  readonly asArray32: U8aFixed;2912  readonly isBlob: boolean;2913  readonly asBlob: Bytes;2914  readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';2915}29162917/** @name XcmV1MultiassetFungibility */2918export interface XcmV1MultiassetFungibility extends Enum {2919  readonly isFungible: boolean;2920  readonly asFungible: Compact<u128>;2921  readonly isNonFungible: boolean;2922  readonly asNonFungible: XcmV1MultiassetAssetInstance;2923  readonly type: 'Fungible' | 'NonFungible';2924}29252926/** @name XcmV1MultiassetMultiAssetFilter */2927export interface XcmV1MultiassetMultiAssetFilter extends Enum {2928  readonly isDefinite: boolean;2929  readonly asDefinite: XcmV1MultiassetMultiAssets;2930  readonly isWild: boolean;2931  readonly asWild: XcmV1MultiassetWildMultiAsset;2932  readonly type: 'Definite' | 'Wild';2933}29342935/** @name XcmV1MultiassetMultiAssets */2936export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}29372938/** @name XcmV1MultiassetWildFungibility */2939export interface XcmV1MultiassetWildFungibility extends Enum {2940  readonly isFungible: boolean;2941  readonly isNonFungible: boolean;2942  readonly type: 'Fungible' | 'NonFungible';2943}29442945/** @name XcmV1MultiassetWildMultiAsset */2946export interface XcmV1MultiassetWildMultiAsset extends Enum {2947  readonly isAll: boolean;2948  readonly isAllOf: boolean;2949  readonly asAllOf: {2950    readonly id: XcmV1MultiassetAssetId;2951    readonly fun: XcmV1MultiassetWildFungibility;2952  } & Struct;2953  readonly type: 'All' | 'AllOf';2954}29552956/** @name XcmV1MultiLocation */2957export interface XcmV1MultiLocation extends Struct {2958  readonly parents: u8;2959  readonly interior: XcmV1MultilocationJunctions;2960}29612962/** @name XcmV1MultilocationJunctions */2963export interface XcmV1MultilocationJunctions extends Enum {2964  readonly isHere: boolean;2965  readonly isX1: boolean;2966  readonly asX1: XcmV1Junction;2967  readonly isX2: boolean;2968  readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;2969  readonly isX3: boolean;2970  readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2971  readonly isX4: boolean;2972  readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2973  readonly isX5: boolean;2974  readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2975  readonly isX6: boolean;2976  readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2977  readonly isX7: boolean;2978  readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2979  readonly isX8: boolean;2980  readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2981  readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2982}29832984/** @name XcmV1Order */2985export interface XcmV1Order extends Enum {2986  readonly isNoop: boolean;2987  readonly isDepositAsset: boolean;2988  readonly asDepositAsset: {2989    readonly assets: XcmV1MultiassetMultiAssetFilter;2990    readonly maxAssets: u32;2991    readonly beneficiary: XcmV1MultiLocation;2992  } & Struct;2993  readonly isDepositReserveAsset: boolean;2994  readonly asDepositReserveAsset: {2995    readonly assets: XcmV1MultiassetMultiAssetFilter;2996    readonly maxAssets: u32;2997    readonly dest: XcmV1MultiLocation;2998    readonly effects: Vec<XcmV1Order>;2999  } & Struct;3000  readonly isExchangeAsset: boolean;3001  readonly asExchangeAsset: {3002    readonly give: XcmV1MultiassetMultiAssetFilter;3003    readonly receive: XcmV1MultiassetMultiAssets;3004  } & Struct;3005  readonly isInitiateReserveWithdraw: boolean;3006  readonly asInitiateReserveWithdraw: {3007    readonly assets: XcmV1MultiassetMultiAssetFilter;3008    readonly reserve: XcmV1MultiLocation;3009    readonly effects: Vec<XcmV1Order>;3010  } & Struct;3011  readonly isInitiateTeleport: boolean;3012  readonly asInitiateTeleport: {3013    readonly assets: XcmV1MultiassetMultiAssetFilter;3014    readonly dest: XcmV1MultiLocation;3015    readonly effects: Vec<XcmV1Order>;3016  } & Struct;3017  readonly isQueryHolding: boolean;3018  readonly asQueryHolding: {3019    readonly queryId: Compact<u64>;3020    readonly dest: XcmV1MultiLocation;3021    readonly assets: XcmV1MultiassetMultiAssetFilter;3022  } & Struct;3023  readonly isBuyExecution: boolean;3024  readonly asBuyExecution: {3025    readonly fees: XcmV1MultiAsset;3026    readonly weight: u64;3027    readonly debt: u64;3028    readonly haltOnError: bool;3029    readonly instructions: Vec<XcmV1Xcm>;3030  } & Struct;3031  readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';3032}30333034/** @name XcmV1Response */3035export interface XcmV1Response extends Enum {3036  readonly isAssets: boolean;3037  readonly asAssets: XcmV1MultiassetMultiAssets;3038  readonly isVersion: boolean;3039  readonly asVersion: u32;3040  readonly type: 'Assets' | 'Version';3041}30423043/** @name XcmV1Xcm */3044export interface XcmV1Xcm extends Enum {3045  readonly isWithdrawAsset: boolean;3046  readonly asWithdrawAsset: {3047    readonly assets: XcmV1MultiassetMultiAssets;3048    readonly effects: Vec<XcmV1Order>;3049  } & Struct;3050  readonly isReserveAssetDeposited: boolean;3051  readonly asReserveAssetDeposited: {3052    readonly assets: XcmV1MultiassetMultiAssets;3053    readonly effects: Vec<XcmV1Order>;3054  } & Struct;3055  readonly isReceiveTeleportedAsset: boolean;3056  readonly asReceiveTeleportedAsset: {3057    readonly assets: XcmV1MultiassetMultiAssets;3058    readonly effects: Vec<XcmV1Order>;3059  } & Struct;3060  readonly isQueryResponse: boolean;3061  readonly asQueryResponse: {3062    readonly queryId: Compact<u64>;3063    readonly response: XcmV1Response;3064  } & Struct;3065  readonly isTransferAsset: boolean;3066  readonly asTransferAsset: {3067    readonly assets: XcmV1MultiassetMultiAssets;3068    readonly beneficiary: XcmV1MultiLocation;3069  } & Struct;3070  readonly isTransferReserveAsset: boolean;3071  readonly asTransferReserveAsset: {3072    readonly assets: XcmV1MultiassetMultiAssets;3073    readonly dest: XcmV1MultiLocation;3074    readonly effects: Vec<XcmV1Order>;3075  } & Struct;3076  readonly isTransact: boolean;3077  readonly asTransact: {3078    readonly originType: XcmV0OriginKind;3079    readonly requireWeightAtMost: u64;3080    readonly call: XcmDoubleEncoded;3081  } & Struct;3082  readonly isHrmpNewChannelOpenRequest: boolean;3083  readonly asHrmpNewChannelOpenRequest: {3084    readonly sender: Compact<u32>;3085    readonly maxMessageSize: Compact<u32>;3086    readonly maxCapacity: Compact<u32>;3087  } & Struct;3088  readonly isHrmpChannelAccepted: boolean;3089  readonly asHrmpChannelAccepted: {3090    readonly recipient: Compact<u32>;3091  } & Struct;3092  readonly isHrmpChannelClosing: boolean;3093  readonly asHrmpChannelClosing: {3094    readonly initiator: Compact<u32>;3095    readonly sender: Compact<u32>;3096    readonly recipient: Compact<u32>;3097  } & Struct;3098  readonly isRelayedFrom: boolean;3099  readonly asRelayedFrom: {3100    readonly who: XcmV1MultilocationJunctions;3101    readonly message: XcmV1Xcm;3102  } & Struct;3103  readonly isSubscribeVersion: boolean;3104  readonly asSubscribeVersion: {3105    readonly queryId: Compact<u64>;3106    readonly maxResponseWeight: Compact<u64>;3107  } & Struct;3108  readonly isUnsubscribeVersion: boolean;3109  readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';3110}31113112/** @name XcmV2Instruction */3113export interface XcmV2Instruction extends Enum {3114  readonly isWithdrawAsset: boolean;3115  readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;3116  readonly isReserveAssetDeposited: boolean;3117  readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;3118  readonly isReceiveTeleportedAsset: boolean;3119  readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;3120  readonly isQueryResponse: boolean;3121  readonly asQueryResponse: {3122    readonly queryId: Compact<u64>;3123    readonly response: XcmV2Response;3124    readonly maxWeight: Compact<u64>;3125  } & Struct;3126  readonly isTransferAsset: boolean;3127  readonly asTransferAsset: {3128    readonly assets: XcmV1MultiassetMultiAssets;3129    readonly beneficiary: XcmV1MultiLocation;3130  } & Struct;3131  readonly isTransferReserveAsset: boolean;3132  readonly asTransferReserveAsset: {3133    readonly assets: XcmV1MultiassetMultiAssets;3134    readonly dest: XcmV1MultiLocation;3135    readonly xcm: XcmV2Xcm;3136  } & Struct;3137  readonly isTransact: boolean;3138  readonly asTransact: {3139    readonly originType: XcmV0OriginKind;3140    readonly requireWeightAtMost: Compact<u64>;3141    readonly call: XcmDoubleEncoded;3142  } & Struct;3143  readonly isHrmpNewChannelOpenRequest: boolean;3144  readonly asHrmpNewChannelOpenRequest: {3145    readonly sender: Compact<u32>;3146    readonly maxMessageSize: Compact<u32>;3147    readonly maxCapacity: Compact<u32>;3148  } & Struct;3149  readonly isHrmpChannelAccepted: boolean;3150  readonly asHrmpChannelAccepted: {3151    readonly recipient: Compact<u32>;3152  } & Struct;3153  readonly isHrmpChannelClosing: boolean;3154  readonly asHrmpChannelClosing: {3155    readonly initiator: Compact<u32>;3156    readonly sender: Compact<u32>;3157    readonly recipient: Compact<u32>;3158  } & Struct;3159  readonly isClearOrigin: boolean;3160  readonly isDescendOrigin: boolean;3161  readonly asDescendOrigin: XcmV1MultilocationJunctions;3162  readonly isReportError: boolean;3163  readonly asReportError: {3164    readonly queryId: Compact<u64>;3165    readonly dest: XcmV1MultiLocation;3166    readonly maxResponseWeight: Compact<u64>;3167  } & Struct;3168  readonly isDepositAsset: boolean;3169  readonly asDepositAsset: {3170    readonly assets: XcmV1MultiassetMultiAssetFilter;3171    readonly maxAssets: Compact<u32>;3172    readonly beneficiary: XcmV1MultiLocation;3173  } & Struct;3174  readonly isDepositReserveAsset: boolean;3175  readonly asDepositReserveAsset: {3176    readonly assets: XcmV1MultiassetMultiAssetFilter;3177    readonly maxAssets: Compact<u32>;3178    readonly dest: XcmV1MultiLocation;3179    readonly xcm: XcmV2Xcm;3180  } & Struct;3181  readonly isExchangeAsset: boolean;3182  readonly asExchangeAsset: {3183    readonly give: XcmV1MultiassetMultiAssetFilter;3184    readonly receive: XcmV1MultiassetMultiAssets;3185  } & Struct;3186  readonly isInitiateReserveWithdraw: boolean;3187  readonly asInitiateReserveWithdraw: {3188    readonly assets: XcmV1MultiassetMultiAssetFilter;3189    readonly reserve: XcmV1MultiLocation;3190    readonly xcm: XcmV2Xcm;3191  } & Struct;3192  readonly isInitiateTeleport: boolean;3193  readonly asInitiateTeleport: {3194    readonly assets: XcmV1MultiassetMultiAssetFilter;3195    readonly dest: XcmV1MultiLocation;3196    readonly xcm: XcmV2Xcm;3197  } & Struct;3198  readonly isQueryHolding: boolean;3199  readonly asQueryHolding: {3200    readonly queryId: Compact<u64>;3201    readonly dest: XcmV1MultiLocation;3202    readonly assets: XcmV1MultiassetMultiAssetFilter;3203    readonly maxResponseWeight: Compact<u64>;3204  } & Struct;3205  readonly isBuyExecution: boolean;3206  readonly asBuyExecution: {3207    readonly fees: XcmV1MultiAsset;3208    readonly weightLimit: XcmV2WeightLimit;3209  } & Struct;3210  readonly isRefundSurplus: boolean;3211  readonly isSetErrorHandler: boolean;3212  readonly asSetErrorHandler: XcmV2Xcm;3213  readonly isSetAppendix: boolean;3214  readonly asSetAppendix: XcmV2Xcm;3215  readonly isClearError: boolean;3216  readonly isClaimAsset: boolean;3217  readonly asClaimAsset: {3218    readonly assets: XcmV1MultiassetMultiAssets;3219    readonly ticket: XcmV1MultiLocation;3220  } & Struct;3221  readonly isTrap: boolean;3222  readonly asTrap: Compact<u64>;3223  readonly isSubscribeVersion: boolean;3224  readonly asSubscribeVersion: {3225    readonly queryId: Compact<u64>;3226    readonly maxResponseWeight: Compact<u64>;3227  } & Struct;3228  readonly isUnsubscribeVersion: boolean;3229  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';3230}32313232/** @name XcmV2Response */3233export interface XcmV2Response extends Enum {3234  readonly isNull: boolean;3235  readonly isAssets: boolean;3236  readonly asAssets: XcmV1MultiassetMultiAssets;3237  readonly isExecutionResult: boolean;3238  readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;3239  readonly isVersion: boolean;3240  readonly asVersion: u32;3241  readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';3242}32433244/** @name XcmV2TraitsError */3245export interface XcmV2TraitsError extends Enum {3246  readonly isOverflow: boolean;3247  readonly isUnimplemented: boolean;3248  readonly isUntrustedReserveLocation: boolean;3249  readonly isUntrustedTeleportLocation: boolean;3250  readonly isMultiLocationFull: boolean;3251  readonly isMultiLocationNotInvertible: boolean;3252  readonly isBadOrigin: boolean;3253  readonly isInvalidLocation: boolean;3254  readonly isAssetNotFound: boolean;3255  readonly isFailedToTransactAsset: boolean;3256  readonly isNotWithdrawable: boolean;3257  readonly isLocationCannotHold: boolean;3258  readonly isExceedsMaxMessageSize: boolean;3259  readonly isDestinationUnsupported: boolean;3260  readonly isTransport: boolean;3261  readonly isUnroutable: boolean;3262  readonly isUnknownClaim: boolean;3263  readonly isFailedToDecode: boolean;3264  readonly isMaxWeightInvalid: boolean;3265  readonly isNotHoldingFees: boolean;3266  readonly isTooExpensive: boolean;3267  readonly isTrap: boolean;3268  readonly asTrap: u64;3269  readonly isUnhandledXcmVersion: boolean;3270  readonly isWeightLimitReached: boolean;3271  readonly asWeightLimitReached: u64;3272  readonly isBarrier: boolean;3273  readonly isWeightNotComputable: boolean;3274  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';3275}32763277/** @name XcmV2TraitsOutcome */3278export interface XcmV2TraitsOutcome extends Enum {3279  readonly isComplete: boolean;3280  readonly asComplete: u64;3281  readonly isIncomplete: boolean;3282  readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;3283  readonly isError: boolean;3284  readonly asError: XcmV2TraitsError;3285  readonly type: 'Complete' | 'Incomplete' | 'Error';3286}32873288/** @name XcmV2WeightLimit */3289export interface XcmV2WeightLimit extends Enum {3290  readonly isUnlimited: boolean;3291  readonly isLimited: boolean;3292  readonly asLimited: Compact<u64>;3293  readonly type: 'Unlimited' | 'Limited';3294}32953296/** @name XcmV2Xcm */3297export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}32983299/** @name XcmVersionedMultiAssets */3300export interface XcmVersionedMultiAssets extends Enum {3301  readonly isV0: boolean;3302  readonly asV0: Vec<XcmV0MultiAsset>;3303  readonly isV1: boolean;3304  readonly asV1: XcmV1MultiassetMultiAssets;3305  readonly type: 'V0' | 'V1';3306}33073308/** @name XcmVersionedMultiLocation */3309export interface XcmVersionedMultiLocation extends Enum {3310  readonly isV0: boolean;3311  readonly asV0: XcmV0MultiLocation;3312  readonly isV1: boolean;3313  readonly asV1: XcmV1MultiLocation;3314  readonly type: 'V0' | 'V1';3315}33163317/** @name XcmVersionedXcm */3318export interface XcmVersionedXcm extends Enum {3319  readonly isV0: boolean;3320  readonly asV0: XcmV0Xcm;3321  readonly isV1: boolean;3322  readonly asV1: XcmV1Xcm;3323  readonly isV2: boolean;3324  readonly asV2: XcmV2Xcm;3325  readonly type: 'V0' | 'V1' | 'V2';3326}33273328export type PHANTOM_DEFAULT = 'default';
after · tests/src/interfaces/default/types.ts
1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';5import type { ITuple } from '@polkadot/types-codec/types';6import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';7import type { Event } from '@polkadot/types/interfaces/system';89/** @name CumulusPalletDmpQueueCall */10export interface CumulusPalletDmpQueueCall extends Enum {11  readonly isServiceOverweight: boolean;12  readonly asServiceOverweight: {13    readonly index: u64;14    readonly weightLimit: u64;15  } & Struct;16  readonly type: 'ServiceOverweight';17}1819/** @name CumulusPalletDmpQueueConfigData */20export interface CumulusPalletDmpQueueConfigData extends Struct {21  readonly maxIndividual: u64;22}2324/** @name CumulusPalletDmpQueueError */25export interface CumulusPalletDmpQueueError extends Enum {26  readonly isUnknown: boolean;27  readonly isOverLimit: boolean;28  readonly type: 'Unknown' | 'OverLimit';29}3031/** @name CumulusPalletDmpQueueEvent */32export interface CumulusPalletDmpQueueEvent extends Enum {33  readonly isInvalidFormat: boolean;34  readonly asInvalidFormat: {35    readonly messageId: U8aFixed;36  } & Struct;37  readonly isUnsupportedVersion: boolean;38  readonly asUnsupportedVersion: {39    readonly messageId: U8aFixed;40  } & Struct;41  readonly isExecutedDownward: boolean;42  readonly asExecutedDownward: {43    readonly messageId: U8aFixed;44    readonly outcome: XcmV2TraitsOutcome;45  } & Struct;46  readonly isWeightExhausted: boolean;47  readonly asWeightExhausted: {48    readonly messageId: U8aFixed;49    readonly remainingWeight: u64;50    readonly requiredWeight: u64;51  } & Struct;52  readonly isOverweightEnqueued: boolean;53  readonly asOverweightEnqueued: {54    readonly messageId: U8aFixed;55    readonly overweightIndex: u64;56    readonly requiredWeight: u64;57  } & Struct;58  readonly isOverweightServiced: boolean;59  readonly asOverweightServiced: {60    readonly overweightIndex: u64;61    readonly weightUsed: u64;62  } & Struct;63  readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';64}6566/** @name CumulusPalletDmpQueuePageIndexData */67export interface CumulusPalletDmpQueuePageIndexData extends Struct {68  readonly beginUsed: u32;69  readonly endUsed: u32;70  readonly overweightCount: u64;71}7273/** @name CumulusPalletParachainSystemCall */74export interface CumulusPalletParachainSystemCall extends Enum {75  readonly isSetValidationData: boolean;76  readonly asSetValidationData: {77    readonly data: CumulusPrimitivesParachainInherentParachainInherentData;78  } & Struct;79  readonly isSudoSendUpwardMessage: boolean;80  readonly asSudoSendUpwardMessage: {81    readonly message: Bytes;82  } & Struct;83  readonly isAuthorizeUpgrade: boolean;84  readonly asAuthorizeUpgrade: {85    readonly codeHash: H256;86  } & Struct;87  readonly isEnactAuthorizedUpgrade: boolean;88  readonly asEnactAuthorizedUpgrade: {89    readonly code: Bytes;90  } & Struct;91  readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';92}9394/** @name CumulusPalletParachainSystemError */95export interface CumulusPalletParachainSystemError extends Enum {96  readonly isOverlappingUpgrades: boolean;97  readonly isProhibitedByPolkadot: boolean;98  readonly isTooBig: boolean;99  readonly isValidationDataNotAvailable: boolean;100  readonly isHostConfigurationNotAvailable: boolean;101  readonly isNotScheduled: boolean;102  readonly isNothingAuthorized: boolean;103  readonly isUnauthorized: boolean;104  readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';105}106107/** @name CumulusPalletParachainSystemEvent */108export interface CumulusPalletParachainSystemEvent extends Enum {109  readonly isValidationFunctionStored: boolean;110  readonly isValidationFunctionApplied: boolean;111  readonly asValidationFunctionApplied: {112    readonly relayChainBlockNum: u32;113  } & Struct;114  readonly isValidationFunctionDiscarded: boolean;115  readonly isUpgradeAuthorized: boolean;116  readonly asUpgradeAuthorized: {117    readonly codeHash: H256;118  } & Struct;119  readonly isDownwardMessagesReceived: boolean;120  readonly asDownwardMessagesReceived: {121    readonly count: u32;122  } & Struct;123  readonly isDownwardMessagesProcessed: boolean;124  readonly asDownwardMessagesProcessed: {125    readonly weightUsed: u64;126    readonly dmqHead: H256;127  } & Struct;128  readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';129}130131/** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot */132export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {133  readonly dmqMqcHead: H256;134  readonly relayDispatchQueueSize: ITuple<[u32, u32]>;135  readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;136  readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;137}138139/** @name CumulusPalletXcmCall */140export interface CumulusPalletXcmCall extends Null {}141142/** @name CumulusPalletXcmError */143export interface CumulusPalletXcmError extends Null {}144145/** @name CumulusPalletXcmEvent */146export interface CumulusPalletXcmEvent extends Enum {147  readonly isInvalidFormat: boolean;148  readonly asInvalidFormat: U8aFixed;149  readonly isUnsupportedVersion: boolean;150  readonly asUnsupportedVersion: U8aFixed;151  readonly isExecutedDownward: boolean;152  readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;153  readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';154}155156/** @name CumulusPalletXcmOrigin */157export interface CumulusPalletXcmOrigin extends Enum {158  readonly isRelay: boolean;159  readonly isSiblingParachain: boolean;160  readonly asSiblingParachain: u32;161  readonly type: 'Relay' | 'SiblingParachain';162}163164/** @name CumulusPalletXcmpQueueCall */165export interface CumulusPalletXcmpQueueCall extends Enum {166  readonly isServiceOverweight: boolean;167  readonly asServiceOverweight: {168    readonly index: u64;169    readonly weightLimit: u64;170  } & Struct;171  readonly isSuspendXcmExecution: boolean;172  readonly isResumeXcmExecution: boolean;173  readonly isUpdateSuspendThreshold: boolean;174  readonly asUpdateSuspendThreshold: {175    readonly new_: u32;176  } & Struct;177  readonly isUpdateDropThreshold: boolean;178  readonly asUpdateDropThreshold: {179    readonly new_: u32;180  } & Struct;181  readonly isUpdateResumeThreshold: boolean;182  readonly asUpdateResumeThreshold: {183    readonly new_: u32;184  } & Struct;185  readonly isUpdateThresholdWeight: boolean;186  readonly asUpdateThresholdWeight: {187    readonly new_: u64;188  } & Struct;189  readonly isUpdateWeightRestrictDecay: boolean;190  readonly asUpdateWeightRestrictDecay: {191    readonly new_: u64;192  } & Struct;193  readonly isUpdateXcmpMaxIndividualWeight: boolean;194  readonly asUpdateXcmpMaxIndividualWeight: {195    readonly new_: u64;196  } & Struct;197  readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';198}199200/** @name CumulusPalletXcmpQueueError */201export interface CumulusPalletXcmpQueueError extends Enum {202  readonly isFailedToSend: boolean;203  readonly isBadXcmOrigin: boolean;204  readonly isBadXcm: boolean;205  readonly isBadOverweightIndex: boolean;206  readonly isWeightOverLimit: boolean;207  readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';208}209210/** @name CumulusPalletXcmpQueueEvent */211export interface CumulusPalletXcmpQueueEvent extends Enum {212  readonly isSuccess: boolean;213  readonly asSuccess: Option<H256>;214  readonly isFail: boolean;215  readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;216  readonly isBadVersion: boolean;217  readonly asBadVersion: Option<H256>;218  readonly isBadFormat: boolean;219  readonly asBadFormat: Option<H256>;220  readonly isUpwardMessageSent: boolean;221  readonly asUpwardMessageSent: Option<H256>;222  readonly isXcmpMessageSent: boolean;223  readonly asXcmpMessageSent: Option<H256>;224  readonly isOverweightEnqueued: boolean;225  readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;226  readonly isOverweightServiced: boolean;227  readonly asOverweightServiced: ITuple<[u64, u64]>;228  readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';229}230231/** @name CumulusPalletXcmpQueueInboundChannelDetails */232export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {233  readonly sender: u32;234  readonly state: CumulusPalletXcmpQueueInboundState;235  readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;236}237238/** @name CumulusPalletXcmpQueueInboundState */239export interface CumulusPalletXcmpQueueInboundState extends Enum {240  readonly isOk: boolean;241  readonly isSuspended: boolean;242  readonly type: 'Ok' | 'Suspended';243}244245/** @name CumulusPalletXcmpQueueOutboundChannelDetails */246export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {247  readonly recipient: u32;248  readonly state: CumulusPalletXcmpQueueOutboundState;249  readonly signalsExist: bool;250  readonly firstIndex: u16;251  readonly lastIndex: u16;252}253254/** @name CumulusPalletXcmpQueueOutboundState */255export interface CumulusPalletXcmpQueueOutboundState extends Enum {256  readonly isOk: boolean;257  readonly isSuspended: boolean;258  readonly type: 'Ok' | 'Suspended';259}260261/** @name CumulusPalletXcmpQueueQueueConfigData */262export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {263  readonly suspendThreshold: u32;264  readonly dropThreshold: u32;265  readonly resumeThreshold: u32;266  readonly thresholdWeight: u64;267  readonly weightRestrictDecay: u64;268  readonly xcmpMaxIndividualWeight: u64;269}270271/** @name CumulusPrimitivesParachainInherentParachainInherentData */272export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {273  readonly validationData: PolkadotPrimitivesV2PersistedValidationData;274  readonly relayChainState: SpTrieStorageProof;275  readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;276  readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;277}278279/** @name EthbloomBloom */280export interface EthbloomBloom extends U8aFixed {}281282/** @name EthereumBlock */283export interface EthereumBlock extends Struct {284  readonly header: EthereumHeader;285  readonly transactions: Vec<EthereumTransactionTransactionV2>;286  readonly ommers: Vec<EthereumHeader>;287}288289/** @name EthereumHeader */290export interface EthereumHeader extends Struct {291  readonly parentHash: H256;292  readonly ommersHash: H256;293  readonly beneficiary: H160;294  readonly stateRoot: H256;295  readonly transactionsRoot: H256;296  readonly receiptsRoot: H256;297  readonly logsBloom: EthbloomBloom;298  readonly difficulty: U256;299  readonly number: U256;300  readonly gasLimit: U256;301  readonly gasUsed: U256;302  readonly timestamp: u64;303  readonly extraData: Bytes;304  readonly mixHash: H256;305  readonly nonce: EthereumTypesHashH64;306}307308/** @name EthereumLog */309export interface EthereumLog extends Struct {310  readonly address: H160;311  readonly topics: Vec<H256>;312  readonly data: Bytes;313}314315/** @name EthereumReceiptEip658ReceiptData */316export interface EthereumReceiptEip658ReceiptData extends Struct {317  readonly statusCode: u8;318  readonly usedGas: U256;319  readonly logsBloom: EthbloomBloom;320  readonly logs: Vec<EthereumLog>;321}322323/** @name EthereumReceiptReceiptV3 */324export interface EthereumReceiptReceiptV3 extends Enum {325  readonly isLegacy: boolean;326  readonly asLegacy: EthereumReceiptEip658ReceiptData;327  readonly isEip2930: boolean;328  readonly asEip2930: EthereumReceiptEip658ReceiptData;329  readonly isEip1559: boolean;330  readonly asEip1559: EthereumReceiptEip658ReceiptData;331  readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';332}333334/** @name EthereumTransactionAccessListItem */335export interface EthereumTransactionAccessListItem extends Struct {336  readonly address: H160;337  readonly storageKeys: Vec<H256>;338}339340/** @name EthereumTransactionEip1559Transaction */341export interface EthereumTransactionEip1559Transaction extends Struct {342  readonly chainId: u64;343  readonly nonce: U256;344  readonly maxPriorityFeePerGas: U256;345  readonly maxFeePerGas: U256;346  readonly gasLimit: U256;347  readonly action: EthereumTransactionTransactionAction;348  readonly value: U256;349  readonly input: Bytes;350  readonly accessList: Vec<EthereumTransactionAccessListItem>;351  readonly oddYParity: bool;352  readonly r: H256;353  readonly s: H256;354}355356/** @name EthereumTransactionEip2930Transaction */357export interface EthereumTransactionEip2930Transaction extends Struct {358  readonly chainId: u64;359  readonly nonce: U256;360  readonly gasPrice: U256;361  readonly gasLimit: U256;362  readonly action: EthereumTransactionTransactionAction;363  readonly value: U256;364  readonly input: Bytes;365  readonly accessList: Vec<EthereumTransactionAccessListItem>;366  readonly oddYParity: bool;367  readonly r: H256;368  readonly s: H256;369}370371/** @name EthereumTransactionLegacyTransaction */372export interface EthereumTransactionLegacyTransaction extends Struct {373  readonly nonce: U256;374  readonly gasPrice: U256;375  readonly gasLimit: U256;376  readonly action: EthereumTransactionTransactionAction;377  readonly value: U256;378  readonly input: Bytes;379  readonly signature: EthereumTransactionTransactionSignature;380}381382/** @name EthereumTransactionTransactionAction */383export interface EthereumTransactionTransactionAction extends Enum {384  readonly isCall: boolean;385  readonly asCall: H160;386  readonly isCreate: boolean;387  readonly type: 'Call' | 'Create';388}389390/** @name EthereumTransactionTransactionSignature */391export interface EthereumTransactionTransactionSignature extends Struct {392  readonly v: u64;393  readonly r: H256;394  readonly s: H256;395}396397/** @name EthereumTransactionTransactionV2 */398export interface EthereumTransactionTransactionV2 extends Enum {399  readonly isLegacy: boolean;400  readonly asLegacy: EthereumTransactionLegacyTransaction;401  readonly isEip2930: boolean;402  readonly asEip2930: EthereumTransactionEip2930Transaction;403  readonly isEip1559: boolean;404  readonly asEip1559: EthereumTransactionEip1559Transaction;405  readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';406}407408/** @name EthereumTypesHashH64 */409export interface EthereumTypesHashH64 extends U8aFixed {}410411/** @name EvmCoreErrorExitError */412export interface EvmCoreErrorExitError extends Enum {413  readonly isStackUnderflow: boolean;414  readonly isStackOverflow: boolean;415  readonly isInvalidJump: boolean;416  readonly isInvalidRange: boolean;417  readonly isDesignatedInvalid: boolean;418  readonly isCallTooDeep: boolean;419  readonly isCreateCollision: boolean;420  readonly isCreateContractLimit: boolean;421  readonly isOutOfOffset: boolean;422  readonly isOutOfGas: boolean;423  readonly isOutOfFund: boolean;424  readonly isPcUnderflow: boolean;425  readonly isCreateEmpty: boolean;426  readonly isOther: boolean;427  readonly asOther: Text;428  readonly isInvalidCode: boolean;429  readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';430}431432/** @name EvmCoreErrorExitFatal */433export interface EvmCoreErrorExitFatal extends Enum {434  readonly isNotSupported: boolean;435  readonly isUnhandledInterrupt: boolean;436  readonly isCallErrorAsFatal: boolean;437  readonly asCallErrorAsFatal: EvmCoreErrorExitError;438  readonly isOther: boolean;439  readonly asOther: Text;440  readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';441}442443/** @name EvmCoreErrorExitReason */444export interface EvmCoreErrorExitReason extends Enum {445  readonly isSucceed: boolean;446  readonly asSucceed: EvmCoreErrorExitSucceed;447  readonly isError: boolean;448  readonly asError: EvmCoreErrorExitError;449  readonly isRevert: boolean;450  readonly asRevert: EvmCoreErrorExitRevert;451  readonly isFatal: boolean;452  readonly asFatal: EvmCoreErrorExitFatal;453  readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';454}455456/** @name EvmCoreErrorExitRevert */457export interface EvmCoreErrorExitRevert extends Enum {458  readonly isReverted: boolean;459  readonly type: 'Reverted';460}461462/** @name EvmCoreErrorExitSucceed */463export interface EvmCoreErrorExitSucceed extends Enum {464  readonly isStopped: boolean;465  readonly isReturned: boolean;466  readonly isSuicided: boolean;467  readonly type: 'Stopped' | 'Returned' | 'Suicided';468}469470/** @name FpRpcTransactionStatus */471export interface FpRpcTransactionStatus extends Struct {472  readonly transactionHash: H256;473  readonly transactionIndex: u32;474  readonly from: H160;475  readonly to: Option<H160>;476  readonly contractAddress: Option<H160>;477  readonly logs: Vec<EthereumLog>;478  readonly logsBloom: EthbloomBloom;479}480481/** @name FrameSupportDispatchRawOrigin */482export interface FrameSupportDispatchRawOrigin extends Enum {483  readonly isRoot: boolean;484  readonly isSigned: boolean;485  readonly asSigned: AccountId32;486  readonly isNone: boolean;487  readonly type: 'Root' | 'Signed' | 'None';488}489490/** @name FrameSupportPalletId */491export interface FrameSupportPalletId extends U8aFixed {}492493/** @name FrameSupportScheduleLookupError */494export interface FrameSupportScheduleLookupError extends Enum {495  readonly isUnknown: boolean;496  readonly isBadFormat: boolean;497  readonly type: 'Unknown' | 'BadFormat';498}499500/** @name FrameSupportScheduleMaybeHashed */501export interface FrameSupportScheduleMaybeHashed extends Enum {502  readonly isValue: boolean;503  readonly asValue: Call;504  readonly isHash: boolean;505  readonly asHash: H256;506  readonly type: 'Value' | 'Hash';507}508509/** @name FrameSupportTokensMiscBalanceStatus */510export interface FrameSupportTokensMiscBalanceStatus extends Enum {511  readonly isFree: boolean;512  readonly isReserved: boolean;513  readonly type: 'Free' | 'Reserved';514}515516/** @name FrameSupportWeightsDispatchClass */517export interface FrameSupportWeightsDispatchClass extends Enum {518  readonly isNormal: boolean;519  readonly isOperational: boolean;520  readonly isMandatory: boolean;521  readonly type: 'Normal' | 'Operational' | 'Mandatory';522}523524/** @name FrameSupportWeightsDispatchInfo */525export interface FrameSupportWeightsDispatchInfo extends Struct {526  readonly weight: u64;527  readonly class: FrameSupportWeightsDispatchClass;528  readonly paysFee: FrameSupportWeightsPays;529}530531/** @name FrameSupportWeightsPays */532export interface FrameSupportWeightsPays extends Enum {533  readonly isYes: boolean;534  readonly isNo: boolean;535  readonly type: 'Yes' | 'No';536}537538/** @name FrameSupportWeightsPerDispatchClassU32 */539export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {540  readonly normal: u32;541  readonly operational: u32;542  readonly mandatory: u32;543}544545/** @name FrameSupportWeightsPerDispatchClassU64 */546export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {547  readonly normal: u64;548  readonly operational: u64;549  readonly mandatory: u64;550}551552/** @name FrameSupportWeightsPerDispatchClassWeightsPerClass */553export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {554  readonly normal: FrameSystemLimitsWeightsPerClass;555  readonly operational: FrameSystemLimitsWeightsPerClass;556  readonly mandatory: FrameSystemLimitsWeightsPerClass;557}558559/** @name FrameSupportWeightsRuntimeDbWeight */560export interface FrameSupportWeightsRuntimeDbWeight extends Struct {561  readonly read: u64;562  readonly write: u64;563}564565/** @name FrameSystemAccountInfo */566export interface FrameSystemAccountInfo extends Struct {567  readonly nonce: u32;568  readonly consumers: u32;569  readonly providers: u32;570  readonly sufficients: u32;571  readonly data: PalletBalancesAccountData;572}573574/** @name FrameSystemCall */575export interface FrameSystemCall extends Enum {576  readonly isFillBlock: boolean;577  readonly asFillBlock: {578    readonly ratio: Perbill;579  } & Struct;580  readonly isRemark: boolean;581  readonly asRemark: {582    readonly remark: Bytes;583  } & Struct;584  readonly isSetHeapPages: boolean;585  readonly asSetHeapPages: {586    readonly pages: u64;587  } & Struct;588  readonly isSetCode: boolean;589  readonly asSetCode: {590    readonly code: Bytes;591  } & Struct;592  readonly isSetCodeWithoutChecks: boolean;593  readonly asSetCodeWithoutChecks: {594    readonly code: Bytes;595  } & Struct;596  readonly isSetStorage: boolean;597  readonly asSetStorage: {598    readonly items: Vec<ITuple<[Bytes, Bytes]>>;599  } & Struct;600  readonly isKillStorage: boolean;601  readonly asKillStorage: {602    readonly keys_: Vec<Bytes>;603  } & Struct;604  readonly isKillPrefix: boolean;605  readonly asKillPrefix: {606    readonly prefix: Bytes;607    readonly subkeys: u32;608  } & Struct;609  readonly isRemarkWithEvent: boolean;610  readonly asRemarkWithEvent: {611    readonly remark: Bytes;612  } & Struct;613  readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';614}615616/** @name FrameSystemError */617export interface FrameSystemError extends Enum {618  readonly isInvalidSpecName: boolean;619  readonly isSpecVersionNeedsToIncrease: boolean;620  readonly isFailedToExtractRuntimeVersion: boolean;621  readonly isNonDefaultComposite: boolean;622  readonly isNonZeroRefCount: boolean;623  readonly isCallFiltered: boolean;624  readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';625}626627/** @name FrameSystemEvent */628export interface FrameSystemEvent extends Enum {629  readonly isExtrinsicSuccess: boolean;630  readonly asExtrinsicSuccess: {631    readonly dispatchInfo: FrameSupportWeightsDispatchInfo;632  } & Struct;633  readonly isExtrinsicFailed: boolean;634  readonly asExtrinsicFailed: {635    readonly dispatchError: SpRuntimeDispatchError;636    readonly dispatchInfo: FrameSupportWeightsDispatchInfo;637  } & Struct;638  readonly isCodeUpdated: boolean;639  readonly isNewAccount: boolean;640  readonly asNewAccount: {641    readonly account: AccountId32;642  } & Struct;643  readonly isKilledAccount: boolean;644  readonly asKilledAccount: {645    readonly account: AccountId32;646  } & Struct;647  readonly isRemarked: boolean;648  readonly asRemarked: {649    readonly sender: AccountId32;650    readonly hash_: H256;651  } & Struct;652  readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';653}654655/** @name FrameSystemEventRecord */656export interface FrameSystemEventRecord extends Struct {657  readonly phase: FrameSystemPhase;658  readonly event: Event;659  readonly topics: Vec<H256>;660}661662/** @name FrameSystemExtensionsCheckGenesis */663export interface FrameSystemExtensionsCheckGenesis extends Null {}664665/** @name FrameSystemExtensionsCheckNonce */666export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}667668/** @name FrameSystemExtensionsCheckSpecVersion */669export interface FrameSystemExtensionsCheckSpecVersion extends Null {}670671/** @name FrameSystemExtensionsCheckWeight */672export interface FrameSystemExtensionsCheckWeight extends Null {}673674/** @name FrameSystemLastRuntimeUpgradeInfo */675export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {676  readonly specVersion: Compact<u32>;677  readonly specName: Text;678}679680/** @name FrameSystemLimitsBlockLength */681export interface FrameSystemLimitsBlockLength extends Struct {682  readonly max: FrameSupportWeightsPerDispatchClassU32;683}684685/** @name FrameSystemLimitsBlockWeights */686export interface FrameSystemLimitsBlockWeights extends Struct {687  readonly baseBlock: u64;688  readonly maxBlock: u64;689  readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;690}691692/** @name FrameSystemLimitsWeightsPerClass */693export interface FrameSystemLimitsWeightsPerClass extends Struct {694  readonly baseExtrinsic: u64;695  readonly maxExtrinsic: Option<u64>;696  readonly maxTotal: Option<u64>;697  readonly reserved: Option<u64>;698}699700/** @name FrameSystemPhase */701export interface FrameSystemPhase extends Enum {702  readonly isApplyExtrinsic: boolean;703  readonly asApplyExtrinsic: u32;704  readonly isFinalization: boolean;705  readonly isInitialization: boolean;706  readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';707}708709/** @name OpalRuntimeOriginCaller */710export interface OpalRuntimeOriginCaller extends Enum {711  readonly isVoid: boolean;712  readonly asVoid: SpCoreVoid;713  readonly isSystem: boolean;714  readonly asSystem: FrameSupportDispatchRawOrigin;715  readonly isPolkadotXcm: boolean;716  readonly asPolkadotXcm: PalletXcmOrigin;717  readonly isCumulusXcm: boolean;718  readonly asCumulusXcm: CumulusPalletXcmOrigin;719  readonly isEthereum: boolean;720  readonly asEthereum: PalletEthereumRawOrigin;721  readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';722}723724/** @name OpalRuntimeRuntime */725export interface OpalRuntimeRuntime extends Null {}726727/** @name OrmlVestingModuleCall */728export interface OrmlVestingModuleCall extends Enum {729  readonly isClaim: boolean;730  readonly isVestedTransfer: boolean;731  readonly asVestedTransfer: {732    readonly dest: MultiAddress;733    readonly schedule: OrmlVestingVestingSchedule;734  } & Struct;735  readonly isUpdateVestingSchedules: boolean;736  readonly asUpdateVestingSchedules: {737    readonly who: MultiAddress;738    readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;739  } & Struct;740  readonly isClaimFor: boolean;741  readonly asClaimFor: {742    readonly dest: MultiAddress;743  } & Struct;744  readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';745}746747/** @name OrmlVestingModuleError */748export interface OrmlVestingModuleError extends Enum {749  readonly isZeroVestingPeriod: boolean;750  readonly isZeroVestingPeriodCount: boolean;751  readonly isInsufficientBalanceToLock: boolean;752  readonly isTooManyVestingSchedules: boolean;753  readonly isAmountLow: boolean;754  readonly isMaxVestingSchedulesExceeded: boolean;755  readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';756}757758/** @name OrmlVestingModuleEvent */759export interface OrmlVestingModuleEvent extends Enum {760  readonly isVestingScheduleAdded: boolean;761  readonly asVestingScheduleAdded: {762    readonly from: AccountId32;763    readonly to: AccountId32;764    readonly vestingSchedule: OrmlVestingVestingSchedule;765  } & Struct;766  readonly isClaimed: boolean;767  readonly asClaimed: {768    readonly who: AccountId32;769    readonly amount: u128;770  } & Struct;771  readonly isVestingSchedulesUpdated: boolean;772  readonly asVestingSchedulesUpdated: {773    readonly who: AccountId32;774  } & Struct;775  readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';776}777778/** @name OrmlVestingVestingSchedule */779export interface OrmlVestingVestingSchedule extends Struct {780  readonly start: u32;781  readonly period: u32;782  readonly periodCount: u32;783  readonly perPeriod: Compact<u128>;784}785786/** @name PalletBalancesAccountData */787export interface PalletBalancesAccountData extends Struct {788  readonly free: u128;789  readonly reserved: u128;790  readonly miscFrozen: u128;791  readonly feeFrozen: u128;792}793794/** @name PalletBalancesBalanceLock */795export interface PalletBalancesBalanceLock extends Struct {796  readonly id: U8aFixed;797  readonly amount: u128;798  readonly reasons: PalletBalancesReasons;799}800801/** @name PalletBalancesCall */802export interface PalletBalancesCall extends Enum {803  readonly isTransfer: boolean;804  readonly asTransfer: {805    readonly dest: MultiAddress;806    readonly value: Compact<u128>;807  } & Struct;808  readonly isSetBalance: boolean;809  readonly asSetBalance: {810    readonly who: MultiAddress;811    readonly newFree: Compact<u128>;812    readonly newReserved: Compact<u128>;813  } & Struct;814  readonly isForceTransfer: boolean;815  readonly asForceTransfer: {816    readonly source: MultiAddress;817    readonly dest: MultiAddress;818    readonly value: Compact<u128>;819  } & Struct;820  readonly isTransferKeepAlive: boolean;821  readonly asTransferKeepAlive: {822    readonly dest: MultiAddress;823    readonly value: Compact<u128>;824  } & Struct;825  readonly isTransferAll: boolean;826  readonly asTransferAll: {827    readonly dest: MultiAddress;828    readonly keepAlive: bool;829  } & Struct;830  readonly isForceUnreserve: boolean;831  readonly asForceUnreserve: {832    readonly who: MultiAddress;833    readonly amount: u128;834  } & Struct;835  readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';836}837838/** @name PalletBalancesError */839export interface PalletBalancesError extends Enum {840  readonly isVestingBalance: boolean;841  readonly isLiquidityRestrictions: boolean;842  readonly isInsufficientBalance: boolean;843  readonly isExistentialDeposit: boolean;844  readonly isKeepAlive: boolean;845  readonly isExistingVestingSchedule: boolean;846  readonly isDeadAccount: boolean;847  readonly isTooManyReserves: boolean;848  readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';849}850851/** @name PalletBalancesEvent */852export interface PalletBalancesEvent extends Enum {853  readonly isEndowed: boolean;854  readonly asEndowed: {855    readonly account: AccountId32;856    readonly freeBalance: u128;857  } & Struct;858  readonly isDustLost: boolean;859  readonly asDustLost: {860    readonly account: AccountId32;861    readonly amount: u128;862  } & Struct;863  readonly isTransfer: boolean;864  readonly asTransfer: {865    readonly from: AccountId32;866    readonly to: AccountId32;867    readonly amount: u128;868  } & Struct;869  readonly isBalanceSet: boolean;870  readonly asBalanceSet: {871    readonly who: AccountId32;872    readonly free: u128;873    readonly reserved: u128;874  } & Struct;875  readonly isReserved: boolean;876  readonly asReserved: {877    readonly who: AccountId32;878    readonly amount: u128;879  } & Struct;880  readonly isUnreserved: boolean;881  readonly asUnreserved: {882    readonly who: AccountId32;883    readonly amount: u128;884  } & Struct;885  readonly isReserveRepatriated: boolean;886  readonly asReserveRepatriated: {887    readonly from: AccountId32;888    readonly to: AccountId32;889    readonly amount: u128;890    readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;891  } & Struct;892  readonly isDeposit: boolean;893  readonly asDeposit: {894    readonly who: AccountId32;895    readonly amount: u128;896  } & Struct;897  readonly isWithdraw: boolean;898  readonly asWithdraw: {899    readonly who: AccountId32;900    readonly amount: u128;901  } & Struct;902  readonly isSlashed: boolean;903  readonly asSlashed: {904    readonly who: AccountId32;905    readonly amount: u128;906  } & Struct;907  readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';908}909910/** @name PalletBalancesReasons */911export interface PalletBalancesReasons extends Enum {912  readonly isFee: boolean;913  readonly isMisc: boolean;914  readonly isAll: boolean;915  readonly type: 'Fee' | 'Misc' | 'All';916}917918/** @name PalletBalancesReleases */919export interface PalletBalancesReleases extends Enum {920  readonly isV100: boolean;921  readonly isV200: boolean;922  readonly type: 'V100' | 'V200';923}924925/** @name PalletBalancesReserveData */926export interface PalletBalancesReserveData extends Struct {927  readonly id: U8aFixed;928  readonly amount: u128;929}930931/** @name PalletCommonError */932export interface PalletCommonError extends Enum {933  readonly isCollectionNotFound: boolean;934  readonly isMustBeTokenOwner: boolean;935  readonly isNoPermission: boolean;936  readonly isCantDestroyNotEmptyCollection: boolean;937  readonly isPublicMintingNotAllowed: boolean;938  readonly isAddressNotInAllowlist: boolean;939  readonly isCollectionNameLimitExceeded: boolean;940  readonly isCollectionDescriptionLimitExceeded: boolean;941  readonly isCollectionTokenPrefixLimitExceeded: boolean;942  readonly isTotalCollectionsLimitExceeded: boolean;943  readonly isCollectionAdminCountExceeded: boolean;944  readonly isCollectionLimitBoundsExceeded: boolean;945  readonly isOwnerPermissionsCantBeReverted: boolean;946  readonly isTransferNotAllowed: boolean;947  readonly isAccountTokenLimitExceeded: boolean;948  readonly isCollectionTokenLimitExceeded: boolean;949  readonly isMetadataFlagFrozen: boolean;950  readonly isTokenNotFound: boolean;951  readonly isTokenValueTooLow: boolean;952  readonly isApprovedValueTooLow: boolean;953  readonly isCantApproveMoreThanOwned: boolean;954  readonly isAddressIsZero: boolean;955  readonly isUnsupportedOperation: boolean;956  readonly isNotSufficientFounds: boolean;957  readonly isUserIsNotAllowedToNest: boolean;958  readonly isSourceCollectionIsNotAllowedToNest: boolean;959  readonly isCollectionFieldSizeExceeded: boolean;960  readonly isNoSpaceForProperty: boolean;961  readonly isPropertyLimitReached: boolean;962  readonly isPropertyKeyIsTooLong: boolean;963  readonly isInvalidCharacterInPropertyKey: boolean;964  readonly isEmptyPropertyKey: boolean;965  readonly isCollectionIsExternal: boolean;966  readonly isCollectionIsInternal: boolean;967  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';968}969970/** @name PalletCommonEvent */971export interface PalletCommonEvent extends Enum {972  readonly isCollectionCreated: boolean;973  readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;974  readonly isCollectionDestroyed: boolean;975  readonly asCollectionDestroyed: u32;976  readonly isItemCreated: boolean;977  readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;978  readonly isItemDestroyed: boolean;979  readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;980  readonly isTransfer: boolean;981  readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;982  readonly isApproved: boolean;983  readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;984  readonly isCollectionPropertySet: boolean;985  readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;986  readonly isCollectionPropertyDeleted: boolean;987  readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;988  readonly isTokenPropertySet: boolean;989  readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;990  readonly isTokenPropertyDeleted: boolean;991  readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;992  readonly isPropertyPermissionSet: boolean;993  readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;994  readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';995}996997/** @name PalletEthereumCall */998export interface PalletEthereumCall extends Enum {999  readonly isTransact: boolean;1000  readonly asTransact: {1001    readonly transaction: EthereumTransactionTransactionV2;1002  } & Struct;1003  readonly type: 'Transact';1004}10051006/** @name PalletEthereumError */1007export interface PalletEthereumError extends Enum {1008  readonly isInvalidSignature: boolean;1009  readonly isPreLogExists: boolean;1010  readonly type: 'InvalidSignature' | 'PreLogExists';1011}10121013/** @name PalletEthereumEvent */1014export interface PalletEthereumEvent extends Enum {1015  readonly isExecuted: boolean;1016  readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;1017  readonly type: 'Executed';1018}10191020/** @name PalletEthereumFakeTransactionFinalizer */1021export interface PalletEthereumFakeTransactionFinalizer extends Null {}10221023/** @name PalletEthereumRawOrigin */1024export interface PalletEthereumRawOrigin extends Enum {1025  readonly isEthereumTransaction: boolean;1026  readonly asEthereumTransaction: H160;1027  readonly type: 'EthereumTransaction';1028}10291030/** @name PalletEvmAccountBasicCrossAccountIdRepr */1031export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1032  readonly isSubstrate: boolean;1033  readonly asSubstrate: AccountId32;1034  readonly isEthereum: boolean;1035  readonly asEthereum: H160;1036  readonly type: 'Substrate' | 'Ethereum';1037}10381039/** @name PalletEvmCall */1040export interface PalletEvmCall extends Enum {1041  readonly isWithdraw: boolean;1042  readonly asWithdraw: {1043    readonly address: H160;1044    readonly value: u128;1045  } & Struct;1046  readonly isCall: boolean;1047  readonly asCall: {1048    readonly source: H160;1049    readonly target: H160;1050    readonly input: Bytes;1051    readonly value: U256;1052    readonly gasLimit: u64;1053    readonly maxFeePerGas: U256;1054    readonly maxPriorityFeePerGas: Option<U256>;1055    readonly nonce: Option<U256>;1056    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1057  } & Struct;1058  readonly isCreate: boolean;1059  readonly asCreate: {1060    readonly source: H160;1061    readonly init: Bytes;1062    readonly value: U256;1063    readonly gasLimit: u64;1064    readonly maxFeePerGas: U256;1065    readonly maxPriorityFeePerGas: Option<U256>;1066    readonly nonce: Option<U256>;1067    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1068  } & Struct;1069  readonly isCreate2: boolean;1070  readonly asCreate2: {1071    readonly source: H160;1072    readonly init: Bytes;1073    readonly salt: H256;1074    readonly value: U256;1075    readonly gasLimit: u64;1076    readonly maxFeePerGas: U256;1077    readonly maxPriorityFeePerGas: Option<U256>;1078    readonly nonce: Option<U256>;1079    readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1080  } & Struct;1081  readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1082}10831084/** @name PalletEvmCoderSubstrateError */1085export interface PalletEvmCoderSubstrateError extends Enum {1086  readonly isOutOfGas: boolean;1087  readonly isOutOfFund: boolean;1088  readonly type: 'OutOfGas' | 'OutOfFund';1089}10901091/** @name PalletEvmContractHelpersError */1092export interface PalletEvmContractHelpersError extends Enum {1093  readonly isNoPermission: boolean;1094  readonly type: 'NoPermission';1095}10961097/** @name PalletEvmContractHelpersSponsoringModeT */1098export interface PalletEvmContractHelpersSponsoringModeT extends Enum {1099  readonly isDisabled: boolean;1100  readonly isAllowlisted: boolean;1101  readonly isGenerous: boolean;1102  readonly type: 'Disabled' | 'Allowlisted' | 'Generous';1103}11041105/** @name PalletEvmError */1106export interface PalletEvmError extends Enum {1107  readonly isBalanceLow: boolean;1108  readonly isFeeOverflow: boolean;1109  readonly isPaymentOverflow: boolean;1110  readonly isWithdrawFailed: boolean;1111  readonly isGasPriceTooLow: boolean;1112  readonly isInvalidNonce: boolean;1113  readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';1114}11151116/** @name PalletEvmEvent */1117export interface PalletEvmEvent extends Enum {1118  readonly isLog: boolean;1119  readonly asLog: EthereumLog;1120  readonly isCreated: boolean;1121  readonly asCreated: H160;1122  readonly isCreatedFailed: boolean;1123  readonly asCreatedFailed: H160;1124  readonly isExecuted: boolean;1125  readonly asExecuted: H160;1126  readonly isExecutedFailed: boolean;1127  readonly asExecutedFailed: H160;1128  readonly isBalanceDeposit: boolean;1129  readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;1130  readonly isBalanceWithdraw: boolean;1131  readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;1132  readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';1133}11341135/** @name PalletEvmMigrationCall */1136export interface PalletEvmMigrationCall extends Enum {1137  readonly isBegin: boolean;1138  readonly asBegin: {1139    readonly address: H160;1140  } & Struct;1141  readonly isSetData: boolean;1142  readonly asSetData: {1143    readonly address: H160;1144    readonly data: Vec<ITuple<[H256, H256]>>;1145  } & Struct;1146  readonly isFinish: boolean;1147  readonly asFinish: {1148    readonly address: H160;1149    readonly code: Bytes;1150  } & Struct;1151  readonly type: 'Begin' | 'SetData' | 'Finish';1152}11531154/** @name PalletEvmMigrationError */1155export interface PalletEvmMigrationError extends Enum {1156  readonly isAccountNotEmpty: boolean;1157  readonly isAccountIsNotMigrating: boolean;1158  readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';1159}11601161/** @name PalletFungibleError */1162export interface PalletFungibleError extends Enum {1163  readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;1164  readonly isFungibleItemsHaveNoId: boolean;1165  readonly isFungibleItemsDontHaveData: boolean;1166  readonly isFungibleDisallowsNesting: boolean;1167  readonly isSettingPropertiesNotAllowed: boolean;1168  readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1169}11701171/** @name PalletInflationCall */1172export interface PalletInflationCall extends Enum {1173  readonly isStartInflation: boolean;1174  readonly asStartInflation: {1175    readonly inflationStartRelayBlock: u32;1176  } & Struct;1177  readonly type: 'StartInflation';1178}11791180/** @name PalletNonfungibleError */1181export interface PalletNonfungibleError extends Enum {1182  readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;1183  readonly isNonfungibleItemsHaveNoAmount: boolean;1184  readonly isCantBurnNftWithChildren: boolean;1185  readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';1186}11871188/** @name PalletNonfungibleItemData */1189export interface PalletNonfungibleItemData extends Struct {1190  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1191}11921193/** @name PalletRefungibleError */1194export interface PalletRefungibleError extends Enum {1195  readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;1196  readonly isWrongRefungiblePieces: boolean;1197  readonly isRepartitionWhileNotOwningAllPieces: boolean;1198  readonly isRefungibleDisallowsNesting: boolean;1199  readonly isSettingPropertiesNotAllowed: boolean;1200  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1201}12021203/** @name PalletRefungibleItemData */1204export interface PalletRefungibleItemData extends Struct {1205  readonly constData: Bytes;1206}12071208/** @name PalletRmrkCoreCall */1209export interface PalletRmrkCoreCall extends Enum {1210  readonly isCreateCollection: boolean;1211  readonly asCreateCollection: {1212    readonly metadata: Bytes;1213    readonly max: Option<u32>;1214    readonly symbol: Bytes;1215  } & Struct;1216  readonly isDestroyCollection: boolean;1217  readonly asDestroyCollection: {1218    readonly collectionId: u32;1219  } & Struct;1220  readonly isChangeCollectionIssuer: boolean;1221  readonly asChangeCollectionIssuer: {1222    readonly collectionId: u32;1223    readonly newIssuer: MultiAddress;1224  } & Struct;1225  readonly isLockCollection: boolean;1226  readonly asLockCollection: {1227    readonly collectionId: u32;1228  } & Struct;1229  readonly isMintNft: boolean;1230  readonly asMintNft: {1231    readonly owner: Option<AccountId32>;1232    readonly collectionId: u32;1233    readonly recipient: Option<AccountId32>;1234    readonly royaltyAmount: Option<Permill>;1235    readonly metadata: Bytes;1236    readonly transferable: bool;1237    readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1238  } & Struct;1239  readonly isBurnNft: boolean;1240  readonly asBurnNft: {1241    readonly collectionId: u32;1242    readonly nftId: u32;1243    readonly maxBurns: u32;1244  } & Struct;1245  readonly isSend: boolean;1246  readonly asSend: {1247    readonly rmrkCollectionId: u32;1248    readonly rmrkNftId: u32;1249    readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1250  } & Struct;1251  readonly isAcceptNft: boolean;1252  readonly asAcceptNft: {1253    readonly rmrkCollectionId: u32;1254    readonly rmrkNftId: u32;1255    readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1256  } & Struct;1257  readonly isRejectNft: boolean;1258  readonly asRejectNft: {1259    readonly rmrkCollectionId: u32;1260    readonly rmrkNftId: u32;1261  } & Struct;1262  readonly isAcceptResource: boolean;1263  readonly asAcceptResource: {1264    readonly rmrkCollectionId: u32;1265    readonly rmrkNftId: u32;1266    readonly resourceId: u32;1267  } & Struct;1268  readonly isAcceptResourceRemoval: boolean;1269  readonly asAcceptResourceRemoval: {1270    readonly rmrkCollectionId: u32;1271    readonly rmrkNftId: u32;1272    readonly resourceId: u32;1273  } & Struct;1274  readonly isSetProperty: boolean;1275  readonly asSetProperty: {1276    readonly rmrkCollectionId: Compact<u32>;1277    readonly maybeNftId: Option<u32>;1278    readonly key: Bytes;1279    readonly value: Bytes;1280  } & Struct;1281  readonly isSetPriority: boolean;1282  readonly asSetPriority: {1283    readonly rmrkCollectionId: u32;1284    readonly rmrkNftId: u32;1285    readonly priorities: Vec<u32>;1286  } & Struct;1287  readonly isAddBasicResource: boolean;1288  readonly asAddBasicResource: {1289    readonly rmrkCollectionId: u32;1290    readonly nftId: u32;1291    readonly resource: RmrkTraitsResourceBasicResource;1292  } & Struct;1293  readonly isAddComposableResource: boolean;1294  readonly asAddComposableResource: {1295    readonly rmrkCollectionId: u32;1296    readonly nftId: u32;1297    readonly resource: RmrkTraitsResourceComposableResource;1298  } & Struct;1299  readonly isAddSlotResource: boolean;1300  readonly asAddSlotResource: {1301    readonly rmrkCollectionId: u32;1302    readonly nftId: u32;1303    readonly resource: RmrkTraitsResourceSlotResource;1304  } & Struct;1305  readonly isRemoveResource: boolean;1306  readonly asRemoveResource: {1307    readonly rmrkCollectionId: u32;1308    readonly nftId: u32;1309    readonly resourceId: u32;1310  } & Struct;1311  readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1312}13131314/** @name PalletRmrkCoreError */1315export interface PalletRmrkCoreError extends Enum {1316  readonly isCorruptedCollectionType: boolean;1317  readonly isNftTypeEncodeError: boolean;1318  readonly isRmrkPropertyKeyIsTooLong: boolean;1319  readonly isRmrkPropertyValueIsTooLong: boolean;1320  readonly isRmrkPropertyIsNotFound: boolean;1321  readonly isUnableToDecodeRmrkData: boolean;1322  readonly isCollectionNotEmpty: boolean;1323  readonly isNoAvailableCollectionId: boolean;1324  readonly isNoAvailableNftId: boolean;1325  readonly isCollectionUnknown: boolean;1326  readonly isNoPermission: boolean;1327  readonly isNonTransferable: boolean;1328  readonly isCollectionFullOrLocked: boolean;1329  readonly isResourceDoesntExist: boolean;1330  readonly isCannotSendToDescendentOrSelf: boolean;1331  readonly isCannotAcceptNonOwnedNft: boolean;1332  readonly isCannotRejectNonOwnedNft: boolean;1333  readonly isCannotRejectNonPendingNft: boolean;1334  readonly isResourceNotPending: boolean;1335  readonly isNoAvailableResourceId: boolean;1336  readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';1337}13381339/** @name PalletRmrkCoreEvent */1340export interface PalletRmrkCoreEvent extends Enum {1341  readonly isCollectionCreated: boolean;1342  readonly asCollectionCreated: {1343    readonly issuer: AccountId32;1344    readonly collectionId: u32;1345  } & Struct;1346  readonly isCollectionDestroyed: boolean;1347  readonly asCollectionDestroyed: {1348    readonly issuer: AccountId32;1349    readonly collectionId: u32;1350  } & Struct;1351  readonly isIssuerChanged: boolean;1352  readonly asIssuerChanged: {1353    readonly oldIssuer: AccountId32;1354    readonly newIssuer: AccountId32;1355    readonly collectionId: u32;1356  } & Struct;1357  readonly isCollectionLocked: boolean;1358  readonly asCollectionLocked: {1359    readonly issuer: AccountId32;1360    readonly collectionId: u32;1361  } & Struct;1362  readonly isNftMinted: boolean;1363  readonly asNftMinted: {1364    readonly owner: AccountId32;1365    readonly collectionId: u32;1366    readonly nftId: u32;1367  } & Struct;1368  readonly isNftBurned: boolean;1369  readonly asNftBurned: {1370    readonly owner: AccountId32;1371    readonly nftId: u32;1372  } & Struct;1373  readonly isNftSent: boolean;1374  readonly asNftSent: {1375    readonly sender: AccountId32;1376    readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1377    readonly collectionId: u32;1378    readonly nftId: u32;1379    readonly approvalRequired: bool;1380  } & Struct;1381  readonly isNftAccepted: boolean;1382  readonly asNftAccepted: {1383    readonly sender: AccountId32;1384    readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1385    readonly collectionId: u32;1386    readonly nftId: u32;1387  } & Struct;1388  readonly isNftRejected: boolean;1389  readonly asNftRejected: {1390    readonly sender: AccountId32;1391    readonly collectionId: u32;1392    readonly nftId: u32;1393  } & Struct;1394  readonly isPropertySet: boolean;1395  readonly asPropertySet: {1396    readonly collectionId: u32;1397    readonly maybeNftId: Option<u32>;1398    readonly key: Bytes;1399    readonly value: Bytes;1400  } & Struct;1401  readonly isResourceAdded: boolean;1402  readonly asResourceAdded: {1403    readonly nftId: u32;1404    readonly resourceId: u32;1405  } & Struct;1406  readonly isResourceRemoval: boolean;1407  readonly asResourceRemoval: {1408    readonly nftId: u32;1409    readonly resourceId: u32;1410  } & Struct;1411  readonly isResourceAccepted: boolean;1412  readonly asResourceAccepted: {1413    readonly nftId: u32;1414    readonly resourceId: u32;1415  } & Struct;1416  readonly isResourceRemovalAccepted: boolean;1417  readonly asResourceRemovalAccepted: {1418    readonly nftId: u32;1419    readonly resourceId: u32;1420  } & Struct;1421  readonly isPrioritySet: boolean;1422  readonly asPrioritySet: {1423    readonly collectionId: u32;1424    readonly nftId: u32;1425  } & Struct;1426  readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';1427}14281429/** @name PalletRmrkEquipCall */1430export interface PalletRmrkEquipCall extends Enum {1431  readonly isCreateBase: boolean;1432  readonly asCreateBase: {1433    readonly baseType: Bytes;1434    readonly symbol: Bytes;1435    readonly parts: Vec<RmrkTraitsPartPartType>;1436  } & Struct;1437  readonly isThemeAdd: boolean;1438  readonly asThemeAdd: {1439    readonly baseId: u32;1440    readonly theme: RmrkTraitsTheme;1441  } & Struct;1442  readonly isEquippable: boolean;1443  readonly asEquippable: {1444    readonly baseId: u32;1445    readonly slotId: u32;1446    readonly equippables: RmrkTraitsPartEquippableList;1447  } & Struct;1448  readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1449}14501451/** @name PalletRmrkEquipError */1452export interface PalletRmrkEquipError extends Enum {1453  readonly isPermissionError: boolean;1454  readonly isNoAvailableBaseId: boolean;1455  readonly isNoAvailablePartId: boolean;1456  readonly isBaseDoesntExist: boolean;1457  readonly isNeedsDefaultThemeFirst: boolean;1458  readonly isPartDoesntExist: boolean;1459  readonly isNoEquippableOnFixedPart: boolean;1460  readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';1461}14621463/** @name PalletRmrkEquipEvent */1464export interface PalletRmrkEquipEvent extends Enum {1465  readonly isBaseCreated: boolean;1466  readonly asBaseCreated: {1467    readonly issuer: AccountId32;1468    readonly baseId: u32;1469  } & Struct;1470  readonly isEquippablesUpdated: boolean;1471  readonly asEquippablesUpdated: {1472    readonly baseId: u32;1473    readonly slotId: u32;1474  } & Struct;1475  readonly type: 'BaseCreated' | 'EquippablesUpdated';1476}14771478/** @name PalletStructureCall */1479export interface PalletStructureCall extends Null {}14801481/** @name PalletStructureError */1482export interface PalletStructureError extends Enum {1483  readonly isOuroborosDetected: boolean;1484  readonly isDepthLimit: boolean;1485  readonly isBreadthLimit: boolean;1486  readonly isTokenNotFound: boolean;1487  readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';1488}14891490/** @name PalletStructureEvent */1491export interface PalletStructureEvent extends Enum {1492  readonly isExecuted: boolean;1493  readonly asExecuted: Result<Null, SpRuntimeDispatchError>;1494  readonly type: 'Executed';1495}14961497/** @name PalletSudoCall */1498export interface PalletSudoCall extends Enum {1499  readonly isSudo: boolean;1500  readonly asSudo: {1501    readonly call: Call;1502  } & Struct;1503  readonly isSudoUncheckedWeight: boolean;1504  readonly asSudoUncheckedWeight: {1505    readonly call: Call;1506    readonly weight: u64;1507  } & Struct;1508  readonly isSetKey: boolean;1509  readonly asSetKey: {1510    readonly new_: MultiAddress;1511  } & Struct;1512  readonly isSudoAs: boolean;1513  readonly asSudoAs: {1514    readonly who: MultiAddress;1515    readonly call: Call;1516  } & Struct;1517  readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';1518}15191520/** @name PalletSudoError */1521export interface PalletSudoError extends Enum {1522  readonly isRequireSudo: boolean;1523  readonly type: 'RequireSudo';1524}15251526/** @name PalletSudoEvent */1527export interface PalletSudoEvent extends Enum {1528  readonly isSudid: boolean;1529  readonly asSudid: {1530    readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1531  } & Struct;1532  readonly isKeyChanged: boolean;1533  readonly asKeyChanged: {1534    readonly oldSudoer: Option<AccountId32>;1535  } & Struct;1536  readonly isSudoAsDone: boolean;1537  readonly asSudoAsDone: {1538    readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1539  } & Struct;1540  readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';1541}15421543/** @name PalletTemplateTransactionPaymentCall */1544export interface PalletTemplateTransactionPaymentCall extends Null {}15451546/** @name PalletTemplateTransactionPaymentChargeTransactionPayment */1547export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}15481549/** @name PalletTimestampCall */1550export interface PalletTimestampCall extends Enum {1551  readonly isSet: boolean;1552  readonly asSet: {1553    readonly now: Compact<u64>;1554  } & Struct;1555  readonly type: 'Set';1556}15571558/** @name PalletTransactionPaymentReleases */1559export interface PalletTransactionPaymentReleases extends Enum {1560  readonly isV1Ancient: boolean;1561  readonly isV2: boolean;1562  readonly type: 'V1Ancient' | 'V2';1563}15641565/** @name PalletTreasuryCall */1566export interface PalletTreasuryCall extends Enum {1567  readonly isProposeSpend: boolean;1568  readonly asProposeSpend: {1569    readonly value: Compact<u128>;1570    readonly beneficiary: MultiAddress;1571  } & Struct;1572  readonly isRejectProposal: boolean;1573  readonly asRejectProposal: {1574    readonly proposalId: Compact<u32>;1575  } & Struct;1576  readonly isApproveProposal: boolean;1577  readonly asApproveProposal: {1578    readonly proposalId: Compact<u32>;1579  } & Struct;1580  readonly isRemoveApproval: boolean;1581  readonly asRemoveApproval: {1582    readonly proposalId: Compact<u32>;1583  } & Struct;1584  readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';1585}15861587/** @name PalletTreasuryError */1588export interface PalletTreasuryError extends Enum {1589  readonly isInsufficientProposersBalance: boolean;1590  readonly isInvalidIndex: boolean;1591  readonly isTooManyApprovals: boolean;1592  readonly isProposalNotApproved: boolean;1593  readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';1594}15951596/** @name PalletTreasuryEvent */1597export interface PalletTreasuryEvent extends Enum {1598  readonly isProposed: boolean;1599  readonly asProposed: {1600    readonly proposalIndex: u32;1601  } & Struct;1602  readonly isSpending: boolean;1603  readonly asSpending: {1604    readonly budgetRemaining: u128;1605  } & Struct;1606  readonly isAwarded: boolean;1607  readonly asAwarded: {1608    readonly proposalIndex: u32;1609    readonly award: u128;1610    readonly account: AccountId32;1611  } & Struct;1612  readonly isRejected: boolean;1613  readonly asRejected: {1614    readonly proposalIndex: u32;1615    readonly slashed: u128;1616  } & Struct;1617  readonly isBurnt: boolean;1618  readonly asBurnt: {1619    readonly burntFunds: u128;1620  } & Struct;1621  readonly isRollover: boolean;1622  readonly asRollover: {1623    readonly rolloverBalance: u128;1624  } & Struct;1625  readonly isDeposit: boolean;1626  readonly asDeposit: {1627    readonly value: u128;1628  } & Struct;1629  readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';1630}16311632/** @name PalletTreasuryProposal */1633export interface PalletTreasuryProposal extends Struct {1634  readonly proposer: AccountId32;1635  readonly value: u128;1636  readonly beneficiary: AccountId32;1637  readonly bond: u128;1638}16391640/** @name PalletUniqueCall */1641export interface PalletUniqueCall extends Enum {1642  readonly isCreateCollection: boolean;1643  readonly asCreateCollection: {1644    readonly collectionName: Vec<u16>;1645    readonly collectionDescription: Vec<u16>;1646    readonly tokenPrefix: Bytes;1647    readonly mode: UpDataStructsCollectionMode;1648  } & Struct;1649  readonly isCreateCollectionEx: boolean;1650  readonly asCreateCollectionEx: {1651    readonly data: UpDataStructsCreateCollectionData;1652  } & Struct;1653  readonly isDestroyCollection: boolean;1654  readonly asDestroyCollection: {1655    readonly collectionId: u32;1656  } & Struct;1657  readonly isAddToAllowList: boolean;1658  readonly asAddToAllowList: {1659    readonly collectionId: u32;1660    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1661  } & Struct;1662  readonly isRemoveFromAllowList: boolean;1663  readonly asRemoveFromAllowList: {1664    readonly collectionId: u32;1665    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1666  } & Struct;1667  readonly isChangeCollectionOwner: boolean;1668  readonly asChangeCollectionOwner: {1669    readonly collectionId: u32;1670    readonly newOwner: AccountId32;1671  } & Struct;1672  readonly isAddCollectionAdmin: boolean;1673  readonly asAddCollectionAdmin: {1674    readonly collectionId: u32;1675    readonly newAdmin: PalletEvmAccountBasicCrossAccountIdRepr;1676  } & Struct;1677  readonly isRemoveCollectionAdmin: boolean;1678  readonly asRemoveCollectionAdmin: {1679    readonly collectionId: u32;1680    readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1681  } & Struct;1682  readonly isSetCollectionSponsor: boolean;1683  readonly asSetCollectionSponsor: {1684    readonly collectionId: u32;1685    readonly newSponsor: AccountId32;1686  } & Struct;1687  readonly isConfirmSponsorship: boolean;1688  readonly asConfirmSponsorship: {1689    readonly collectionId: u32;1690  } & Struct;1691  readonly isRemoveCollectionSponsor: boolean;1692  readonly asRemoveCollectionSponsor: {1693    readonly collectionId: u32;1694  } & Struct;1695  readonly isCreateItem: boolean;1696  readonly asCreateItem: {1697    readonly collectionId: u32;1698    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1699    readonly data: UpDataStructsCreateItemData;1700  } & Struct;1701  readonly isCreateMultipleItems: boolean;1702  readonly asCreateMultipleItems: {1703    readonly collectionId: u32;1704    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1705    readonly itemsData: Vec<UpDataStructsCreateItemData>;1706  } & Struct;1707  readonly isSetCollectionProperties: boolean;1708  readonly asSetCollectionProperties: {1709    readonly collectionId: u32;1710    readonly properties: Vec<UpDataStructsProperty>;1711  } & Struct;1712  readonly isDeleteCollectionProperties: boolean;1713  readonly asDeleteCollectionProperties: {1714    readonly collectionId: u32;1715    readonly propertyKeys: Vec<Bytes>;1716  } & Struct;1717  readonly isSetTokenProperties: boolean;1718  readonly asSetTokenProperties: {1719    readonly collectionId: u32;1720    readonly tokenId: u32;1721    readonly properties: Vec<UpDataStructsProperty>;1722  } & Struct;1723  readonly isDeleteTokenProperties: boolean;1724  readonly asDeleteTokenProperties: {1725    readonly collectionId: u32;1726    readonly tokenId: u32;1727    readonly propertyKeys: Vec<Bytes>;1728  } & Struct;1729  readonly isSetTokenPropertyPermissions: boolean;1730  readonly asSetTokenPropertyPermissions: {1731    readonly collectionId: u32;1732    readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1733  } & Struct;1734  readonly isCreateMultipleItemsEx: boolean;1735  readonly asCreateMultipleItemsEx: {1736    readonly collectionId: u32;1737    readonly data: UpDataStructsCreateItemExData;1738  } & Struct;1739  readonly isSetTransfersEnabledFlag: boolean;1740  readonly asSetTransfersEnabledFlag: {1741    readonly collectionId: u32;1742    readonly value: bool;1743  } & Struct;1744  readonly isBurnItem: boolean;1745  readonly asBurnItem: {1746    readonly collectionId: u32;1747    readonly itemId: u32;1748    readonly value: u128;1749  } & Struct;1750  readonly isBurnFrom: boolean;1751  readonly asBurnFrom: {1752    readonly collectionId: u32;1753    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1754    readonly itemId: u32;1755    readonly value: u128;1756  } & Struct;1757  readonly isTransfer: boolean;1758  readonly asTransfer: {1759    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1760    readonly collectionId: u32;1761    readonly itemId: u32;1762    readonly value: u128;1763  } & Struct;1764  readonly isApprove: boolean;1765  readonly asApprove: {1766    readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1767    readonly collectionId: u32;1768    readonly itemId: u32;1769    readonly amount: u128;1770  } & Struct;1771  readonly isTransferFrom: boolean;1772  readonly asTransferFrom: {1773    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1774    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1775    readonly collectionId: u32;1776    readonly itemId: u32;1777    readonly value: u128;1778  } & Struct;1779  readonly isSetCollectionLimits: boolean;1780  readonly asSetCollectionLimits: {1781    readonly collectionId: u32;1782    readonly newLimit: UpDataStructsCollectionLimits;1783  } & Struct;1784  readonly isSetCollectionPermissions: boolean;1785  readonly asSetCollectionPermissions: {1786    readonly collectionId: u32;1787    readonly newPermission: UpDataStructsCollectionPermissions;1788  } & Struct;1789  readonly isRepartition: boolean;1790  readonly asRepartition: {1791    readonly collectionId: u32;1792    readonly tokenId: u32;1793    readonly amount: u128;1794  } & Struct;1795  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';1796}17971798/** @name PalletUniqueError */1799export interface PalletUniqueError extends Enum {1800  readonly isCollectionDecimalPointLimitExceeded: boolean;1801  readonly isConfirmUnsetSponsorFail: boolean;1802  readonly isEmptyArgument: boolean;1803  readonly isRepartitionCalledOnNonRefungibleCollection: boolean;1804  readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';1805}18061807/** @name PalletUniqueRawEvent */1808export interface PalletUniqueRawEvent extends Enum {1809  readonly isCollectionSponsorRemoved: boolean;1810  readonly asCollectionSponsorRemoved: u32;1811  readonly isCollectionAdminAdded: boolean;1812  readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1813  readonly isCollectionOwnedChanged: boolean;1814  readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;1815  readonly isCollectionSponsorSet: boolean;1816  readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;1817  readonly isSponsorshipConfirmed: boolean;1818  readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;1819  readonly isCollectionAdminRemoved: boolean;1820  readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1821  readonly isAllowListAddressRemoved: boolean;1822  readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1823  readonly isAllowListAddressAdded: boolean;1824  readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1825  readonly isCollectionLimitSet: boolean;1826  readonly asCollectionLimitSet: u32;1827  readonly isCollectionPermissionSet: boolean;1828  readonly asCollectionPermissionSet: u32;1829  readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';1830}18311832/** @name PalletUniqueSchedulerCall */1833export interface PalletUniqueSchedulerCall extends Enum {1834  readonly isScheduleNamed: boolean;1835  readonly asScheduleNamed: {1836    readonly id: U8aFixed;1837    readonly when: u32;1838    readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1839    readonly priority: u8;1840    readonly call: FrameSupportScheduleMaybeHashed;1841  } & Struct;1842  readonly isCancelNamed: boolean;1843  readonly asCancelNamed: {1844    readonly id: U8aFixed;1845  } & Struct;1846  readonly isScheduleNamedAfter: boolean;1847  readonly asScheduleNamedAfter: {1848    readonly id: U8aFixed;1849    readonly after: u32;1850    readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1851    readonly priority: u8;1852    readonly call: FrameSupportScheduleMaybeHashed;1853  } & Struct;1854  readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1855}18561857/** @name PalletUniqueSchedulerError */1858export interface PalletUniqueSchedulerError extends Enum {1859  readonly isFailedToSchedule: boolean;1860  readonly isNotFound: boolean;1861  readonly isTargetBlockNumberInPast: boolean;1862  readonly isRescheduleNoChange: boolean;1863  readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';1864}18651866/** @name PalletUniqueSchedulerEvent */1867export interface PalletUniqueSchedulerEvent extends Enum {1868  readonly isScheduled: boolean;1869  readonly asScheduled: {1870    readonly when: u32;1871    readonly index: u32;1872  } & Struct;1873  readonly isCanceled: boolean;1874  readonly asCanceled: {1875    readonly when: u32;1876    readonly index: u32;1877  } & Struct;1878  readonly isDispatched: boolean;1879  readonly asDispatched: {1880    readonly task: ITuple<[u32, u32]>;1881    readonly id: Option<U8aFixed>;1882    readonly result: Result<Null, SpRuntimeDispatchError>;1883  } & Struct;1884  readonly isCallLookupFailed: boolean;1885  readonly asCallLookupFailed: {1886    readonly task: ITuple<[u32, u32]>;1887    readonly id: Option<U8aFixed>;1888    readonly error: FrameSupportScheduleLookupError;1889  } & Struct;1890  readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';1891}18921893/** @name PalletUniqueSchedulerScheduledV3 */1894export interface PalletUniqueSchedulerScheduledV3 extends Struct {1895  readonly maybeId: Option<U8aFixed>;1896  readonly priority: u8;1897  readonly call: FrameSupportScheduleMaybeHashed;1898  readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1899  readonly origin: OpalRuntimeOriginCaller;1900}19011902/** @name PalletXcmCall */1903export interface PalletXcmCall extends Enum {1904  readonly isSend: boolean;1905  readonly asSend: {1906    readonly dest: XcmVersionedMultiLocation;1907    readonly message: XcmVersionedXcm;1908  } & Struct;1909  readonly isTeleportAssets: boolean;1910  readonly asTeleportAssets: {1911    readonly dest: XcmVersionedMultiLocation;1912    readonly beneficiary: XcmVersionedMultiLocation;1913    readonly assets: XcmVersionedMultiAssets;1914    readonly feeAssetItem: u32;1915  } & Struct;1916  readonly isReserveTransferAssets: boolean;1917  readonly asReserveTransferAssets: {1918    readonly dest: XcmVersionedMultiLocation;1919    readonly beneficiary: XcmVersionedMultiLocation;1920    readonly assets: XcmVersionedMultiAssets;1921    readonly feeAssetItem: u32;1922  } & Struct;1923  readonly isExecute: boolean;1924  readonly asExecute: {1925    readonly message: XcmVersionedXcm;1926    readonly maxWeight: u64;1927  } & Struct;1928  readonly isForceXcmVersion: boolean;1929  readonly asForceXcmVersion: {1930    readonly location: XcmV1MultiLocation;1931    readonly xcmVersion: u32;1932  } & Struct;1933  readonly isForceDefaultXcmVersion: boolean;1934  readonly asForceDefaultXcmVersion: {1935    readonly maybeXcmVersion: Option<u32>;1936  } & Struct;1937  readonly isForceSubscribeVersionNotify: boolean;1938  readonly asForceSubscribeVersionNotify: {1939    readonly location: XcmVersionedMultiLocation;1940  } & Struct;1941  readonly isForceUnsubscribeVersionNotify: boolean;1942  readonly asForceUnsubscribeVersionNotify: {1943    readonly location: XcmVersionedMultiLocation;1944  } & Struct;1945  readonly isLimitedReserveTransferAssets: boolean;1946  readonly asLimitedReserveTransferAssets: {1947    readonly dest: XcmVersionedMultiLocation;1948    readonly beneficiary: XcmVersionedMultiLocation;1949    readonly assets: XcmVersionedMultiAssets;1950    readonly feeAssetItem: u32;1951    readonly weightLimit: XcmV2WeightLimit;1952  } & Struct;1953  readonly isLimitedTeleportAssets: boolean;1954  readonly asLimitedTeleportAssets: {1955    readonly dest: XcmVersionedMultiLocation;1956    readonly beneficiary: XcmVersionedMultiLocation;1957    readonly assets: XcmVersionedMultiAssets;1958    readonly feeAssetItem: u32;1959    readonly weightLimit: XcmV2WeightLimit;1960  } & Struct;1961  readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';1962}19631964/** @name PalletXcmError */1965export interface PalletXcmError extends Enum {1966  readonly isUnreachable: boolean;1967  readonly isSendFailure: boolean;1968  readonly isFiltered: boolean;1969  readonly isUnweighableMessage: boolean;1970  readonly isDestinationNotInvertible: boolean;1971  readonly isEmpty: boolean;1972  readonly isCannotReanchor: boolean;1973  readonly isTooManyAssets: boolean;1974  readonly isInvalidOrigin: boolean;1975  readonly isBadVersion: boolean;1976  readonly isBadLocation: boolean;1977  readonly isNoSubscription: boolean;1978  readonly isAlreadySubscribed: boolean;1979  readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';1980}19811982/** @name PalletXcmEvent */1983export interface PalletXcmEvent extends Enum {1984  readonly isAttempted: boolean;1985  readonly asAttempted: XcmV2TraitsOutcome;1986  readonly isSent: boolean;1987  readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;1988  readonly isUnexpectedResponse: boolean;1989  readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;1990  readonly isResponseReady: boolean;1991  readonly asResponseReady: ITuple<[u64, XcmV2Response]>;1992  readonly isNotified: boolean;1993  readonly asNotified: ITuple<[u64, u8, u8]>;1994  readonly isNotifyOverweight: boolean;1995  readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;1996  readonly isNotifyDispatchError: boolean;1997  readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;1998  readonly isNotifyDecodeFailed: boolean;1999  readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2000  readonly isInvalidResponder: boolean;2001  readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2002  readonly isInvalidResponderVersion: boolean;2003  readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2004  readonly isResponseTaken: boolean;2005  readonly asResponseTaken: u64;2006  readonly isAssetsTrapped: boolean;2007  readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2008  readonly isVersionChangeNotified: boolean;2009  readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2010  readonly isSupportedVersionChanged: boolean;2011  readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2012  readonly isNotifyTargetSendFail: boolean;2013  readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2014  readonly isNotifyTargetMigrationFail: boolean;2015  readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2016  readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2017}20182019/** @name PalletXcmOrigin */2020export interface PalletXcmOrigin extends Enum {2021  readonly isXcm: boolean;2022  readonly asXcm: XcmV1MultiLocation;2023  readonly isResponse: boolean;2024  readonly asResponse: XcmV1MultiLocation;2025  readonly type: 'Xcm' | 'Response';2026}20272028/** @name PhantomTypeUpDataStructs */2029export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}20302031/** @name PolkadotCorePrimitivesInboundDownwardMessage */2032export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {2033  readonly sentAt: u32;2034  readonly msg: Bytes;2035}20362037/** @name PolkadotCorePrimitivesInboundHrmpMessage */2038export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {2039  readonly sentAt: u32;2040  readonly data: Bytes;2041}20422043/** @name PolkadotCorePrimitivesOutboundHrmpMessage */2044export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {2045  readonly recipient: u32;2046  readonly data: Bytes;2047}20482049/** @name PolkadotParachainPrimitivesXcmpMessageFormat */2050export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2051  readonly isConcatenatedVersionedXcm: boolean;2052  readonly isConcatenatedEncodedBlob: boolean;2053  readonly isSignals: boolean;2054  readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2055}20562057/** @name PolkadotPrimitivesV2AbridgedHostConfiguration */2058export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {2059  readonly maxCodeSize: u32;2060  readonly maxHeadDataSize: u32;2061  readonly maxUpwardQueueCount: u32;2062  readonly maxUpwardQueueSize: u32;2063  readonly maxUpwardMessageSize: u32;2064  readonly maxUpwardMessageNumPerCandidate: u32;2065  readonly hrmpMaxMessageNumPerCandidate: u32;2066  readonly validationUpgradeCooldown: u32;2067  readonly validationUpgradeDelay: u32;2068}20692070/** @name PolkadotPrimitivesV2AbridgedHrmpChannel */2071export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {2072  readonly maxCapacity: u32;2073  readonly maxTotalSize: u32;2074  readonly maxMessageSize: u32;2075  readonly msgCount: u32;2076  readonly totalSize: u32;2077  readonly mqcHead: Option<H256>;2078}20792080/** @name PolkadotPrimitivesV2PersistedValidationData */2081export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {2082  readonly parentHead: Bytes;2083  readonly relayParentNumber: u32;2084  readonly relayParentStorageRoot: H256;2085  readonly maxPovSize: u32;2086}20872088/** @name PolkadotPrimitivesV2UpgradeRestriction */2089export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {2090  readonly isPresent: boolean;2091  readonly type: 'Present';2092}20932094/** @name RmrkTraitsBaseBaseInfo */2095export interface RmrkTraitsBaseBaseInfo extends Struct {2096  readonly issuer: AccountId32;2097  readonly baseType: Bytes;2098  readonly symbol: Bytes;2099}21002101/** @name RmrkTraitsCollectionCollectionInfo */2102export interface RmrkTraitsCollectionCollectionInfo extends Struct {2103  readonly issuer: AccountId32;2104  readonly metadata: Bytes;2105  readonly max: Option<u32>;2106  readonly symbol: Bytes;2107  readonly nftsCount: u32;2108}21092110/** @name RmrkTraitsNftAccountIdOrCollectionNftTuple */2111export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {2112  readonly isAccountId: boolean;2113  readonly asAccountId: AccountId32;2114  readonly isCollectionAndNftTuple: boolean;2115  readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;2116  readonly type: 'AccountId' | 'CollectionAndNftTuple';2117}21182119/** @name RmrkTraitsNftNftChild */2120export interface RmrkTraitsNftNftChild extends Struct {2121  readonly collectionId: u32;2122  readonly nftId: u32;2123}21242125/** @name RmrkTraitsNftNftInfo */2126export interface RmrkTraitsNftNftInfo extends Struct {2127  readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2128  readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;2129  readonly metadata: Bytes;2130  readonly equipped: bool;2131  readonly pending: bool;2132}21332134/** @name RmrkTraitsNftRoyaltyInfo */2135export interface RmrkTraitsNftRoyaltyInfo extends Struct {2136  readonly recipient: AccountId32;2137  readonly amount: Permill;2138}21392140/** @name RmrkTraitsPartEquippableList */2141export interface RmrkTraitsPartEquippableList extends Enum {2142  readonly isAll: boolean;2143  readonly isEmpty: boolean;2144  readonly isCustom: boolean;2145  readonly asCustom: Vec<u32>;2146  readonly type: 'All' | 'Empty' | 'Custom';2147}21482149/** @name RmrkTraitsPartFixedPart */2150export interface RmrkTraitsPartFixedPart extends Struct {2151  readonly id: u32;2152  readonly z: u32;2153  readonly src: Bytes;2154}21552156/** @name RmrkTraitsPartPartType */2157export interface RmrkTraitsPartPartType extends Enum {2158  readonly isFixedPart: boolean;2159  readonly asFixedPart: RmrkTraitsPartFixedPart;2160  readonly isSlotPart: boolean;2161  readonly asSlotPart: RmrkTraitsPartSlotPart;2162  readonly type: 'FixedPart' | 'SlotPart';2163}21642165/** @name RmrkTraitsPartSlotPart */2166export interface RmrkTraitsPartSlotPart extends Struct {2167  readonly id: u32;2168  readonly equippable: RmrkTraitsPartEquippableList;2169  readonly src: Bytes;2170  readonly z: u32;2171}21722173/** @name RmrkTraitsPropertyPropertyInfo */2174export interface RmrkTraitsPropertyPropertyInfo extends Struct {2175  readonly key: Bytes;2176  readonly value: Bytes;2177}21782179/** @name RmrkTraitsResourceBasicResource */2180export interface RmrkTraitsResourceBasicResource extends Struct {2181  readonly src: Option<Bytes>;2182  readonly metadata: Option<Bytes>;2183  readonly license: Option<Bytes>;2184  readonly thumb: Option<Bytes>;2185}21862187/** @name RmrkTraitsResourceComposableResource */2188export interface RmrkTraitsResourceComposableResource extends Struct {2189  readonly parts: Vec<u32>;2190  readonly base: u32;2191  readonly src: Option<Bytes>;2192  readonly metadata: Option<Bytes>;2193  readonly license: Option<Bytes>;2194  readonly thumb: Option<Bytes>;2195}21962197/** @name RmrkTraitsResourceResourceInfo */2198export interface RmrkTraitsResourceResourceInfo extends Struct {2199  readonly id: u32;2200  readonly resource: RmrkTraitsResourceResourceTypes;2201  readonly pending: bool;2202  readonly pendingRemoval: bool;2203}22042205/** @name RmrkTraitsResourceResourceTypes */2206export interface RmrkTraitsResourceResourceTypes extends Enum {2207  readonly isBasic: boolean;2208  readonly asBasic: RmrkTraitsResourceBasicResource;2209  readonly isComposable: boolean;2210  readonly asComposable: RmrkTraitsResourceComposableResource;2211  readonly isSlot: boolean;2212  readonly asSlot: RmrkTraitsResourceSlotResource;2213  readonly type: 'Basic' | 'Composable' | 'Slot';2214}22152216/** @name RmrkTraitsResourceSlotResource */2217export interface RmrkTraitsResourceSlotResource extends Struct {2218  readonly base: u32;2219  readonly src: Option<Bytes>;2220  readonly metadata: Option<Bytes>;2221  readonly slot: u32;2222  readonly license: Option<Bytes>;2223  readonly thumb: Option<Bytes>;2224}22252226/** @name RmrkTraitsTheme */2227export interface RmrkTraitsTheme extends Struct {2228  readonly name: Bytes;2229  readonly properties: Vec<RmrkTraitsThemeThemeProperty>;2230  readonly inherit: bool;2231}22322233/** @name RmrkTraitsThemeThemeProperty */2234export interface RmrkTraitsThemeThemeProperty extends Struct {2235  readonly key: Bytes;2236  readonly value: Bytes;2237}22382239/** @name SpCoreEcdsaSignature */2240export interface SpCoreEcdsaSignature extends U8aFixed {}22412242/** @name SpCoreEd25519Signature */2243export interface SpCoreEd25519Signature extends U8aFixed {}22442245/** @name SpCoreSr25519Signature */2246export interface SpCoreSr25519Signature extends U8aFixed {}22472248/** @name SpCoreVoid */2249export interface SpCoreVoid extends Null {}22502251/** @name SpRuntimeArithmeticError */2252export interface SpRuntimeArithmeticError extends Enum {2253  readonly isUnderflow: boolean;2254  readonly isOverflow: boolean;2255  readonly isDivisionByZero: boolean;2256  readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2257}22582259/** @name SpRuntimeDigest */2260export interface SpRuntimeDigest extends Struct {2261  readonly logs: Vec<SpRuntimeDigestDigestItem>;2262}22632264/** @name SpRuntimeDigestDigestItem */2265export interface SpRuntimeDigestDigestItem extends Enum {2266  readonly isOther: boolean;2267  readonly asOther: Bytes;2268  readonly isConsensus: boolean;2269  readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2270  readonly isSeal: boolean;2271  readonly asSeal: ITuple<[U8aFixed, Bytes]>;2272  readonly isPreRuntime: boolean;2273  readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2274  readonly isRuntimeEnvironmentUpdated: boolean;2275  readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2276}22772278/** @name SpRuntimeDispatchError */2279export interface SpRuntimeDispatchError extends Enum {2280  readonly isOther: boolean;2281  readonly isCannotLookup: boolean;2282  readonly isBadOrigin: boolean;2283  readonly isModule: boolean;2284  readonly asModule: SpRuntimeModuleError;2285  readonly isConsumerRemaining: boolean;2286  readonly isNoProviders: boolean;2287  readonly isTooManyConsumers: boolean;2288  readonly isToken: boolean;2289  readonly asToken: SpRuntimeTokenError;2290  readonly isArithmetic: boolean;2291  readonly asArithmetic: SpRuntimeArithmeticError;2292  readonly isTransactional: boolean;2293  readonly asTransactional: SpRuntimeTransactionalError;2294  readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2295}22962297/** @name SpRuntimeModuleError */2298export interface SpRuntimeModuleError extends Struct {2299  readonly index: u8;2300  readonly error: U8aFixed;2301}23022303/** @name SpRuntimeMultiSignature */2304export interface SpRuntimeMultiSignature extends Enum {2305  readonly isEd25519: boolean;2306  readonly asEd25519: SpCoreEd25519Signature;2307  readonly isSr25519: boolean;2308  readonly asSr25519: SpCoreSr25519Signature;2309  readonly isEcdsa: boolean;2310  readonly asEcdsa: SpCoreEcdsaSignature;2311  readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';2312}23132314/** @name SpRuntimeTokenError */2315export interface SpRuntimeTokenError extends Enum {2316  readonly isNoFunds: boolean;2317  readonly isWouldDie: boolean;2318  readonly isBelowMinimum: boolean;2319  readonly isCannotCreate: boolean;2320  readonly isUnknownAsset: boolean;2321  readonly isFrozen: boolean;2322  readonly isUnsupported: boolean;2323  readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2324}23252326/** @name SpRuntimeTransactionalError */2327export interface SpRuntimeTransactionalError extends Enum {2328  readonly isLimitReached: boolean;2329  readonly isNoLayer: boolean;2330  readonly type: 'LimitReached' | 'NoLayer';2331}23322333/** @name SpTrieStorageProof */2334export interface SpTrieStorageProof extends Struct {2335  readonly trieNodes: BTreeSet<Bytes>;2336}23372338/** @name SpVersionRuntimeVersion */2339export interface SpVersionRuntimeVersion extends Struct {2340  readonly specName: Text;2341  readonly implName: Text;2342  readonly authoringVersion: u32;2343  readonly specVersion: u32;2344  readonly implVersion: u32;2345  readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2346  readonly transactionVersion: u32;2347  readonly stateVersion: u8;2348}23492350/** @name UpDataStructsAccessMode */2351export interface UpDataStructsAccessMode extends Enum {2352  readonly isNormal: boolean;2353  readonly isAllowList: boolean;2354  readonly type: 'Normal' | 'AllowList';2355}23562357/** @name UpDataStructsCollection */2358export interface UpDataStructsCollection extends Struct {2359  readonly owner: AccountId32;2360  readonly mode: UpDataStructsCollectionMode;2361  readonly name: Vec<u16>;2362  readonly description: Vec<u16>;2363  readonly tokenPrefix: Bytes;2364  readonly sponsorship: UpDataStructsSponsorshipState;2365  readonly limits: UpDataStructsCollectionLimits;2366  readonly permissions: UpDataStructsCollectionPermissions;2367  readonly externalCollection: bool;2368}23692370/** @name UpDataStructsCollectionLimits */2371export interface UpDataStructsCollectionLimits extends Struct {2372  readonly accountTokenOwnershipLimit: Option<u32>;2373  readonly sponsoredDataSize: Option<u32>;2374  readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;2375  readonly tokenLimit: Option<u32>;2376  readonly sponsorTransferTimeout: Option<u32>;2377  readonly sponsorApproveTimeout: Option<u32>;2378  readonly ownerCanTransfer: Option<bool>;2379  readonly ownerCanDestroy: Option<bool>;2380  readonly transfersEnabled: Option<bool>;2381}23822383/** @name UpDataStructsCollectionMode */2384export interface UpDataStructsCollectionMode extends Enum {2385  readonly isNft: boolean;2386  readonly isFungible: boolean;2387  readonly asFungible: u8;2388  readonly isReFungible: boolean;2389  readonly type: 'Nft' | 'Fungible' | 'ReFungible';2390}23912392/** @name UpDataStructsCollectionPermissions */2393export interface UpDataStructsCollectionPermissions extends Struct {2394  readonly access: Option<UpDataStructsAccessMode>;2395  readonly mintMode: Option<bool>;2396  readonly nesting: Option<UpDataStructsNestingPermissions>;2397}23982399/** @name UpDataStructsCollectionStats */2400export interface UpDataStructsCollectionStats extends Struct {2401  readonly created: u32;2402  readonly destroyed: u32;2403  readonly alive: u32;2404}24052406/** @name UpDataStructsCreateCollectionData */2407export interface UpDataStructsCreateCollectionData extends Struct {2408  readonly mode: UpDataStructsCollectionMode;2409  readonly access: Option<UpDataStructsAccessMode>;2410  readonly name: Vec<u16>;2411  readonly description: Vec<u16>;2412  readonly tokenPrefix: Bytes;2413  readonly pendingSponsor: Option<AccountId32>;2414  readonly limits: Option<UpDataStructsCollectionLimits>;2415  readonly permissions: Option<UpDataStructsCollectionPermissions>;2416  readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2417  readonly properties: Vec<UpDataStructsProperty>;2418}24192420/** @name UpDataStructsCreateFungibleData */2421export interface UpDataStructsCreateFungibleData extends Struct {2422  readonly value: u128;2423}24242425/** @name UpDataStructsCreateItemData */2426export interface UpDataStructsCreateItemData extends Enum {2427  readonly isNft: boolean;2428  readonly asNft: UpDataStructsCreateNftData;2429  readonly isFungible: boolean;2430  readonly asFungible: UpDataStructsCreateFungibleData;2431  readonly isReFungible: boolean;2432  readonly asReFungible: UpDataStructsCreateReFungibleData;2433  readonly type: 'Nft' | 'Fungible' | 'ReFungible';2434}24352436/** @name UpDataStructsCreateItemExData */2437export interface UpDataStructsCreateItemExData extends Enum {2438  readonly isNft: boolean;2439  readonly asNft: Vec<UpDataStructsCreateNftExData>;2440  readonly isFungible: boolean;2441  readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr,u128>;2442  readonly isRefungibleMultipleItems: boolean;2443  readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;2444  readonly isRefungibleMultipleOwners: boolean;2445  readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;2446  readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';2447}24482449/** @name UpDataStructsCreateNftData */2450export interface UpDataStructsCreateNftData extends Struct {2451  readonly properties: Vec<UpDataStructsProperty>;2452}24532454/** @name UpDataStructsCreateNftExData */2455export interface UpDataStructsCreateNftExData extends Struct {2456  readonly properties: Vec<UpDataStructsProperty>;2457  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2458}24592460/** @name UpDataStructsCreateReFungibleData */2461export interface UpDataStructsCreateReFungibleData extends Struct {2462  readonly constData: Bytes;2463  readonly pieces: u128;2464  readonly properties: Vec<UpDataStructsProperty>;2465}24662467/** @name UpDataStructsCreateRefungibleExData */2468export interface UpDataStructsCreateRefungibleExData extends Struct {2469  readonly constData: Bytes;2470  readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2471  readonly properties: Vec<UpDataStructsProperty>;2472}24732474/** @name UpDataStructsNestingPermissions */2475export interface UpDataStructsNestingPermissions extends Struct {2476  readonly tokenOwner: bool;2477  readonly collectionAdmin: bool;2478  readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;2479}24802481/** @name UpDataStructsOwnerRestrictedSet */2482export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}24832484/** @name UpDataStructsProperties */2485export interface UpDataStructsProperties extends Struct {2486  readonly map: UpDataStructsPropertiesMapBoundedVec;2487  readonly consumedSpace: u32;2488  readonly spaceLimit: u32;2489}24902491/** @name UpDataStructsPropertiesMapBoundedVec */2492export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}24932494/** @name UpDataStructsPropertiesMapPropertyPermission */2495export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}24962497/** @name UpDataStructsProperty */2498export interface UpDataStructsProperty extends Struct {2499  readonly key: Bytes;2500  readonly value: Bytes;2501}25022503/** @name UpDataStructsPropertyKeyPermission */2504export interface UpDataStructsPropertyKeyPermission extends Struct {2505  readonly key: Bytes;2506  readonly permission: UpDataStructsPropertyPermission;2507}25082509/** @name UpDataStructsPropertyPermission */2510export interface UpDataStructsPropertyPermission extends Struct {2511  readonly mutable: bool;2512  readonly collectionAdmin: bool;2513  readonly tokenOwner: bool;2514}25152516/** @name UpDataStructsPropertyScope */2517export interface UpDataStructsPropertyScope extends Enum {2518  readonly isNone: boolean;2519  readonly isRmrk: boolean;2520  readonly type: 'None' | 'Rmrk';2521}25222523/** @name UpDataStructsRpcCollection */2524export interface UpDataStructsRpcCollection extends Struct {2525  readonly owner: AccountId32;2526  readonly mode: UpDataStructsCollectionMode;2527  readonly name: Vec<u16>;2528  readonly description: Vec<u16>;2529  readonly tokenPrefix: Bytes;2530  readonly sponsorship: UpDataStructsSponsorshipState;2531  readonly limits: UpDataStructsCollectionLimits;2532  readonly permissions: UpDataStructsCollectionPermissions;2533  readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2534  readonly properties: Vec<UpDataStructsProperty>;2535  readonly readOnly: bool;2536}25372538/** @name UpDataStructsSponsoringRateLimit */2539export interface UpDataStructsSponsoringRateLimit extends Enum {2540  readonly isSponsoringDisabled: boolean;2541  readonly isBlocks: boolean;2542  readonly asBlocks: u32;2543  readonly type: 'SponsoringDisabled' | 'Blocks';2544}25452546/** @name UpDataStructsSponsorshipState */2547export interface UpDataStructsSponsorshipState extends Enum {2548  readonly isDisabled: boolean;2549  readonly isUnconfirmed: boolean;2550  readonly asUnconfirmed: AccountId32;2551  readonly isConfirmed: boolean;2552  readonly asConfirmed: AccountId32;2553  readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2554}25552556/** @name UpDataStructsTokenChild */2557export interface UpDataStructsTokenChild extends Struct {2558  readonly token: u32;2559  readonly collection: u32;2560}25612562/** @name UpDataStructsTokenData */2563export interface UpDataStructsTokenData extends Struct {2564  readonly properties: Vec<UpDataStructsProperty>;2565  readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2566  readonly pieces: u128;2567}25682569/** @name XcmDoubleEncoded */2570export interface XcmDoubleEncoded extends Struct {2571  readonly encoded: Bytes;2572}25732574/** @name XcmV0Junction */2575export interface XcmV0Junction extends Enum {2576  readonly isParent: boolean;2577  readonly isParachain: boolean;2578  readonly asParachain: Compact<u32>;2579  readonly isAccountId32: boolean;2580  readonly asAccountId32: {2581    readonly network: XcmV0JunctionNetworkId;2582    readonly id: U8aFixed;2583  } & Struct;2584  readonly isAccountIndex64: boolean;2585  readonly asAccountIndex64: {2586    readonly network: XcmV0JunctionNetworkId;2587    readonly index: Compact<u64>;2588  } & Struct;2589  readonly isAccountKey20: boolean;2590  readonly asAccountKey20: {2591    readonly network: XcmV0JunctionNetworkId;2592    readonly key: U8aFixed;2593  } & Struct;2594  readonly isPalletInstance: boolean;2595  readonly asPalletInstance: u8;2596  readonly isGeneralIndex: boolean;2597  readonly asGeneralIndex: Compact<u128>;2598  readonly isGeneralKey: boolean;2599  readonly asGeneralKey: Bytes;2600  readonly isOnlyChild: boolean;2601  readonly isPlurality: boolean;2602  readonly asPlurality: {2603    readonly id: XcmV0JunctionBodyId;2604    readonly part: XcmV0JunctionBodyPart;2605  } & Struct;2606  readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2607}26082609/** @name XcmV0JunctionBodyId */2610export interface XcmV0JunctionBodyId extends Enum {2611  readonly isUnit: boolean;2612  readonly isNamed: boolean;2613  readonly asNamed: Bytes;2614  readonly isIndex: boolean;2615  readonly asIndex: Compact<u32>;2616  readonly isExecutive: boolean;2617  readonly isTechnical: boolean;2618  readonly isLegislative: boolean;2619  readonly isJudicial: boolean;2620  readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';2621}26222623/** @name XcmV0JunctionBodyPart */2624export interface XcmV0JunctionBodyPart extends Enum {2625  readonly isVoice: boolean;2626  readonly isMembers: boolean;2627  readonly asMembers: {2628    readonly count: Compact<u32>;2629  } & Struct;2630  readonly isFraction: boolean;2631  readonly asFraction: {2632    readonly nom: Compact<u32>;2633    readonly denom: Compact<u32>;2634  } & Struct;2635  readonly isAtLeastProportion: boolean;2636  readonly asAtLeastProportion: {2637    readonly nom: Compact<u32>;2638    readonly denom: Compact<u32>;2639  } & Struct;2640  readonly isMoreThanProportion: boolean;2641  readonly asMoreThanProportion: {2642    readonly nom: Compact<u32>;2643    readonly denom: Compact<u32>;2644  } & Struct;2645  readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';2646}26472648/** @name XcmV0JunctionNetworkId */2649export interface XcmV0JunctionNetworkId extends Enum {2650  readonly isAny: boolean;2651  readonly isNamed: boolean;2652  readonly asNamed: Bytes;2653  readonly isPolkadot: boolean;2654  readonly isKusama: boolean;2655  readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';2656}26572658/** @name XcmV0MultiAsset */2659export interface XcmV0MultiAsset extends Enum {2660  readonly isNone: boolean;2661  readonly isAll: boolean;2662  readonly isAllFungible: boolean;2663  readonly isAllNonFungible: boolean;2664  readonly isAllAbstractFungible: boolean;2665  readonly asAllAbstractFungible: {2666    readonly id: Bytes;2667  } & Struct;2668  readonly isAllAbstractNonFungible: boolean;2669  readonly asAllAbstractNonFungible: {2670    readonly class: Bytes;2671  } & Struct;2672  readonly isAllConcreteFungible: boolean;2673  readonly asAllConcreteFungible: {2674    readonly id: XcmV0MultiLocation;2675  } & Struct;2676  readonly isAllConcreteNonFungible: boolean;2677  readonly asAllConcreteNonFungible: {2678    readonly class: XcmV0MultiLocation;2679  } & Struct;2680  readonly isAbstractFungible: boolean;2681  readonly asAbstractFungible: {2682    readonly id: Bytes;2683    readonly amount: Compact<u128>;2684  } & Struct;2685  readonly isAbstractNonFungible: boolean;2686  readonly asAbstractNonFungible: {2687    readonly class: Bytes;2688    readonly instance: XcmV1MultiassetAssetInstance;2689  } & Struct;2690  readonly isConcreteFungible: boolean;2691  readonly asConcreteFungible: {2692    readonly id: XcmV0MultiLocation;2693    readonly amount: Compact<u128>;2694  } & Struct;2695  readonly isConcreteNonFungible: boolean;2696  readonly asConcreteNonFungible: {2697    readonly class: XcmV0MultiLocation;2698    readonly instance: XcmV1MultiassetAssetInstance;2699  } & Struct;2700  readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';2701}27022703/** @name XcmV0MultiLocation */2704export interface XcmV0MultiLocation extends Enum {2705  readonly isNull: boolean;2706  readonly isX1: boolean;2707  readonly asX1: XcmV0Junction;2708  readonly isX2: boolean;2709  readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;2710  readonly isX3: boolean;2711  readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2712  readonly isX4: boolean;2713  readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2714  readonly isX5: boolean;2715  readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2716  readonly isX6: boolean;2717  readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2718  readonly isX7: boolean;2719  readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2720  readonly isX8: boolean;2721  readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2722  readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2723}27242725/** @name XcmV0Order */2726export interface XcmV0Order extends Enum {2727  readonly isNull: boolean;2728  readonly isDepositAsset: boolean;2729  readonly asDepositAsset: {2730    readonly assets: Vec<XcmV0MultiAsset>;2731    readonly dest: XcmV0MultiLocation;2732  } & Struct;2733  readonly isDepositReserveAsset: boolean;2734  readonly asDepositReserveAsset: {2735    readonly assets: Vec<XcmV0MultiAsset>;2736    readonly dest: XcmV0MultiLocation;2737    readonly effects: Vec<XcmV0Order>;2738  } & Struct;2739  readonly isExchangeAsset: boolean;2740  readonly asExchangeAsset: {2741    readonly give: Vec<XcmV0MultiAsset>;2742    readonly receive: Vec<XcmV0MultiAsset>;2743  } & Struct;2744  readonly isInitiateReserveWithdraw: boolean;2745  readonly asInitiateReserveWithdraw: {2746    readonly assets: Vec<XcmV0MultiAsset>;2747    readonly reserve: XcmV0MultiLocation;2748    readonly effects: Vec<XcmV0Order>;2749  } & Struct;2750  readonly isInitiateTeleport: boolean;2751  readonly asInitiateTeleport: {2752    readonly assets: Vec<XcmV0MultiAsset>;2753    readonly dest: XcmV0MultiLocation;2754    readonly effects: Vec<XcmV0Order>;2755  } & Struct;2756  readonly isQueryHolding: boolean;2757  readonly asQueryHolding: {2758    readonly queryId: Compact<u64>;2759    readonly dest: XcmV0MultiLocation;2760    readonly assets: Vec<XcmV0MultiAsset>;2761  } & Struct;2762  readonly isBuyExecution: boolean;2763  readonly asBuyExecution: {2764    readonly fees: XcmV0MultiAsset;2765    readonly weight: u64;2766    readonly debt: u64;2767    readonly haltOnError: bool;2768    readonly xcm: Vec<XcmV0Xcm>;2769  } & Struct;2770  readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';2771}27722773/** @name XcmV0OriginKind */2774export interface XcmV0OriginKind extends Enum {2775  readonly isNative: boolean;2776  readonly isSovereignAccount: boolean;2777  readonly isSuperuser: boolean;2778  readonly isXcm: boolean;2779  readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';2780}27812782/** @name XcmV0Response */2783export interface XcmV0Response extends Enum {2784  readonly isAssets: boolean;2785  readonly asAssets: Vec<XcmV0MultiAsset>;2786  readonly type: 'Assets';2787}27882789/** @name XcmV0Xcm */2790export interface XcmV0Xcm extends Enum {2791  readonly isWithdrawAsset: boolean;2792  readonly asWithdrawAsset: {2793    readonly assets: Vec<XcmV0MultiAsset>;2794    readonly effects: Vec<XcmV0Order>;2795  } & Struct;2796  readonly isReserveAssetDeposit: boolean;2797  readonly asReserveAssetDeposit: {2798    readonly assets: Vec<XcmV0MultiAsset>;2799    readonly effects: Vec<XcmV0Order>;2800  } & Struct;2801  readonly isTeleportAsset: boolean;2802  readonly asTeleportAsset: {2803    readonly assets: Vec<XcmV0MultiAsset>;2804    readonly effects: Vec<XcmV0Order>;2805  } & Struct;2806  readonly isQueryResponse: boolean;2807  readonly asQueryResponse: {2808    readonly queryId: Compact<u64>;2809    readonly response: XcmV0Response;2810  } & Struct;2811  readonly isTransferAsset: boolean;2812  readonly asTransferAsset: {2813    readonly assets: Vec<XcmV0MultiAsset>;2814    readonly dest: XcmV0MultiLocation;2815  } & Struct;2816  readonly isTransferReserveAsset: boolean;2817  readonly asTransferReserveAsset: {2818    readonly assets: Vec<XcmV0MultiAsset>;2819    readonly dest: XcmV0MultiLocation;2820    readonly effects: Vec<XcmV0Order>;2821  } & Struct;2822  readonly isTransact: boolean;2823  readonly asTransact: {2824    readonly originType: XcmV0OriginKind;2825    readonly requireWeightAtMost: u64;2826    readonly call: XcmDoubleEncoded;2827  } & Struct;2828  readonly isHrmpNewChannelOpenRequest: boolean;2829  readonly asHrmpNewChannelOpenRequest: {2830    readonly sender: Compact<u32>;2831    readonly maxMessageSize: Compact<u32>;2832    readonly maxCapacity: Compact<u32>;2833  } & Struct;2834  readonly isHrmpChannelAccepted: boolean;2835  readonly asHrmpChannelAccepted: {2836    readonly recipient: Compact<u32>;2837  } & Struct;2838  readonly isHrmpChannelClosing: boolean;2839  readonly asHrmpChannelClosing: {2840    readonly initiator: Compact<u32>;2841    readonly sender: Compact<u32>;2842    readonly recipient: Compact<u32>;2843  } & Struct;2844  readonly isRelayedFrom: boolean;2845  readonly asRelayedFrom: {2846    readonly who: XcmV0MultiLocation;2847    readonly message: XcmV0Xcm;2848  } & Struct;2849  readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';2850}28512852/** @name XcmV1Junction */2853export interface XcmV1Junction extends Enum {2854  readonly isParachain: boolean;2855  readonly asParachain: Compact<u32>;2856  readonly isAccountId32: boolean;2857  readonly asAccountId32: {2858    readonly network: XcmV0JunctionNetworkId;2859    readonly id: U8aFixed;2860  } & Struct;2861  readonly isAccountIndex64: boolean;2862  readonly asAccountIndex64: {2863    readonly network: XcmV0JunctionNetworkId;2864    readonly index: Compact<u64>;2865  } & Struct;2866  readonly isAccountKey20: boolean;2867  readonly asAccountKey20: {2868    readonly network: XcmV0JunctionNetworkId;2869    readonly key: U8aFixed;2870  } & Struct;2871  readonly isPalletInstance: boolean;2872  readonly asPalletInstance: u8;2873  readonly isGeneralIndex: boolean;2874  readonly asGeneralIndex: Compact<u128>;2875  readonly isGeneralKey: boolean;2876  readonly asGeneralKey: Bytes;2877  readonly isOnlyChild: boolean;2878  readonly isPlurality: boolean;2879  readonly asPlurality: {2880    readonly id: XcmV0JunctionBodyId;2881    readonly part: XcmV0JunctionBodyPart;2882  } & Struct;2883  readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2884}28852886/** @name XcmV1MultiAsset */2887export interface XcmV1MultiAsset extends Struct {2888  readonly id: XcmV1MultiassetAssetId;2889  readonly fun: XcmV1MultiassetFungibility;2890}28912892/** @name XcmV1MultiassetAssetId */2893export interface XcmV1MultiassetAssetId extends Enum {2894  readonly isConcrete: boolean;2895  readonly asConcrete: XcmV1MultiLocation;2896  readonly isAbstract: boolean;2897  readonly asAbstract: Bytes;2898  readonly type: 'Concrete' | 'Abstract';2899}29002901/** @name XcmV1MultiassetAssetInstance */2902export interface XcmV1MultiassetAssetInstance extends Enum {2903  readonly isUndefined: boolean;2904  readonly isIndex: boolean;2905  readonly asIndex: Compact<u128>;2906  readonly isArray4: boolean;2907  readonly asArray4: U8aFixed;2908  readonly isArray8: boolean;2909  readonly asArray8: U8aFixed;2910  readonly isArray16: boolean;2911  readonly asArray16: U8aFixed;2912  readonly isArray32: boolean;2913  readonly asArray32: U8aFixed;2914  readonly isBlob: boolean;2915  readonly asBlob: Bytes;2916  readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';2917}29182919/** @name XcmV1MultiassetFungibility */2920export interface XcmV1MultiassetFungibility extends Enum {2921  readonly isFungible: boolean;2922  readonly asFungible: Compact<u128>;2923  readonly isNonFungible: boolean;2924  readonly asNonFungible: XcmV1MultiassetAssetInstance;2925  readonly type: 'Fungible' | 'NonFungible';2926}29272928/** @name XcmV1MultiassetMultiAssetFilter */2929export interface XcmV1MultiassetMultiAssetFilter extends Enum {2930  readonly isDefinite: boolean;2931  readonly asDefinite: XcmV1MultiassetMultiAssets;2932  readonly isWild: boolean;2933  readonly asWild: XcmV1MultiassetWildMultiAsset;2934  readonly type: 'Definite' | 'Wild';2935}29362937/** @name XcmV1MultiassetMultiAssets */2938export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}29392940/** @name XcmV1MultiassetWildFungibility */2941export interface XcmV1MultiassetWildFungibility extends Enum {2942  readonly isFungible: boolean;2943  readonly isNonFungible: boolean;2944  readonly type: 'Fungible' | 'NonFungible';2945}29462947/** @name XcmV1MultiassetWildMultiAsset */2948export interface XcmV1MultiassetWildMultiAsset extends Enum {2949  readonly isAll: boolean;2950  readonly isAllOf: boolean;2951  readonly asAllOf: {2952    readonly id: XcmV1MultiassetAssetId;2953    readonly fun: XcmV1MultiassetWildFungibility;2954  } & Struct;2955  readonly type: 'All' | 'AllOf';2956}29572958/** @name XcmV1MultiLocation */2959export interface XcmV1MultiLocation extends Struct {2960  readonly parents: u8;2961  readonly interior: XcmV1MultilocationJunctions;2962}29632964/** @name XcmV1MultilocationJunctions */2965export interface XcmV1MultilocationJunctions extends Enum {2966  readonly isHere: boolean;2967  readonly isX1: boolean;2968  readonly asX1: XcmV1Junction;2969  readonly isX2: boolean;2970  readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;2971  readonly isX3: boolean;2972  readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2973  readonly isX4: boolean;2974  readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2975  readonly isX5: boolean;2976  readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2977  readonly isX6: boolean;2978  readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2979  readonly isX7: boolean;2980  readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2981  readonly isX8: boolean;2982  readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2983  readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2984}29852986/** @name XcmV1Order */2987export interface XcmV1Order extends Enum {2988  readonly isNoop: boolean;2989  readonly isDepositAsset: boolean;2990  readonly asDepositAsset: {2991    readonly assets: XcmV1MultiassetMultiAssetFilter;2992    readonly maxAssets: u32;2993    readonly beneficiary: XcmV1MultiLocation;2994  } & Struct;2995  readonly isDepositReserveAsset: boolean;2996  readonly asDepositReserveAsset: {2997    readonly assets: XcmV1MultiassetMultiAssetFilter;2998    readonly maxAssets: u32;2999    readonly dest: XcmV1MultiLocation;3000    readonly effects: Vec<XcmV1Order>;3001  } & Struct;3002  readonly isExchangeAsset: boolean;3003  readonly asExchangeAsset: {3004    readonly give: XcmV1MultiassetMultiAssetFilter;3005    readonly receive: XcmV1MultiassetMultiAssets;3006  } & Struct;3007  readonly isInitiateReserveWithdraw: boolean;3008  readonly asInitiateReserveWithdraw: {3009    readonly assets: XcmV1MultiassetMultiAssetFilter;3010    readonly reserve: XcmV1MultiLocation;3011    readonly effects: Vec<XcmV1Order>;3012  } & Struct;3013  readonly isInitiateTeleport: boolean;3014  readonly asInitiateTeleport: {3015    readonly assets: XcmV1MultiassetMultiAssetFilter;3016    readonly dest: XcmV1MultiLocation;3017    readonly effects: Vec<XcmV1Order>;3018  } & Struct;3019  readonly isQueryHolding: boolean;3020  readonly asQueryHolding: {3021    readonly queryId: Compact<u64>;3022    readonly dest: XcmV1MultiLocation;3023    readonly assets: XcmV1MultiassetMultiAssetFilter;3024  } & Struct;3025  readonly isBuyExecution: boolean;3026  readonly asBuyExecution: {3027    readonly fees: XcmV1MultiAsset;3028    readonly weight: u64;3029    readonly debt: u64;3030    readonly haltOnError: bool;3031    readonly instructions: Vec<XcmV1Xcm>;3032  } & Struct;3033  readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';3034}30353036/** @name XcmV1Response */3037export interface XcmV1Response extends Enum {3038  readonly isAssets: boolean;3039  readonly asAssets: XcmV1MultiassetMultiAssets;3040  readonly isVersion: boolean;3041  readonly asVersion: u32;3042  readonly type: 'Assets' | 'Version';3043}30443045/** @name XcmV1Xcm */3046export interface XcmV1Xcm extends Enum {3047  readonly isWithdrawAsset: boolean;3048  readonly asWithdrawAsset: {3049    readonly assets: XcmV1MultiassetMultiAssets;3050    readonly effects: Vec<XcmV1Order>;3051  } & Struct;3052  readonly isReserveAssetDeposited: boolean;3053  readonly asReserveAssetDeposited: {3054    readonly assets: XcmV1MultiassetMultiAssets;3055    readonly effects: Vec<XcmV1Order>;3056  } & Struct;3057  readonly isReceiveTeleportedAsset: boolean;3058  readonly asReceiveTeleportedAsset: {3059    readonly assets: XcmV1MultiassetMultiAssets;3060    readonly effects: Vec<XcmV1Order>;3061  } & Struct;3062  readonly isQueryResponse: boolean;3063  readonly asQueryResponse: {3064    readonly queryId: Compact<u64>;3065    readonly response: XcmV1Response;3066  } & Struct;3067  readonly isTransferAsset: boolean;3068  readonly asTransferAsset: {3069    readonly assets: XcmV1MultiassetMultiAssets;3070    readonly beneficiary: XcmV1MultiLocation;3071  } & Struct;3072  readonly isTransferReserveAsset: boolean;3073  readonly asTransferReserveAsset: {3074    readonly assets: XcmV1MultiassetMultiAssets;3075    readonly dest: XcmV1MultiLocation;3076    readonly effects: Vec<XcmV1Order>;3077  } & Struct;3078  readonly isTransact: boolean;3079  readonly asTransact: {3080    readonly originType: XcmV0OriginKind;3081    readonly requireWeightAtMost: u64;3082    readonly call: XcmDoubleEncoded;3083  } & Struct;3084  readonly isHrmpNewChannelOpenRequest: boolean;3085  readonly asHrmpNewChannelOpenRequest: {3086    readonly sender: Compact<u32>;3087    readonly maxMessageSize: Compact<u32>;3088    readonly maxCapacity: Compact<u32>;3089  } & Struct;3090  readonly isHrmpChannelAccepted: boolean;3091  readonly asHrmpChannelAccepted: {3092    readonly recipient: Compact<u32>;3093  } & Struct;3094  readonly isHrmpChannelClosing: boolean;3095  readonly asHrmpChannelClosing: {3096    readonly initiator: Compact<u32>;3097    readonly sender: Compact<u32>;3098    readonly recipient: Compact<u32>;3099  } & Struct;3100  readonly isRelayedFrom: boolean;3101  readonly asRelayedFrom: {3102    readonly who: XcmV1MultilocationJunctions;3103    readonly message: XcmV1Xcm;3104  } & Struct;3105  readonly isSubscribeVersion: boolean;3106  readonly asSubscribeVersion: {3107    readonly queryId: Compact<u64>;3108    readonly maxResponseWeight: Compact<u64>;3109  } & Struct;3110  readonly isUnsubscribeVersion: boolean;3111  readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';3112}31133114/** @name XcmV2Instruction */3115export interface XcmV2Instruction extends Enum {3116  readonly isWithdrawAsset: boolean;3117  readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;3118  readonly isReserveAssetDeposited: boolean;3119  readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;3120  readonly isReceiveTeleportedAsset: boolean;3121  readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;3122  readonly isQueryResponse: boolean;3123  readonly asQueryResponse: {3124    readonly queryId: Compact<u64>;3125    readonly response: XcmV2Response;3126    readonly maxWeight: Compact<u64>;3127  } & Struct;3128  readonly isTransferAsset: boolean;3129  readonly asTransferAsset: {3130    readonly assets: XcmV1MultiassetMultiAssets;3131    readonly beneficiary: XcmV1MultiLocation;3132  } & Struct;3133  readonly isTransferReserveAsset: boolean;3134  readonly asTransferReserveAsset: {3135    readonly assets: XcmV1MultiassetMultiAssets;3136    readonly dest: XcmV1MultiLocation;3137    readonly xcm: XcmV2Xcm;3138  } & Struct;3139  readonly isTransact: boolean;3140  readonly asTransact: {3141    readonly originType: XcmV0OriginKind;3142    readonly requireWeightAtMost: Compact<u64>;3143    readonly call: XcmDoubleEncoded;3144  } & Struct;3145  readonly isHrmpNewChannelOpenRequest: boolean;3146  readonly asHrmpNewChannelOpenRequest: {3147    readonly sender: Compact<u32>;3148    readonly maxMessageSize: Compact<u32>;3149    readonly maxCapacity: Compact<u32>;3150  } & Struct;3151  readonly isHrmpChannelAccepted: boolean;3152  readonly asHrmpChannelAccepted: {3153    readonly recipient: Compact<u32>;3154  } & Struct;3155  readonly isHrmpChannelClosing: boolean;3156  readonly asHrmpChannelClosing: {3157    readonly initiator: Compact<u32>;3158    readonly sender: Compact<u32>;3159    readonly recipient: Compact<u32>;3160  } & Struct;3161  readonly isClearOrigin: boolean;3162  readonly isDescendOrigin: boolean;3163  readonly asDescendOrigin: XcmV1MultilocationJunctions;3164  readonly isReportError: boolean;3165  readonly asReportError: {3166    readonly queryId: Compact<u64>;3167    readonly dest: XcmV1MultiLocation;3168    readonly maxResponseWeight: Compact<u64>;3169  } & Struct;3170  readonly isDepositAsset: boolean;3171  readonly asDepositAsset: {3172    readonly assets: XcmV1MultiassetMultiAssetFilter;3173    readonly maxAssets: Compact<u32>;3174    readonly beneficiary: XcmV1MultiLocation;3175  } & Struct;3176  readonly isDepositReserveAsset: boolean;3177  readonly asDepositReserveAsset: {3178    readonly assets: XcmV1MultiassetMultiAssetFilter;3179    readonly maxAssets: Compact<u32>;3180    readonly dest: XcmV1MultiLocation;3181    readonly xcm: XcmV2Xcm;3182  } & Struct;3183  readonly isExchangeAsset: boolean;3184  readonly asExchangeAsset: {3185    readonly give: XcmV1MultiassetMultiAssetFilter;3186    readonly receive: XcmV1MultiassetMultiAssets;3187  } & Struct;3188  readonly isInitiateReserveWithdraw: boolean;3189  readonly asInitiateReserveWithdraw: {3190    readonly assets: XcmV1MultiassetMultiAssetFilter;3191    readonly reserve: XcmV1MultiLocation;3192    readonly xcm: XcmV2Xcm;3193  } & Struct;3194  readonly isInitiateTeleport: boolean;3195  readonly asInitiateTeleport: {3196    readonly assets: XcmV1MultiassetMultiAssetFilter;3197    readonly dest: XcmV1MultiLocation;3198    readonly xcm: XcmV2Xcm;3199  } & Struct;3200  readonly isQueryHolding: boolean;3201  readonly asQueryHolding: {3202    readonly queryId: Compact<u64>;3203    readonly dest: XcmV1MultiLocation;3204    readonly assets: XcmV1MultiassetMultiAssetFilter;3205    readonly maxResponseWeight: Compact<u64>;3206  } & Struct;3207  readonly isBuyExecution: boolean;3208  readonly asBuyExecution: {3209    readonly fees: XcmV1MultiAsset;3210    readonly weightLimit: XcmV2WeightLimit;3211  } & Struct;3212  readonly isRefundSurplus: boolean;3213  readonly isSetErrorHandler: boolean;3214  readonly asSetErrorHandler: XcmV2Xcm;3215  readonly isSetAppendix: boolean;3216  readonly asSetAppendix: XcmV2Xcm;3217  readonly isClearError: boolean;3218  readonly isClaimAsset: boolean;3219  readonly asClaimAsset: {3220    readonly assets: XcmV1MultiassetMultiAssets;3221    readonly ticket: XcmV1MultiLocation;3222  } & Struct;3223  readonly isTrap: boolean;3224  readonly asTrap: Compact<u64>;3225  readonly isSubscribeVersion: boolean;3226  readonly asSubscribeVersion: {3227    readonly queryId: Compact<u64>;3228    readonly maxResponseWeight: Compact<u64>;3229  } & Struct;3230  readonly isUnsubscribeVersion: boolean;3231  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';3232}32333234/** @name XcmV2Response */3235export interface XcmV2Response extends Enum {3236  readonly isNull: boolean;3237  readonly isAssets: boolean;3238  readonly asAssets: XcmV1MultiassetMultiAssets;3239  readonly isExecutionResult: boolean;3240  readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;3241  readonly isVersion: boolean;3242  readonly asVersion: u32;3243  readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';3244}32453246/** @name XcmV2TraitsError */3247export interface XcmV2TraitsError extends Enum {3248  readonly isOverflow: boolean;3249  readonly isUnimplemented: boolean;3250  readonly isUntrustedReserveLocation: boolean;3251  readonly isUntrustedTeleportLocation: boolean;3252  readonly isMultiLocationFull: boolean;3253  readonly isMultiLocationNotInvertible: boolean;3254  readonly isBadOrigin: boolean;3255  readonly isInvalidLocation: boolean;3256  readonly isAssetNotFound: boolean;3257  readonly isFailedToTransactAsset: boolean;3258  readonly isNotWithdrawable: boolean;3259  readonly isLocationCannotHold: boolean;3260  readonly isExceedsMaxMessageSize: boolean;3261  readonly isDestinationUnsupported: boolean;3262  readonly isTransport: boolean;3263  readonly isUnroutable: boolean;3264  readonly isUnknownClaim: boolean;3265  readonly isFailedToDecode: boolean;3266  readonly isMaxWeightInvalid: boolean;3267  readonly isNotHoldingFees: boolean;3268  readonly isTooExpensive: boolean;3269  readonly isTrap: boolean;3270  readonly asTrap: u64;3271  readonly isUnhandledXcmVersion: boolean;3272  readonly isWeightLimitReached: boolean;3273  readonly asWeightLimitReached: u64;3274  readonly isBarrier: boolean;3275  readonly isWeightNotComputable: boolean;3276  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';3277}32783279/** @name XcmV2TraitsOutcome */3280export interface XcmV2TraitsOutcome extends Enum {3281  readonly isComplete: boolean;3282  readonly asComplete: u64;3283  readonly isIncomplete: boolean;3284  readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;3285  readonly isError: boolean;3286  readonly asError: XcmV2TraitsError;3287  readonly type: 'Complete' | 'Incomplete' | 'Error';3288}32893290/** @name XcmV2WeightLimit */3291export interface XcmV2WeightLimit extends Enum {3292  readonly isUnlimited: boolean;3293  readonly isLimited: boolean;3294  readonly asLimited: Compact<u64>;3295  readonly type: 'Unlimited' | 'Limited';3296}32973298/** @name XcmV2Xcm */3299export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}33003301/** @name XcmVersionedMultiAssets */3302export interface XcmVersionedMultiAssets extends Enum {3303  readonly isV0: boolean;3304  readonly asV0: Vec<XcmV0MultiAsset>;3305  readonly isV1: boolean;3306  readonly asV1: XcmV1MultiassetMultiAssets;3307  readonly type: 'V0' | 'V1';3308}33093310/** @name XcmVersionedMultiLocation */3311export interface XcmVersionedMultiLocation extends Enum {3312  readonly isV0: boolean;3313  readonly asV0: XcmV0MultiLocation;3314  readonly isV1: boolean;3315  readonly asV1: XcmV1MultiLocation;3316  readonly type: 'V0' | 'V1';3317}33183319/** @name XcmVersionedXcm */3320export interface XcmVersionedXcm extends Enum {3321  readonly isV0: boolean;3322  readonly asV0: XcmV0Xcm;3323  readonly isV1: boolean;3324  readonly asV1: XcmV1Xcm;3325  readonly isV2: boolean;3326  readonly asV2: XcmV2Xcm;3327  readonly type: 'V0' | 'V1' | 'V2';3328}33293330export type PHANTOM_DEFAULT = 'default';
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
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -1629,6 +1629,7 @@
   export interface UpDataStructsCreateReFungibleData extends Struct {
     readonly constData: Bytes;
     readonly pieces: u128;
+    readonly properties: Vec<UpDataStructsProperty>;
   }
 
   /** @name UpDataStructsCreateItemExData (193) */
@@ -1654,6 +1655,7 @@
   export interface UpDataStructsCreateRefungibleExData extends Struct {
     readonly constData: Bytes;
     readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
+    readonly properties: Vec<UpDataStructsProperty>;
   }
 
   /** @name PalletUniqueSchedulerCall (204) */
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);