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

difftreelog

added feature: repartition method in refungible palette. added tests: integration tests for repartition.

Grigoriy Simonov2022-06-27parent: #88a8aa6.patch.diff
in: master

17 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6608,6 +6608,7 @@
  "pallet-evm",
  "pallet-evm-coder-substrate",
  "pallet-nonfungible",
+ "pallet-refungible",
  "parity-scale-codec 3.1.5",
  "scale-info",
  "serde",
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -64,6 +64,8 @@
 		NotRefungibleDataUsedToMintFungibleCollectionToken,
 		/// Maximum refungibility exceeded
 		WrongRefungiblePieces,
+		/// Refungible token can't be repartitioned by user who isn't owns all pieces
+		RepartitionWhileNotOwningAllPieces,
 		/// Refungible token can't nest other tokens
 		RefungibleDisallowsNesting,
 		/// Setting item properties is not allowed
@@ -684,4 +686,28 @@
 	) -> DispatchResult {
 		Self::create_multiple_items(collection, sender, vec![data], nesting_budget)
 	}
+
+	pub fn repartition(
+		owner: &T::CrossAccountId,
+		collection: &RefungibleHandle<T>,
+		token: TokenId,
+		amount: u128,
+	) -> DispatchResult {
+		ensure!(
+			amount <= MAX_REFUNGIBLE_PIECES,
+			<Error<T>>::WrongRefungiblePieces
+		);
+		ensure!(amount > 0, <CommonError<T>>::TokenValueTooLow);
+		// Ensure user owns all pieces
+		let total_supply = <TotalSupply<T>>::get((collection.id, token));
+		let balance = <Balance<T>>::get((collection.id, token, owner));
+		ensure!(
+			total_supply == balance,
+			<Error<T>>::RepartitionWhileNotOwningAllPieces
+		);
+
+		<Balance<T>>::insert((collection.id, token, owner), amount);
+		<TotalSupply<T>>::insert((collection.id, token), amount);
+		Ok(())
+	}
 }
modifiedpallets/unique/Cargo.tomldiffbeforeafterboth
--- a/pallets/unique/Cargo.toml
+++ b/pallets/unique/Cargo.toml
@@ -103,3 +103,4 @@
 evm-coder = { default-features = false, path = '../../crates/evm-coder' }
 pallet-evm-coder-substrate = { default-features = false, path = '../../pallets/evm-coder-substrate' }
 pallet-nonfungible = { default-features = false, path = '../../pallets/nonfungible' }
+pallet-refungible = { default-features = false, path = '../../pallets/refungible' }
modifiedpallets/unique/src/lib.rsdiffbeforeafterboth
before · pallets/unique/src/lib.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617#![recursion_limit = "1024"]18#![cfg_attr(not(feature = "std"), no_std)]19#![allow(20	clippy::too_many_arguments,21	clippy::unnecessary_mut_passed,22	clippy::unused_unit23)]2425extern crate alloc;2627use frame_support::{28	decl_module, decl_storage, decl_error, decl_event,29	dispatch::DispatchResult,30	ensure,31	weights::{Weight},32	transactional,33	pallet_prelude::{DispatchResultWithPostInfo, ConstU32},34	BoundedVec,35};36use scale_info::TypeInfo;37use frame_system::{self as system, ensure_signed};38use sp_runtime::{sp_std::prelude::Vec};39use up_data_structs::{40	MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH,41	CreateItemData, CollectionLimits, CollectionPermissions, CollectionId, CollectionMode, TokenId,42	SponsorshipState, CreateCollectionData, CreateItemExData, budget, Property, PropertyKey,43	PropertyKeyPermission,44};45use pallet_evm::account::CrossAccountId;46use pallet_common::{47	CollectionHandle, Pallet as PalletCommon, CommonWeightInfo, dispatch::dispatch_tx,48	dispatch::CollectionDispatch,49};50pub mod eth;5152#[cfg(feature = "runtime-benchmarks")]53mod benchmarking;54pub mod weights;55use weights::WeightInfo;5657const NESTING_BUDGET: u32 = 5;5859decl_error! {60	/// Error for non-fungible-token module.61	pub enum Error for Module<T: Config> {62		/// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.63		CollectionDecimalPointLimitExceeded,64		/// This address is not set as sponsor, use setCollectionSponsor first.65		ConfirmUnsetSponsorFail,66		/// Length of items properties must be greater than 0.67		EmptyArgument,68	}69}7071pub trait Config: system::Config + pallet_common::Config + Sized + TypeInfo {72	type Event: From<Event<Self>> + Into<<Self as frame_system::Config>::Event>;7374	/// Weight information for extrinsics in this pallet.75	type WeightInfo: WeightInfo;76	type CommonWeightInfo: CommonWeightInfo<Self::CrossAccountId>;77}7879decl_event! {80	pub enum Event<T>81	where82		<T as frame_system::Config>::AccountId,83		<T as pallet_evm::account::Config>::CrossAccountId,84	{85		/// Collection sponsor was removed86		///87		/// # Arguments88		///89		/// * collection_id: Globally unique collection identifier.90		CollectionSponsorRemoved(CollectionId),9192		/// Collection admin was added93		///94		/// # Arguments95		///96		/// * collection_id: Globally unique collection identifier.97		///98		/// * admin:  Admin address.99		CollectionAdminAdded(CollectionId, CrossAccountId),100101		/// Collection owned was change102		///103		/// # Arguments104		///105		/// * collection_id: Globally unique collection identifier.106		///107		/// * owner:  New owner address.108		CollectionOwnedChanged(CollectionId, AccountId),109110		/// Collection sponsor was set111		///112		/// # Arguments113		///114		/// * collection_id: Globally unique collection identifier.115		///116		/// * owner:  New sponsor address.117		CollectionSponsorSet(CollectionId, AccountId),118119		/// New sponsor was confirm120		///121		/// # Arguments122		///123		/// * collection_id: Globally unique collection identifier.124		///125		/// * sponsor:  New sponsor address.126		SponsorshipConfirmed(CollectionId, AccountId),127128		/// Collection admin was removed129		///130		/// # Arguments131		///132		/// * collection_id: Globally unique collection identifier.133		///134		/// * admin:  Admin address.135		CollectionAdminRemoved(CollectionId, CrossAccountId),136137		/// Address was remove from allow list138		///139		/// # Arguments140		///141		/// * collection_id: Globally unique collection identifier.142		///143		/// * user:  Address.144		AllowListAddressRemoved(CollectionId, CrossAccountId),145146		/// Address was add to allow list147		///148		/// # Arguments149		///150		/// * collection_id: Globally unique collection identifier.151		///152		/// * user:  Address.153		AllowListAddressAdded(CollectionId, CrossAccountId),154155		/// Collection limits was set156		///157		/// # Arguments158		///159		/// * collection_id: Globally unique collection identifier.160		CollectionLimitSet(CollectionId),161162		CollectionPermissionSet(CollectionId),163	}164}165166type SelfWeightOf<T> = <T as Config>::WeightInfo;167168// # Used definitions169//170// ## User control levels171//172// chain-controlled - key is uncontrolled by user173//                    i.e autoincrementing index174//                    can use non-cryptographic hash175// real - key is controlled by user176//        but it is hard to generate enough colliding values, i.e owner of signed txs177//        can use non-cryptographic hash178// controlled - key is completly controlled by users179//              i.e maps with mutable keys180//              should use cryptographic hash181//182// ## User control level downgrade reasons183//184// ?1 - chain-controlled -> controlled185//      collections/tokens can be destroyed, resulting in massive holes186// ?2 - chain-controlled -> controlled187//      same as ?1, but can be only added, resulting in easier exploitation188// ?3 - real -> controlled189//      no confirmation required, so addresses can be easily generated190decl_storage! {191	trait Store for Module<T: Config> as Unique {192193		//#region Private members194		/// Used for migrations195		ChainVersion: u64;196		//#endregion197198		//#region Tokens transfer rate limit baskets199		/// (Collection id (controlled?2), who created (real))200		/// TODO: Off chain worker should remove from this map when collection gets removed201		pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => Option<T::BlockNumber>;202		/// Collection id (controlled?2), token id (controlled?2)203		pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;204		/// Collection id (controlled?2), owning user (real)205		pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;206		/// Collection id (controlled?2), token id (controlled?2)207		pub ReFungibleTransferBasket get(fn refungible_transfer_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;208		//#endregion209210		/// Variable metadata sponsoring211		/// Collection id (controlled?2), token id (controlled?2)212		#[deprecated]213		pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;214		pub TokenPropertyBasket get(fn token_property_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;215216		/// Approval sponsoring217		pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;218		pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;219		pub RefungibleApproveBasket get(fn refungible_approve_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;220	}221}222223decl_module! {224	pub struct Module<T: Config> for enum Call225	where226		origin: T::Origin227	{228		type Error = Error<T>;229230		fn deposit_event() = default;231232		fn on_initialize(_now: T::BlockNumber) -> Weight {233			0234		}235236		fn on_runtime_upgrade() -> Weight {237			let limit = None;238239			<VariableMetaDataBasket<T>>::remove_all(limit);240241			0242		}243244		/// 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.245		///246		/// # Permissions247		///248		/// * Anyone.249		///250		/// # Arguments251		///252		/// * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.253		///254		/// * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.255		///256		/// * token_prefix: UTF-8 string with token prefix.257		///258		/// * mode: [CollectionMode] collection type and type dependent data.259		// returns collection ID260		#[weight = <SelfWeightOf<T>>::create_collection()]261		#[transactional]262		#[deprecated]263		pub fn create_collection(origin,264								 collection_name: BoundedVec<u16, ConstU32<MAX_COLLECTION_NAME_LENGTH>>,265								 collection_description: BoundedVec<u16, ConstU32<MAX_COLLECTION_DESCRIPTION_LENGTH>>,266								 token_prefix: BoundedVec<u8, ConstU32<MAX_TOKEN_PREFIX_LENGTH>>,267								 mode: CollectionMode) -> DispatchResult  {268			let data: CreateCollectionData<T::AccountId> = CreateCollectionData {269				name: collection_name,270				description: collection_description,271				token_prefix,272				mode,273				..Default::default()274			};275			Self::create_collection_ex(origin, data)276		}277278		/// This method creates a collection279		///280		/// Prefer it to deprecated [`created_collection`] method281		#[weight = <SelfWeightOf<T>>::create_collection()]282		#[transactional]283		pub fn create_collection_ex(origin, data: CreateCollectionData<T::AccountId>) -> DispatchResult {284			let sender = ensure_signed(origin)?;285286			// =========287288			T::CollectionDispatch::create(T::CrossAccountId::from_sub(sender), data)?;289290			Ok(())291		}292293		/// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.294		///295		/// # Permissions296		///297		/// * Collection Owner.298		///299		/// # Arguments300		///301		/// * collection_id: collection to destroy.302		#[weight = <SelfWeightOf<T>>::destroy_collection()]303		#[transactional]304		pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {305			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);306			let collection = <CollectionHandle<T>>::try_get(collection_id)?;307			collection.check_is_internal()?;308309			// =========310311			T::CollectionDispatch::destroy(sender, collection)?;312313			<NftTransferBasket<T>>::remove_prefix(collection_id, None);314			<FungibleTransferBasket<T>>::remove_prefix(collection_id, None);315			<ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);316317			<NftApproveBasket<T>>::remove_prefix(collection_id, None);318			<FungibleApproveBasket<T>>::remove_prefix(collection_id, None);319			<RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);320321			Ok(())322		}323324		/// Add an address to allow list.325		///326		/// # Permissions327		///328		/// * Collection Owner329		/// * Collection Admin330		///331		/// # Arguments332		///333		/// * collection_id.334		///335		/// * address.336		#[weight = <SelfWeightOf<T>>::add_to_allow_list()]337		#[transactional]338		pub fn add_to_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{339340			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);341			let collection = <CollectionHandle<T>>::try_get(collection_id)?;342			collection.check_is_internal()?;343344			<PalletCommon<T>>::toggle_allowlist(345				&collection,346				&sender,347				&address,348				true,349			)?;350351			Self::deposit_event(Event::<T>::AllowListAddressAdded(352				collection_id,353				address354			));355356			Ok(())357		}358359		/// Remove an address from allow list.360		///361		/// # Permissions362		///363		/// * Collection Owner364		/// * Collection Admin365		///366		/// # Arguments367		///368		/// * collection_id.369		///370		/// * address.371		#[weight = <SelfWeightOf<T>>::remove_from_allow_list()]372		#[transactional]373		pub fn remove_from_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{374375			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);376			let collection = <CollectionHandle<T>>::try_get(collection_id)?;377			collection.check_is_internal()?;378379			<PalletCommon<T>>::toggle_allowlist(380				&collection,381				&sender,382				&address,383				false,384			)?;385386			<Pallet<T>>::deposit_event(Event::<T>::AllowListAddressRemoved(387				collection_id,388				address389			));390391			Ok(())392		}393394		/// Change the owner of the collection.395		///396		/// # Permissions397		///398		/// * Collection Owner.399		///400		/// # Arguments401		///402		/// * collection_id.403		///404		/// * new_owner.405		#[weight = <SelfWeightOf<T>>::change_collection_owner()]406		#[transactional]407		pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {408409			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);410411			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;412			target_collection.check_is_internal()?;413			target_collection.check_is_owner(&sender)?;414415			target_collection.owner = new_owner.clone();416			<Pallet<T>>::deposit_event(Event::<T>::CollectionOwnedChanged(417				collection_id,418				new_owner419			));420421			target_collection.save()422		}423424		/// Adds an admin of the Collection.425		/// 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.426		///427		/// # Permissions428		///429		/// * Collection Owner.430		/// * Collection Admin.431		///432		/// # Arguments433		///434		/// * collection_id: ID of the Collection to add admin for.435		///436		/// * new_admin_id: Address of new admin to add.437		#[weight = <SelfWeightOf<T>>::add_collection_admin()]438		#[transactional]439		pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {440			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);441			let collection = <CollectionHandle<T>>::try_get(collection_id)?;442			collection.check_is_internal()?;443444			<Pallet<T>>::deposit_event(Event::<T>::CollectionAdminAdded(445				collection_id,446				new_admin_id.clone()447			));448449			<PalletCommon<T>>::toggle_admin(&collection, &sender, &new_admin_id, true)450		}451452		/// 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.453		///454		/// # Permissions455		///456		/// * Collection Owner.457		/// * Collection Admin.458		///459		/// # Arguments460		///461		/// * collection_id: ID of the Collection to remove admin for.462		///463		/// * account_id: Address of admin to remove.464		#[weight = <SelfWeightOf<T>>::remove_collection_admin()]465		#[transactional]466		pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {467			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);468			let collection = <CollectionHandle<T>>::try_get(collection_id)?;469			collection.check_is_internal()?;470471			<Pallet<T>>::deposit_event(Event::<T>::CollectionAdminRemoved(472				collection_id,473				account_id.clone()474			));475476			<PalletCommon<T>>::toggle_admin(&collection, &sender, &account_id, false)477		}478479		/// # Permissions480		///481		/// * Collection Owner482		///483		/// # Arguments484		///485		/// * collection_id.486		///487		/// * new_sponsor.488		#[weight = <SelfWeightOf<T>>::set_collection_sponsor()]489		#[transactional]490		pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {491			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);492493			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;494			target_collection.check_is_owner_or_admin(&sender)?;495			target_collection.check_is_internal()?;496497			target_collection.set_sponsor(new_sponsor.clone())?;498499			<Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorSet(500				collection_id,501				new_sponsor502			));503504			target_collection.save()505		}506507		/// # Permissions508		///509		/// * Sponsor.510		///511		/// # Arguments512		///513		/// * collection_id.514		#[weight = <SelfWeightOf<T>>::confirm_sponsorship()]515		#[transactional]516		pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {517			let sender = ensure_signed(origin)?;518519			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;520			target_collection.check_is_internal()?;521			ensure!(522				target_collection.confirm_sponsorship(&sender)?,523				Error::<T>::ConfirmUnsetSponsorFail524			);525526			<Pallet<T>>::deposit_event(Event::<T>::SponsorshipConfirmed(527				collection_id,528				sender529			));530531			target_collection.save()532		}533534		/// Switch back to pay-per-own-transaction model.535		///536		/// # Permissions537		///538		/// * Collection owner.539		///540		/// # Arguments541		///542		/// * collection_id.543		#[weight = <SelfWeightOf<T>>::remove_collection_sponsor()]544		#[transactional]545		pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {546			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);547548			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;549			target_collection.check_is_internal()?;550			target_collection.check_is_owner(&sender)?;551552			target_collection.sponsorship = SponsorshipState::Disabled;553554			<Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorRemoved(555				collection_id556			));557			target_collection.save()558		}559560		/// This method creates a concrete instance of NFT Collection created with CreateCollection method.561		///562		/// # Permissions563		///564		/// * Collection Owner.565		/// * Collection Admin.566		/// * Anyone if567		///     * Allow List is enabled, and568		///     * Address is added to allow list, and569		///     * MintPermission is enabled (see SetMintPermission method)570		///571		/// # Arguments572		///573		/// * collection_id: ID of the collection.574		///575		/// * owner: Address, initial owner of the NFT.576		///577		/// * data: Token data to store on chain.578		#[weight = T::CommonWeightInfo::create_item()]579		#[transactional]580		pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResultWithPostInfo {581			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);582			let budget = budget::Value::new(NESTING_BUDGET);583584			dispatch_tx::<T, _>(collection_id, |d| d.create_item(sender, owner, data, &budget))585		}586587		/// This method creates multiple items in a collection created with CreateCollection method.588		///589		/// # Permissions590		///591		/// * Collection Owner.592		/// * Collection Admin.593		/// * Anyone if594		///     * Allow List is enabled, and595		///     * Address is added to allow list, and596		///     * MintPermission is enabled (see SetMintPermission method)597		///598		/// # Arguments599		///600		/// * collection_id: ID of the collection.601		///602		/// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].603		///604		/// * owner: Address, initial owner of the NFT.605		#[weight = T::CommonWeightInfo::create_multiple_items(&items_data)]606		#[transactional]607		pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResultWithPostInfo {608			ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);609			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);610			let budget = budget::Value::new(NESTING_BUDGET);611612			dispatch_tx::<T, _>(collection_id, |d| d.create_multiple_items(sender, owner, items_data, &budget))613		}614615		#[weight = T::CommonWeightInfo::set_collection_properties(properties.len() as u32)]616		#[transactional]617		pub fn set_collection_properties(618			origin,619			collection_id: CollectionId,620			properties: Vec<Property>621		) -> DispatchResultWithPostInfo {622			ensure!(!properties.is_empty(), Error::<T>::EmptyArgument);623624			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);625626			dispatch_tx::<T, _>(collection_id, |d| d.set_collection_properties(sender, properties))627		}628629		#[weight = T::CommonWeightInfo::delete_collection_properties(property_keys.len() as u32)]630		#[transactional]631		pub fn delete_collection_properties(632			origin,633			collection_id: CollectionId,634			property_keys: Vec<PropertyKey>,635		) -> DispatchResultWithPostInfo {636			ensure!(!property_keys.is_empty(), Error::<T>::EmptyArgument);637638			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);639640			dispatch_tx::<T, _>(collection_id, |d| d.delete_collection_properties(&sender, property_keys))641		}642643		#[weight = T::CommonWeightInfo::set_token_properties(properties.len() as u32)]644		#[transactional]645		pub fn set_token_properties(646			origin,647			collection_id: CollectionId,648			token_id: TokenId,649			properties: Vec<Property>650		) -> DispatchResultWithPostInfo {651			ensure!(!properties.is_empty(), Error::<T>::EmptyArgument);652653			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);654655			dispatch_tx::<T, _>(collection_id, |d| d.set_token_properties(sender, token_id, properties))656		}657658		#[weight = T::CommonWeightInfo::delete_token_properties(property_keys.len() as u32)]659		#[transactional]660		pub fn delete_token_properties(661			origin,662			collection_id: CollectionId,663			token_id: TokenId,664			property_keys: Vec<PropertyKey>665		) -> DispatchResultWithPostInfo {666			ensure!(!property_keys.is_empty(), Error::<T>::EmptyArgument);667668			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);669670			dispatch_tx::<T, _>(collection_id, |d| d.delete_token_properties(sender, token_id, property_keys))671		}672673		#[weight = T::CommonWeightInfo::set_token_property_permissions(property_permissions.len() as u32)]674		#[transactional]675		pub fn set_token_property_permissions(676			origin,677			collection_id: CollectionId,678			property_permissions: Vec<PropertyKeyPermission>,679		) -> DispatchResultWithPostInfo {680			ensure!(!property_permissions.is_empty(), Error::<T>::EmptyArgument);681682			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);683684			dispatch_tx::<T, _>(collection_id, |d| d.set_token_property_permissions(&sender, property_permissions))685		}686687		#[weight = T::CommonWeightInfo::create_multiple_items_ex(&data)]688		#[transactional]689		pub fn create_multiple_items_ex(origin, collection_id: CollectionId, data: CreateItemExData<T::CrossAccountId>) -> DispatchResultWithPostInfo {690			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);691			let budget = budget::Value::new(NESTING_BUDGET);692693			dispatch_tx::<T, _>(collection_id, |d| d.create_multiple_items_ex(sender, data, &budget))694		}695696		/// Set transfers_enabled value for particular collection697		///698		/// # Permissions699		///700		/// * Collection Owner.701		///702		/// # Arguments703		///704		/// * collection_id: ID of the collection.705		///706		/// * value: New flag value.707		#[weight = <SelfWeightOf<T>>::set_transfers_enabled_flag()]708		#[transactional]709		pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {710			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);711			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;712			target_collection.check_is_internal()?;713			target_collection.check_is_owner(&sender)?;714715			// =========716717			target_collection.limits.transfers_enabled = Some(value);718			target_collection.save()719		}720721		/// Destroys a concrete instance of NFT.722		///723		/// # Permissions724		///725		/// * Collection Owner.726		/// * Collection Admin.727		/// * Current NFT Owner.728		///729		/// # Arguments730		///731		/// * collection_id: ID of the collection.732		///733		/// * item_id: ID of NFT to burn.734		#[weight = T::CommonWeightInfo::burn_item()]735		#[transactional]736		pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {737			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);738739			let post_info = dispatch_tx::<T, _>(collection_id, |d| d.burn_item(sender, item_id, value))?;740			if value == 1 {741				<NftTransferBasket<T>>::remove(collection_id, item_id);742				<NftApproveBasket<T>>::remove(collection_id, item_id);743			}744			// Those maps should be cleared only if token disappears completly, need to move this part of logic to pallets?745			// <FungibleApproveBasket<T>>::remove(collection_id, sender.as_sub());746			// <RefungibleApproveBasket<T>>::remove((collection_id, item_id, sender.as_sub()));747			Ok(post_info)748		}749750		/// Destroys a concrete instance of NFT on behalf of the owner751		/// See also: [`approve`]752		///753		/// # Permissions754		///755		/// * Collection Owner.756		/// * Collection Admin.757		/// * Current NFT Owner.758		///759		/// # Arguments760		///761		/// * collection_id: ID of the collection.762		///763		/// * item_id: ID of NFT to burn.764		///765		/// * from: owner of item766		#[weight = T::CommonWeightInfo::burn_from()]767		#[transactional]768		pub fn burn_from(origin, collection_id: CollectionId, from: T::CrossAccountId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {769			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);770			let budget = budget::Value::new(NESTING_BUDGET);771772			dispatch_tx::<T, _>(collection_id, |d| d.burn_from(sender, from, item_id, value, &budget))773		}774775		/// Change ownership of the token.776		///777		/// # Permissions778		///779		/// * Collection Owner780		/// * Collection Admin781		/// * Current NFT owner782		///783		/// # Arguments784		///785		/// * recipient: Address of token recipient.786		///787		/// * collection_id.788		///789		/// * item_id: ID of the item790		///     * Non-Fungible Mode: Required.791		///     * Fungible Mode: Ignored.792		///     * Re-Fungible Mode: Required.793		///794		/// * value: Amount to transfer.795		///     * Non-Fungible Mode: Ignored796		///     * Fungible Mode: Must specify transferred amount797		///     * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)798		#[weight = T::CommonWeightInfo::transfer()]799		#[transactional]800		pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {801			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);802			let budget = budget::Value::new(NESTING_BUDGET);803804			dispatch_tx::<T, _>(collection_id, |d| d.transfer(sender, recipient, item_id, value, &budget))805		}806807		/// Set, change, or remove approved address to transfer the ownership of the NFT.808		///809		/// # Permissions810		///811		/// * Collection Owner812		/// * Collection Admin813		/// * Current NFT owner814		///815		/// # Arguments816		///817		/// * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).818		///819		/// * collection_id.820		///821		/// * item_id: ID of the item.822		#[weight = T::CommonWeightInfo::approve()]823		#[transactional]824		pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {825			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);826827			dispatch_tx::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))828		}829830		/// 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.831		///832		/// # Permissions833		/// * Collection Owner834		/// * Collection Admin835		/// * Current NFT owner836		/// * Address approved by current NFT owner837		///838		/// # Arguments839		///840		/// * from: Address that owns token.841		///842		/// * recipient: Address of token recipient.843		///844		/// * collection_id.845		///846		/// * item_id: ID of the item.847		///848		/// * value: Amount to transfer.849		#[weight = T::CommonWeightInfo::transfer_from()]850		#[transactional]851		pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResultWithPostInfo {852			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);853			let budget = budget::Value::new(NESTING_BUDGET);854855			dispatch_tx::<T, _>(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value, &budget))856		}857858		#[weight = <SelfWeightOf<T>>::set_collection_limits()]859		#[transactional]860		pub fn set_collection_limits(861			origin,862			collection_id: CollectionId,863			new_limit: CollectionLimits,864		) -> DispatchResult {865			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);866			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;867			target_collection.check_is_internal()?;868			target_collection.check_is_owner_or_admin(&sender)?;869			let old_limit = &target_collection.limits;870871			target_collection.limits = <PalletCommon<T>>::clamp_limits(target_collection.mode.clone(), &old_limit, new_limit)?;872873			<Pallet<T>>::deposit_event(Event::<T>::CollectionLimitSet(874				collection_id875			));876877			target_collection.save()878		}879880		#[weight = <SelfWeightOf<T>>::set_collection_limits()]881		#[transactional]882		pub fn set_collection_permissions(883			origin,884			collection_id: CollectionId,885			new_limit: CollectionPermissions,886		) -> DispatchResult {887			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);888			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;889			target_collection.check_is_internal()?;890			target_collection.check_is_owner_or_admin(&sender)?;891			let old_limit = &target_collection.permissions;892893			target_collection.permissions = <PalletCommon<T>>::clamp_permissions(target_collection.mode.clone(), &old_limit, new_limit)?;894895			<Pallet<T>>::deposit_event(Event::<T>::CollectionPermissionSet(896				collection_id897			));898899			target_collection.save()900		}901	}902}
after · pallets/unique/src/lib.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617#![recursion_limit = "1024"]18#![cfg_attr(not(feature = "std"), no_std)]19#![allow(20	clippy::too_many_arguments,21	clippy::unnecessary_mut_passed,22	clippy::unused_unit23)]2425extern crate alloc;2627use frame_support::{28	decl_module, decl_storage, decl_error, decl_event,29	dispatch::DispatchResult,30	ensure, fail,31	weights::{Weight},32	transactional,33	pallet_prelude::{DispatchResultWithPostInfo, ConstU32},34	BoundedVec,35};36use scale_info::TypeInfo;37use frame_system::{self as system, ensure_signed};38use sp_runtime::{sp_std::prelude::Vec};39use up_data_structs::{40	MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH,41	CreateItemData, CollectionLimits, CollectionPermissions, CollectionId, CollectionMode, TokenId,42	SponsorshipState, CreateCollectionData, CreateItemExData, budget, Property, PropertyKey,43	PropertyKeyPermission,44};45use pallet_evm::account::CrossAccountId;46use pallet_common::{47	CollectionHandle, Pallet as PalletCommon, CommonWeightInfo, dispatch::dispatch_tx,48	dispatch::CollectionDispatch,49};50use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle};51pub mod eth;5253#[cfg(feature = "runtime-benchmarks")]54mod benchmarking;55pub mod weights;56use weights::WeightInfo;5758const NESTING_BUDGET: u32 = 5;5960decl_error! {61	/// Error for non-fungible-token module.62	pub enum Error for Module<T: Config> {63		/// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.64		CollectionDecimalPointLimitExceeded,65		/// This address is not set as sponsor, use setCollectionSponsor first.66		ConfirmUnsetSponsorFail,67		/// Length of items properties must be greater than 0.68		EmptyArgument,69		/// Repertition is only supported by refungible collection70		RepartitionCalledOnNonRefungibleCollection,71	}72}7374pub trait Config:75	system::Config + pallet_common::Config + pallet_refungible::Config + Sized + TypeInfo76{77	type Event: From<Event<Self>> + Into<<Self as frame_system::Config>::Event>;7879	/// Weight information for extrinsics in this pallet.80	type WeightInfo: WeightInfo;81	type CommonWeightInfo: CommonWeightInfo<Self::CrossAccountId>;82}8384decl_event! {85	pub enum Event<T>86	where87		<T as frame_system::Config>::AccountId,88		<T as pallet_evm::account::Config>::CrossAccountId,89	{90		/// Collection sponsor was removed91		///92		/// # Arguments93		///94		/// * collection_id: Globally unique collection identifier.95		CollectionSponsorRemoved(CollectionId),9697		/// Collection admin was added98		///99		/// # Arguments100		///101		/// * collection_id: Globally unique collection identifier.102		///103		/// * admin:  Admin address.104		CollectionAdminAdded(CollectionId, CrossAccountId),105106		/// Collection owned was change107		///108		/// # Arguments109		///110		/// * collection_id: Globally unique collection identifier.111		///112		/// * owner:  New owner address.113		CollectionOwnedChanged(CollectionId, AccountId),114115		/// Collection sponsor was set116		///117		/// # Arguments118		///119		/// * collection_id: Globally unique collection identifier.120		///121		/// * owner:  New sponsor address.122		CollectionSponsorSet(CollectionId, AccountId),123124		/// New sponsor was confirm125		///126		/// # Arguments127		///128		/// * collection_id: Globally unique collection identifier.129		///130		/// * sponsor:  New sponsor address.131		SponsorshipConfirmed(CollectionId, AccountId),132133		/// Collection admin was removed134		///135		/// # Arguments136		///137		/// * collection_id: Globally unique collection identifier.138		///139		/// * admin:  Admin address.140		CollectionAdminRemoved(CollectionId, CrossAccountId),141142		/// Address was remove from allow list143		///144		/// # Arguments145		///146		/// * collection_id: Globally unique collection identifier.147		///148		/// * user:  Address.149		AllowListAddressRemoved(CollectionId, CrossAccountId),150151		/// Address was add to allow list152		///153		/// # Arguments154		///155		/// * collection_id: Globally unique collection identifier.156		///157		/// * user:  Address.158		AllowListAddressAdded(CollectionId, CrossAccountId),159160		/// Collection limits was set161		///162		/// # Arguments163		///164		/// * collection_id: Globally unique collection identifier.165		CollectionLimitSet(CollectionId),166167		CollectionPermissionSet(CollectionId),168	}169}170171type SelfWeightOf<T> = <T as Config>::WeightInfo;172173// # Used definitions174//175// ## User control levels176//177// chain-controlled - key is uncontrolled by user178//                    i.e autoincrementing index179//                    can use non-cryptographic hash180// real - key is controlled by user181//        but it is hard to generate enough colliding values, i.e owner of signed txs182//        can use non-cryptographic hash183// controlled - key is completly controlled by users184//              i.e maps with mutable keys185//              should use cryptographic hash186//187// ## User control level downgrade reasons188//189// ?1 - chain-controlled -> controlled190//      collections/tokens can be destroyed, resulting in massive holes191// ?2 - chain-controlled -> controlled192//      same as ?1, but can be only added, resulting in easier exploitation193// ?3 - real -> controlled194//      no confirmation required, so addresses can be easily generated195decl_storage! {196	trait Store for Module<T: Config> as Unique {197198		//#region Private members199		/// Used for migrations200		ChainVersion: u64;201		//#endregion202203		//#region Tokens transfer rate limit baskets204		/// (Collection id (controlled?2), who created (real))205		/// TODO: Off chain worker should remove from this map when collection gets removed206		pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => Option<T::BlockNumber>;207		/// Collection id (controlled?2), token id (controlled?2)208		pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;209		/// Collection id (controlled?2), owning user (real)210		pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;211		/// Collection id (controlled?2), token id (controlled?2)212		pub ReFungibleTransferBasket get(fn refungible_transfer_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;213		//#endregion214215		/// Variable metadata sponsoring216		/// Collection id (controlled?2), token id (controlled?2)217		#[deprecated]218		pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;219		pub TokenPropertyBasket get(fn token_property_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;220221		/// Approval sponsoring222		pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;223		pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;224		pub RefungibleApproveBasket get(fn refungible_approve_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;225	}226}227228decl_module! {229	pub struct Module<T: Config> for enum Call230	where231		origin: T::Origin232	{233		type Error = Error<T>;234235		fn deposit_event() = default;236237		fn on_initialize(_now: T::BlockNumber) -> Weight {238			0239		}240241		fn on_runtime_upgrade() -> Weight {242			let limit = None;243244			<VariableMetaDataBasket<T>>::remove_all(limit);245246			0247		}248249		/// 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.250		///251		/// # Permissions252		///253		/// * Anyone.254		///255		/// # Arguments256		///257		/// * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.258		///259		/// * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.260		///261		/// * token_prefix: UTF-8 string with token prefix.262		///263		/// * mode: [CollectionMode] collection type and type dependent data.264		// returns collection ID265		#[weight = <SelfWeightOf<T>>::create_collection()]266		#[transactional]267		#[deprecated]268		pub fn create_collection(origin,269								 collection_name: BoundedVec<u16, ConstU32<MAX_COLLECTION_NAME_LENGTH>>,270								 collection_description: BoundedVec<u16, ConstU32<MAX_COLLECTION_DESCRIPTION_LENGTH>>,271								 token_prefix: BoundedVec<u8, ConstU32<MAX_TOKEN_PREFIX_LENGTH>>,272								 mode: CollectionMode) -> DispatchResult  {273			let data: CreateCollectionData<T::AccountId> = CreateCollectionData {274				name: collection_name,275				description: collection_description,276				token_prefix,277				mode,278				..Default::default()279			};280			Self::create_collection_ex(origin, data)281		}282283		/// This method creates a collection284		///285		/// Prefer it to deprecated [`created_collection`] method286		#[weight = <SelfWeightOf<T>>::create_collection()]287		#[transactional]288		pub fn create_collection_ex(origin, data: CreateCollectionData<T::AccountId>) -> DispatchResult {289			let sender = ensure_signed(origin)?;290291			// =========292293			T::CollectionDispatch::create(T::CrossAccountId::from_sub(sender), data)?;294295			Ok(())296		}297298		/// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.299		///300		/// # Permissions301		///302		/// * Collection Owner.303		///304		/// # Arguments305		///306		/// * collection_id: collection to destroy.307		#[weight = <SelfWeightOf<T>>::destroy_collection()]308		#[transactional]309		pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {310			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);311			let collection = <CollectionHandle<T>>::try_get(collection_id)?;312			collection.check_is_internal()?;313314			// =========315316			T::CollectionDispatch::destroy(sender, collection)?;317318			<NftTransferBasket<T>>::remove_prefix(collection_id, None);319			<FungibleTransferBasket<T>>::remove_prefix(collection_id, None);320			<ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);321322			<NftApproveBasket<T>>::remove_prefix(collection_id, None);323			<FungibleApproveBasket<T>>::remove_prefix(collection_id, None);324			<RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);325326			Ok(())327		}328329		/// Add an address to allow list.330		///331		/// # Permissions332		///333		/// * Collection Owner334		/// * Collection Admin335		///336		/// # Arguments337		///338		/// * collection_id.339		///340		/// * address.341		#[weight = <SelfWeightOf<T>>::add_to_allow_list()]342		#[transactional]343		pub fn add_to_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{344345			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);346			let collection = <CollectionHandle<T>>::try_get(collection_id)?;347			collection.check_is_internal()?;348349			<PalletCommon<T>>::toggle_allowlist(350				&collection,351				&sender,352				&address,353				true,354			)?;355356			Self::deposit_event(Event::<T>::AllowListAddressAdded(357				collection_id,358				address359			));360361			Ok(())362		}363364		/// Remove an address from allow list.365		///366		/// # Permissions367		///368		/// * Collection Owner369		/// * Collection Admin370		///371		/// # Arguments372		///373		/// * collection_id.374		///375		/// * address.376		#[weight = <SelfWeightOf<T>>::remove_from_allow_list()]377		#[transactional]378		pub fn remove_from_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{379380			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);381			let collection = <CollectionHandle<T>>::try_get(collection_id)?;382			collection.check_is_internal()?;383384			<PalletCommon<T>>::toggle_allowlist(385				&collection,386				&sender,387				&address,388				false,389			)?;390391			<Pallet<T>>::deposit_event(Event::<T>::AllowListAddressRemoved(392				collection_id,393				address394			));395396			Ok(())397		}398399		/// Change the owner of the collection.400		///401		/// # Permissions402		///403		/// * Collection Owner.404		///405		/// # Arguments406		///407		/// * collection_id.408		///409		/// * new_owner.410		#[weight = <SelfWeightOf<T>>::change_collection_owner()]411		#[transactional]412		pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {413414			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);415416			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;417			target_collection.check_is_internal()?;418			target_collection.check_is_owner(&sender)?;419420			target_collection.owner = new_owner.clone();421			<Pallet<T>>::deposit_event(Event::<T>::CollectionOwnedChanged(422				collection_id,423				new_owner424			));425426			target_collection.save()427		}428429		/// Adds an admin of the Collection.430		/// 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.431		///432		/// # Permissions433		///434		/// * Collection Owner.435		/// * Collection Admin.436		///437		/// # Arguments438		///439		/// * collection_id: ID of the Collection to add admin for.440		///441		/// * new_admin_id: Address of new admin to add.442		#[weight = <SelfWeightOf<T>>::add_collection_admin()]443		#[transactional]444		pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {445			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);446			let collection = <CollectionHandle<T>>::try_get(collection_id)?;447			collection.check_is_internal()?;448449			<Pallet<T>>::deposit_event(Event::<T>::CollectionAdminAdded(450				collection_id,451				new_admin_id.clone()452			));453454			<PalletCommon<T>>::toggle_admin(&collection, &sender, &new_admin_id, true)455		}456457		/// 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.458		///459		/// # Permissions460		///461		/// * Collection Owner.462		/// * Collection Admin.463		///464		/// # Arguments465		///466		/// * collection_id: ID of the Collection to remove admin for.467		///468		/// * account_id: Address of admin to remove.469		#[weight = <SelfWeightOf<T>>::remove_collection_admin()]470		#[transactional]471		pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {472			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);473			let collection = <CollectionHandle<T>>::try_get(collection_id)?;474			collection.check_is_internal()?;475476			<Pallet<T>>::deposit_event(Event::<T>::CollectionAdminRemoved(477				collection_id,478				account_id.clone()479			));480481			<PalletCommon<T>>::toggle_admin(&collection, &sender, &account_id, false)482		}483484		/// # Permissions485		///486		/// * Collection Owner487		///488		/// # Arguments489		///490		/// * collection_id.491		///492		/// * new_sponsor.493		#[weight = <SelfWeightOf<T>>::set_collection_sponsor()]494		#[transactional]495		pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {496			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);497498			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;499			target_collection.check_is_owner_or_admin(&sender)?;500			target_collection.check_is_internal()?;501502			target_collection.set_sponsor(new_sponsor.clone())?;503504			<Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorSet(505				collection_id,506				new_sponsor507			));508509			target_collection.save()510		}511512		/// # Permissions513		///514		/// * Sponsor.515		///516		/// # Arguments517		///518		/// * collection_id.519		#[weight = <SelfWeightOf<T>>::confirm_sponsorship()]520		#[transactional]521		pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {522			let sender = ensure_signed(origin)?;523524			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;525			target_collection.check_is_internal()?;526			ensure!(527				target_collection.confirm_sponsorship(&sender)?,528				Error::<T>::ConfirmUnsetSponsorFail529			);530531			<Pallet<T>>::deposit_event(Event::<T>::SponsorshipConfirmed(532				collection_id,533				sender534			));535536			target_collection.save()537		}538539		/// Switch back to pay-per-own-transaction model.540		///541		/// # Permissions542		///543		/// * Collection owner.544		///545		/// # Arguments546		///547		/// * collection_id.548		#[weight = <SelfWeightOf<T>>::remove_collection_sponsor()]549		#[transactional]550		pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {551			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);552553			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;554			target_collection.check_is_internal()?;555			target_collection.check_is_owner(&sender)?;556557			target_collection.sponsorship = SponsorshipState::Disabled;558559			<Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorRemoved(560				collection_id561			));562			target_collection.save()563		}564565		/// This method creates a concrete instance of NFT Collection created with CreateCollection method.566		///567		/// # Permissions568		///569		/// * Collection Owner.570		/// * Collection Admin.571		/// * Anyone if572		///     * Allow List is enabled, and573		///     * Address is added to allow list, and574		///     * MintPermission is enabled (see SetMintPermission method)575		///576		/// # Arguments577		///578		/// * collection_id: ID of the collection.579		///580		/// * owner: Address, initial owner of the NFT.581		///582		/// * data: Token data to store on chain.583		#[weight = T::CommonWeightInfo::create_item()]584		#[transactional]585		pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResultWithPostInfo {586			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);587			let budget = budget::Value::new(NESTING_BUDGET);588589			dispatch_tx::<T, _>(collection_id, |d| d.create_item(sender, owner, data, &budget))590		}591592		/// This method creates multiple items in a collection created with CreateCollection method.593		///594		/// # Permissions595		///596		/// * Collection Owner.597		/// * Collection Admin.598		/// * Anyone if599		///     * Allow List is enabled, and600		///     * Address is added to allow list, and601		///     * MintPermission is enabled (see SetMintPermission method)602		///603		/// # Arguments604		///605		/// * collection_id: ID of the collection.606		///607		/// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].608		///609		/// * owner: Address, initial owner of the NFT.610		#[weight = T::CommonWeightInfo::create_multiple_items(&items_data)]611		#[transactional]612		pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResultWithPostInfo {613			ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);614			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);615			let budget = budget::Value::new(NESTING_BUDGET);616617			dispatch_tx::<T, _>(collection_id, |d| d.create_multiple_items(sender, owner, items_data, &budget))618		}619620		#[weight = T::CommonWeightInfo::set_collection_properties(properties.len() as u32)]621		#[transactional]622		pub fn set_collection_properties(623			origin,624			collection_id: CollectionId,625			properties: Vec<Property>626		) -> DispatchResultWithPostInfo {627			ensure!(!properties.is_empty(), Error::<T>::EmptyArgument);628629			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);630631			dispatch_tx::<T, _>(collection_id, |d| d.set_collection_properties(sender, properties))632		}633634		#[weight = T::CommonWeightInfo::delete_collection_properties(property_keys.len() as u32)]635		#[transactional]636		pub fn delete_collection_properties(637			origin,638			collection_id: CollectionId,639			property_keys: Vec<PropertyKey>,640		) -> DispatchResultWithPostInfo {641			ensure!(!property_keys.is_empty(), Error::<T>::EmptyArgument);642643			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);644645			dispatch_tx::<T, _>(collection_id, |d| d.delete_collection_properties(&sender, property_keys))646		}647648		#[weight = T::CommonWeightInfo::set_token_properties(properties.len() as u32)]649		#[transactional]650		pub fn set_token_properties(651			origin,652			collection_id: CollectionId,653			token_id: TokenId,654			properties: Vec<Property>655		) -> DispatchResultWithPostInfo {656			ensure!(!properties.is_empty(), Error::<T>::EmptyArgument);657658			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);659660			dispatch_tx::<T, _>(collection_id, |d| d.set_token_properties(sender, token_id, properties))661		}662663		#[weight = T::CommonWeightInfo::delete_token_properties(property_keys.len() as u32)]664		#[transactional]665		pub fn delete_token_properties(666			origin,667			collection_id: CollectionId,668			token_id: TokenId,669			property_keys: Vec<PropertyKey>670		) -> DispatchResultWithPostInfo {671			ensure!(!property_keys.is_empty(), Error::<T>::EmptyArgument);672673			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);674675			dispatch_tx::<T, _>(collection_id, |d| d.delete_token_properties(sender, token_id, property_keys))676		}677678		#[weight = T::CommonWeightInfo::set_token_property_permissions(property_permissions.len() as u32)]679		#[transactional]680		pub fn set_token_property_permissions(681			origin,682			collection_id: CollectionId,683			property_permissions: Vec<PropertyKeyPermission>,684		) -> DispatchResultWithPostInfo {685			ensure!(!property_permissions.is_empty(), Error::<T>::EmptyArgument);686687			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);688689			dispatch_tx::<T, _>(collection_id, |d| d.set_token_property_permissions(&sender, property_permissions))690		}691692		#[weight = T::CommonWeightInfo::create_multiple_items_ex(&data)]693		#[transactional]694		pub fn create_multiple_items_ex(origin, collection_id: CollectionId, data: CreateItemExData<T::CrossAccountId>) -> DispatchResultWithPostInfo {695			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);696			let budget = budget::Value::new(NESTING_BUDGET);697698			dispatch_tx::<T, _>(collection_id, |d| d.create_multiple_items_ex(sender, data, &budget))699		}700701		/// Set transfers_enabled value for particular collection702		///703		/// # Permissions704		///705		/// * Collection Owner.706		///707		/// # Arguments708		///709		/// * collection_id: ID of the collection.710		///711		/// * value: New flag value.712		#[weight = <SelfWeightOf<T>>::set_transfers_enabled_flag()]713		#[transactional]714		pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {715			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);716			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;717			target_collection.check_is_internal()?;718			target_collection.check_is_owner(&sender)?;719720			// =========721722			target_collection.limits.transfers_enabled = Some(value);723			target_collection.save()724		}725726		/// Destroys a concrete instance of NFT.727		///728		/// # Permissions729		///730		/// * Collection Owner.731		/// * Collection Admin.732		/// * Current NFT Owner.733		///734		/// # Arguments735		///736		/// * collection_id: ID of the collection.737		///738		/// * item_id: ID of NFT to burn.739		#[weight = T::CommonWeightInfo::burn_item()]740		#[transactional]741		pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {742			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);743744			let post_info = dispatch_tx::<T, _>(collection_id, |d| d.burn_item(sender, item_id, value))?;745			if value == 1 {746				<NftTransferBasket<T>>::remove(collection_id, item_id);747				<NftApproveBasket<T>>::remove(collection_id, item_id);748			}749			// Those maps should be cleared only if token disappears completly, need to move this part of logic to pallets?750			// <FungibleApproveBasket<T>>::remove(collection_id, sender.as_sub());751			// <RefungibleApproveBasket<T>>::remove((collection_id, item_id, sender.as_sub()));752			Ok(post_info)753		}754755		/// Destroys a concrete instance of NFT on behalf of the owner756		/// See also: [`approve`]757		///758		/// # Permissions759		///760		/// * Collection Owner.761		/// * Collection Admin.762		/// * Current NFT Owner.763		///764		/// # Arguments765		///766		/// * collection_id: ID of the collection.767		///768		/// * item_id: ID of NFT to burn.769		///770		/// * from: owner of item771		#[weight = T::CommonWeightInfo::burn_from()]772		#[transactional]773		pub fn burn_from(origin, collection_id: CollectionId, from: T::CrossAccountId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {774			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);775			let budget = budget::Value::new(NESTING_BUDGET);776777			dispatch_tx::<T, _>(collection_id, |d| d.burn_from(sender, from, item_id, value, &budget))778		}779780		/// Change ownership of the token.781		///782		/// # Permissions783		///784		/// * Collection Owner785		/// * Collection Admin786		/// * Current NFT owner787		///788		/// # Arguments789		///790		/// * recipient: Address of token recipient.791		///792		/// * collection_id.793		///794		/// * item_id: ID of the item795		///     * Non-Fungible Mode: Required.796		///     * Fungible Mode: Ignored.797		///     * Re-Fungible Mode: Required.798		///799		/// * value: Amount to transfer.800		///     * Non-Fungible Mode: Ignored801		///     * Fungible Mode: Must specify transferred amount802		///     * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)803		#[weight = T::CommonWeightInfo::transfer()]804		#[transactional]805		pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {806			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);807			let budget = budget::Value::new(NESTING_BUDGET);808809			dispatch_tx::<T, _>(collection_id, |d| d.transfer(sender, recipient, item_id, value, &budget))810		}811812		/// Set, change, or remove approved address to transfer the ownership of the NFT.813		///814		/// # Permissions815		///816		/// * Collection Owner817		/// * Collection Admin818		/// * Current NFT owner819		///820		/// # Arguments821		///822		/// * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).823		///824		/// * collection_id.825		///826		/// * item_id: ID of the item.827		#[weight = T::CommonWeightInfo::approve()]828		#[transactional]829		pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {830			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);831832			dispatch_tx::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))833		}834835		/// 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.836		///837		/// # Permissions838		/// * Collection Owner839		/// * Collection Admin840		/// * Current NFT owner841		/// * Address approved by current NFT owner842		///843		/// # Arguments844		///845		/// * from: Address that owns token.846		///847		/// * recipient: Address of token recipient.848		///849		/// * collection_id.850		///851		/// * item_id: ID of the item.852		///853		/// * value: Amount to transfer.854		#[weight = T::CommonWeightInfo::transfer_from()]855		#[transactional]856		pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResultWithPostInfo {857			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);858			let budget = budget::Value::new(NESTING_BUDGET);859860			dispatch_tx::<T, _>(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value, &budget))861		}862863		#[weight = <SelfWeightOf<T>>::set_collection_limits()]864		#[transactional]865		pub fn set_collection_limits(866			origin,867			collection_id: CollectionId,868			new_limit: CollectionLimits,869		) -> DispatchResult {870			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);871			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;872			target_collection.check_is_internal()?;873			target_collection.check_is_owner_or_admin(&sender)?;874			let old_limit = &target_collection.limits;875876			target_collection.limits = <PalletCommon<T>>::clamp_limits(target_collection.mode.clone(), &old_limit, new_limit)?;877878			<Pallet<T>>::deposit_event(Event::<T>::CollectionLimitSet(879				collection_id880			));881882			target_collection.save()883		}884885		#[weight = <SelfWeightOf<T>>::set_collection_limits()]886		#[transactional]887		pub fn set_collection_permissions(888			origin,889			collection_id: CollectionId,890			new_limit: CollectionPermissions,891		) -> DispatchResult {892			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);893			let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;894			target_collection.check_is_internal()?;895			target_collection.check_is_owner_or_admin(&sender)?;896			let old_limit = &target_collection.permissions;897898			target_collection.permissions = <PalletCommon<T>>::clamp_permissions(target_collection.mode.clone(), &old_limit, new_limit)?;899900			<Pallet<T>>::deposit_event(Event::<T>::CollectionPermissionSet(901				collection_id902			));903904			target_collection.save()905		}906907		#[weight = <SelfWeightOf<T>>::set_collection_limits()]908		#[transactional]909		pub fn repartition(910			origin,911			collection_id: CollectionId,912			token: TokenId,913			amount: u128,914		) -> DispatchResult {915			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);916			let target_collection = <CollectionHandle<T>>::try_get(collection_id)?;917			target_collection.check_is_internal()?;918			let refungible_collection = match target_collection.mode {919				CollectionMode::ReFungible => RefungibleHandle::cast(target_collection),920				_ => fail!(<Error<T>>::RepartitionCalledOnNonRefungibleCollection),921			};922			<PalletRefungible<T>>::repartition(&sender, &refungible_collection, token, amount)?;923			Ok(())924		}925	}926}
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -78,6 +78,7 @@
     "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts",
     "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",
     "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/interfaces/augment-api-consts.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-consts.ts
+++ b/tests/src/interfaces/augment-api-consts.ts
@@ -2,10 +2,10 @@
 /* eslint-disable */
 
 import type { ApiTypes } from '@polkadot/api-base/types';
-import type { Option, Vec, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
+import type { Option, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { Codec } from '@polkadot/types-codec/types';
 import type { Permill } from '@polkadot/types/interfaces/runtime';
-import type { FrameSupportPalletId, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, SpVersionRuntimeVersion } from '@polkadot/types/lookup';
+import type { FrameSupportPalletId, FrameSupportWeightsRuntimeDbWeight, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, SpVersionRuntimeVersion } from '@polkadot/types/lookup';
 
 declare module '@polkadot/api-base/types/consts' {
   export interface AugmentedConsts<ApiType extends ApiTypes> {
@@ -110,10 +110,6 @@
       [key: string]: Codec;
     };
     transactionPayment: {
-      /**
-       * The polynomial that is applied in order to derive fee from length.
-       **/
-      lengthToFee: Vec<FrameSupportWeightsWeightToFeeCoefficient> & AugmentedConst<ApiType>;
       /**
        * A fee mulitplier for `Operational` extrinsics to compute "virtual tip" to boost their
        * `priority`
@@ -138,10 +134,6 @@
        * transactions.
        **/
       operationalFeeMultiplier: u8 & AugmentedConst<ApiType>;
-      /**
-       * The polynomial that is applied in order to derive fee from weight.
-       **/
-      weightToFee: Vec<FrameSupportWeightsWeightToFeeCoefficient> & 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
@@ -429,6 +429,10 @@
        **/
       RefungibleDisallowsNesting: AugmentedError<ApiType>;
       /**
+       * Refungible token can't be repartitioned by user who isn't owns all pieces
+       **/
+      RepartitionWhileNotOwningAllPieces: AugmentedError<ApiType>;
+      /**
        * Setting item properties is not allowed
        **/
       SettingPropertiesNotAllowed: AugmentedError<ApiType>;
@@ -444,6 +448,7 @@
     rmrkCore: {
       CannotAcceptNonOwnedNft: AugmentedError<ApiType>;
       CannotRejectNonOwnedNft: AugmentedError<ApiType>;
+      CannotRejectNonPendingNft: AugmentedError<ApiType>;
       CannotSendToDescendentOrSelf: AugmentedError<ApiType>;
       CollectionFullOrLocked: AugmentedError<ApiType>;
       CollectionNotEmpty: AugmentedError<ApiType>;
@@ -452,10 +457,12 @@
       NftTypeEncodeError: AugmentedError<ApiType>;
       NoAvailableCollectionId: AugmentedError<ApiType>;
       NoAvailableNftId: AugmentedError<ApiType>;
+      NoAvailableResourceId: AugmentedError<ApiType>;
       NonTransferable: AugmentedError<ApiType>;
       NoPermission: AugmentedError<ApiType>;
       ResourceDoesntExist: AugmentedError<ApiType>;
       ResourceNotPending: AugmentedError<ApiType>;
+      RmrkPropertyIsNotFound: AugmentedError<ApiType>;
       RmrkPropertyKeyIsTooLong: AugmentedError<ApiType>;
       RmrkPropertyValueIsTooLong: AugmentedError<ApiType>;
       UnableToDecodeRmrkData: AugmentedError<ApiType>;
@@ -469,6 +476,8 @@
       NeedsDefaultThemeFirst: AugmentedError<ApiType>;
       NoAvailableBaseId: AugmentedError<ApiType>;
       NoAvailablePartId: AugmentedError<ApiType>;
+      NoEquippableOnFixedPart: AugmentedError<ApiType>;
+      PartDoesntExist: AugmentedError<ApiType>;
       PermissionError: AugmentedError<ApiType>;
       /**
        * Generic error
@@ -599,6 +608,10 @@
        **/
       EmptyArgument: AugmentedError<ApiType>;
       /**
+       * Repertition is only supported by refungible collection
+       **/
+      RepartitionCalledOnNonRefungibleCollection: AugmentedError<ApiType>;
+      /**
        * Generic error
        **/
       [key: string]: 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
@@ -166,34 +166,28 @@
     dmpQueue: {
       /**
        * Downward message executed with the given outcome.
-       * \[ id, outcome \]
        **/
-      ExecutedDownward: AugmentedEvent<ApiType, [U8aFixed, XcmV2TraitsOutcome]>;
+      ExecutedDownward: AugmentedEvent<ApiType, [messageId: U8aFixed, outcome: XcmV2TraitsOutcome], { messageId: U8aFixed, outcome: XcmV2TraitsOutcome }>;
       /**
        * Downward message is invalid XCM.
-       * \[ id \]
        **/
-      InvalidFormat: AugmentedEvent<ApiType, [U8aFixed]>;
+      InvalidFormat: AugmentedEvent<ApiType, [messageId: U8aFixed], { messageId: U8aFixed }>;
       /**
        * Downward message is overweight and was placed in the overweight queue.
-       * \[ id, index, required \]
        **/
-      OverweightEnqueued: AugmentedEvent<ApiType, [U8aFixed, u64, u64]>;
+      OverweightEnqueued: AugmentedEvent<ApiType, [messageId: U8aFixed, overweightIndex: u64, requiredWeight: u64], { messageId: U8aFixed, overweightIndex: u64, requiredWeight: u64 }>;
       /**
        * Downward message from the overweight queue was executed.
-       * \[ index, used \]
        **/
-      OverweightServiced: AugmentedEvent<ApiType, [u64, u64]>;
+      OverweightServiced: AugmentedEvent<ApiType, [overweightIndex: u64, weightUsed: u64], { overweightIndex: u64, weightUsed: u64 }>;
       /**
        * Downward message is unsupported version of XCM.
-       * \[ id \]
        **/
-      UnsupportedVersion: AugmentedEvent<ApiType, [U8aFixed]>;
+      UnsupportedVersion: AugmentedEvent<ApiType, [messageId: U8aFixed], { messageId: U8aFixed }>;
       /**
        * The weight limit for handling downward messages was reached.
-       * \[ id, remaining, required \]
        **/
-      WeightExhausted: AugmentedEvent<ApiType, [U8aFixed, u64, u64]>;
+      WeightExhausted: AugmentedEvent<ApiType, [messageId: U8aFixed, remainingWeight: u64, requiredWeight: u64], { messageId: U8aFixed, remainingWeight: u64, requiredWeight: u64 }>;
       /**
        * Generic event
        **/
@@ -246,22 +240,20 @@
     parachainSystem: {
       /**
        * Downward messages were processed using the given weight.
-       * \[ weight_used, result_mqc_head \]
        **/
-      DownwardMessagesProcessed: AugmentedEvent<ApiType, [u64, H256]>;
+      DownwardMessagesProcessed: AugmentedEvent<ApiType, [weightUsed: u64, dmqHead: H256], { weightUsed: u64, dmqHead: H256 }>;
       /**
        * Some downward messages have been received and will be processed.
-       * \[ count \]
        **/
-      DownwardMessagesReceived: AugmentedEvent<ApiType, [u32]>;
+      DownwardMessagesReceived: AugmentedEvent<ApiType, [count: u32], { count: u32 }>;
       /**
        * An upgrade has been authorized.
        **/
-      UpgradeAuthorized: AugmentedEvent<ApiType, [H256]>;
+      UpgradeAuthorized: AugmentedEvent<ApiType, [codeHash: H256], { codeHash: H256 }>;
       /**
        * The validation function was applied as of the contained relay chain block number.
        **/
-      ValidationFunctionApplied: AugmentedEvent<ApiType, [u32]>;
+      ValidationFunctionApplied: AugmentedEvent<ApiType, [relayChainBlockNum: u32], { relayChainBlockNum: u32 }>;
       /**
        * The relay-chain aborted the upgrade process.
        **/
@@ -420,6 +412,7 @@
     };
     rmrkEquip: {
       BaseCreated: AugmentedEvent<ApiType, [issuer: AccountId32, baseId: u32], { issuer: AccountId32, baseId: u32 }>;
+      EquippablesUpdated: AugmentedEvent<ApiType, [baseId: u32, slotId: u32], { baseId: u32, slotId: u32 }>;
       /**
        * Generic event
        **/
modifiedtests/src/interfaces/augment-api-query.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -5,7 +5,7 @@
 import type { BTreeMap, Bytes, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types-codec';
 import type { AnyNumber, ITuple } from '@polkadot/types-codec/types';
 import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
-import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsTokenChild } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsTokenChild } from '@polkadot/types/lookup';
 import type { Observable } from '@polkadot/types/types';
 
 declare module '@polkadot/api-base/types/storage' {
@@ -228,6 +228,7 @@
        * Used to enumerate tokens owned by account
        **/
       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]>;
+      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]>;
       /**
        * Used to enumerate token's children
        **/
modifiedtests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -5,7 +5,7 @@
 import type { Bytes, Compact, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types';
 import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';
-import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, FrameSupportScheduleMaybeHashed, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsPartPartType, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
+import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, FrameSupportScheduleMaybeHashed, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsPartEquippableList, RmrkTraitsPartPartType, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
 
 declare module '@polkadot/api-base/types/submittable' {
   export interface AugmentedSubmittables<ApiType extends ApiTypes> {
@@ -361,11 +361,11 @@
       /**
        * accept the addition of a new resource to an existing NFT
        **/
-      acceptResource: AugmentedSubmittable<(rmrkCollectionId: u32 | AnyNumber | Uint8Array, rmrkNftId: u32 | AnyNumber | Uint8Array, rmrkResourceId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u32]>;
+      acceptResource: AugmentedSubmittable<(rmrkCollectionId: u32 | AnyNumber | Uint8Array, rmrkNftId: u32 | AnyNumber | Uint8Array, resourceId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u32]>;
       /**
        * accept the removal of a resource of an existing NFT
        **/
-      acceptResourceRemoval: AugmentedSubmittable<(rmrkCollectionId: u32 | AnyNumber | Uint8Array, rmrkNftId: u32 | AnyNumber | Uint8Array, rmrkResourceId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u32]>;
+      acceptResourceRemoval: AugmentedSubmittable<(rmrkCollectionId: u32 | AnyNumber | Uint8Array, rmrkNftId: u32 | AnyNumber | Uint8Array, resourceId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u32]>;
       /**
        * Create basic resource
        **/
@@ -415,7 +415,7 @@
        * - `metadata`: Arbitrary data about an nft, e.g. IPFS hash
        * - `transferable`: Ability to transfer this NFT
        **/
-      mintNft: AugmentedSubmittable<(owner: AccountId32 | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, recipient: Option<AccountId32> | null | object | string | Uint8Array, royaltyAmount: Option<Permill> | null | object | string | Uint8Array, metadata: Bytes | string | Uint8Array, transferable: bool | boolean | Uint8Array, resources: Option<Vec<RmrkTraitsResourceResourceTypes>> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [AccountId32, u32, Option<AccountId32>, Option<Permill>, Bytes, bool, Option<Vec<RmrkTraitsResourceResourceTypes>>]>;
+      mintNft: AugmentedSubmittable<(owner: Option<AccountId32> | null | object | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, recipient: Option<AccountId32> | null | object | string | Uint8Array, royaltyAmount: Option<Permill> | null | object | string | Uint8Array, metadata: Bytes | string | Uint8Array, transferable: bool | boolean | Uint8Array, resources: Option<Vec<RmrkTraitsResourceResourceTypes>> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Option<AccountId32>, u32, Option<AccountId32>, Option<Permill>, Bytes, bool, Option<Vec<RmrkTraitsResourceResourceTypes>>]>;
       /**
        * Rejects an NFT sent from another account to self or owned NFT
        * 
@@ -465,6 +465,7 @@
        * RmrkPartsLimit
        **/
       createBase: AugmentedSubmittable<(baseType: Bytes | string | Uint8Array, symbol: Bytes | string | Uint8Array, parts: Vec<RmrkTraitsPartPartType> | (RmrkTraitsPartPartType | { FixedPart: any } | { SlotPart: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [Bytes, Bytes, Vec<RmrkTraitsPartPartType>]>;
+      equippable: AugmentedSubmittable<(baseId: u32 | AnyNumber | Uint8Array, slotId: u32 | AnyNumber | Uint8Array, equippables: RmrkTraitsPartEquippableList | { All: any } | { Empty: any } | { Custom: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, RmrkTraitsPartEquippableList]>;
       /**
        * Adds a Theme to a Base.
        * Modeled after [themeadd interaction](https://github.com/rmrk-team/rmrk-spec/blob/master/standards/rmrk2.0.0/interactions/themeadd.md)
@@ -959,6 +960,7 @@
        * * address.
        **/
       removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
+      repartition: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, token: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
       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]>;
       setCollectionPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: UpDataStructsCollectionPermissions | { access?: any; mintMode?: any; nesting?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionPermissions]>;
       setCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsProperty>]>;
modifiedtests/src/interfaces/augment-types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-types.ts
+++ b/tests/src/interfaces/augment-types.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-defs`, do not edit
 /* eslint-disable */
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default';
 import type { Data, StorageKey } from '@polkadot/types';
 import type { BitVec, Bool, Bytes, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec';
 import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets';
@@ -489,7 +489,6 @@
     FrameSupportWeightsPerDispatchClassU64: FrameSupportWeightsPerDispatchClassU64;
     FrameSupportWeightsPerDispatchClassWeightsPerClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;
     FrameSupportWeightsRuntimeDbWeight: FrameSupportWeightsRuntimeDbWeight;
-    FrameSupportWeightsWeightToFeeCoefficient: FrameSupportWeightsWeightToFeeCoefficient;
     FrameSystemAccountInfo: FrameSystemAccountInfo;
     FrameSystemCall: FrameSystemCall;
     FrameSystemError: FrameSystemError;
@@ -1226,6 +1225,7 @@
     UpDataStructsProperty: UpDataStructsProperty;
     UpDataStructsPropertyKeyPermission: UpDataStructsPropertyKeyPermission;
     UpDataStructsPropertyPermission: UpDataStructsPropertyPermission;
+    UpDataStructsPropertyScope: UpDataStructsPropertyScope;
     UpDataStructsRpcCollection: UpDataStructsRpcCollection;
     UpDataStructsSponsoringRateLimit: UpDataStructsSponsoringRateLimit;
     UpDataStructsSponsorshipState: UpDataStructsSponsorshipState;
modifiedtests/src/interfaces/default/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/default/types.ts
+++ b/tests/src/interfaces/default/types.ts
@@ -31,17 +31,35 @@
 /** @name CumulusPalletDmpQueueEvent */
 export interface CumulusPalletDmpQueueEvent extends Enum {
   readonly isInvalidFormat: boolean;
-  readonly asInvalidFormat: U8aFixed;
+  readonly asInvalidFormat: {
+    readonly messageId: U8aFixed;
+  } & Struct;
   readonly isUnsupportedVersion: boolean;
-  readonly asUnsupportedVersion: U8aFixed;
+  readonly asUnsupportedVersion: {
+    readonly messageId: U8aFixed;
+  } & Struct;
   readonly isExecutedDownward: boolean;
-  readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;
+  readonly asExecutedDownward: {
+    readonly messageId: U8aFixed;
+    readonly outcome: XcmV2TraitsOutcome;
+  } & Struct;
   readonly isWeightExhausted: boolean;
-  readonly asWeightExhausted: ITuple<[U8aFixed, u64, u64]>;
+  readonly asWeightExhausted: {
+    readonly messageId: U8aFixed;
+    readonly remainingWeight: u64;
+    readonly requiredWeight: u64;
+  } & Struct;
   readonly isOverweightEnqueued: boolean;
-  readonly asOverweightEnqueued: ITuple<[U8aFixed, u64, u64]>;
+  readonly asOverweightEnqueued: {
+    readonly messageId: U8aFixed;
+    readonly overweightIndex: u64;
+    readonly requiredWeight: u64;
+  } & Struct;
   readonly isOverweightServiced: boolean;
-  readonly asOverweightServiced: ITuple<[u64, u64]>;
+  readonly asOverweightServiced: {
+    readonly overweightIndex: u64;
+    readonly weightUsed: u64;
+  } & Struct;
   readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';
 }
 
@@ -90,14 +108,23 @@
 export interface CumulusPalletParachainSystemEvent extends Enum {
   readonly isValidationFunctionStored: boolean;
   readonly isValidationFunctionApplied: boolean;
-  readonly asValidationFunctionApplied: u32;
+  readonly asValidationFunctionApplied: {
+    readonly relayChainBlockNum: u32;
+  } & Struct;
   readonly isValidationFunctionDiscarded: boolean;
   readonly isUpgradeAuthorized: boolean;
-  readonly asUpgradeAuthorized: H256;
+  readonly asUpgradeAuthorized: {
+    readonly codeHash: H256;
+  } & Struct;
   readonly isDownwardMessagesReceived: boolean;
-  readonly asDownwardMessagesReceived: u32;
+  readonly asDownwardMessagesReceived: {
+    readonly count: u32;
+  } & Struct;
   readonly isDownwardMessagesProcessed: boolean;
-  readonly asDownwardMessagesProcessed: ITuple<[u64, H256]>;
+  readonly asDownwardMessagesProcessed: {
+    readonly weightUsed: u64;
+    readonly dmqHead: H256;
+  } & Struct;
   readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';
 }
 
@@ -535,14 +562,6 @@
   readonly write: u64;
 }
 
-/** @name FrameSupportWeightsWeightToFeeCoefficient */
-export interface FrameSupportWeightsWeightToFeeCoefficient extends Struct {
-  readonly coeffInteger: u128;
-  readonly coeffFrac: Perbill;
-  readonly negative: bool;
-  readonly degree: u8;
-}
-
 /** @name FrameSystemAccountInfo */
 export interface FrameSystemAccountInfo extends Struct {
   readonly nonce: u32;
@@ -1175,9 +1194,10 @@
 export interface PalletRefungibleError extends Enum {
   readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;
   readonly isWrongRefungiblePieces: boolean;
+  readonly isRepartitionWhileNotOwningAllPieces: boolean;
   readonly isRefungibleDisallowsNesting: boolean;
   readonly isSettingPropertiesNotAllowed: boolean;
-  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
+  readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
 }
 
 /** @name PalletRefungibleItemData */
@@ -1208,7 +1228,7 @@
   } & Struct;
   readonly isMintNft: boolean;
   readonly asMintNft: {
-    readonly owner: AccountId32;
+    readonly owner: Option<AccountId32>;
     readonly collectionId: u32;
     readonly recipient: Option<AccountId32>;
     readonly royaltyAmount: Option<Permill>;
@@ -1243,13 +1263,13 @@
   readonly asAcceptResource: {
     readonly rmrkCollectionId: u32;
     readonly rmrkNftId: u32;
-    readonly rmrkResourceId: u32;
+    readonly resourceId: u32;
   } & Struct;
   readonly isAcceptResourceRemoval: boolean;
   readonly asAcceptResourceRemoval: {
     readonly rmrkCollectionId: u32;
     readonly rmrkNftId: u32;
-    readonly rmrkResourceId: u32;
+    readonly resourceId: u32;
   } & Struct;
   readonly isSetProperty: boolean;
   readonly asSetProperty: {
@@ -1297,6 +1317,7 @@
   readonly isNftTypeEncodeError: boolean;
   readonly isRmrkPropertyKeyIsTooLong: boolean;
   readonly isRmrkPropertyValueIsTooLong: boolean;
+  readonly isRmrkPropertyIsNotFound: boolean;
   readonly isUnableToDecodeRmrkData: boolean;
   readonly isCollectionNotEmpty: boolean;
   readonly isNoAvailableCollectionId: boolean;
@@ -1309,8 +1330,10 @@
   readonly isCannotSendToDescendentOrSelf: boolean;
   readonly isCannotAcceptNonOwnedNft: boolean;
   readonly isCannotRejectNonOwnedNft: boolean;
+  readonly isCannotRejectNonPendingNft: boolean;
   readonly isResourceNotPending: boolean;
-  readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'ResourceNotPending';
+  readonly isNoAvailableResourceId: boolean;
+  readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';
 }
 
 /** @name PalletRmrkCoreEvent */
@@ -1416,7 +1439,13 @@
     readonly baseId: u32;
     readonly theme: RmrkTraitsTheme;
   } & Struct;
-  readonly type: 'CreateBase' | 'ThemeAdd';
+  readonly isEquippable: boolean;
+  readonly asEquippable: {
+    readonly baseId: u32;
+    readonly slotId: u32;
+    readonly equippables: RmrkTraitsPartEquippableList;
+  } & Struct;
+  readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';
 }
 
 /** @name PalletRmrkEquipError */
@@ -1426,7 +1455,9 @@
   readonly isNoAvailablePartId: boolean;
   readonly isBaseDoesntExist: boolean;
   readonly isNeedsDefaultThemeFirst: boolean;
-  readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst';
+  readonly isPartDoesntExist: boolean;
+  readonly isNoEquippableOnFixedPart: boolean;
+  readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';
 }
 
 /** @name PalletRmrkEquipEvent */
@@ -1436,7 +1467,12 @@
     readonly issuer: AccountId32;
     readonly baseId: u32;
   } & Struct;
-  readonly type: 'BaseCreated';
+  readonly isEquippablesUpdated: boolean;
+  readonly asEquippablesUpdated: {
+    readonly baseId: u32;
+    readonly slotId: u32;
+  } & Struct;
+  readonly type: 'BaseCreated' | 'EquippablesUpdated';
 }
 
 /** @name PalletStructureCall */
@@ -1750,7 +1786,13 @@
     readonly collectionId: u32;
     readonly newLimit: UpDataStructsCollectionPermissions;
   } & Struct;
-  readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions';
+  readonly isRepartition: boolean;
+  readonly asRepartition: {
+    readonly collectionId: u32;
+    readonly token: u32;
+    readonly amount: u128;
+  } & Struct;
+  readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition';
 }
 
 /** @name PalletUniqueError */
@@ -1758,7 +1800,8 @@
   readonly isCollectionDecimalPointLimitExceeded: boolean;
   readonly isConfirmUnsetSponsorFail: boolean;
   readonly isEmptyArgument: boolean;
-  readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument';
+  readonly isRepartitionCalledOnNonRefungibleCollection: boolean;
+  readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';
 }
 
 /** @name PalletUniqueRawEvent */
@@ -2431,7 +2474,6 @@
   readonly tokenOwner: bool;
   readonly collectionAdmin: bool;
   readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;
-  readonly permissive: bool;
 }
 
 /** @name UpDataStructsOwnerRestrictedSet */
@@ -2469,6 +2511,13 @@
   readonly tokenOwner: bool;
 }
 
+/** @name UpDataStructsPropertyScope */
+export interface UpDataStructsPropertyScope extends Enum {
+  readonly isNone: boolean;
+  readonly isRmrk: boolean;
+  readonly type: 'None' | 'Rmrk';
+}
+
 /** @name UpDataStructsRpcCollection */
 export interface UpDataStructsRpcCollection extends Struct {
   readonly owner: AccountId32;
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -114,11 +114,20 @@
   CumulusPalletParachainSystemEvent: {
     _enum: {
       ValidationFunctionStored: 'Null',
-      ValidationFunctionApplied: 'u32',
+      ValidationFunctionApplied: {
+        relayChainBlockNum: 'u32',
+      },
       ValidationFunctionDiscarded: 'Null',
-      UpgradeAuthorized: 'H256',
-      DownwardMessagesReceived: 'u32',
-      DownwardMessagesProcessed: '(u64,H256)'
+      UpgradeAuthorized: {
+        codeHash: 'H256',
+      },
+      DownwardMessagesReceived: {
+        count: 'u32',
+      },
+      DownwardMessagesProcessed: {
+        weightUsed: 'u64',
+        dmqHead: 'H256'
+      }
     }
   },
   /**
@@ -276,16 +285,7 @@
     _enum: ['V1Ancient', 'V2']
   },
   /**
-   * Lookup68: frame_support::weights::WeightToFeeCoefficient<Balance>
-   **/
-  FrameSupportWeightsWeightToFeeCoefficient: {
-    coeffInteger: 'u128',
-    coeffFrac: 'Perbill',
-    negative: 'bool',
-    degree: 'u8'
-  },
-  /**
-   * Lookup70: pallet_treasury::Proposal<sp_core::crypto::AccountId32, Balance>
+   * Lookup67: pallet_treasury::Proposal<sp_core::crypto::AccountId32, Balance>
    **/
   PalletTreasuryProposal: {
     proposer: 'AccountId32',
@@ -294,7 +294,7 @@
     bond: 'u128'
   },
   /**
-   * Lookup73: pallet_treasury::pallet::Call<T, I>
+   * Lookup70: pallet_treasury::pallet::Call<T, I>
    **/
   PalletTreasuryCall: {
     _enum: {
@@ -314,7 +314,7 @@
     }
   },
   /**
-   * Lookup75: pallet_treasury::pallet::Event<T, I>
+   * Lookup72: pallet_treasury::pallet::Event<T, I>
    **/
   PalletTreasuryEvent: {
     _enum: {
@@ -345,17 +345,17 @@
     }
   },
   /**
-   * Lookup78: frame_support::PalletId
+   * Lookup75: frame_support::PalletId
    **/
   FrameSupportPalletId: '[u8;8]',
   /**
-   * Lookup79: pallet_treasury::pallet::Error<T, I>
+   * Lookup76: pallet_treasury::pallet::Error<T, I>
    **/
   PalletTreasuryError: {
     _enum: ['InsufficientProposersBalance', 'InvalidIndex', 'TooManyApprovals', 'ProposalNotApproved']
   },
   /**
-   * Lookup80: pallet_sudo::pallet::Call<T>
+   * Lookup77: pallet_sudo::pallet::Call<T>
    **/
   PalletSudoCall: {
     _enum: {
@@ -379,7 +379,7 @@
     }
   },
   /**
-   * Lookup82: frame_system::pallet::Call<T>
+   * Lookup79: frame_system::pallet::Call<T>
    **/
   FrameSystemCall: {
     _enum: {
@@ -417,7 +417,7 @@
     }
   },
   /**
-   * Lookup85: orml_vesting::module::Call<T>
+   * Lookup83: orml_vesting::module::Call<T>
    **/
   OrmlVestingModuleCall: {
     _enum: {
@@ -436,7 +436,7 @@
     }
   },
   /**
-   * Lookup86: orml_vesting::VestingSchedule<BlockNumber, Balance>
+   * Lookup84: orml_vesting::VestingSchedule<BlockNumber, Balance>
    **/
   OrmlVestingVestingSchedule: {
     start: 'u32',
@@ -445,7 +445,7 @@
     perPeriod: 'Compact<u128>'
   },
   /**
-   * Lookup88: cumulus_pallet_xcmp_queue::pallet::Call<T>
+   * Lookup86: cumulus_pallet_xcmp_queue::pallet::Call<T>
    **/
   CumulusPalletXcmpQueueCall: {
     _enum: {
@@ -494,7 +494,7 @@
     }
   },
   /**
-   * Lookup89: pallet_xcm::pallet::Call<T>
+   * Lookup87: pallet_xcm::pallet::Call<T>
    **/
   PalletXcmCall: {
     _enum: {
@@ -548,7 +548,7 @@
     }
   },
   /**
-   * Lookup90: xcm::VersionedMultiLocation
+   * Lookup88: xcm::VersionedMultiLocation
    **/
   XcmVersionedMultiLocation: {
     _enum: {
@@ -557,7 +557,7 @@
     }
   },
   /**
-   * Lookup91: xcm::v0::multi_location::MultiLocation
+   * Lookup89: xcm::v0::multi_location::MultiLocation
    **/
   XcmV0MultiLocation: {
     _enum: {
@@ -573,7 +573,7 @@
     }
   },
   /**
-   * Lookup92: xcm::v0::junction::Junction
+   * Lookup90: xcm::v0::junction::Junction
    **/
   XcmV0Junction: {
     _enum: {
@@ -602,7 +602,7 @@
     }
   },
   /**
-   * Lookup93: xcm::v0::junction::NetworkId
+   * Lookup91: xcm::v0::junction::NetworkId
    **/
   XcmV0JunctionNetworkId: {
     _enum: {
@@ -613,7 +613,7 @@
     }
   },
   /**
-   * Lookup94: xcm::v0::junction::BodyId
+   * Lookup92: xcm::v0::junction::BodyId
    **/
   XcmV0JunctionBodyId: {
     _enum: {
@@ -627,7 +627,7 @@
     }
   },
   /**
-   * Lookup95: xcm::v0::junction::BodyPart
+   * Lookup93: xcm::v0::junction::BodyPart
    **/
   XcmV0JunctionBodyPart: {
     _enum: {
@@ -650,14 +650,14 @@
     }
   },
   /**
-   * Lookup96: xcm::v1::multilocation::MultiLocation
+   * Lookup94: xcm::v1::multilocation::MultiLocation
    **/
   XcmV1MultiLocation: {
     parents: 'u8',
     interior: 'XcmV1MultilocationJunctions'
   },
   /**
-   * Lookup97: xcm::v1::multilocation::Junctions
+   * Lookup95: xcm::v1::multilocation::Junctions
    **/
   XcmV1MultilocationJunctions: {
     _enum: {
@@ -673,7 +673,7 @@
     }
   },
   /**
-   * Lookup98: xcm::v1::junction::Junction
+   * Lookup96: xcm::v1::junction::Junction
    **/
   XcmV1Junction: {
     _enum: {
@@ -701,7 +701,7 @@
     }
   },
   /**
-   * Lookup99: xcm::VersionedXcm<Call>
+   * Lookup97: xcm::VersionedXcm<Call>
    **/
   XcmVersionedXcm: {
     _enum: {
@@ -711,7 +711,7 @@
     }
   },
   /**
-   * Lookup100: xcm::v0::Xcm<Call>
+   * Lookup98: xcm::v0::Xcm<Call>
    **/
   XcmV0Xcm: {
     _enum: {
@@ -765,7 +765,7 @@
     }
   },
   /**
-   * Lookup102: xcm::v0::multi_asset::MultiAsset
+   * Lookup100: xcm::v0::multi_asset::MultiAsset
    **/
   XcmV0MultiAsset: {
     _enum: {
@@ -804,7 +804,7 @@
     }
   },
   /**
-   * Lookup103: xcm::v1::multiasset::AssetInstance
+   * Lookup101: xcm::v1::multiasset::AssetInstance
    **/
   XcmV1MultiassetAssetInstance: {
     _enum: {
@@ -818,7 +818,7 @@
     }
   },
   /**
-   * Lookup106: xcm::v0::order::Order<Call>
+   * Lookup104: xcm::v0::order::Order<Call>
    **/
   XcmV0Order: {
     _enum: {
@@ -861,7 +861,7 @@
     }
   },
   /**
-   * Lookup108: xcm::v0::Response
+   * Lookup106: xcm::v0::Response
    **/
   XcmV0Response: {
     _enum: {
@@ -869,19 +869,19 @@
     }
   },
   /**
-   * Lookup109: xcm::v0::OriginKind
+   * Lookup107: xcm::v0::OriginKind
    **/
   XcmV0OriginKind: {
     _enum: ['Native', 'SovereignAccount', 'Superuser', 'Xcm']
   },
   /**
-   * Lookup110: xcm::double_encoded::DoubleEncoded<T>
+   * Lookup108: xcm::double_encoded::DoubleEncoded<T>
    **/
   XcmDoubleEncoded: {
     encoded: 'Bytes'
   },
   /**
-   * Lookup111: xcm::v1::Xcm<Call>
+   * Lookup109: xcm::v1::Xcm<Call>
    **/
   XcmV1Xcm: {
     _enum: {
@@ -940,18 +940,18 @@
     }
   },
   /**
-   * Lookup112: xcm::v1::multiasset::MultiAssets
+   * Lookup110: xcm::v1::multiasset::MultiAssets
    **/
   XcmV1MultiassetMultiAssets: 'Vec<XcmV1MultiAsset>',
   /**
-   * Lookup114: xcm::v1::multiasset::MultiAsset
+   * Lookup112: xcm::v1::multiasset::MultiAsset
    **/
   XcmV1MultiAsset: {
     id: 'XcmV1MultiassetAssetId',
     fun: 'XcmV1MultiassetFungibility'
   },
   /**
-   * Lookup115: xcm::v1::multiasset::AssetId
+   * Lookup113: xcm::v1::multiasset::AssetId
    **/
   XcmV1MultiassetAssetId: {
     _enum: {
@@ -960,7 +960,7 @@
     }
   },
   /**
-   * Lookup116: xcm::v1::multiasset::Fungibility
+   * Lookup114: xcm::v1::multiasset::Fungibility
    **/
   XcmV1MultiassetFungibility: {
     _enum: {
@@ -969,7 +969,7 @@
     }
   },
   /**
-   * Lookup118: xcm::v1::order::Order<Call>
+   * Lookup116: xcm::v1::order::Order<Call>
    **/
   XcmV1Order: {
     _enum: {
@@ -1014,7 +1014,7 @@
     }
   },
   /**
-   * Lookup119: xcm::v1::multiasset::MultiAssetFilter
+   * Lookup117: xcm::v1::multiasset::MultiAssetFilter
    **/
   XcmV1MultiassetMultiAssetFilter: {
     _enum: {
@@ -1023,7 +1023,7 @@
     }
   },
   /**
-   * Lookup120: xcm::v1::multiasset::WildMultiAsset
+   * Lookup118: xcm::v1::multiasset::WildMultiAsset
    **/
   XcmV1MultiassetWildMultiAsset: {
     _enum: {
@@ -1035,13 +1035,13 @@
     }
   },
   /**
-   * Lookup121: xcm::v1::multiasset::WildFungibility
+   * Lookup119: xcm::v1::multiasset::WildFungibility
    **/
   XcmV1MultiassetWildFungibility: {
     _enum: ['Fungible', 'NonFungible']
   },
   /**
-   * Lookup123: xcm::v1::Response
+   * Lookup121: xcm::v1::Response
    **/
   XcmV1Response: {
     _enum: {
@@ -1050,11 +1050,11 @@
     }
   },
   /**
-   * Lookup124: xcm::v2::Xcm<Call>
+   * Lookup122: xcm::v2::Xcm<Call>
    **/
   XcmV2Xcm: 'Vec<XcmV2Instruction>',
   /**
-   * Lookup126: xcm::v2::Instruction<Call>
+   * Lookup124: xcm::v2::Instruction<Call>
    **/
   XcmV2Instruction: {
     _enum: {
@@ -1152,7 +1152,7 @@
     }
   },
   /**
-   * Lookup127: xcm::v2::Response
+   * Lookup125: xcm::v2::Response
    **/
   XcmV2Response: {
     _enum: {
@@ -1163,7 +1163,7 @@
     }
   },
   /**
-   * Lookup130: xcm::v2::traits::Error
+   * Lookup128: xcm::v2::traits::Error
    **/
   XcmV2TraitsError: {
     _enum: {
@@ -1196,7 +1196,7 @@
     }
   },
   /**
-   * Lookup131: xcm::v2::WeightLimit
+   * Lookup129: xcm::v2::WeightLimit
    **/
   XcmV2WeightLimit: {
     _enum: {
@@ -1205,7 +1205,7 @@
     }
   },
   /**
-   * Lookup132: xcm::VersionedMultiAssets
+   * Lookup130: xcm::VersionedMultiAssets
    **/
   XcmVersionedMultiAssets: {
     _enum: {
@@ -1214,11 +1214,11 @@
     }
   },
   /**
-   * Lookup147: cumulus_pallet_xcm::pallet::Call<T>
+   * Lookup145: cumulus_pallet_xcm::pallet::Call<T>
    **/
   CumulusPalletXcmCall: 'Null',
   /**
-   * Lookup148: cumulus_pallet_dmp_queue::pallet::Call<T>
+   * Lookup146: cumulus_pallet_dmp_queue::pallet::Call<T>
    **/
   CumulusPalletDmpQueueCall: {
     _enum: {
@@ -1229,7 +1229,7 @@
     }
   },
   /**
-   * Lookup149: pallet_inflation::pallet::Call<T>
+   * Lookup147: pallet_inflation::pallet::Call<T>
    **/
   PalletInflationCall: {
     _enum: {
@@ -1239,7 +1239,7 @@
     }
   },
   /**
-   * Lookup150: pallet_unique::Call<T>
+   * Lookup148: pallet_unique::Call<T>
    **/
   PalletUniqueCall: {
     _enum: {
@@ -1361,12 +1361,17 @@
       },
       set_collection_permissions: {
         collectionId: 'u32',
-        newLimit: 'UpDataStructsCollectionPermissions'
+        newLimit: 'UpDataStructsCollectionPermissions',
+      },
+      repartition: {
+        collectionId: 'u32',
+        token: 'u32',
+        amount: 'u128'
       }
     }
   },
   /**
-   * Lookup156: up_data_structs::CollectionMode
+   * Lookup154: up_data_structs::CollectionMode
    **/
   UpDataStructsCollectionMode: {
     _enum: {
@@ -1376,7 +1381,7 @@
     }
   },
   /**
-   * Lookup157: up_data_structs::CreateCollectionData<sp_core::crypto::AccountId32>
+   * Lookup155: up_data_structs::CreateCollectionData<sp_core::crypto::AccountId32>
    **/
   UpDataStructsCreateCollectionData: {
     mode: 'UpDataStructsCollectionMode',
@@ -1391,13 +1396,13 @@
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup159: up_data_structs::AccessMode
+   * Lookup157: up_data_structs::AccessMode
    **/
   UpDataStructsAccessMode: {
     _enum: ['Normal', 'AllowList']
   },
   /**
-   * Lookup162: up_data_structs::CollectionLimits
+   * Lookup160: up_data_structs::CollectionLimits
    **/
   UpDataStructsCollectionLimits: {
     accountTokenOwnershipLimit: 'Option<u32>',
@@ -1411,7 +1416,7 @@
     transfersEnabled: 'Option<bool>'
   },
   /**
-   * Lookup164: up_data_structs::SponsoringRateLimit
+   * Lookup162: up_data_structs::SponsoringRateLimit
    **/
   UpDataStructsSponsoringRateLimit: {
     _enum: {
@@ -1420,7 +1425,7 @@
     }
   },
   /**
-   * Lookup167: up_data_structs::CollectionPermissions
+   * Lookup165: up_data_structs::CollectionPermissions
    **/
   UpDataStructsCollectionPermissions: {
     access: 'Option<UpDataStructsAccessMode>',
@@ -1428,27 +1433,26 @@
     nesting: 'Option<UpDataStructsNestingPermissions>'
   },
   /**
-   * Lookup169: up_data_structs::NestingPermissions
+   * Lookup167: up_data_structs::NestingPermissions
    **/
   UpDataStructsNestingPermissions: {
     tokenOwner: 'bool',
     collectionAdmin: 'bool',
-    restricted: 'Option<UpDataStructsOwnerRestrictedSet>',
-    permissive: 'bool'
+    restricted: 'Option<UpDataStructsOwnerRestrictedSet>'
   },
   /**
-   * Lookup171: up_data_structs::OwnerRestrictedSet
+   * Lookup169: up_data_structs::OwnerRestrictedSet
    **/
   UpDataStructsOwnerRestrictedSet: 'BTreeSet<u32>',
   /**
-   * Lookup177: up_data_structs::PropertyKeyPermission
+   * Lookup175: up_data_structs::PropertyKeyPermission
    **/
   UpDataStructsPropertyKeyPermission: {
     key: 'Bytes',
     permission: 'UpDataStructsPropertyPermission'
   },
   /**
-   * Lookup179: up_data_structs::PropertyPermission
+   * Lookup177: up_data_structs::PropertyPermission
    **/
   UpDataStructsPropertyPermission: {
     mutable: 'bool',
@@ -1456,14 +1460,14 @@
     tokenOwner: 'bool'
   },
   /**
-   * Lookup182: up_data_structs::Property
+   * Lookup180: up_data_structs::Property
    **/
   UpDataStructsProperty: {
     key: 'Bytes',
     value: 'Bytes'
   },
   /**
-   * Lookup185: pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>
+   * Lookup183: pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>
    **/
   PalletEvmAccountBasicCrossAccountIdRepr: {
     _enum: {
@@ -1472,7 +1476,7 @@
     }
   },
   /**
-   * Lookup187: up_data_structs::CreateItemData
+   * Lookup185: up_data_structs::CreateItemData
    **/
   UpDataStructsCreateItemData: {
     _enum: {
@@ -1482,26 +1486,26 @@
     }
   },
   /**
-   * Lookup188: up_data_structs::CreateNftData
+   * Lookup186: up_data_structs::CreateNftData
    **/
   UpDataStructsCreateNftData: {
     properties: 'Vec<UpDataStructsProperty>'
   },
   /**
-   * Lookup189: up_data_structs::CreateFungibleData
+   * Lookup187: up_data_structs::CreateFungibleData
    **/
   UpDataStructsCreateFungibleData: {
     value: 'u128'
   },
   /**
-   * Lookup190: up_data_structs::CreateReFungibleData
+   * Lookup188: up_data_structs::CreateReFungibleData
    **/
   UpDataStructsCreateReFungibleData: {
     constData: 'Bytes',
     pieces: 'u128'
   },
   /**
-   * Lookup195: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup193: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateItemExData: {
     _enum: {
@@ -1512,21 +1516,21 @@
     }
   },
   /**
-   * Lookup197: up_data_structs::CreateNftExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup195: up_data_structs::CreateNftExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateNftExData: {
     properties: 'Vec<UpDataStructsProperty>',
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup204: up_data_structs::CreateRefungibleExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup202: up_data_structs::CreateRefungibleExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateRefungibleExData: {
     constData: 'Bytes',
     users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>'
   },
   /**
-   * Lookup206: pallet_unique_scheduler::pallet::Call<T>
+   * Lookup204: pallet_unique_scheduler::pallet::Call<T>
    **/
   PalletUniqueSchedulerCall: {
     _enum: {
@@ -1550,7 +1554,7 @@
     }
   },
   /**
-   * Lookup208: frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>
+   * Lookup206: frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>
    **/
   FrameSupportScheduleMaybeHashed: {
     _enum: {
@@ -1559,15 +1563,15 @@
     }
   },
   /**
-   * Lookup209: pallet_template_transaction_payment::Call<T>
+   * Lookup207: pallet_template_transaction_payment::Call<T>
    **/
   PalletTemplateTransactionPaymentCall: 'Null',
   /**
-   * Lookup210: pallet_structure::pallet::Call<T>
+   * Lookup208: pallet_structure::pallet::Call<T>
    **/
   PalletStructureCall: 'Null',
   /**
-   * Lookup211: pallet_rmrk_core::pallet::Call<T>
+   * Lookup209: pallet_rmrk_core::pallet::Call<T>
    **/
   PalletRmrkCoreCall: {
     _enum: {
@@ -1587,7 +1591,7 @@
         collectionId: 'u32',
       },
       mint_nft: {
-        owner: 'AccountId32',
+        owner: 'Option<AccountId32>',
         collectionId: 'u32',
         recipient: 'Option<AccountId32>',
         royaltyAmount: 'Option<Permill>',
@@ -1617,12 +1621,12 @@
       accept_resource: {
         rmrkCollectionId: 'u32',
         rmrkNftId: 'u32',
-        rmrkResourceId: 'u32',
+        resourceId: 'u32',
       },
       accept_resource_removal: {
         rmrkCollectionId: 'u32',
         rmrkNftId: 'u32',
-        rmrkResourceId: 'u32',
+        resourceId: 'u32',
       },
       set_property: {
         rmrkCollectionId: 'Compact<u32>',
@@ -1658,7 +1662,7 @@
     }
   },
   /**
-   * Lookup217: rmrk_traits::resource::ResourceTypes<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup215: rmrk_traits::resource::ResourceTypes<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceResourceTypes: {
     _enum: {
@@ -1668,7 +1672,7 @@
     }
   },
   /**
-   * Lookup219: rmrk_traits::resource::BasicResource<frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup217: rmrk_traits::resource::BasicResource<frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceBasicResource: {
     src: 'Option<Bytes>',
@@ -1677,7 +1681,7 @@
     thumb: 'Option<Bytes>'
   },
   /**
-   * Lookup221: rmrk_traits::resource::ComposableResource<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup219: rmrk_traits::resource::ComposableResource<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceComposableResource: {
     parts: 'Vec<u32>',
@@ -1688,7 +1692,7 @@
     thumb: 'Option<Bytes>'
   },
   /**
-   * Lookup222: rmrk_traits::resource::SlotResource<frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup220: rmrk_traits::resource::SlotResource<frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsResourceSlotResource: {
     base: 'u32',
@@ -1699,7 +1703,7 @@
     thumb: 'Option<Bytes>'
   },
   /**
-   * Lookup224: rmrk_traits::nft::AccountIdOrCollectionNftTuple<sp_core::crypto::AccountId32>
+   * Lookup222: rmrk_traits::nft::AccountIdOrCollectionNftTuple<sp_core::crypto::AccountId32>
    **/
   RmrkTraitsNftAccountIdOrCollectionNftTuple: {
     _enum: {
@@ -1708,7 +1712,7 @@
     }
   },
   /**
-   * Lookup228: pallet_rmrk_equip::pallet::Call<T>
+   * Lookup226: pallet_rmrk_equip::pallet::Call<T>
    **/
   PalletRmrkEquipCall: {
     _enum: {
@@ -1719,12 +1723,17 @@
       },
       theme_add: {
         baseId: 'u32',
-        theme: 'RmrkTraitsTheme'
+        theme: 'RmrkTraitsTheme',
+      },
+      equippable: {
+        baseId: 'u32',
+        slotId: 'u32',
+        equippables: 'RmrkTraitsPartEquippableList'
       }
     }
   },
   /**
-   * Lookup230: rmrk_traits::part::PartType<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup229: rmrk_traits::part::PartType<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartPartType: {
     _enum: {
@@ -1733,7 +1742,7 @@
     }
   },
   /**
-   * Lookup232: rmrk_traits::part::FixedPart<frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup231: rmrk_traits::part::FixedPart<frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartFixedPart: {
     id: 'u32',
@@ -1741,7 +1750,7 @@
     src: 'Bytes'
   },
   /**
-   * Lookup233: rmrk_traits::part::SlotPart<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup232: rmrk_traits::part::SlotPart<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartSlotPart: {
     id: 'u32',
@@ -1750,7 +1759,7 @@
     z: 'u32'
   },
   /**
-   * Lookup234: rmrk_traits::part::EquippableList<frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup233: rmrk_traits::part::EquippableList<frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsPartEquippableList: {
     _enum: {
@@ -1760,7 +1769,7 @@
     }
   },
   /**
-   * Lookup236: rmrk_traits::theme::Theme<frame_support::storage::bounded_vec::BoundedVec<T, S>, PropertyList>
+   * Lookup235: rmrk_traits::theme::Theme<frame_support::storage::bounded_vec::BoundedVec<T, S>, frame_support::storage::bounded_vec::BoundedVec<rmrk_traits::theme::ThemeProperty<frame_support::storage::bounded_vec::BoundedVec<T, S>>, S>>
    **/
   RmrkTraitsTheme: {
     name: 'Bytes',
@@ -1768,7 +1777,7 @@
     inherit: 'bool'
   },
   /**
-   * Lookup238: rmrk_traits::theme::ThemeProperty<frame_support::storage::bounded_vec::BoundedVec<T, S>>
+   * Lookup237: rmrk_traits::theme::ThemeProperty<frame_support::storage::bounded_vec::BoundedVec<T, S>>
    **/
   RmrkTraitsThemeThemeProperty: {
     key: 'Bytes',
@@ -2166,12 +2175,30 @@
    **/
   CumulusPalletDmpQueueEvent: {
     _enum: {
-      InvalidFormat: '[u8;32]',
-      UnsupportedVersion: '[u8;32]',
-      ExecutedDownward: '([u8;32],XcmV2TraitsOutcome)',
-      WeightExhausted: '([u8;32],u64,u64)',
-      OverweightEnqueued: '([u8;32],u64,u64)',
-      OverweightServiced: '(u64,u64)'
+      InvalidFormat: {
+        messageId: '[u8;32]',
+      },
+      UnsupportedVersion: {
+        messageId: '[u8;32]',
+      },
+      ExecutedDownward: {
+        messageId: '[u8;32]',
+        outcome: 'XcmV2TraitsOutcome',
+      },
+      WeightExhausted: {
+        messageId: '[u8;32]',
+        remainingWeight: 'u64',
+        requiredWeight: 'u64',
+      },
+      OverweightEnqueued: {
+        messageId: '[u8;32]',
+        overweightIndex: 'u64',
+        requiredWeight: 'u64',
+      },
+      OverweightServiced: {
+        overweightIndex: 'u64',
+        weightUsed: 'u64'
+      }
     }
   },
   /**
@@ -2332,7 +2359,11 @@
     _enum: {
       BaseCreated: {
         issuer: 'AccountId32',
-        baseId: 'u32'
+        baseId: 'u32',
+      },
+      EquippablesUpdated: {
+        baseId: 'u32',
+        slotId: 'u32'
       }
     }
   },
@@ -2597,7 +2628,7 @@
    * Lookup344: pallet_unique::Error<T>
    **/
   PalletUniqueError: {
-    _enum: ['CollectionDecimalPointLimitExceeded', 'ConfirmUnsetSponsorFail', 'EmptyArgument']
+    _enum: ['CollectionDecimalPointLimitExceeded', 'ConfirmUnsetSponsorFail', 'EmptyArgument', 'RepartitionCalledOnNonRefungibleCollection']
   },
   /**
    * Lookup347: pallet_unique_scheduler::ScheduledV3<frame_support::traits::schedule::MaybeHashed<opal_runtime::Call, primitive_types::H256>, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32>
@@ -2926,7 +2957,7 @@
    * Lookup393: pallet_refungible::pallet::Error<T>
    **/
   PalletRefungibleError: {
-    _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
+    _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RepartitionWhileNotOwningAllPieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
   },
   /**
    * Lookup394: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
@@ -2935,37 +2966,43 @@
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup396: pallet_nonfungible::pallet::Error<T>
+   * Lookup396: up_data_structs::PropertyScope
+   **/
+  UpDataStructsPropertyScope: {
+    _enum: ['None', 'Rmrk']
+  },
+  /**
+   * Lookup398: pallet_nonfungible::pallet::Error<T>
    **/
   PalletNonfungibleError: {
     _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount', 'CantBurnNftWithChildren']
   },
   /**
-   * Lookup397: pallet_structure::pallet::Error<T>
+   * Lookup399: pallet_structure::pallet::Error<T>
    **/
   PalletStructureError: {
     _enum: ['OuroborosDetected', 'DepthLimit', 'BreadthLimit', 'TokenNotFound']
   },
   /**
-   * Lookup398: pallet_rmrk_core::pallet::Error<T>
+   * Lookup400: pallet_rmrk_core::pallet::Error<T>
    **/
   PalletRmrkCoreError: {
-    _enum: ['CorruptedCollectionType', 'NftTypeEncodeError', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'ResourceNotPending']
+    _enum: ['CorruptedCollectionType', 'NftTypeEncodeError', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'RmrkPropertyIsNotFound', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'CannotRejectNonPendingNft', 'ResourceNotPending', 'NoAvailableResourceId']
   },
   /**
-   * Lookup400: pallet_rmrk_equip::pallet::Error<T>
+   * Lookup402: pallet_rmrk_equip::pallet::Error<T>
    **/
   PalletRmrkEquipError: {
-    _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst']
+    _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst', 'PartDoesntExist', 'NoEquippableOnFixedPart']
   },
   /**
-   * Lookup403: pallet_evm::pallet::Error<T>
+   * Lookup405: pallet_evm::pallet::Error<T>
    **/
   PalletEvmError: {
     _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce']
   },
   /**
-   * Lookup406: fp_rpc::TransactionStatus
+   * Lookup408: fp_rpc::TransactionStatus
    **/
   FpRpcTransactionStatus: {
     transactionHash: 'H256',
@@ -2977,11 +3014,11 @@
     logsBloom: 'EthbloomBloom'
   },
   /**
-   * Lookup408: ethbloom::Bloom
+   * Lookup410: ethbloom::Bloom
    **/
   EthbloomBloom: '[u8;256]',
   /**
-   * Lookup410: ethereum::receipt::ReceiptV3
+   * Lookup412: ethereum::receipt::ReceiptV3
    **/
   EthereumReceiptReceiptV3: {
     _enum: {
@@ -2991,7 +3028,7 @@
     }
   },
   /**
-   * Lookup411: ethereum::receipt::EIP658ReceiptData
+   * Lookup413: ethereum::receipt::EIP658ReceiptData
    **/
   EthereumReceiptEip658ReceiptData: {
     statusCode: 'u8',
@@ -3000,7 +3037,7 @@
     logs: 'Vec<EthereumLog>'
   },
   /**
-   * Lookup412: ethereum::block::Block<ethereum::transaction::TransactionV2>
+   * Lookup414: ethereum::block::Block<ethereum::transaction::TransactionV2>
    **/
   EthereumBlock: {
     header: 'EthereumHeader',
@@ -3008,7 +3045,7 @@
     ommers: 'Vec<EthereumHeader>'
   },
   /**
-   * Lookup413: ethereum::header::Header
+   * Lookup415: ethereum::header::Header
    **/
   EthereumHeader: {
     parentHash: 'H256',
@@ -3028,41 +3065,41 @@
     nonce: 'EthereumTypesHashH64'
   },
   /**
-   * Lookup414: ethereum_types::hash::H64
+   * Lookup416: ethereum_types::hash::H64
    **/
   EthereumTypesHashH64: '[u8;8]',
   /**
-   * Lookup419: pallet_ethereum::pallet::Error<T>
+   * Lookup421: pallet_ethereum::pallet::Error<T>
    **/
   PalletEthereumError: {
     _enum: ['InvalidSignature', 'PreLogExists']
   },
   /**
-   * Lookup420: pallet_evm_coder_substrate::pallet::Error<T>
+   * Lookup422: pallet_evm_coder_substrate::pallet::Error<T>
    **/
   PalletEvmCoderSubstrateError: {
     _enum: ['OutOfGas', 'OutOfFund']
   },
   /**
-   * Lookup421: pallet_evm_contract_helpers::SponsoringModeT
+   * Lookup423: pallet_evm_contract_helpers::SponsoringModeT
    **/
   PalletEvmContractHelpersSponsoringModeT: {
     _enum: ['Disabled', 'Allowlisted', 'Generous']
   },
   /**
-   * Lookup423: pallet_evm_contract_helpers::pallet::Error<T>
+   * Lookup425: pallet_evm_contract_helpers::pallet::Error<T>
    **/
   PalletEvmContractHelpersError: {
     _enum: ['NoPermission']
   },
   /**
-   * Lookup424: pallet_evm_migration::pallet::Error<T>
+   * Lookup426: pallet_evm_migration::pallet::Error<T>
    **/
   PalletEvmMigrationError: {
     _enum: ['AccountNotEmpty', 'AccountIsNotMigrating']
   },
   /**
-   * Lookup426: sp_runtime::MultiSignature
+   * Lookup428: sp_runtime::MultiSignature
    **/
   SpRuntimeMultiSignature: {
     _enum: {
@@ -3072,43 +3109,43 @@
     }
   },
   /**
-   * Lookup427: sp_core::ed25519::Signature
+   * Lookup429: sp_core::ed25519::Signature
    **/
   SpCoreEd25519Signature: '[u8;64]',
   /**
-   * Lookup429: sp_core::sr25519::Signature
+   * Lookup431: sp_core::sr25519::Signature
    **/
   SpCoreSr25519Signature: '[u8;64]',
   /**
-   * Lookup430: sp_core::ecdsa::Signature
+   * Lookup432: sp_core::ecdsa::Signature
    **/
   SpCoreEcdsaSignature: '[u8;65]',
   /**
-   * Lookup433: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
+   * Lookup435: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
    **/
   FrameSystemExtensionsCheckSpecVersion: 'Null',
   /**
-   * Lookup434: frame_system::extensions::check_genesis::CheckGenesis<T>
+   * Lookup436: frame_system::extensions::check_genesis::CheckGenesis<T>
    **/
   FrameSystemExtensionsCheckGenesis: 'Null',
   /**
-   * Lookup437: frame_system::extensions::check_nonce::CheckNonce<T>
+   * Lookup439: frame_system::extensions::check_nonce::CheckNonce<T>
    **/
   FrameSystemExtensionsCheckNonce: 'Compact<u32>',
   /**
-   * Lookup438: frame_system::extensions::check_weight::CheckWeight<T>
+   * Lookup440: frame_system::extensions::check_weight::CheckWeight<T>
    **/
   FrameSystemExtensionsCheckWeight: 'Null',
   /**
-   * Lookup439: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
+   * Lookup441: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
    **/
   PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact<u128>',
   /**
-   * Lookup440: opal_runtime::Runtime
+   * Lookup442: opal_runtime::Runtime
    **/
   OpalRuntimeRuntime: 'Null',
   /**
-   * Lookup441: pallet_ethereum::FakeTransactionFinalizer<opal_runtime::Runtime>
+   * Lookup443: pallet_ethereum::FakeTransactionFinalizer<opal_runtime::Runtime>
    **/
   PalletEthereumFakeTransactionFinalizer: 'Null'
 };
modifiedtests/src/interfaces/registry.tsdiffbeforeafterboth
--- a/tests/src/interfaces/registry.ts
+++ b/tests/src/interfaces/registry.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-defs`, do not edit
 /* eslint-disable */
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
 
 declare module '@polkadot/types/types/registry' {
   export interface InterfaceTypes {
@@ -59,7 +59,6 @@
     FrameSupportWeightsPerDispatchClassU64: FrameSupportWeightsPerDispatchClassU64;
     FrameSupportWeightsPerDispatchClassWeightsPerClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;
     FrameSupportWeightsRuntimeDbWeight: FrameSupportWeightsRuntimeDbWeight;
-    FrameSupportWeightsWeightToFeeCoefficient: FrameSupportWeightsWeightToFeeCoefficient;
     FrameSystemAccountInfo: FrameSystemAccountInfo;
     FrameSystemCall: FrameSystemCall;
     FrameSystemError: FrameSystemError;
@@ -204,6 +203,7 @@
     UpDataStructsProperty: UpDataStructsProperty;
     UpDataStructsPropertyKeyPermission: UpDataStructsPropertyKeyPermission;
     UpDataStructsPropertyPermission: UpDataStructsPropertyPermission;
+    UpDataStructsPropertyScope: UpDataStructsPropertyScope;
     UpDataStructsRpcCollection: UpDataStructsRpcCollection;
     UpDataStructsSponsoringRateLimit: UpDataStructsSponsoringRateLimit;
     UpDataStructsSponsorshipState: UpDataStructsSponsorshipState;
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -108,14 +108,23 @@
   export interface CumulusPalletParachainSystemEvent extends Enum {
     readonly isValidationFunctionStored: boolean;
     readonly isValidationFunctionApplied: boolean;
-    readonly asValidationFunctionApplied: u32;
+    readonly asValidationFunctionApplied: {
+      readonly relayChainBlockNum: u32;
+    } & Struct;
     readonly isValidationFunctionDiscarded: boolean;
     readonly isUpgradeAuthorized: boolean;
-    readonly asUpgradeAuthorized: H256;
+    readonly asUpgradeAuthorized: {
+      readonly codeHash: H256;
+    } & Struct;
     readonly isDownwardMessagesReceived: boolean;
-    readonly asDownwardMessagesReceived: u32;
+    readonly asDownwardMessagesReceived: {
+      readonly count: u32;
+    } & Struct;
     readonly isDownwardMessagesProcessed: boolean;
-    readonly asDownwardMessagesProcessed: ITuple<[u64, H256]>;
+    readonly asDownwardMessagesProcessed: {
+      readonly weightUsed: u64;
+      readonly dmqHead: H256;
+    } & Struct;
     readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';
   }
 
@@ -300,15 +309,7 @@
     readonly type: 'V1Ancient' | 'V2';
   }
 
-  /** @name FrameSupportWeightsWeightToFeeCoefficient (68) */
-  export interface FrameSupportWeightsWeightToFeeCoefficient extends Struct {
-    readonly coeffInteger: u128;
-    readonly coeffFrac: Perbill;
-    readonly negative: bool;
-    readonly degree: u8;
-  }
-
-  /** @name PalletTreasuryProposal (70) */
+  /** @name PalletTreasuryProposal (67) */
   export interface PalletTreasuryProposal extends Struct {
     readonly proposer: AccountId32;
     readonly value: u128;
@@ -316,7 +317,7 @@
     readonly bond: u128;
   }
 
-  /** @name PalletTreasuryCall (73) */
+  /** @name PalletTreasuryCall (70) */
   export interface PalletTreasuryCall extends Enum {
     readonly isProposeSpend: boolean;
     readonly asProposeSpend: {
@@ -338,7 +339,7 @@
     readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';
   }
 
-  /** @name PalletTreasuryEvent (75) */
+  /** @name PalletTreasuryEvent (72) */
   export interface PalletTreasuryEvent extends Enum {
     readonly isProposed: boolean;
     readonly asProposed: {
@@ -374,10 +375,10 @@
     readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';
   }
 
-  /** @name FrameSupportPalletId (78) */
+  /** @name FrameSupportPalletId (75) */
   export interface FrameSupportPalletId extends U8aFixed {}
 
-  /** @name PalletTreasuryError (79) */
+  /** @name PalletTreasuryError (76) */
   export interface PalletTreasuryError extends Enum {
     readonly isInsufficientProposersBalance: boolean;
     readonly isInvalidIndex: boolean;
@@ -386,7 +387,7 @@
     readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';
   }
 
-  /** @name PalletSudoCall (80) */
+  /** @name PalletSudoCall (77) */
   export interface PalletSudoCall extends Enum {
     readonly isSudo: boolean;
     readonly asSudo: {
@@ -409,7 +410,7 @@
     readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';
   }
 
-  /** @name FrameSystemCall (82) */
+  /** @name FrameSystemCall (79) */
   export interface FrameSystemCall extends Enum {
     readonly isFillBlock: boolean;
     readonly asFillBlock: {
@@ -451,7 +452,7 @@
     readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';
   }
 
-  /** @name OrmlVestingModuleCall (85) */
+  /** @name OrmlVestingModuleCall (83) */
   export interface OrmlVestingModuleCall extends Enum {
     readonly isClaim: boolean;
     readonly isVestedTransfer: boolean;
@@ -471,7 +472,7 @@
     readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';
   }
 
-  /** @name OrmlVestingVestingSchedule (86) */
+  /** @name OrmlVestingVestingSchedule (84) */
   export interface OrmlVestingVestingSchedule extends Struct {
     readonly start: u32;
     readonly period: u32;
@@ -479,7 +480,7 @@
     readonly perPeriod: Compact<u128>;
   }
 
-  /** @name CumulusPalletXcmpQueueCall (88) */
+  /** @name CumulusPalletXcmpQueueCall (86) */
   export interface CumulusPalletXcmpQueueCall extends Enum {
     readonly isServiceOverweight: boolean;
     readonly asServiceOverweight: {
@@ -515,7 +516,7 @@
     readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';
   }
 
-  /** @name PalletXcmCall (89) */
+  /** @name PalletXcmCall (87) */
   export interface PalletXcmCall extends Enum {
     readonly isSend: boolean;
     readonly asSend: {
@@ -577,7 +578,7 @@
     readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';
   }
 
-  /** @name XcmVersionedMultiLocation (90) */
+  /** @name XcmVersionedMultiLocation (88) */
   export interface XcmVersionedMultiLocation extends Enum {
     readonly isV0: boolean;
     readonly asV0: XcmV0MultiLocation;
@@ -586,7 +587,7 @@
     readonly type: 'V0' | 'V1';
   }
 
-  /** @name XcmV0MultiLocation (91) */
+  /** @name XcmV0MultiLocation (89) */
   export interface XcmV0MultiLocation extends Enum {
     readonly isNull: boolean;
     readonly isX1: boolean;
@@ -608,7 +609,7 @@
     readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';
   }
 
-  /** @name XcmV0Junction (92) */
+  /** @name XcmV0Junction (90) */
   export interface XcmV0Junction extends Enum {
     readonly isParent: boolean;
     readonly isParachain: boolean;
@@ -643,7 +644,7 @@
     readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';
   }
 
-  /** @name XcmV0JunctionNetworkId (93) */
+  /** @name XcmV0JunctionNetworkId (91) */
   export interface XcmV0JunctionNetworkId extends Enum {
     readonly isAny: boolean;
     readonly isNamed: boolean;
@@ -653,7 +654,7 @@
     readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';
   }
 
-  /** @name XcmV0JunctionBodyId (94) */
+  /** @name XcmV0JunctionBodyId (92) */
   export interface XcmV0JunctionBodyId extends Enum {
     readonly isUnit: boolean;
     readonly isNamed: boolean;
@@ -667,7 +668,7 @@
     readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';
   }
 
-  /** @name XcmV0JunctionBodyPart (95) */
+  /** @name XcmV0JunctionBodyPart (93) */
   export interface XcmV0JunctionBodyPart extends Enum {
     readonly isVoice: boolean;
     readonly isMembers: boolean;
@@ -692,13 +693,13 @@
     readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';
   }
 
-  /** @name XcmV1MultiLocation (96) */
+  /** @name XcmV1MultiLocation (94) */
   export interface XcmV1MultiLocation extends Struct {
     readonly parents: u8;
     readonly interior: XcmV1MultilocationJunctions;
   }
 
-  /** @name XcmV1MultilocationJunctions (97) */
+  /** @name XcmV1MultilocationJunctions (95) */
   export interface XcmV1MultilocationJunctions extends Enum {
     readonly isHere: boolean;
     readonly isX1: boolean;
@@ -720,7 +721,7 @@
     readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';
   }
 
-  /** @name XcmV1Junction (98) */
+  /** @name XcmV1Junction (96) */
   export interface XcmV1Junction extends Enum {
     readonly isParachain: boolean;
     readonly asParachain: Compact<u32>;
@@ -754,7 +755,7 @@
     readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';
   }
 
-  /** @name XcmVersionedXcm (99) */
+  /** @name XcmVersionedXcm (97) */
   export interface XcmVersionedXcm extends Enum {
     readonly isV0: boolean;
     readonly asV0: XcmV0Xcm;
@@ -765,7 +766,7 @@
     readonly type: 'V0' | 'V1' | 'V2';
   }
 
-  /** @name XcmV0Xcm (100) */
+  /** @name XcmV0Xcm (98) */
   export interface XcmV0Xcm extends Enum {
     readonly isWithdrawAsset: boolean;
     readonly asWithdrawAsset: {
@@ -828,7 +829,7 @@
     readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';
   }
 
-  /** @name XcmV0MultiAsset (102) */
+  /** @name XcmV0MultiAsset (100) */
   export interface XcmV0MultiAsset extends Enum {
     readonly isNone: boolean;
     readonly isAll: boolean;
@@ -873,7 +874,7 @@
     readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';
   }
 
-  /** @name XcmV1MultiassetAssetInstance (103) */
+  /** @name XcmV1MultiassetAssetInstance (101) */
   export interface XcmV1MultiassetAssetInstance extends Enum {
     readonly isUndefined: boolean;
     readonly isIndex: boolean;
@@ -891,7 +892,7 @@
     readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';
   }
 
-  /** @name XcmV0Order (106) */
+  /** @name XcmV0Order (104) */
   export interface XcmV0Order extends Enum {
     readonly isNull: boolean;
     readonly isDepositAsset: boolean;
@@ -939,14 +940,14 @@
     readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';
   }
 
-  /** @name XcmV0Response (108) */
+  /** @name XcmV0Response (106) */
   export interface XcmV0Response extends Enum {
     readonly isAssets: boolean;
     readonly asAssets: Vec<XcmV0MultiAsset>;
     readonly type: 'Assets';
   }
 
-  /** @name XcmV0OriginKind (109) */
+  /** @name XcmV0OriginKind (107) */
   export interface XcmV0OriginKind extends Enum {
     readonly isNative: boolean;
     readonly isSovereignAccount: boolean;
@@ -955,12 +956,12 @@
     readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';
   }
 
-  /** @name XcmDoubleEncoded (110) */
+  /** @name XcmDoubleEncoded (108) */
   export interface XcmDoubleEncoded extends Struct {
     readonly encoded: Bytes;
   }
 
-  /** @name XcmV1Xcm (111) */
+  /** @name XcmV1Xcm (109) */
   export interface XcmV1Xcm extends Enum {
     readonly isWithdrawAsset: boolean;
     readonly asWithdrawAsset: {
@@ -1029,16 +1030,16 @@
     readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';
   }
 
-  /** @name XcmV1MultiassetMultiAssets (112) */
+  /** @name XcmV1MultiassetMultiAssets (110) */
   export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}
 
-  /** @name XcmV1MultiAsset (114) */
+  /** @name XcmV1MultiAsset (112) */
   export interface XcmV1MultiAsset extends Struct {
     readonly id: XcmV1MultiassetAssetId;
     readonly fun: XcmV1MultiassetFungibility;
   }
 
-  /** @name XcmV1MultiassetAssetId (115) */
+  /** @name XcmV1MultiassetAssetId (113) */
   export interface XcmV1MultiassetAssetId extends Enum {
     readonly isConcrete: boolean;
     readonly asConcrete: XcmV1MultiLocation;
@@ -1047,7 +1048,7 @@
     readonly type: 'Concrete' | 'Abstract';
   }
 
-  /** @name XcmV1MultiassetFungibility (116) */
+  /** @name XcmV1MultiassetFungibility (114) */
   export interface XcmV1MultiassetFungibility extends Enum {
     readonly isFungible: boolean;
     readonly asFungible: Compact<u128>;
@@ -1056,7 +1057,7 @@
     readonly type: 'Fungible' | 'NonFungible';
   }
 
-  /** @name XcmV1Order (118) */
+  /** @name XcmV1Order (116) */
   export interface XcmV1Order extends Enum {
     readonly isNoop: boolean;
     readonly isDepositAsset: boolean;
@@ -1106,7 +1107,7 @@
     readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';
   }
 
-  /** @name XcmV1MultiassetMultiAssetFilter (119) */
+  /** @name XcmV1MultiassetMultiAssetFilter (117) */
   export interface XcmV1MultiassetMultiAssetFilter extends Enum {
     readonly isDefinite: boolean;
     readonly asDefinite: XcmV1MultiassetMultiAssets;
@@ -1115,7 +1116,7 @@
     readonly type: 'Definite' | 'Wild';
   }
 
-  /** @name XcmV1MultiassetWildMultiAsset (120) */
+  /** @name XcmV1MultiassetWildMultiAsset (118) */
   export interface XcmV1MultiassetWildMultiAsset extends Enum {
     readonly isAll: boolean;
     readonly isAllOf: boolean;
@@ -1126,14 +1127,14 @@
     readonly type: 'All' | 'AllOf';
   }
 
-  /** @name XcmV1MultiassetWildFungibility (121) */
+  /** @name XcmV1MultiassetWildFungibility (119) */
   export interface XcmV1MultiassetWildFungibility extends Enum {
     readonly isFungible: boolean;
     readonly isNonFungible: boolean;
     readonly type: 'Fungible' | 'NonFungible';
   }
 
-  /** @name XcmV1Response (123) */
+  /** @name XcmV1Response (121) */
   export interface XcmV1Response extends Enum {
     readonly isAssets: boolean;
     readonly asAssets: XcmV1MultiassetMultiAssets;
@@ -1142,10 +1143,10 @@
     readonly type: 'Assets' | 'Version';
   }
 
-  /** @name XcmV2Xcm (124) */
+  /** @name XcmV2Xcm (122) */
   export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}
 
-  /** @name XcmV2Instruction (126) */
+  /** @name XcmV2Instruction (124) */
   export interface XcmV2Instruction extends Enum {
     readonly isWithdrawAsset: boolean;
     readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;
@@ -1265,7 +1266,7 @@
     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';
   }
 
-  /** @name XcmV2Response (127) */
+  /** @name XcmV2Response (125) */
   export interface XcmV2Response extends Enum {
     readonly isNull: boolean;
     readonly isAssets: boolean;
@@ -1277,7 +1278,7 @@
     readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';
   }
 
-  /** @name XcmV2TraitsError (130) */
+  /** @name XcmV2TraitsError (128) */
   export interface XcmV2TraitsError extends Enum {
     readonly isOverflow: boolean;
     readonly isUnimplemented: boolean;
@@ -1310,7 +1311,7 @@
     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';
   }
 
-  /** @name XcmV2WeightLimit (131) */
+  /** @name XcmV2WeightLimit (129) */
   export interface XcmV2WeightLimit extends Enum {
     readonly isUnlimited: boolean;
     readonly isLimited: boolean;
@@ -1318,7 +1319,7 @@
     readonly type: 'Unlimited' | 'Limited';
   }
 
-  /** @name XcmVersionedMultiAssets (132) */
+  /** @name XcmVersionedMultiAssets (130) */
   export interface XcmVersionedMultiAssets extends Enum {
     readonly isV0: boolean;
     readonly asV0: Vec<XcmV0MultiAsset>;
@@ -1327,10 +1328,10 @@
     readonly type: 'V0' | 'V1';
   }
 
-  /** @name CumulusPalletXcmCall (147) */
+  /** @name CumulusPalletXcmCall (145) */
   export type CumulusPalletXcmCall = Null;
 
-  /** @name CumulusPalletDmpQueueCall (148) */
+  /** @name CumulusPalletDmpQueueCall (146) */
   export interface CumulusPalletDmpQueueCall extends Enum {
     readonly isServiceOverweight: boolean;
     readonly asServiceOverweight: {
@@ -1340,7 +1341,7 @@
     readonly type: 'ServiceOverweight';
   }
 
-  /** @name PalletInflationCall (149) */
+  /** @name PalletInflationCall (147) */
   export interface PalletInflationCall extends Enum {
     readonly isStartInflation: boolean;
     readonly asStartInflation: {
@@ -1349,7 +1350,7 @@
     readonly type: 'StartInflation';
   }
 
-  /** @name PalletUniqueCall (150) */
+  /** @name PalletUniqueCall (148) */
   export interface PalletUniqueCall extends Enum {
     readonly isCreateCollection: boolean;
     readonly asCreateCollection: {
@@ -1498,10 +1499,16 @@
       readonly collectionId: u32;
       readonly newLimit: UpDataStructsCollectionPermissions;
     } & Struct;
-    readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions';
+    readonly isRepartition: boolean;
+    readonly asRepartition: {
+      readonly collectionId: u32;
+      readonly token: u32;
+      readonly amount: u128;
+    } & Struct;
+    readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition';
   }
 
-  /** @name UpDataStructsCollectionMode (156) */
+  /** @name UpDataStructsCollectionMode (154) */
   export interface UpDataStructsCollectionMode extends Enum {
     readonly isNft: boolean;
     readonly isFungible: boolean;
@@ -1510,7 +1517,7 @@
     readonly type: 'Nft' | 'Fungible' | 'ReFungible';
   }
 
-  /** @name UpDataStructsCreateCollectionData (157) */
+  /** @name UpDataStructsCreateCollectionData (155) */
   export interface UpDataStructsCreateCollectionData extends Struct {
     readonly mode: UpDataStructsCollectionMode;
     readonly access: Option<UpDataStructsAccessMode>;
@@ -1524,14 +1531,14 @@
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name UpDataStructsAccessMode (159) */
+  /** @name UpDataStructsAccessMode (157) */
   export interface UpDataStructsAccessMode extends Enum {
     readonly isNormal: boolean;
     readonly isAllowList: boolean;
     readonly type: 'Normal' | 'AllowList';
   }
 
-  /** @name UpDataStructsCollectionLimits (162) */
+  /** @name UpDataStructsCollectionLimits (160) */
   export interface UpDataStructsCollectionLimits extends Struct {
     readonly accountTokenOwnershipLimit: Option<u32>;
     readonly sponsoredDataSize: Option<u32>;
@@ -1544,7 +1551,7 @@
     readonly transfersEnabled: Option<bool>;
   }
 
-  /** @name UpDataStructsSponsoringRateLimit (164) */
+  /** @name UpDataStructsSponsoringRateLimit (162) */
   export interface UpDataStructsSponsoringRateLimit extends Enum {
     readonly isSponsoringDisabled: boolean;
     readonly isBlocks: boolean;
@@ -1552,44 +1559,43 @@
     readonly type: 'SponsoringDisabled' | 'Blocks';
   }
 
-  /** @name UpDataStructsCollectionPermissions (167) */
+  /** @name UpDataStructsCollectionPermissions (165) */
   export interface UpDataStructsCollectionPermissions extends Struct {
     readonly access: Option<UpDataStructsAccessMode>;
     readonly mintMode: Option<bool>;
     readonly nesting: Option<UpDataStructsNestingPermissions>;
   }
 
-  /** @name UpDataStructsNestingPermissions (169) */
+  /** @name UpDataStructsNestingPermissions (167) */
   export interface UpDataStructsNestingPermissions extends Struct {
     readonly tokenOwner: bool;
     readonly collectionAdmin: bool;
     readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;
-    readonly permissive: bool;
   }
 
-  /** @name UpDataStructsOwnerRestrictedSet (171) */
+  /** @name UpDataStructsOwnerRestrictedSet (169) */
   export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}
 
-  /** @name UpDataStructsPropertyKeyPermission (177) */
+  /** @name UpDataStructsPropertyKeyPermission (175) */
   export interface UpDataStructsPropertyKeyPermission extends Struct {
     readonly key: Bytes;
     readonly permission: UpDataStructsPropertyPermission;
   }
 
-  /** @name UpDataStructsPropertyPermission (179) */
+  /** @name UpDataStructsPropertyPermission (177) */
   export interface UpDataStructsPropertyPermission extends Struct {
     readonly mutable: bool;
     readonly collectionAdmin: bool;
     readonly tokenOwner: bool;
   }
 
-  /** @name UpDataStructsProperty (182) */
+  /** @name UpDataStructsProperty (180) */
   export interface UpDataStructsProperty extends Struct {
     readonly key: Bytes;
     readonly value: Bytes;
   }
 
-  /** @name PalletEvmAccountBasicCrossAccountIdRepr (185) */
+  /** @name PalletEvmAccountBasicCrossAccountIdRepr (183) */
   export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {
     readonly isSubstrate: boolean;
     readonly asSubstrate: AccountId32;
@@ -1598,7 +1604,7 @@
     readonly type: 'Substrate' | 'Ethereum';
   }
 
-  /** @name UpDataStructsCreateItemData (187) */
+  /** @name UpDataStructsCreateItemData (185) */
   export interface UpDataStructsCreateItemData extends Enum {
     readonly isNft: boolean;
     readonly asNft: UpDataStructsCreateNftData;
@@ -1609,23 +1615,23 @@
     readonly type: 'Nft' | 'Fungible' | 'ReFungible';
   }
 
-  /** @name UpDataStructsCreateNftData (188) */
+  /** @name UpDataStructsCreateNftData (186) */
   export interface UpDataStructsCreateNftData extends Struct {
     readonly properties: Vec<UpDataStructsProperty>;
   }
 
-  /** @name UpDataStructsCreateFungibleData (189) */
+  /** @name UpDataStructsCreateFungibleData (187) */
   export interface UpDataStructsCreateFungibleData extends Struct {
     readonly value: u128;
   }
 
-  /** @name UpDataStructsCreateReFungibleData (190) */
+  /** @name UpDataStructsCreateReFungibleData (188) */
   export interface UpDataStructsCreateReFungibleData extends Struct {
     readonly constData: Bytes;
     readonly pieces: u128;
   }
 
-  /** @name UpDataStructsCreateItemExData (195) */
+  /** @name UpDataStructsCreateItemExData (193) */
   export interface UpDataStructsCreateItemExData extends Enum {
     readonly isNft: boolean;
     readonly asNft: Vec<UpDataStructsCreateNftExData>;
@@ -1638,19 +1644,19 @@
     readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';
   }
 
-  /** @name UpDataStructsCreateNftExData (197) */
+  /** @name UpDataStructsCreateNftExData (195) */
   export interface UpDataStructsCreateNftExData extends Struct {
     readonly properties: Vec<UpDataStructsProperty>;
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
-  /** @name UpDataStructsCreateRefungibleExData (204) */
+  /** @name UpDataStructsCreateRefungibleExData (202) */
   export interface UpDataStructsCreateRefungibleExData extends Struct {
     readonly constData: Bytes;
     readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
   }
 
-  /** @name PalletUniqueSchedulerCall (206) */
+  /** @name PalletUniqueSchedulerCall (204) */
   export interface PalletUniqueSchedulerCall extends Enum {
     readonly isScheduleNamed: boolean;
     readonly asScheduleNamed: {
@@ -1675,7 +1681,7 @@
     readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';
   }
 
-  /** @name FrameSupportScheduleMaybeHashed (208) */
+  /** @name FrameSupportScheduleMaybeHashed (206) */
   export interface FrameSupportScheduleMaybeHashed extends Enum {
     readonly isValue: boolean;
     readonly asValue: Call;
@@ -1684,13 +1690,13 @@
     readonly type: 'Value' | 'Hash';
   }
 
-  /** @name PalletTemplateTransactionPaymentCall (209) */
+  /** @name PalletTemplateTransactionPaymentCall (207) */
   export type PalletTemplateTransactionPaymentCall = Null;
 
-  /** @name PalletStructureCall (210) */
+  /** @name PalletStructureCall (208) */
   export type PalletStructureCall = Null;
 
-  /** @name PalletRmrkCoreCall (211) */
+  /** @name PalletRmrkCoreCall (209) */
   export interface PalletRmrkCoreCall extends Enum {
     readonly isCreateCollection: boolean;
     readonly asCreateCollection: {
@@ -1713,7 +1719,7 @@
     } & Struct;
     readonly isMintNft: boolean;
     readonly asMintNft: {
-      readonly owner: AccountId32;
+      readonly owner: Option<AccountId32>;
       readonly collectionId: u32;
       readonly recipient: Option<AccountId32>;
       readonly royaltyAmount: Option<Permill>;
@@ -1748,13 +1754,13 @@
     readonly asAcceptResource: {
       readonly rmrkCollectionId: u32;
       readonly rmrkNftId: u32;
-      readonly rmrkResourceId: u32;
+      readonly resourceId: u32;
     } & Struct;
     readonly isAcceptResourceRemoval: boolean;
     readonly asAcceptResourceRemoval: {
       readonly rmrkCollectionId: u32;
       readonly rmrkNftId: u32;
-      readonly rmrkResourceId: u32;
+      readonly resourceId: u32;
     } & Struct;
     readonly isSetProperty: boolean;
     readonly asSetProperty: {
@@ -1796,7 +1802,7 @@
     readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';
   }
 
-  /** @name RmrkTraitsResourceResourceTypes (217) */
+  /** @name RmrkTraitsResourceResourceTypes (215) */
   export interface RmrkTraitsResourceResourceTypes extends Enum {
     readonly isBasic: boolean;
     readonly asBasic: RmrkTraitsResourceBasicResource;
@@ -1807,7 +1813,7 @@
     readonly type: 'Basic' | 'Composable' | 'Slot';
   }
 
-  /** @name RmrkTraitsResourceBasicResource (219) */
+  /** @name RmrkTraitsResourceBasicResource (217) */
   export interface RmrkTraitsResourceBasicResource extends Struct {
     readonly src: Option<Bytes>;
     readonly metadata: Option<Bytes>;
@@ -1815,7 +1821,7 @@
     readonly thumb: Option<Bytes>;
   }
 
-  /** @name RmrkTraitsResourceComposableResource (221) */
+  /** @name RmrkTraitsResourceComposableResource (219) */
   export interface RmrkTraitsResourceComposableResource extends Struct {
     readonly parts: Vec<u32>;
     readonly base: u32;
@@ -1825,7 +1831,7 @@
     readonly thumb: Option<Bytes>;
   }
 
-  /** @name RmrkTraitsResourceSlotResource (222) */
+  /** @name RmrkTraitsResourceSlotResource (220) */
   export interface RmrkTraitsResourceSlotResource extends Struct {
     readonly base: u32;
     readonly src: Option<Bytes>;
@@ -1835,7 +1841,7 @@
     readonly thumb: Option<Bytes>;
   }
 
-  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (224) */
+  /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (222) */
   export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {
     readonly isAccountId: boolean;
     readonly asAccountId: AccountId32;
@@ -1844,7 +1850,7 @@
     readonly type: 'AccountId' | 'CollectionAndNftTuple';
   }
 
-  /** @name PalletRmrkEquipCall (228) */
+  /** @name PalletRmrkEquipCall (226) */
   export interface PalletRmrkEquipCall extends Enum {
     readonly isCreateBase: boolean;
     readonly asCreateBase: {
@@ -1857,10 +1863,16 @@
       readonly baseId: u32;
       readonly theme: RmrkTraitsTheme;
     } & Struct;
-    readonly type: 'CreateBase' | 'ThemeAdd';
+    readonly isEquippable: boolean;
+    readonly asEquippable: {
+      readonly baseId: u32;
+      readonly slotId: u32;
+      readonly equippables: RmrkTraitsPartEquippableList;
+    } & Struct;
+    readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';
   }
 
-  /** @name RmrkTraitsPartPartType (230) */
+  /** @name RmrkTraitsPartPartType (229) */
   export interface RmrkTraitsPartPartType extends Enum {
     readonly isFixedPart: boolean;
     readonly asFixedPart: RmrkTraitsPartFixedPart;
@@ -1869,14 +1881,14 @@
     readonly type: 'FixedPart' | 'SlotPart';
   }
 
-  /** @name RmrkTraitsPartFixedPart (232) */
+  /** @name RmrkTraitsPartFixedPart (231) */
   export interface RmrkTraitsPartFixedPart extends Struct {
     readonly id: u32;
     readonly z: u32;
     readonly src: Bytes;
   }
 
-  /** @name RmrkTraitsPartSlotPart (233) */
+  /** @name RmrkTraitsPartSlotPart (232) */
   export interface RmrkTraitsPartSlotPart extends Struct {
     readonly id: u32;
     readonly equippable: RmrkTraitsPartEquippableList;
@@ -1884,7 +1896,7 @@
     readonly z: u32;
   }
 
-  /** @name RmrkTraitsPartEquippableList (234) */
+  /** @name RmrkTraitsPartEquippableList (233) */
   export interface RmrkTraitsPartEquippableList extends Enum {
     readonly isAll: boolean;
     readonly isEmpty: boolean;
@@ -1893,14 +1905,14 @@
     readonly type: 'All' | 'Empty' | 'Custom';
   }
 
-  /** @name RmrkTraitsTheme (236) */
+  /** @name RmrkTraitsTheme (235) */
   export interface RmrkTraitsTheme extends Struct {
     readonly name: Bytes;
     readonly properties: Vec<RmrkTraitsThemeThemeProperty>;
     readonly inherit: bool;
   }
 
-  /** @name RmrkTraitsThemeThemeProperty (238) */
+  /** @name RmrkTraitsThemeThemeProperty (237) */
   export interface RmrkTraitsThemeThemeProperty extends Struct {
     readonly key: Bytes;
     readonly value: Bytes;
@@ -2323,17 +2335,35 @@
   /** @name CumulusPalletDmpQueueEvent (284) */
   export interface CumulusPalletDmpQueueEvent extends Enum {
     readonly isInvalidFormat: boolean;
-    readonly asInvalidFormat: U8aFixed;
+    readonly asInvalidFormat: {
+      readonly messageId: U8aFixed;
+    } & Struct;
     readonly isUnsupportedVersion: boolean;
-    readonly asUnsupportedVersion: U8aFixed;
+    readonly asUnsupportedVersion: {
+      readonly messageId: U8aFixed;
+    } & Struct;
     readonly isExecutedDownward: boolean;
-    readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;
+    readonly asExecutedDownward: {
+      readonly messageId: U8aFixed;
+      readonly outcome: XcmV2TraitsOutcome;
+    } & Struct;
     readonly isWeightExhausted: boolean;
-    readonly asWeightExhausted: ITuple<[U8aFixed, u64, u64]>;
+    readonly asWeightExhausted: {
+      readonly messageId: U8aFixed;
+      readonly remainingWeight: u64;
+      readonly requiredWeight: u64;
+    } & Struct;
     readonly isOverweightEnqueued: boolean;
-    readonly asOverweightEnqueued: ITuple<[U8aFixed, u64, u64]>;
+    readonly asOverweightEnqueued: {
+      readonly messageId: U8aFixed;
+      readonly overweightIndex: u64;
+      readonly requiredWeight: u64;
+    } & Struct;
     readonly isOverweightServiced: boolean;
-    readonly asOverweightServiced: ITuple<[u64, u64]>;
+    readonly asOverweightServiced: {
+      readonly overweightIndex: u64;
+      readonly weightUsed: u64;
+    } & Struct;
     readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';
   }
 
@@ -2527,7 +2557,12 @@
       readonly issuer: AccountId32;
       readonly baseId: u32;
     } & Struct;
-    readonly type: 'BaseCreated';
+    readonly isEquippablesUpdated: boolean;
+    readonly asEquippablesUpdated: {
+      readonly baseId: u32;
+      readonly slotId: u32;
+    } & Struct;
+    readonly type: 'BaseCreated' | 'EquippablesUpdated';
   }
 
   /** @name PalletEvmEvent (293) */
@@ -2814,7 +2849,8 @@
     readonly isCollectionDecimalPointLimitExceeded: boolean;
     readonly isConfirmUnsetSponsorFail: boolean;
     readonly isEmptyArgument: boolean;
-    readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument';
+    readonly isRepartitionCalledOnNonRefungibleCollection: boolean;
+    readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';
   }
 
   /** @name PalletUniqueSchedulerScheduledV3 (347) */
@@ -3067,9 +3103,10 @@
   export interface PalletRefungibleError extends Enum {
     readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isWrongRefungiblePieces: boolean;
+    readonly isRepartitionWhileNotOwningAllPieces: boolean;
     readonly isRefungibleDisallowsNesting: boolean;
     readonly isSettingPropertiesNotAllowed: boolean;
-    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
+    readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
   }
 
   /** @name PalletNonfungibleItemData (394) */
@@ -3077,7 +3114,14 @@
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
-  /** @name PalletNonfungibleError (396) */
+  /** @name UpDataStructsPropertyScope (396) */
+  export interface UpDataStructsPropertyScope extends Enum {
+    readonly isNone: boolean;
+    readonly isRmrk: boolean;
+    readonly type: 'None' | 'Rmrk';
+  }
+
+  /** @name PalletNonfungibleError (398) */
   export interface PalletNonfungibleError extends Enum {
     readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isNonfungibleItemsHaveNoAmount: boolean;
@@ -3085,7 +3129,7 @@
     readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';
   }
 
-  /** @name PalletStructureError (397) */
+  /** @name PalletStructureError (399) */
   export interface PalletStructureError extends Enum {
     readonly isOuroborosDetected: boolean;
     readonly isDepthLimit: boolean;
@@ -3094,12 +3138,13 @@
     readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';
   }
 
-  /** @name PalletRmrkCoreError (398) */
+  /** @name PalletRmrkCoreError (400) */
   export interface PalletRmrkCoreError extends Enum {
     readonly isCorruptedCollectionType: boolean;
     readonly isNftTypeEncodeError: boolean;
     readonly isRmrkPropertyKeyIsTooLong: boolean;
     readonly isRmrkPropertyValueIsTooLong: boolean;
+    readonly isRmrkPropertyIsNotFound: boolean;
     readonly isUnableToDecodeRmrkData: boolean;
     readonly isCollectionNotEmpty: boolean;
     readonly isNoAvailableCollectionId: boolean;
@@ -3112,21 +3157,25 @@
     readonly isCannotSendToDescendentOrSelf: boolean;
     readonly isCannotAcceptNonOwnedNft: boolean;
     readonly isCannotRejectNonOwnedNft: boolean;
+    readonly isCannotRejectNonPendingNft: boolean;
     readonly isResourceNotPending: boolean;
-    readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'ResourceNotPending';
+    readonly isNoAvailableResourceId: boolean;
+    readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';
   }
 
-  /** @name PalletRmrkEquipError (400) */
+  /** @name PalletRmrkEquipError (402) */
   export interface PalletRmrkEquipError extends Enum {
     readonly isPermissionError: boolean;
     readonly isNoAvailableBaseId: boolean;
     readonly isNoAvailablePartId: boolean;
     readonly isBaseDoesntExist: boolean;
     readonly isNeedsDefaultThemeFirst: boolean;
-    readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst';
+    readonly isPartDoesntExist: boolean;
+    readonly isNoEquippableOnFixedPart: boolean;
+    readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';
   }
 
-  /** @name PalletEvmError (403) */
+  /** @name PalletEvmError (405) */
   export interface PalletEvmError extends Enum {
     readonly isBalanceLow: boolean;
     readonly isFeeOverflow: boolean;
@@ -3137,7 +3186,7 @@
     readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';
   }
 
-  /** @name FpRpcTransactionStatus (406) */
+  /** @name FpRpcTransactionStatus (408) */
   export interface FpRpcTransactionStatus extends Struct {
     readonly transactionHash: H256;
     readonly transactionIndex: u32;
@@ -3148,10 +3197,10 @@
     readonly logsBloom: EthbloomBloom;
   }
 
-  /** @name EthbloomBloom (408) */
+  /** @name EthbloomBloom (410) */
   export interface EthbloomBloom extends U8aFixed {}
 
-  /** @name EthereumReceiptReceiptV3 (410) */
+  /** @name EthereumReceiptReceiptV3 (412) */
   export interface EthereumReceiptReceiptV3 extends Enum {
     readonly isLegacy: boolean;
     readonly asLegacy: EthereumReceiptEip658ReceiptData;
@@ -3162,7 +3211,7 @@
     readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';
   }
 
-  /** @name EthereumReceiptEip658ReceiptData (411) */
+  /** @name EthereumReceiptEip658ReceiptData (413) */
   export interface EthereumReceiptEip658ReceiptData extends Struct {
     readonly statusCode: u8;
     readonly usedGas: U256;
@@ -3170,14 +3219,14 @@
     readonly logs: Vec<EthereumLog>;
   }
 
-  /** @name EthereumBlock (412) */
+  /** @name EthereumBlock (414) */
   export interface EthereumBlock extends Struct {
     readonly header: EthereumHeader;
     readonly transactions: Vec<EthereumTransactionTransactionV2>;
     readonly ommers: Vec<EthereumHeader>;
   }
 
-  /** @name EthereumHeader (413) */
+  /** @name EthereumHeader (415) */
   export interface EthereumHeader extends Struct {
     readonly parentHash: H256;
     readonly ommersHash: H256;
@@ -3196,24 +3245,24 @@
     readonly nonce: EthereumTypesHashH64;
   }
 
-  /** @name EthereumTypesHashH64 (414) */
+  /** @name EthereumTypesHashH64 (416) */
   export interface EthereumTypesHashH64 extends U8aFixed {}
 
-  /** @name PalletEthereumError (419) */
+  /** @name PalletEthereumError (421) */
   export interface PalletEthereumError extends Enum {
     readonly isInvalidSignature: boolean;
     readonly isPreLogExists: boolean;
     readonly type: 'InvalidSignature' | 'PreLogExists';
   }
 
-  /** @name PalletEvmCoderSubstrateError (420) */
+  /** @name PalletEvmCoderSubstrateError (422) */
   export interface PalletEvmCoderSubstrateError extends Enum {
     readonly isOutOfGas: boolean;
     readonly isOutOfFund: boolean;
     readonly type: 'OutOfGas' | 'OutOfFund';
   }
 
-  /** @name PalletEvmContractHelpersSponsoringModeT (421) */
+  /** @name PalletEvmContractHelpersSponsoringModeT (423) */
   export interface PalletEvmContractHelpersSponsoringModeT extends Enum {
     readonly isDisabled: boolean;
     readonly isAllowlisted: boolean;
@@ -3221,20 +3270,20 @@
     readonly type: 'Disabled' | 'Allowlisted' | 'Generous';
   }
 
-  /** @name PalletEvmContractHelpersError (423) */
+  /** @name PalletEvmContractHelpersError (425) */
   export interface PalletEvmContractHelpersError extends Enum {
     readonly isNoPermission: boolean;
     readonly type: 'NoPermission';
   }
 
-  /** @name PalletEvmMigrationError (424) */
+  /** @name PalletEvmMigrationError (426) */
   export interface PalletEvmMigrationError extends Enum {
     readonly isAccountNotEmpty: boolean;
     readonly isAccountIsNotMigrating: boolean;
     readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';
   }
 
-  /** @name SpRuntimeMultiSignature (426) */
+  /** @name SpRuntimeMultiSignature (428) */
   export interface SpRuntimeMultiSignature extends Enum {
     readonly isEd25519: boolean;
     readonly asEd25519: SpCoreEd25519Signature;
@@ -3245,34 +3294,34 @@
     readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';
   }
 
-  /** @name SpCoreEd25519Signature (427) */
+  /** @name SpCoreEd25519Signature (429) */
   export interface SpCoreEd25519Signature extends U8aFixed {}
 
-  /** @name SpCoreSr25519Signature (429) */
+  /** @name SpCoreSr25519Signature (431) */
   export interface SpCoreSr25519Signature extends U8aFixed {}
 
-  /** @name SpCoreEcdsaSignature (430) */
+  /** @name SpCoreEcdsaSignature (432) */
   export interface SpCoreEcdsaSignature extends U8aFixed {}
 
-  /** @name FrameSystemExtensionsCheckSpecVersion (433) */
+  /** @name FrameSystemExtensionsCheckSpecVersion (435) */
   export type FrameSystemExtensionsCheckSpecVersion = Null;
 
-  /** @name FrameSystemExtensionsCheckGenesis (434) */
+  /** @name FrameSystemExtensionsCheckGenesis (436) */
   export type FrameSystemExtensionsCheckGenesis = Null;
 
-  /** @name FrameSystemExtensionsCheckNonce (437) */
+  /** @name FrameSystemExtensionsCheckNonce (439) */
   export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}
 
-  /** @name FrameSystemExtensionsCheckWeight (438) */
+  /** @name FrameSystemExtensionsCheckWeight (440) */
   export type FrameSystemExtensionsCheckWeight = Null;
 
-  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (439) */
+  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (441) */
   export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}
 
-  /** @name OpalRuntimeRuntime (440) */
+  /** @name OpalRuntimeRuntime (442) */
   export type OpalRuntimeRuntime = Null;
 
-  /** @name PalletEthereumFakeTransactionFinalizer (441) */
+  /** @name PalletEthereumFakeTransactionFinalizer (443) */
   export type PalletEthereumFakeTransactionFinalizer = Null;
 
 } // declare module
modifiedtests/src/refungible.test.tsdiffbeforeafterboth
--- a/tests/src/refungible.test.ts
+++ b/tests/src/refungible.test.ts
@@ -29,6 +29,7 @@
   createRefungibleToken,
   transfer,
   burnItem,
+  repartitionRFT,
 } from './util/helpers';
 
 import chai from 'chai';
@@ -162,4 +163,27 @@
       expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(40n);
     });
   });
+
+  it('Repartition', async () => {
+    await usingApi(async api => {
+      const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+      const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n)).itemId;
+
+      expect(await repartitionRFT(api, collectionId, alice, tokenId, 200n)).to.be.true;
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(200n);
+
+      expect(await transfer(api, collectionId, tokenId, alice, bob, 110n)).to.be.true;
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(90n);
+      expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(110n);
+
+      await expect(repartitionRFT(api, collectionId, alice, tokenId, 80n)).to.eventually.be.rejected;
+
+      expect(await transfer(api, collectionId, tokenId, alice, bob, 90n)).to.be.true;
+      expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(0n);
+      expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(200n);
+
+      expect(await repartitionRFT(api, collectionId, bob, tokenId, 150n)).to.be.true;
+      await expect(transfer(api, collectionId, tokenId, bob, alice, 160n)).to.eventually.be.rejected;
+    });
+  });
 });
modifiedtests/src/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -1630,3 +1630,17 @@
     return promise;
   });
 }
+
+export async function repartitionRFT(
+  api: ApiPromise,
+  collectionId: number,
+  sender: IKeyringPair,
+  tokenId: number,
+  amount: bigint,
+): Promise<boolean> {
+  const tx = api.tx.unique.repartition(collectionId, tokenId, amount);
+  const events = await submitTransactionAsync(sender, tx);
+  const result = getGenericResult(events);
+
+  return result.success;
+}