git.delta.rocks / unique-network / refs/commits / 415353264b69

difftreelog

style reformat code

Yaroslav Bolyukin2022-05-30parent: #d048005.patch.diff
in: master

19 files changed

modifiedclient/rpc/src/lib.rsdiffbeforeafterboth
--- a/client/rpc/src/lib.rs
+++ b/client/rpc/src/lib.rs
@@ -30,8 +30,7 @@
 // RMRK
 use rmrk_rpc::RmrkApi as RmrkRuntimeApi;
 use up_data_structs::{
-	RmrkCollectionId, RmrkNftId, RmrkBaseId, RmrkNftChild, RmrkThemeName,
-	RmrkResourceId,
+	RmrkCollectionId, RmrkNftId, RmrkBaseId, RmrkNftChild, RmrkThemeName, RmrkResourceId,
 };
 
 pub use rmrk_unique_rpc::RmrkApi;
modifiednode/cli/src/service.rsdiffbeforeafterboth
before · node/cli/src/service.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//! Service and ServiceFactory implementation. Specialized wrapper over substrate service.1819// std20use std::sync::Arc;21use std::sync::Mutex;22use std::collections::BTreeMap;23use std::time::Duration;24use std::pin::Pin;25use fc_rpc_core::types::FeeHistoryCache;26use futures::{27	Stream, StreamExt,28	stream::select,29	task::{Context, Poll},30};31use tokio::time::Interval;3233use unique_rpc::overrides_handle;3435use serde::{Serialize, Deserialize};3637// Cumulus Imports38use cumulus_client_consensus_aura::{AuraConsensus, BuildAuraConsensusParams, SlotProportion};39use cumulus_client_consensus_common::ParachainConsensus;40use cumulus_client_service::{41	prepare_node_config, start_collator, start_full_node, StartCollatorParams, StartFullNodeParams,42};43use cumulus_client_cli::CollatorOptions;44use cumulus_client_network::BlockAnnounceValidator;45use cumulus_primitives_core::ParaId;46use cumulus_relay_chain_inprocess_interface::build_inprocess_relay_chain;47use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult};48use cumulus_relay_chain_rpc_interface::RelayChainRPCInterface;4950// Substrate Imports51use sc_client_api::ExecutorProvider;52use sc_executor::NativeElseWasmExecutor;53use sc_executor::NativeExecutionDispatch;54use sc_network::NetworkService;55use sc_service::{BasePath, Configuration, PartialComponents, Role, TaskManager};56use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle};57use sp_keystore::SyncCryptoStorePtr;58use sp_runtime::traits::BlakeTwo256;59use substrate_prometheus_endpoint::Registry;60use sc_client_api::BlockchainEvents;6162use polkadot_service::CollatorPair;6364// Frontier Imports65use fc_rpc_core::types::FilterPool;66use fc_mapping_sync::{MappingSyncWorker, SyncStrategy};6768use unique_runtime_common::types::{AuraId, RuntimeInstance, AccountId, Balance, Index, Hash, Block};6970// RMRK71/* TODO free RMRK! use up_data_structs::{72	RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, RmrkBaseInfo,73	RmrkPartType, RmrkTheme,74};*/7576/// Unique native executor instance.77#[cfg(feature = "unique-runtime")]78pub struct UniqueRuntimeExecutor;7980#[cfg(feature = "quartz-runtime")]81/// Quartz native executor instance.8283pub struct QuartzRuntimeExecutor;8485/// Opal native executor instance.86pub struct OpalRuntimeExecutor;8788#[cfg(feature = "unique-runtime")]89impl NativeExecutionDispatch for UniqueRuntimeExecutor {90	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;9192	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {93		unique_runtime::api::dispatch(method, data)94	}9596	fn native_version() -> sc_executor::NativeVersion {97		unique_runtime::native_version()98	}99}100101#[cfg(feature = "quartz-runtime")]102impl NativeExecutionDispatch for QuartzRuntimeExecutor {103	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;104105	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {106		quartz_runtime::api::dispatch(method, data)107	}108109	fn native_version() -> sc_executor::NativeVersion {110		quartz_runtime::native_version()111	}112}113114impl NativeExecutionDispatch for OpalRuntimeExecutor {115	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;116117	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {118		opal_runtime::api::dispatch(method, data)119	}120121	fn native_version() -> sc_executor::NativeVersion {122		opal_runtime::native_version()123	}124}125126pub struct AutosealInterval {127	interval: Interval,128}129130impl AutosealInterval {131	pub fn new(config: &Configuration, interval: Duration) -> Self {132		let _tokio_runtime = config.tokio_handle.enter();133		let interval = tokio::time::interval(interval);134135		Self { interval }136	}137}138139impl Stream for AutosealInterval {140	type Item = tokio::time::Instant;141142	fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {143		self.interval.poll_tick(cx).map(Some)144	}145}146147pub fn open_frontier_backend(config: &Configuration) -> Result<Arc<fc_db::Backend<Block>>, String> {148	let config_dir = config149		.base_path150		.as_ref()151		.map(|base_path| base_path.config_dir(config.chain_spec.id()))152		.unwrap_or_else(|| {153			BasePath::from_project("", "", "unique").config_dir(config.chain_spec.id())154		});155	let database_dir = config_dir.join("frontier").join("db");156157	Ok(Arc::new(fc_db::Backend::<Block>::new(158		&fc_db::DatabaseSettings {159			source: fc_db::DatabaseSettingsSrc::RocksDb {160				path: database_dir,161				cache_size: 0,162			},163		},164	)?))165}166167type FullClient<RuntimeApi, ExecutorDispatch> =168	sc_service::TFullClient<Block, RuntimeApi, NativeElseWasmExecutor<ExecutorDispatch>>;169type FullBackend = sc_service::TFullBackend<Block>;170type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;171172/// Starts a `ServiceBuilder` for a full service.173///174/// Use this macro if you don't actually need the full service, but just the builder in order to175/// be able to perform chain operations.176#[allow(clippy::type_complexity)]177pub fn new_partial<RuntimeApi, ExecutorDispatch, BIQ>(178	config: &Configuration,179	build_import_queue: BIQ,180) -> Result<181	PartialComponents<182		FullClient<RuntimeApi, ExecutorDispatch>,183		FullBackend,184		FullSelectChain,185		sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,186		sc_transaction_pool::FullPool<Block, FullClient<RuntimeApi, ExecutorDispatch>>,187		(188			Option<Telemetry>,189			Option<FilterPool>,190			Arc<fc_db::Backend<Block>>,191			Option<TelemetryWorkerHandle>,192			FeeHistoryCache,193		),194	>,195	sc_service::Error,196>197where198	sc_client_api::StateBackendFor<FullBackend, Block>: sp_api::StateBackend<BlakeTwo256>,199	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>200		+ Send201		+ Sync202		+ 'static,203	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>,204	ExecutorDispatch: NativeExecutionDispatch + 'static,205	BIQ: FnOnce(206		Arc<FullClient<RuntimeApi, ExecutorDispatch>>,207		&Configuration,208		Option<TelemetryHandle>,209		&TaskManager,210	) -> Result<211		sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,212		sc_service::Error,213	>,214{215	let _telemetry = config216		.telemetry_endpoints217		.clone()218		.filter(|x| !x.is_empty())219		.map(|endpoints| -> Result<_, sc_telemetry::Error> {220			let worker = TelemetryWorker::new(16)?;221			let telemetry = worker.handle().new_telemetry(endpoints);222			Ok((worker, telemetry))223		})224		.transpose()?;225226	let telemetry = config227		.telemetry_endpoints228		.clone()229		.filter(|x| !x.is_empty())230		.map(|endpoints| -> Result<_, sc_telemetry::Error> {231			let worker = TelemetryWorker::new(16)?;232			let telemetry = worker.handle().new_telemetry(endpoints);233			Ok((worker, telemetry))234		})235		.transpose()?;236237	let executor = NativeElseWasmExecutor::<ExecutorDispatch>::new(238		config.wasm_method,239		config.default_heap_pages,240		config.max_runtime_instances,241		config.runtime_cache_size,242	);243244	let (client, backend, keystore_container, task_manager) =245		sc_service::new_full_parts::<Block, RuntimeApi, _>(246			config,247			telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()),248			executor,249		)?;250	let client = Arc::new(client);251252	let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle());253254	let telemetry = telemetry.map(|(worker, telemetry)| {255		task_manager256			.spawn_handle()257			.spawn("telemetry", None, worker.run());258		telemetry259	});260261	let select_chain = sc_consensus::LongestChain::new(backend.clone());262263	let transaction_pool = sc_transaction_pool::BasicPool::new_full(264		config.transaction_pool.clone(),265		config.role.is_authority().into(),266		config.prometheus_registry(),267		task_manager.spawn_essential_handle(),268		client.clone(),269	);270271	let filter_pool: Option<FilterPool> = Some(Arc::new(Mutex::new(BTreeMap::new())));272273	let frontier_backend = open_frontier_backend(config)?;274275	let import_queue = build_import_queue(276		client.clone(),277		config,278		telemetry.as_ref().map(|telemetry| telemetry.handle()),279		&task_manager,280	)?;281	let fee_history_cache: FeeHistoryCache = Arc::new(Mutex::new(BTreeMap::new()));282283	let params = PartialComponents {284		backend,285		client,286		import_queue,287		keystore_container,288		task_manager,289		transaction_pool,290		select_chain,291		other: (292			telemetry,293			filter_pool,294			frontier_backend,295			telemetry_worker_handle,296			fee_history_cache,297		),298	};299300	Ok(params)301}302303async fn build_relay_chain_interface(304	polkadot_config: Configuration,305	parachain_config: &Configuration,306	telemetry_worker_handle: Option<TelemetryWorkerHandle>,307	task_manager: &mut TaskManager,308	collator_options: CollatorOptions,309) -> RelayChainResult<(310	Arc<(dyn RelayChainInterface + 'static)>,311	Option<CollatorPair>,312)> {313	match collator_options.relay_chain_rpc_url {314		Some(relay_chain_url) => Ok((315			Arc::new(RelayChainRPCInterface::new(relay_chain_url).await?) as Arc<_>,316			None,317		)),318		None => build_inprocess_relay_chain(319			polkadot_config,320			parachain_config,321			telemetry_worker_handle,322			task_manager,323		),324	}325}326327/// Start a node with the given parachain `Configuration` and relay chain `Configuration`.328///329/// This is the actual implementation that is abstract over the executor and the runtime api.330#[sc_tracing::logging::prefix_logs_with("Parachain")]331async fn start_node_impl<Runtime, RuntimeApi, ExecutorDispatch, BIQ, BIC>(332	parachain_config: Configuration,333	polkadot_config: Configuration,334	collator_options: CollatorOptions,335	id: ParaId,336	build_import_queue: BIQ,337	build_consensus: BIC,338) -> sc_service::error::Result<(TaskManager, Arc<FullClient<RuntimeApi, ExecutorDispatch>>)>339where340	sc_client_api::StateBackendFor<FullBackend, Block>: sp_api::StateBackend<BlakeTwo256>,341	Runtime: RuntimeInstance + Send + Sync + 'static,342	<Runtime as RuntimeInstance>::CrossAccountId: Serialize,343	for<'de> <Runtime as RuntimeInstance>::CrossAccountId: Deserialize<'de>,344	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>345		+ Send346		+ Sync347		+ 'static,348	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>349		+ fp_rpc::EthereumRuntimeRPCApi<Block>350		+ fp_rpc::ConvertTransactionRuntimeApi<Block>351		+ sp_session::SessionKeys<Block>352		+ sp_block_builder::BlockBuilder<Block>353		+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>354		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>355		+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>356		/* TODO free RMRK!357		+ rmrk_rpc::RmrkApi<358			Block,359			AccountId,360			RmrkCollectionInfo<AccountId>,361			RmrkInstanceInfo<AccountId>,362			RmrkResourceInfo,363			RmrkPropertyInfo,364			RmrkBaseInfo<AccountId>,365			RmrkPartType,366			RmrkTheme,367		>*/ + substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>368		+ sp_api::Metadata<Block>369		+ sp_offchain::OffchainWorkerApi<Block>370		+ cumulus_primitives_core::CollectCollationInfo<Block>,371	ExecutorDispatch: NativeExecutionDispatch + 'static,372	BIQ: FnOnce(373		Arc<FullClient<RuntimeApi, ExecutorDispatch>>,374		&Configuration,375		Option<TelemetryHandle>,376		&TaskManager,377	) -> Result<378		sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,379		sc_service::Error,380	>,381	BIC: FnOnce(382		Arc<FullClient<RuntimeApi, ExecutorDispatch>>,383		Option<&Registry>,384		Option<TelemetryHandle>,385		&TaskManager,386		Arc<dyn RelayChainInterface>,387		Arc<sc_transaction_pool::FullPool<Block, FullClient<RuntimeApi, ExecutorDispatch>>>,388		Arc<NetworkService<Block, Hash>>,389		SyncCryptoStorePtr,390		bool,391	) -> Result<Box<dyn ParachainConsensus<Block>>, sc_service::Error>,392{393	if matches!(parachain_config.role, Role::Light) {394		return Err("Light client not supported!".into());395	}396397	let parachain_config = prepare_node_config(parachain_config);398399	let params =400		new_partial::<RuntimeApi, ExecutorDispatch, BIQ>(&parachain_config, build_import_queue)?;401	let (mut telemetry, filter_pool, frontier_backend, telemetry_worker_handle, fee_history_cache) =402		params.other;403404	let client = params.client.clone();405	let backend = params.backend.clone();406	let mut task_manager = params.task_manager;407408	let (relay_chain_interface, collator_key) = build_relay_chain_interface(409		polkadot_config,410		&parachain_config,411		telemetry_worker_handle,412		&mut task_manager,413		collator_options.clone(),414	)415	.await416	.map_err(|e| match e {417		RelayChainError::ServiceError(polkadot_service::Error::Sub(x)) => x,418		s => s.to_string().into(),419	})?;420421	let block_announce_validator = BlockAnnounceValidator::new(relay_chain_interface.clone(), id);422423	let force_authoring = parachain_config.force_authoring;424	let validator = parachain_config.role.is_authority();425	let prometheus_registry = parachain_config.prometheus_registry().cloned();426	let transaction_pool = params.transaction_pool.clone();427	let import_queue = cumulus_client_service::SharedImportQueue::new(params.import_queue);428429	let (network, system_rpc_tx, start_network) =430		sc_service::build_network(sc_service::BuildNetworkParams {431			config: &parachain_config,432			client: client.clone(),433			transaction_pool: transaction_pool.clone(),434			spawn_handle: task_manager.spawn_handle(),435			import_queue: import_queue.clone(),436			block_announce_validator_builder: Some(Box::new(|_| {437				Box::new(block_announce_validator)438			})),439			warp_sync: None,440		})?;441442	let subscription_executor = sc_rpc::SubscriptionTaskExecutor::new(task_manager.spawn_handle());443	let rpc_client = client.clone();444	let rpc_pool = transaction_pool.clone();445	let select_chain = params.select_chain.clone();446	let rpc_network = network.clone();447448	let rpc_frontier_backend = frontier_backend.clone();449450	let block_data_cache = Arc::new(fc_rpc::EthBlockDataCache::new(451		task_manager.spawn_handle(),452		overrides_handle::<_, _, Runtime>(client.clone()),453		50,454		50,455	));456457	let rpc_extensions_builder = Box::new(move |deny_unsafe, _| {458		let full_deps = unique_rpc::FullDeps {459			backend: rpc_frontier_backend.clone(),460			deny_unsafe,461			client: rpc_client.clone(),462			pool: rpc_pool.clone(),463			graph: rpc_pool.pool().clone(),464			// TODO: Unhardcode465			enable_dev_signer: false,466			filter_pool: filter_pool.clone(),467			network: rpc_network.clone(),468			select_chain: select_chain.clone(),469			is_authority: validator,470			// TODO: Unhardcode471			max_past_logs: 10000,472			block_data_cache: block_data_cache.clone(),473			fee_history_cache: fee_history_cache.clone(),474			// TODO: Unhardcode475			fee_history_limit: 2048,476		};477478		Ok(479			unique_rpc::create_full::<_, _, _, _, Runtime, RuntimeApi, _>(480				full_deps,481				subscription_executor.clone(),482			),483		)484	});485486	task_manager.spawn_essential_handle().spawn(487		"frontier-mapping-sync-worker",488		None,489		MappingSyncWorker::new(490			client.import_notification_stream(),491			Duration::new(6, 0),492			client.clone(),493			backend.clone(),494			frontier_backend.clone(),495			3,496			0,497			SyncStrategy::Normal,498		)499		.for_each(|()| futures::future::ready(())),500	);501502	sc_service::spawn_tasks(sc_service::SpawnTasksParams {503		rpc_extensions_builder,504		client: client.clone(),505		transaction_pool: transaction_pool.clone(),506		task_manager: &mut task_manager,507		config: parachain_config,508		keystore: params.keystore_container.sync_keystore(),509		backend: backend.clone(),510		network: network.clone(),511		system_rpc_tx,512		telemetry: telemetry.as_mut(),513	})?;514515	let announce_block = {516		let network = network.clone();517		Arc::new(move |hash, data| network.announce_block(hash, data))518	};519520	let relay_chain_slot_duration = Duration::from_secs(6);521522	if validator {523		let parachain_consensus = build_consensus(524			client.clone(),525			prometheus_registry.as_ref(),526			telemetry.as_ref().map(|t| t.handle()),527			&task_manager,528			relay_chain_interface.clone(),529			transaction_pool,530			network,531			params.keystore_container.sync_keystore(),532			force_authoring,533		)?;534535		let spawner = task_manager.spawn_handle();536537		let params = StartCollatorParams {538			para_id: id,539			block_status: client.clone(),540			announce_block,541			client: client.clone(),542			task_manager: &mut task_manager,543			spawner,544			parachain_consensus,545			import_queue,546			collator_key: collator_key.expect("Command line arguments do not allow this. qed"),547			relay_chain_interface,548			relay_chain_slot_duration,549		};550551		start_collator(params).await?;552	} else {553		let params = StartFullNodeParams {554			client: client.clone(),555			announce_block,556			task_manager: &mut task_manager,557			para_id: id,558			import_queue,559			relay_chain_interface,560			relay_chain_slot_duration,561			collator_options,562		};563564		start_full_node(params)?;565	}566567	start_network.start_network();568569	Ok((task_manager, client))570}571572/// Build the import queue for the the parachain runtime.573pub fn parachain_build_import_queue<RuntimeApi, ExecutorDispatch>(574	client: Arc<FullClient<RuntimeApi, ExecutorDispatch>>,575	config: &Configuration,576	telemetry: Option<TelemetryHandle>,577	task_manager: &TaskManager,578) -> Result<579	sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,580	sc_service::Error,581>582where583	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>584		+ Send585		+ Sync586		+ 'static,587	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>588		+ sp_block_builder::BlockBuilder<Block>589		+ sp_consensus_aura::AuraApi<Block, AuraId>590		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>,591	ExecutorDispatch: NativeExecutionDispatch + 'static,592{593	let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;594595	cumulus_client_consensus_aura::import_queue::<596		sp_consensus_aura::sr25519::AuthorityPair,597		_,598		_,599		_,600		_,601		_,602		_,603	>(cumulus_client_consensus_aura::ImportQueueParams {604		block_import: client.clone(),605		client: client.clone(),606		create_inherent_data_providers: move |_, _| async move {607			let time = sp_timestamp::InherentDataProvider::from_system_time();608609			let slot =610				sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(611					*time,612					slot_duration,613				);614615			Ok((time, slot))616		},617		registry: config.prometheus_registry(),618		can_author_with: sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()),619		spawner: &task_manager.spawn_essential_handle(),620		telemetry,621	})622	.map_err(Into::into)623}624625/// Start a normal parachain node.626pub async fn start_node<Runtime, RuntimeApi, ExecutorDispatch>(627	parachain_config: Configuration,628	polkadot_config: Configuration,629	collator_options: CollatorOptions,630	id: ParaId,631) -> sc_service::error::Result<(TaskManager, Arc<FullClient<RuntimeApi, ExecutorDispatch>>)>632where633	Runtime: RuntimeInstance + Send + Sync + 'static,634	<Runtime as RuntimeInstance>::CrossAccountId: Serialize,635	for<'de> <Runtime as RuntimeInstance>::CrossAccountId: Deserialize<'de>,636	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>637		+ Send638		+ Sync639		+ 'static,640	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>641		+ fp_rpc::EthereumRuntimeRPCApi<Block>642		+ fp_rpc::ConvertTransactionRuntimeApi<Block>643		+ sp_session::SessionKeys<Block>644		+ sp_block_builder::BlockBuilder<Block>645		+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>646		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>647		+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>648		/* TODO free RMRK!649		+ rmrk_rpc::RmrkApi<650			Block,651			AccountId,652			RmrkCollectionInfo<AccountId>,653			RmrkInstanceInfo<AccountId>,654			RmrkResourceInfo,655			RmrkPropertyInfo,656			RmrkBaseInfo<AccountId>,657			RmrkPartType,658			RmrkTheme,659		>*/ + substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>660		+ sp_api::Metadata<Block>661		+ sp_offchain::OffchainWorkerApi<Block>662		+ cumulus_primitives_core::CollectCollationInfo<Block>663		+ sp_consensus_aura::AuraApi<Block, AuraId>,664	ExecutorDispatch: NativeExecutionDispatch + 'static,665{666	start_node_impl::<Runtime, RuntimeApi, ExecutorDispatch, _, _>(667		parachain_config,668		polkadot_config,669		collator_options,670		id,671		parachain_build_import_queue,672		|client,673		 prometheus_registry,674		 telemetry,675		 task_manager,676		 relay_chain_interface,677		 transaction_pool,678		 sync_oracle,679		 keystore,680		 force_authoring| {681			let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;682683			let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording(684				task_manager.spawn_handle(),685				client.clone(),686				transaction_pool,687				prometheus_registry,688				telemetry.clone(),689			);690691			Ok(AuraConsensus::build::<692				sp_consensus_aura::sr25519::AuthorityPair,693				_,694				_,695				_,696				_,697				_,698				_,699			>(BuildAuraConsensusParams {700				proposer_factory,701				create_inherent_data_providers: move |_, (relay_parent, validation_data)| {702					let relay_chain_interface = relay_chain_interface.clone();703					async move {704						let parachain_inherent =705						cumulus_primitives_parachain_inherent::ParachainInherentData::create_at(706							relay_parent,707							&relay_chain_interface,708							&validation_data,709							id,710						).await;711712						let time = sp_timestamp::InherentDataProvider::from_system_time();713714						let slot =715						sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(716							*time,717							slot_duration,718						);719720						let parachain_inherent = parachain_inherent.ok_or_else(|| {721							Box::<dyn std::error::Error + Send + Sync>::from(722								"Failed to create parachain inherent",723							)724						})?;725						Ok((time, slot, parachain_inherent))726					}727				},728				block_import: client.clone(),729				para_client: client,730				backoff_authoring_blocks: Option::<()>::None,731				sync_oracle,732				keystore,733				force_authoring,734				slot_duration,735				// We got around 500ms for proposing736				block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32),737				telemetry,738				max_block_proposal_slot_portion: None,739			}))740		},741	)742	.await743}744745fn dev_build_import_queue<RuntimeApi, ExecutorDispatch>(746	client: Arc<FullClient<RuntimeApi, ExecutorDispatch>>,747	config: &Configuration,748	_: Option<TelemetryHandle>,749	task_manager: &TaskManager,750) -> Result<751	sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,752	sc_service::Error,753>754where755	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>756		+ Send757		+ Sync758		+ 'static,759	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>760		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>,761	ExecutorDispatch: NativeExecutionDispatch + 'static,762{763	Ok(sc_consensus_manual_seal::import_queue(764		Box::new(client.clone()),765		&task_manager.spawn_essential_handle(),766		config.prometheus_registry(),767	))768}769770/// Builds a new development service. This service uses instant seal, and mocks771/// the parachain inherent772pub fn start_dev_node<Runtime, RuntimeApi, ExecutorDispatch>(773	config: Configuration,774	autoseal_interval: Duration,775) -> sc_service::error::Result<TaskManager>776where777	Runtime: RuntimeInstance + Send + Sync + 'static,778	<Runtime as RuntimeInstance>::CrossAccountId: Serialize,779	for<'de> <Runtime as RuntimeInstance>::CrossAccountId: Deserialize<'de>,780	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>781		+ Send782		+ Sync783		+ 'static,784	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>785		+ fp_rpc::EthereumRuntimeRPCApi<Block>786		+ fp_rpc::ConvertTransactionRuntimeApi<Block>787		+ sp_session::SessionKeys<Block>788		+ sp_block_builder::BlockBuilder<Block>789		+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>790		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>791		+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>792		/* TODO free RMRK!793		+ rmrk_rpc::RmrkApi<794			Block,795			AccountId,796			RmrkCollectionInfo<AccountId>,797			RmrkInstanceInfo<AccountId>,798			RmrkResourceInfo,799			RmrkPropertyInfo,800			RmrkBaseInfo<AccountId>,801			RmrkPartType,802			RmrkTheme,803		>*/ + substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>804		+ sp_api::Metadata<Block>805		+ sp_offchain::OffchainWorkerApi<Block>806		+ cumulus_primitives_core::CollectCollationInfo<Block>807		+ sp_consensus_aura::AuraApi<Block, AuraId>,808	ExecutorDispatch: NativeExecutionDispatch + 'static,809{810	use sc_consensus_manual_seal::{run_manual_seal, EngineCommand, ManualSealParams};811	use fc_consensus::FrontierBlockImport;812	use sc_client_api::HeaderBackend;813814	let sc_service::PartialComponents {815		client,816		backend,817		mut task_manager,818		import_queue,819		keystore_container,820		select_chain: maybe_select_chain,821		transaction_pool,822		other:823			(telemetry, filter_pool, frontier_backend, _telemetry_worker_handle, fee_history_cache),824	} = new_partial::<RuntimeApi, ExecutorDispatch, _>(825		&config,826		dev_build_import_queue::<RuntimeApi, ExecutorDispatch>,827	)?;828829	let block_data_cache = Arc::new(fc_rpc::EthBlockDataCache::new(830		task_manager.spawn_handle(),831		overrides_handle::<_, _, Runtime>(client.clone()),832		50,833		50,834	));835836	let (network, system_rpc_tx, network_starter) =837		sc_service::build_network(sc_service::BuildNetworkParams {838			config: &config,839			client: client.clone(),840			transaction_pool: transaction_pool.clone(),841			spawn_handle: task_manager.spawn_handle(),842			import_queue,843			block_announce_validator_builder: None,844			warp_sync: None,845		})?;846847	if config.offchain_worker.enabled {848		sc_service::build_offchain_workers(849			&config,850			task_manager.spawn_handle(),851			client.clone(),852			network.clone(),853		);854	}855856	let prometheus_registry = config.prometheus_registry().cloned();857	let collator = config.role.is_authority();858859	let select_chain = maybe_select_chain.clone();860861	if collator {862		let block_import =863			FrontierBlockImport::new(client.clone(), client.clone(), frontier_backend.clone());864865		let env = sc_basic_authorship::ProposerFactory::new(866			task_manager.spawn_handle(),867			client.clone(),868			transaction_pool.clone(),869			prometheus_registry.as_ref(),870			telemetry.as_ref().map(|x| x.handle()),871		);872873		let transactions_commands_stream: Box<874			dyn Stream<Item = EngineCommand<Hash>> + Send + Sync + Unpin,875		> = Box::new(876			transaction_pool877				.pool()878				.validated_pool()879				.import_notification_stream()880				.map(|_| EngineCommand::SealNewBlock {881					create_empty: true,882					finalize: false,883					parent_hash: None,884					sender: None,885				}),886		);887888		let autoseal_interval = Box::pin(AutosealInterval::new(&config, autoseal_interval));889		let idle_commands_stream: Box<890			dyn Stream<Item = EngineCommand<Hash>> + Send + Sync + Unpin,891		> = Box::new(autoseal_interval.map(|_| EngineCommand::SealNewBlock {892			create_empty: true,893			finalize: false,894			parent_hash: None,895			sender: None,896		}));897898		let commands_stream = select(transactions_commands_stream, idle_commands_stream);899900		let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;901		let client_set_aside_for_cidp = client.clone();902903		task_manager.spawn_essential_handle().spawn_blocking(904			"authorship_task",905			Some("block-authoring"),906			run_manual_seal(ManualSealParams {907				block_import,908				env,909				client: client.clone(),910				pool: transaction_pool.clone(),911				commands_stream,912				select_chain: select_chain.clone(),913				consensus_data_provider: None,914				create_inherent_data_providers: move |block: Hash, ()| {915					let current_para_block = client_set_aside_for_cidp916						.number(block)917						.expect("Header lookup should succeed")918						.expect("Header passed in as parent should be present in backend.");919920					let client_for_xcm = client_set_aside_for_cidp.clone();921					async move {922						let time = sp_timestamp::InherentDataProvider::from_system_time();923924						let mocked_parachain = cumulus_primitives_parachain_inherent::MockValidationDataInherentDataProvider {925							current_para_block,926							relay_offset: 1000,927							relay_blocks_per_para_block: 2,928							xcm_config: cumulus_primitives_parachain_inherent::MockXcmConfig::new(929								&*client_for_xcm,930								block,931								Default::default(),932								Default::default(),933							),934							raw_downward_messages: vec![],935							raw_horizontal_messages: vec![],936						};937938						let slot =939						sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(940							*time,941							slot_duration,942						);943944						Ok((time, slot, mocked_parachain))945					}946				},947			}),948		);949	}950951	task_manager.spawn_essential_handle().spawn(952		"frontier-mapping-sync-worker",953		Some("block-authoring"),954		MappingSyncWorker::new(955			client.import_notification_stream(),956			Duration::new(6, 0),957			client.clone(),958			backend.clone(),959			frontier_backend.clone(),960			3,961			0,962			SyncStrategy::Normal,963		)964		.for_each(|()| futures::future::ready(())),965	);966967	let subscription_executor = sc_rpc::SubscriptionTaskExecutor::new(task_manager.spawn_handle());968	let rpc_client = client.clone();969	let rpc_pool = transaction_pool.clone();970	let rpc_network = network.clone();971	let rpc_frontier_backend = frontier_backend.clone();972	let rpc_extensions_builder = Box::new(move |deny_unsafe, _| {973		let full_deps = unique_rpc::FullDeps {974			backend: rpc_frontier_backend.clone(),975			deny_unsafe,976			client: rpc_client.clone(),977			pool: rpc_pool.clone(),978			graph: rpc_pool.pool().clone(),979			// TODO: Unhardcode980			enable_dev_signer: false,981			filter_pool: filter_pool.clone(),982			network: rpc_network.clone(),983			select_chain: select_chain.clone(),984			is_authority: collator,985			// TODO: Unhardcode986			max_past_logs: 10000,987			block_data_cache: block_data_cache.clone(),988			fee_history_cache: fee_history_cache.clone(),989			// TODO: Unhardcode990			fee_history_limit: 2048,991		};992993		Ok(994			unique_rpc::create_full::<_, _, _, _, Runtime, RuntimeApi, _>(995				full_deps,996				subscription_executor.clone(),997			),998		)999	});10001001	sc_service::spawn_tasks(sc_service::SpawnTasksParams {1002		network,1003		client,1004		keystore: keystore_container.sync_keystore(),1005		task_manager: &mut task_manager,1006		transaction_pool,1007		rpc_extensions_builder,1008		backend,1009		system_rpc_tx,1010		config,1011		telemetry: None,1012	})?;10131014	network_starter.start_network();1015	Ok(task_manager)1016}
after · node/cli/src/service.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//! Service and ServiceFactory implementation. Specialized wrapper over substrate service.1819// std20use std::sync::Arc;21use std::sync::Mutex;22use std::collections::BTreeMap;23use std::time::Duration;24use std::pin::Pin;25use fc_rpc_core::types::FeeHistoryCache;26use futures::{27	Stream, StreamExt,28	stream::select,29	task::{Context, Poll},30};31use tokio::time::Interval;3233use unique_rpc::overrides_handle;3435use serde::{Serialize, Deserialize};3637// Cumulus Imports38use cumulus_client_consensus_aura::{AuraConsensus, BuildAuraConsensusParams, SlotProportion};39use cumulus_client_consensus_common::ParachainConsensus;40use cumulus_client_service::{41	prepare_node_config, start_collator, start_full_node, StartCollatorParams, StartFullNodeParams,42};43use cumulus_client_cli::CollatorOptions;44use cumulus_client_network::BlockAnnounceValidator;45use cumulus_primitives_core::ParaId;46use cumulus_relay_chain_inprocess_interface::build_inprocess_relay_chain;47use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult};48use cumulus_relay_chain_rpc_interface::RelayChainRPCInterface;4950// Substrate Imports51use sc_client_api::ExecutorProvider;52use sc_executor::NativeElseWasmExecutor;53use sc_executor::NativeExecutionDispatch;54use sc_network::NetworkService;55use sc_service::{BasePath, Configuration, PartialComponents, Role, TaskManager};56use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle};57use sp_keystore::SyncCryptoStorePtr;58use sp_runtime::traits::BlakeTwo256;59use substrate_prometheus_endpoint::Registry;60use sc_client_api::BlockchainEvents;6162use polkadot_service::CollatorPair;6364// Frontier Imports65use fc_rpc_core::types::FilterPool;66use fc_mapping_sync::{MappingSyncWorker, SyncStrategy};6768use unique_runtime_common::types::{AuraId, RuntimeInstance, AccountId, Balance, Index, Hash, Block};6970// RMRK71/* TODO free RMRK! use up_data_structs::{72	RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, RmrkBaseInfo,73	RmrkPartType, RmrkTheme,74};*/7576/// Unique native executor instance.77#[cfg(feature = "unique-runtime")]78pub struct UniqueRuntimeExecutor;7980#[cfg(feature = "quartz-runtime")]81/// Quartz native executor instance.8283pub struct QuartzRuntimeExecutor;8485/// Opal native executor instance.86pub struct OpalRuntimeExecutor;8788#[cfg(feature = "unique-runtime")]89impl NativeExecutionDispatch for UniqueRuntimeExecutor {90	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;9192	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {93		unique_runtime::api::dispatch(method, data)94	}9596	fn native_version() -> sc_executor::NativeVersion {97		unique_runtime::native_version()98	}99}100101#[cfg(feature = "quartz-runtime")]102impl NativeExecutionDispatch for QuartzRuntimeExecutor {103	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;104105	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {106		quartz_runtime::api::dispatch(method, data)107	}108109	fn native_version() -> sc_executor::NativeVersion {110		quartz_runtime::native_version()111	}112}113114impl NativeExecutionDispatch for OpalRuntimeExecutor {115	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;116117	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {118		opal_runtime::api::dispatch(method, data)119	}120121	fn native_version() -> sc_executor::NativeVersion {122		opal_runtime::native_version()123	}124}125126pub struct AutosealInterval {127	interval: Interval,128}129130impl AutosealInterval {131	pub fn new(config: &Configuration, interval: Duration) -> Self {132		let _tokio_runtime = config.tokio_handle.enter();133		let interval = tokio::time::interval(interval);134135		Self { interval }136	}137}138139impl Stream for AutosealInterval {140	type Item = tokio::time::Instant;141142	fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {143		self.interval.poll_tick(cx).map(Some)144	}145}146147pub fn open_frontier_backend(config: &Configuration) -> Result<Arc<fc_db::Backend<Block>>, String> {148	let config_dir = config149		.base_path150		.as_ref()151		.map(|base_path| base_path.config_dir(config.chain_spec.id()))152		.unwrap_or_else(|| {153			BasePath::from_project("", "", "unique").config_dir(config.chain_spec.id())154		});155	let database_dir = config_dir.join("frontier").join("db");156157	Ok(Arc::new(fc_db::Backend::<Block>::new(158		&fc_db::DatabaseSettings {159			source: fc_db::DatabaseSettingsSrc::RocksDb {160				path: database_dir,161				cache_size: 0,162			},163		},164	)?))165}166167type FullClient<RuntimeApi, ExecutorDispatch> =168	sc_service::TFullClient<Block, RuntimeApi, NativeElseWasmExecutor<ExecutorDispatch>>;169type FullBackend = sc_service::TFullBackend<Block>;170type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;171172/// Starts a `ServiceBuilder` for a full service.173///174/// Use this macro if you don't actually need the full service, but just the builder in order to175/// be able to perform chain operations.176#[allow(clippy::type_complexity)]177pub fn new_partial<RuntimeApi, ExecutorDispatch, BIQ>(178	config: &Configuration,179	build_import_queue: BIQ,180) -> Result<181	PartialComponents<182		FullClient<RuntimeApi, ExecutorDispatch>,183		FullBackend,184		FullSelectChain,185		sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,186		sc_transaction_pool::FullPool<Block, FullClient<RuntimeApi, ExecutorDispatch>>,187		(188			Option<Telemetry>,189			Option<FilterPool>,190			Arc<fc_db::Backend<Block>>,191			Option<TelemetryWorkerHandle>,192			FeeHistoryCache,193		),194	>,195	sc_service::Error,196>197where198	sc_client_api::StateBackendFor<FullBackend, Block>: sp_api::StateBackend<BlakeTwo256>,199	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>200		+ Send201		+ Sync202		+ 'static,203	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>,204	ExecutorDispatch: NativeExecutionDispatch + 'static,205	BIQ: FnOnce(206		Arc<FullClient<RuntimeApi, ExecutorDispatch>>,207		&Configuration,208		Option<TelemetryHandle>,209		&TaskManager,210	) -> Result<211		sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,212		sc_service::Error,213	>,214{215	let _telemetry = config216		.telemetry_endpoints217		.clone()218		.filter(|x| !x.is_empty())219		.map(|endpoints| -> Result<_, sc_telemetry::Error> {220			let worker = TelemetryWorker::new(16)?;221			let telemetry = worker.handle().new_telemetry(endpoints);222			Ok((worker, telemetry))223		})224		.transpose()?;225226	let telemetry = config227		.telemetry_endpoints228		.clone()229		.filter(|x| !x.is_empty())230		.map(|endpoints| -> Result<_, sc_telemetry::Error> {231			let worker = TelemetryWorker::new(16)?;232			let telemetry = worker.handle().new_telemetry(endpoints);233			Ok((worker, telemetry))234		})235		.transpose()?;236237	let executor = NativeElseWasmExecutor::<ExecutorDispatch>::new(238		config.wasm_method,239		config.default_heap_pages,240		config.max_runtime_instances,241		config.runtime_cache_size,242	);243244	let (client, backend, keystore_container, task_manager) =245		sc_service::new_full_parts::<Block, RuntimeApi, _>(246			config,247			telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()),248			executor,249		)?;250	let client = Arc::new(client);251252	let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle());253254	let telemetry = telemetry.map(|(worker, telemetry)| {255		task_manager256			.spawn_handle()257			.spawn("telemetry", None, worker.run());258		telemetry259	});260261	let select_chain = sc_consensus::LongestChain::new(backend.clone());262263	let transaction_pool = sc_transaction_pool::BasicPool::new_full(264		config.transaction_pool.clone(),265		config.role.is_authority().into(),266		config.prometheus_registry(),267		task_manager.spawn_essential_handle(),268		client.clone(),269	);270271	let filter_pool: Option<FilterPool> = Some(Arc::new(Mutex::new(BTreeMap::new())));272273	let frontier_backend = open_frontier_backend(config)?;274275	let import_queue = build_import_queue(276		client.clone(),277		config,278		telemetry.as_ref().map(|telemetry| telemetry.handle()),279		&task_manager,280	)?;281	let fee_history_cache: FeeHistoryCache = Arc::new(Mutex::new(BTreeMap::new()));282283	let params = PartialComponents {284		backend,285		client,286		import_queue,287		keystore_container,288		task_manager,289		transaction_pool,290		select_chain,291		other: (292			telemetry,293			filter_pool,294			frontier_backend,295			telemetry_worker_handle,296			fee_history_cache,297		),298	};299300	Ok(params)301}302303async fn build_relay_chain_interface(304	polkadot_config: Configuration,305	parachain_config: &Configuration,306	telemetry_worker_handle: Option<TelemetryWorkerHandle>,307	task_manager: &mut TaskManager,308	collator_options: CollatorOptions,309) -> RelayChainResult<(310	Arc<(dyn RelayChainInterface + 'static)>,311	Option<CollatorPair>,312)> {313	match collator_options.relay_chain_rpc_url {314		Some(relay_chain_url) => Ok((315			Arc::new(RelayChainRPCInterface::new(relay_chain_url).await?) as Arc<_>,316			None,317		)),318		None => build_inprocess_relay_chain(319			polkadot_config,320			parachain_config,321			telemetry_worker_handle,322			task_manager,323		),324	}325}326327/// Start a node with the given parachain `Configuration` and relay chain `Configuration`.328///329/// This is the actual implementation that is abstract over the executor and the runtime api.330#[sc_tracing::logging::prefix_logs_with("Parachain")]331async fn start_node_impl<Runtime, RuntimeApi, ExecutorDispatch, BIQ, BIC>(332	parachain_config: Configuration,333	polkadot_config: Configuration,334	collator_options: CollatorOptions,335	id: ParaId,336	build_import_queue: BIQ,337	build_consensus: BIC,338) -> sc_service::error::Result<(TaskManager, Arc<FullClient<RuntimeApi, ExecutorDispatch>>)>339where340	sc_client_api::StateBackendFor<FullBackend, Block>: sp_api::StateBackend<BlakeTwo256>,341	Runtime: RuntimeInstance + Send + Sync + 'static,342	<Runtime as RuntimeInstance>::CrossAccountId: Serialize,343	for<'de> <Runtime as RuntimeInstance>::CrossAccountId: Deserialize<'de>,344	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>345		+ Send346		+ Sync347		+ 'static,348	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>349		+ fp_rpc::EthereumRuntimeRPCApi<Block>350		+ fp_rpc::ConvertTransactionRuntimeApi<Block>351		+ sp_session::SessionKeys<Block>352		+ sp_block_builder::BlockBuilder<Block>353		+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>354		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>355		+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>356		/* TODO free RMRK!357		+ rmrk_rpc::RmrkApi<358			Block,359			AccountId,360			RmrkCollectionInfo<AccountId>,361			RmrkInstanceInfo<AccountId>,362			RmrkResourceInfo,363			RmrkPropertyInfo,364			RmrkBaseInfo<AccountId>,365			RmrkPartType,366			RmrkTheme,367		>*/368		+ substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>369		+ sp_api::Metadata<Block>370		+ sp_offchain::OffchainWorkerApi<Block>371		+ cumulus_primitives_core::CollectCollationInfo<Block>,372	ExecutorDispatch: NativeExecutionDispatch + 'static,373	BIQ: FnOnce(374		Arc<FullClient<RuntimeApi, ExecutorDispatch>>,375		&Configuration,376		Option<TelemetryHandle>,377		&TaskManager,378	) -> Result<379		sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,380		sc_service::Error,381	>,382	BIC: FnOnce(383		Arc<FullClient<RuntimeApi, ExecutorDispatch>>,384		Option<&Registry>,385		Option<TelemetryHandle>,386		&TaskManager,387		Arc<dyn RelayChainInterface>,388		Arc<sc_transaction_pool::FullPool<Block, FullClient<RuntimeApi, ExecutorDispatch>>>,389		Arc<NetworkService<Block, Hash>>,390		SyncCryptoStorePtr,391		bool,392	) -> Result<Box<dyn ParachainConsensus<Block>>, sc_service::Error>,393{394	if matches!(parachain_config.role, Role::Light) {395		return Err("Light client not supported!".into());396	}397398	let parachain_config = prepare_node_config(parachain_config);399400	let params =401		new_partial::<RuntimeApi, ExecutorDispatch, BIQ>(&parachain_config, build_import_queue)?;402	let (mut telemetry, filter_pool, frontier_backend, telemetry_worker_handle, fee_history_cache) =403		params.other;404405	let client = params.client.clone();406	let backend = params.backend.clone();407	let mut task_manager = params.task_manager;408409	let (relay_chain_interface, collator_key) = build_relay_chain_interface(410		polkadot_config,411		&parachain_config,412		telemetry_worker_handle,413		&mut task_manager,414		collator_options.clone(),415	)416	.await417	.map_err(|e| match e {418		RelayChainError::ServiceError(polkadot_service::Error::Sub(x)) => x,419		s => s.to_string().into(),420	})?;421422	let block_announce_validator = BlockAnnounceValidator::new(relay_chain_interface.clone(), id);423424	let force_authoring = parachain_config.force_authoring;425	let validator = parachain_config.role.is_authority();426	let prometheus_registry = parachain_config.prometheus_registry().cloned();427	let transaction_pool = params.transaction_pool.clone();428	let import_queue = cumulus_client_service::SharedImportQueue::new(params.import_queue);429430	let (network, system_rpc_tx, start_network) =431		sc_service::build_network(sc_service::BuildNetworkParams {432			config: &parachain_config,433			client: client.clone(),434			transaction_pool: transaction_pool.clone(),435			spawn_handle: task_manager.spawn_handle(),436			import_queue: import_queue.clone(),437			block_announce_validator_builder: Some(Box::new(|_| {438				Box::new(block_announce_validator)439			})),440			warp_sync: None,441		})?;442443	let subscription_executor = sc_rpc::SubscriptionTaskExecutor::new(task_manager.spawn_handle());444	let rpc_client = client.clone();445	let rpc_pool = transaction_pool.clone();446	let select_chain = params.select_chain.clone();447	let rpc_network = network.clone();448449	let rpc_frontier_backend = frontier_backend.clone();450451	let block_data_cache = Arc::new(fc_rpc::EthBlockDataCache::new(452		task_manager.spawn_handle(),453		overrides_handle::<_, _, Runtime>(client.clone()),454		50,455		50,456	));457458	let rpc_extensions_builder = Box::new(move |deny_unsafe, _| {459		let full_deps = unique_rpc::FullDeps {460			backend: rpc_frontier_backend.clone(),461			deny_unsafe,462			client: rpc_client.clone(),463			pool: rpc_pool.clone(),464			graph: rpc_pool.pool().clone(),465			// TODO: Unhardcode466			enable_dev_signer: false,467			filter_pool: filter_pool.clone(),468			network: rpc_network.clone(),469			select_chain: select_chain.clone(),470			is_authority: validator,471			// TODO: Unhardcode472			max_past_logs: 10000,473			block_data_cache: block_data_cache.clone(),474			fee_history_cache: fee_history_cache.clone(),475			// TODO: Unhardcode476			fee_history_limit: 2048,477		};478479		Ok(480			unique_rpc::create_full::<_, _, _, _, Runtime, RuntimeApi, _>(481				full_deps,482				subscription_executor.clone(),483			),484		)485	});486487	task_manager.spawn_essential_handle().spawn(488		"frontier-mapping-sync-worker",489		None,490		MappingSyncWorker::new(491			client.import_notification_stream(),492			Duration::new(6, 0),493			client.clone(),494			backend.clone(),495			frontier_backend.clone(),496			3,497			0,498			SyncStrategy::Normal,499		)500		.for_each(|()| futures::future::ready(())),501	);502503	sc_service::spawn_tasks(sc_service::SpawnTasksParams {504		rpc_extensions_builder,505		client: client.clone(),506		transaction_pool: transaction_pool.clone(),507		task_manager: &mut task_manager,508		config: parachain_config,509		keystore: params.keystore_container.sync_keystore(),510		backend: backend.clone(),511		network: network.clone(),512		system_rpc_tx,513		telemetry: telemetry.as_mut(),514	})?;515516	let announce_block = {517		let network = network.clone();518		Arc::new(move |hash, data| network.announce_block(hash, data))519	};520521	let relay_chain_slot_duration = Duration::from_secs(6);522523	if validator {524		let parachain_consensus = build_consensus(525			client.clone(),526			prometheus_registry.as_ref(),527			telemetry.as_ref().map(|t| t.handle()),528			&task_manager,529			relay_chain_interface.clone(),530			transaction_pool,531			network,532			params.keystore_container.sync_keystore(),533			force_authoring,534		)?;535536		let spawner = task_manager.spawn_handle();537538		let params = StartCollatorParams {539			para_id: id,540			block_status: client.clone(),541			announce_block,542			client: client.clone(),543			task_manager: &mut task_manager,544			spawner,545			parachain_consensus,546			import_queue,547			collator_key: collator_key.expect("Command line arguments do not allow this. qed"),548			relay_chain_interface,549			relay_chain_slot_duration,550		};551552		start_collator(params).await?;553	} else {554		let params = StartFullNodeParams {555			client: client.clone(),556			announce_block,557			task_manager: &mut task_manager,558			para_id: id,559			import_queue,560			relay_chain_interface,561			relay_chain_slot_duration,562			collator_options,563		};564565		start_full_node(params)?;566	}567568	start_network.start_network();569570	Ok((task_manager, client))571}572573/// Build the import queue for the the parachain runtime.574pub fn parachain_build_import_queue<RuntimeApi, ExecutorDispatch>(575	client: Arc<FullClient<RuntimeApi, ExecutorDispatch>>,576	config: &Configuration,577	telemetry: Option<TelemetryHandle>,578	task_manager: &TaskManager,579) -> Result<580	sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,581	sc_service::Error,582>583where584	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>585		+ Send586		+ Sync587		+ 'static,588	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>589		+ sp_block_builder::BlockBuilder<Block>590		+ sp_consensus_aura::AuraApi<Block, AuraId>591		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>,592	ExecutorDispatch: NativeExecutionDispatch + 'static,593{594	let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;595596	cumulus_client_consensus_aura::import_queue::<597		sp_consensus_aura::sr25519::AuthorityPair,598		_,599		_,600		_,601		_,602		_,603		_,604	>(cumulus_client_consensus_aura::ImportQueueParams {605		block_import: client.clone(),606		client: client.clone(),607		create_inherent_data_providers: move |_, _| async move {608			let time = sp_timestamp::InherentDataProvider::from_system_time();609610			let slot =611				sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(612					*time,613					slot_duration,614				);615616			Ok((time, slot))617		},618		registry: config.prometheus_registry(),619		can_author_with: sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()),620		spawner: &task_manager.spawn_essential_handle(),621		telemetry,622	})623	.map_err(Into::into)624}625626/// Start a normal parachain node.627pub async fn start_node<Runtime, RuntimeApi, ExecutorDispatch>(628	parachain_config: Configuration,629	polkadot_config: Configuration,630	collator_options: CollatorOptions,631	id: ParaId,632) -> sc_service::error::Result<(TaskManager, Arc<FullClient<RuntimeApi, ExecutorDispatch>>)>633where634	Runtime: RuntimeInstance + Send + Sync + 'static,635	<Runtime as RuntimeInstance>::CrossAccountId: Serialize,636	for<'de> <Runtime as RuntimeInstance>::CrossAccountId: Deserialize<'de>,637	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>638		+ Send639		+ Sync640		+ 'static,641	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>642		+ fp_rpc::EthereumRuntimeRPCApi<Block>643		+ fp_rpc::ConvertTransactionRuntimeApi<Block>644		+ sp_session::SessionKeys<Block>645		+ sp_block_builder::BlockBuilder<Block>646		+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>647		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>648		+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>649		/* TODO free RMRK!650		+ rmrk_rpc::RmrkApi<651			Block,652			AccountId,653			RmrkCollectionInfo<AccountId>,654			RmrkInstanceInfo<AccountId>,655			RmrkResourceInfo,656			RmrkPropertyInfo,657			RmrkBaseInfo<AccountId>,658			RmrkPartType,659			RmrkTheme,660		>*/661		+ substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>662		+ sp_api::Metadata<Block>663		+ sp_offchain::OffchainWorkerApi<Block>664		+ cumulus_primitives_core::CollectCollationInfo<Block>665		+ sp_consensus_aura::AuraApi<Block, AuraId>,666	ExecutorDispatch: NativeExecutionDispatch + 'static,667{668	start_node_impl::<Runtime, RuntimeApi, ExecutorDispatch, _, _>(669		parachain_config,670		polkadot_config,671		collator_options,672		id,673		parachain_build_import_queue,674		|client,675		 prometheus_registry,676		 telemetry,677		 task_manager,678		 relay_chain_interface,679		 transaction_pool,680		 sync_oracle,681		 keystore,682		 force_authoring| {683			let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;684685			let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording(686				task_manager.spawn_handle(),687				client.clone(),688				transaction_pool,689				prometheus_registry,690				telemetry.clone(),691			);692693			Ok(AuraConsensus::build::<694				sp_consensus_aura::sr25519::AuthorityPair,695				_,696				_,697				_,698				_,699				_,700				_,701			>(BuildAuraConsensusParams {702				proposer_factory,703				create_inherent_data_providers: move |_, (relay_parent, validation_data)| {704					let relay_chain_interface = relay_chain_interface.clone();705					async move {706						let parachain_inherent =707						cumulus_primitives_parachain_inherent::ParachainInherentData::create_at(708							relay_parent,709							&relay_chain_interface,710							&validation_data,711							id,712						).await;713714						let time = sp_timestamp::InherentDataProvider::from_system_time();715716						let slot =717						sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(718							*time,719							slot_duration,720						);721722						let parachain_inherent = parachain_inherent.ok_or_else(|| {723							Box::<dyn std::error::Error + Send + Sync>::from(724								"Failed to create parachain inherent",725							)726						})?;727						Ok((time, slot, parachain_inherent))728					}729				},730				block_import: client.clone(),731				para_client: client,732				backoff_authoring_blocks: Option::<()>::None,733				sync_oracle,734				keystore,735				force_authoring,736				slot_duration,737				// We got around 500ms for proposing738				block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32),739				telemetry,740				max_block_proposal_slot_portion: None,741			}))742		},743	)744	.await745}746747fn dev_build_import_queue<RuntimeApi, ExecutorDispatch>(748	client: Arc<FullClient<RuntimeApi, ExecutorDispatch>>,749	config: &Configuration,750	_: Option<TelemetryHandle>,751	task_manager: &TaskManager,752) -> Result<753	sc_consensus::DefaultImportQueue<Block, FullClient<RuntimeApi, ExecutorDispatch>>,754	sc_service::Error,755>756where757	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>758		+ Send759		+ Sync760		+ 'static,761	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>762		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>,763	ExecutorDispatch: NativeExecutionDispatch + 'static,764{765	Ok(sc_consensus_manual_seal::import_queue(766		Box::new(client.clone()),767		&task_manager.spawn_essential_handle(),768		config.prometheus_registry(),769	))770}771772/// Builds a new development service. This service uses instant seal, and mocks773/// the parachain inherent774pub fn start_dev_node<Runtime, RuntimeApi, ExecutorDispatch>(775	config: Configuration,776	autoseal_interval: Duration,777) -> sc_service::error::Result<TaskManager>778where779	Runtime: RuntimeInstance + Send + Sync + 'static,780	<Runtime as RuntimeInstance>::CrossAccountId: Serialize,781	for<'de> <Runtime as RuntimeInstance>::CrossAccountId: Deserialize<'de>,782	RuntimeApi: sp_api::ConstructRuntimeApi<Block, FullClient<RuntimeApi, ExecutorDispatch>>783		+ Send784		+ Sync785		+ 'static,786	RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>787		+ fp_rpc::EthereumRuntimeRPCApi<Block>788		+ fp_rpc::ConvertTransactionRuntimeApi<Block>789		+ sp_session::SessionKeys<Block>790		+ sp_block_builder::BlockBuilder<Block>791		+ pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance>792		+ sp_api::ApiExt<Block, StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>793		+ up_rpc::UniqueApi<Block, Runtime::CrossAccountId, AccountId>794		/* TODO free RMRK!795		+ rmrk_rpc::RmrkApi<796			Block,797			AccountId,798			RmrkCollectionInfo<AccountId>,799			RmrkInstanceInfo<AccountId>,800			RmrkResourceInfo,801			RmrkPropertyInfo,802			RmrkBaseInfo<AccountId>,803			RmrkPartType,804			RmrkTheme,805		>*/806		+ substrate_frame_rpc_system::AccountNonceApi<Block, AccountId, Index>807		+ sp_api::Metadata<Block>808		+ sp_offchain::OffchainWorkerApi<Block>809		+ cumulus_primitives_core::CollectCollationInfo<Block>810		+ sp_consensus_aura::AuraApi<Block, AuraId>,811	ExecutorDispatch: NativeExecutionDispatch + 'static,812{813	use sc_consensus_manual_seal::{run_manual_seal, EngineCommand, ManualSealParams};814	use fc_consensus::FrontierBlockImport;815	use sc_client_api::HeaderBackend;816817	let sc_service::PartialComponents {818		client,819		backend,820		mut task_manager,821		import_queue,822		keystore_container,823		select_chain: maybe_select_chain,824		transaction_pool,825		other:826			(telemetry, filter_pool, frontier_backend, _telemetry_worker_handle, fee_history_cache),827	} = new_partial::<RuntimeApi, ExecutorDispatch, _>(828		&config,829		dev_build_import_queue::<RuntimeApi, ExecutorDispatch>,830	)?;831832	let block_data_cache = Arc::new(fc_rpc::EthBlockDataCache::new(833		task_manager.spawn_handle(),834		overrides_handle::<_, _, Runtime>(client.clone()),835		50,836		50,837	));838839	let (network, system_rpc_tx, network_starter) =840		sc_service::build_network(sc_service::BuildNetworkParams {841			config: &config,842			client: client.clone(),843			transaction_pool: transaction_pool.clone(),844			spawn_handle: task_manager.spawn_handle(),845			import_queue,846			block_announce_validator_builder: None,847			warp_sync: None,848		})?;849850	if config.offchain_worker.enabled {851		sc_service::build_offchain_workers(852			&config,853			task_manager.spawn_handle(),854			client.clone(),855			network.clone(),856		);857	}858859	let prometheus_registry = config.prometheus_registry().cloned();860	let collator = config.role.is_authority();861862	let select_chain = maybe_select_chain.clone();863864	if collator {865		let block_import =866			FrontierBlockImport::new(client.clone(), client.clone(), frontier_backend.clone());867868		let env = sc_basic_authorship::ProposerFactory::new(869			task_manager.spawn_handle(),870			client.clone(),871			transaction_pool.clone(),872			prometheus_registry.as_ref(),873			telemetry.as_ref().map(|x| x.handle()),874		);875876		let transactions_commands_stream: Box<877			dyn Stream<Item = EngineCommand<Hash>> + Send + Sync + Unpin,878		> = Box::new(879			transaction_pool880				.pool()881				.validated_pool()882				.import_notification_stream()883				.map(|_| EngineCommand::SealNewBlock {884					create_empty: true,885					finalize: false,886					parent_hash: None,887					sender: None,888				}),889		);890891		let autoseal_interval = Box::pin(AutosealInterval::new(&config, autoseal_interval));892		let idle_commands_stream: Box<893			dyn Stream<Item = EngineCommand<Hash>> + Send + Sync + Unpin,894		> = Box::new(autoseal_interval.map(|_| EngineCommand::SealNewBlock {895			create_empty: true,896			finalize: false,897			parent_hash: None,898			sender: None,899		}));900901		let commands_stream = select(transactions_commands_stream, idle_commands_stream);902903		let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;904		let client_set_aside_for_cidp = client.clone();905906		task_manager.spawn_essential_handle().spawn_blocking(907			"authorship_task",908			Some("block-authoring"),909			run_manual_seal(ManualSealParams {910				block_import,911				env,912				client: client.clone(),913				pool: transaction_pool.clone(),914				commands_stream,915				select_chain: select_chain.clone(),916				consensus_data_provider: None,917				create_inherent_data_providers: move |block: Hash, ()| {918					let current_para_block = client_set_aside_for_cidp919						.number(block)920						.expect("Header lookup should succeed")921						.expect("Header passed in as parent should be present in backend.");922923					let client_for_xcm = client_set_aside_for_cidp.clone();924					async move {925						let time = sp_timestamp::InherentDataProvider::from_system_time();926927						let mocked_parachain = cumulus_primitives_parachain_inherent::MockValidationDataInherentDataProvider {928							current_para_block,929							relay_offset: 1000,930							relay_blocks_per_para_block: 2,931							xcm_config: cumulus_primitives_parachain_inherent::MockXcmConfig::new(932								&*client_for_xcm,933								block,934								Default::default(),935								Default::default(),936							),937							raw_downward_messages: vec![],938							raw_horizontal_messages: vec![],939						};940941						let slot =942						sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(943							*time,944							slot_duration,945						);946947						Ok((time, slot, mocked_parachain))948					}949				},950			}),951		);952	}953954	task_manager.spawn_essential_handle().spawn(955		"frontier-mapping-sync-worker",956		Some("block-authoring"),957		MappingSyncWorker::new(958			client.import_notification_stream(),959			Duration::new(6, 0),960			client.clone(),961			backend.clone(),962			frontier_backend.clone(),963			3,964			0,965			SyncStrategy::Normal,966		)967		.for_each(|()| futures::future::ready(())),968	);969970	let subscription_executor = sc_rpc::SubscriptionTaskExecutor::new(task_manager.spawn_handle());971	let rpc_client = client.clone();972	let rpc_pool = transaction_pool.clone();973	let rpc_network = network.clone();974	let rpc_frontier_backend = frontier_backend.clone();975	let rpc_extensions_builder = Box::new(move |deny_unsafe, _| {976		let full_deps = unique_rpc::FullDeps {977			backend: rpc_frontier_backend.clone(),978			deny_unsafe,979			client: rpc_client.clone(),980			pool: rpc_pool.clone(),981			graph: rpc_pool.pool().clone(),982			// TODO: Unhardcode983			enable_dev_signer: false,984			filter_pool: filter_pool.clone(),985			network: rpc_network.clone(),986			select_chain: select_chain.clone(),987			is_authority: collator,988			// TODO: Unhardcode989			max_past_logs: 10000,990			block_data_cache: block_data_cache.clone(),991			fee_history_cache: fee_history_cache.clone(),992			// TODO: Unhardcode993			fee_history_limit: 2048,994		};995996		Ok(997			unique_rpc::create_full::<_, _, _, _, Runtime, RuntimeApi, _>(998				full_deps,999				subscription_executor.clone(),1000			),1001		)1002	});10031004	sc_service::spawn_tasks(sc_service::SpawnTasksParams {1005		network,1006		client,1007		keystore: keystore_container.sync_keystore(),1008		task_manager: &mut task_manager,1009		transaction_pool,1010		rpc_extensions_builder,1011		backend,1012		system_rpc_tx,1013		config,1014		telemetry: None,1015	})?;10161017	network_starter.start_network();1018	Ok(task_manager)1019}
modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -501,7 +501,6 @@
 			PhantomType<(
 				TokenData<T::CrossAccountId>,
 				RpcCollection<T::AccountId>,
-
 				// RMRK
 				RmrkCollectionInfo<T::AccountId>,
 				RmrkInstanceInfo<T::AccountId>,
@@ -526,19 +525,34 @@
 					if !v.offchain_schema.is_empty() {
 						props.push(Property {
 							key: b"_old_offchainSchema".to_vec().try_into().unwrap(),
-							value: v.offchain_schema.clone().into_inner().try_into().expect("offchain schema too big"),
+							value: v
+								.offchain_schema
+								.clone()
+								.into_inner()
+								.try_into()
+								.expect("offchain schema too big"),
 						});
 					}
 					if !v.variable_on_chain_schema.is_empty() {
 						props.push(Property {
 							key: b"_old_variableOnChainSchema".to_vec().try_into().unwrap(),
-							value: v.variable_on_chain_schema.clone().into_inner().try_into().expect("offchain schema too big"),
+							value: v
+								.variable_on_chain_schema
+								.clone()
+								.into_inner()
+								.try_into()
+								.expect("offchain schema too big"),
 						});
 					}
 					if !v.const_on_chain_schema.is_empty() {
 						props.push(Property {
 							key: b"_old_constOnChainSchema".to_vec().try_into().unwrap(),
-							value: v.const_on_chain_schema.clone().into_inner().try_into().expect("offchain schema too big"),
+							value: v
+								.const_on_chain_schema
+								.clone()
+								.into_inner()
+								.try_into()
+								.expect("offchain schema too big"),
 						});
 					}
 					props.push(Property {
@@ -546,13 +560,17 @@
 						value: match v.schema_version {
 							SchemaVersion::ImageURL => b"ImageUrl".as_slice(),
 							SchemaVersion::Unique => b"Unique".as_slice(),
-						}.to_vec().try_into().unwrap(),
+						}
+						.to_vec()
+						.try_into()
+						.unwrap(),
 					});
 					Self::set_scoped_collection_properties(
 						id,
 						PropertyScope::None,
 						props.into_iter(),
-					).expect("existing data larger than properties");
+					)
+					.expect("existing data larger than properties");
 					let mut new = CollectionVersion2::from(v.clone());
 					new.permissions.access = Some(v.access);
 					new.permissions.mint_mode = Some(v.mint_mode);
@@ -644,18 +662,12 @@
 
 		let token_property_permissions = <CollectionPropertyPermissions<T>>::get(collection)
 			.into_iter()
-			.map(|(key, permission)| PropertyKeyPermission {
-				key,
-				permission,
-			})
+			.map(|(key, permission)| PropertyKeyPermission { key, permission })
 			.collect();
 
 		let properties = <CollectionProperties<T>>::get(collection)
 			.into_iter()
-			.map(|(key, value)| Property {
-				key,
-				value,
-			})
+			.map(|(key, value)| Property { key, value })
 			.collect();
 
 		let permissions = CollectionPermissions {
@@ -751,7 +763,9 @@
 				.unwrap_or_else(|| Ok(CollectionLimits::default()))?,
 			permissions: data
 				.permissions
-				.map(|permissions| Self::clamp_permissions(data.mode.clone(), &Default::default(), permissions))
+				.map(|permissions| {
+					Self::clamp_permissions(data.mode.clone(), &Default::default(), permissions)
+				})
 				.unwrap_or_else(|| Ok(CollectionPermissions::default()))?,
 		};
 
@@ -1005,10 +1019,7 @@
 			.unwrap_or_else(|| {
 				properties
 					.into_iter()
-					.map(|(key, value)| Property {
-						key,
-						value,
-					})
+					.map(|(key, value)| Property { key, value })
 					.collect()
 			});
 
@@ -1037,10 +1048,7 @@
 			.unwrap_or_else(|| {
 				permissions
 					.into_iter()
-					.map(|(key, permission)| PropertyKeyPermission {
-						key,
-						permission,
-					})
+					.map(|(key, permission)| PropertyKeyPermission { key, permission })
 					.collect()
 			});
 
@@ -1276,17 +1284,9 @@
 		budget: &dyn Budget,
 	) -> DispatchResult;
 
-	fn nest(
-		&self,
-		under: TokenId,
-		to_nest: (CollectionId, TokenId)
-	);
+	fn nest(&self, under: TokenId, to_nest: (CollectionId, TokenId));
 
-	fn unnest(
-		&self,
-		under: TokenId,
-		to_nest: (CollectionId, TokenId)
-	);
+	fn unnest(&self, under: TokenId, to_nest: (CollectionId, TokenId));
 
 	fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId>;
 	fn collection_tokens(&self) -> Vec<TokenId>;
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -298,17 +298,9 @@
 		fail!(<Error<T>>::FungibleDisallowsNesting)
 	}
 
-	fn nest(
-		&self,
-		_under: TokenId,
-		_to_nest: (CollectionId, TokenId)
-	) {}
+	fn nest(&self, _under: TokenId, _to_nest: (CollectionId, TokenId)) {}
 
-	fn unnest(
-		&self,
-		_under: TokenId,
-		_to_nest: (CollectionId, TokenId)
-	) {}
+	fn unnest(&self, _under: TokenId, _to_nest: (CollectionId, TokenId)) {}
 
 	fn collection_tokens(&self) -> Vec<TokenId> {
 		vec![TokenId::default()]
modifiedpallets/fungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -184,11 +184,7 @@
 
 		if balance == 0 {
 			<Balance<T>>::remove((collection.id, owner));
-			<PalletStructure<T>>::unnest_if_nested(
-				owner,
-				collection.id,
-				TokenId::default()
-			);
+			<PalletStructure<T>>::unnest_if_nested(owner, collection.id, TokenId::default());
 		} else {
 			<Balance<T>>::insert((collection.id, owner), balance);
 		}
@@ -249,18 +245,14 @@
 			to,
 			collection.id,
 			TokenId::default(),
-			nesting_budget
+			nesting_budget,
 		)?;
 
 		if let Some(balance_to) = balance_to {
 			// from != to
 			if balance_from == 0 {
 				<Balance<T>>::remove((collection.id, from));
-				<PalletStructure<T>>::unnest_if_nested(
-					from,
-					collection.id,
-					TokenId::default()
-				);
+				<PalletStructure<T>>::unnest_if_nested(from, collection.id, TokenId::default());
 			} else {
 				<Balance<T>>::insert((collection.id, from), balance_from);
 			}
@@ -333,7 +325,11 @@
 		<TotalSupply<T>>::insert(collection.id, total_supply);
 		for (user, amount) in balances {
 			<Balance<T>>::insert((collection.id, &user), amount);
-			<PalletStructure<T>>::nest_if_sent_to_token_unchecked(&user, collection.id, TokenId::default());
+			<PalletStructure<T>>::nest_if_sent_to_token_unchecked(
+				&user,
+				collection.id,
+				TokenId::default(),
+			);
 			<PalletEvm<T>>::deposit_log(
 				ERC20Events::Transfer {
 					from: H160::default(),
modifiedpallets/nonfungible/src/common.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -22,7 +22,7 @@
 	PropertyKeyPermission, PropertyValue,
 };
 use pallet_common::{
-	CommonCollectionOperations, CommonWeightInfo, with_weight, weights::WeightInfo as _
+	CommonCollectionOperations, CommonWeightInfo, with_weight, weights::WeightInfo as _,
 };
 use sp_runtime::DispatchError;
 use sp_std::vec::Vec;
@@ -353,19 +353,11 @@
 		<Pallet<T>>::check_nesting(self, sender, from, under, budget)
 	}
 
-	fn nest(
-		&self,
-		under: TokenId,
-		to_nest: (CollectionId, TokenId)
-	) {
+	fn nest(&self, under: TokenId, to_nest: (CollectionId, TokenId)) {
 		<Pallet<T>>::nest((self.id, under), to_nest);
 	}
 
-	fn unnest(
-		&self,
-		under: TokenId,
-		to_unnest: (CollectionId, TokenId)
-	) {
+	fn unnest(&self, under: TokenId, to_unnest: (CollectionId, TokenId)) {
 		<Pallet<T>>::unnest((self.id, under), to_unnest);
 	}
 
@@ -415,10 +407,7 @@
 		.unwrap_or_else(|| {
 			properties
 				.into_iter()
-				.map(|(key, value)| Property {
-					key,
-					value,
-				})
+				.map(|(key, value)| Property { key, value })
 				.collect()
 		})
 	}
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -426,11 +426,10 @@
 	Ok(a)
 }
 
-fn has_token_permission<T: Config>(
-	collection_id: CollectionId,
-	key: &PropertyKey,
-) -> bool {
-	if let Ok(token_property_permissions) = CollectionPropertyPermissions::<T>::try_get(collection_id) {
+fn has_token_permission<T: Config>(collection_id: CollectionId, key: &PropertyKey) -> bool {
+	if let Ok(token_property_permissions) =
+		CollectionPropertyPermissions::<T>::try_get(collection_id)
+	{
 		return token_property_permissions.contains_key(key);
 	}
 
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -164,31 +164,44 @@
 		fn on_runtime_upgrade() -> Weight {
 			if StorageVersion::get::<Pallet<T>>() < StorageVersion::new(1) {
 				let mut had_consts = BTreeSet::new();
-				<TokenData<T>>::translate::<ItemDataVersion1<T::CrossAccountId>, _>(|(collection, token), v| {
-					let mut props = vec![];
-					if !v.const_data.is_empty() {
-						props.push(Property {
-							key: b"_old_constData".to_vec().try_into().unwrap(),
-							value: v.const_data.clone().into_inner().try_into().expect("const too long"),
-						});
-						had_consts.insert(collection);
-					}
-					if !v.variable_data.is_empty() {
-						props.push(Property {
-							key: b"_old_variableData".to_vec().try_into().unwrap(),
-							value: v.variable_data.clone().into_inner().try_into().expect("variable too long"),
-						})
-					}
-					if !props.is_empty() {
-						Self::set_scoped_token_properties(
-							collection,
-							token,
-							PropertyScope::None,
-							props.into_iter(),
-						).expect("existing token data exceeds property storage");
-					}
-					Some(<ItemDataVersion2<T::CrossAccountId>>::from(v))
-				});
+				<TokenData<T>>::translate::<ItemDataVersion1<T::CrossAccountId>, _>(
+					|(collection, token), v| {
+						let mut props = vec![];
+						if !v.const_data.is_empty() {
+							props.push(Property {
+								key: b"_old_constData".to_vec().try_into().unwrap(),
+								value: v
+									.const_data
+									.clone()
+									.into_inner()
+									.try_into()
+									.expect("const too long"),
+							});
+							had_consts.insert(collection);
+						}
+						if !v.variable_data.is_empty() {
+							props.push(Property {
+								key: b"_old_variableData".to_vec().try_into().unwrap(),
+								value: v
+									.variable_data
+									.clone()
+									.into_inner()
+									.try_into()
+									.expect("variable too long"),
+							})
+						}
+						if !props.is_empty() {
+							Self::set_scoped_token_properties(
+								collection,
+								token,
+								PropertyScope::None,
+								props.into_iter(),
+							)
+							.expect("existing token data exceeds property storage");
+						}
+						Some(<ItemDataVersion2<T::CrossAccountId>>::from(v))
+					},
+				);
 				for collection in had_consts {
 					<PalletCommon<T>>::set_property_permission_unchecked(
 						collection,
@@ -199,8 +212,9 @@
 								collection_admin: true,
 								token_owner: false,
 							},
-						}
-					).expect("failed to configure permission");
+						},
+					)
+					.expect("failed to configure permission");
 				}
 			}
 
@@ -263,7 +277,7 @@
 		collection_id: CollectionId,
 		token_id: TokenId,
 		scope: PropertyScope,
-		properties: impl Iterator<Item=Property>,
+		properties: impl Iterator<Item = Property>,
 	) -> DispatchResult {
 		TokenProperties::<T>::try_mutate((collection_id, token_id), |stored_properties| {
 			stored_properties.try_scoped_set_from_iter(scope, properties)
@@ -347,11 +361,7 @@
 			<AccountBalance<T>>::insert((collection.id, token_data.owner.clone()), balance);
 		}
 
-		<PalletStructure<T>>::unnest_if_nested(
-			&token_data.owner,
-			collection.id,
-			token
-		);
+		<PalletStructure<T>>::unnest_if_nested(&token_data.owner, collection.id, token);
 
 		<Owned<T>>::remove((collection.id, &token_data.owner, token));
 		<TokensBurnt<T>>::insert(collection.id, burnt);
@@ -589,16 +599,12 @@
 			to,
 			collection.id,
 			token,
-			nesting_budget
+			nesting_budget,
 		)?;
 
 		// =========
 
-		<PalletStructure<T>>::unnest_if_nested(
-			from,
-			collection.id,
-			token
-		);
+		<PalletStructure<T>>::unnest_if_nested(from, collection.id, token);
 
 		<TokenData<T>>::insert(
 			(collection.id, token),
@@ -709,7 +715,11 @@
 					},
 				);
 
-				<PalletStructure<T>>::nest_if_sent_to_token_unchecked(&data.owner, collection.id, TokenId(token));
+				<PalletStructure<T>>::nest_if_sent_to_token_unchecked(
+					&data.owner,
+					collection.id,
+					TokenId(token),
+				);
 
 				if let Err(e) = Self::set_token_properties(
 					collection,
@@ -958,31 +968,24 @@
 		Ok(())
 	}
 
-	fn nest(
-		under: (CollectionId, TokenId),
-		to_nest: (CollectionId, TokenId),
-	) {
-		<TokenChildren<T>>::insert(
-			(under.0, under.1, (to_nest.0, to_nest.1)),
-			true
-		);
+	fn nest(under: (CollectionId, TokenId), to_nest: (CollectionId, TokenId)) {
+		<TokenChildren<T>>::insert((under.0, under.1, (to_nest.0, to_nest.1)), true);
 	}
 
-	fn unnest(
-		under: (CollectionId, TokenId),
-		to_unnest: (CollectionId, TokenId),
-	) {
-		<TokenChildren<T>>::remove(
-			(under.0, under.1, to_unnest)
-		);
+	fn unnest(under: (CollectionId, TokenId), to_unnest: (CollectionId, TokenId)) {
+		<TokenChildren<T>>::remove((under.0, under.1, to_unnest));
 	}
 
 	fn collection_has_tokens(collection_id: CollectionId) -> bool {
-		<TokenData<T>>::iter_prefix((collection_id,)).next().is_some()
+		<TokenData<T>>::iter_prefix((collection_id,))
+			.next()
+			.is_some()
 	}
 
 	fn token_has_children(collection_id: CollectionId, token_id: TokenId) -> bool {
-		<TokenChildren<T>>::iter_prefix((collection_id, token_id)).next().is_some()
+		<TokenChildren<T>>::iter_prefix((collection_id, token_id))
+			.next()
+			.is_some()
 	}
 
 	/// Delegated to `create_multiple_items`
modifiedpallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-core/src/lib.rs
+++ b/pallets/proxy-rmrk-core/src/lib.rs
@@ -21,7 +21,9 @@
 use sp_runtime::{DispatchError, Permill, traits::StaticLookup};
 use sp_std::vec::Vec;
 use up_data_structs::*;
-use pallet_common::{Pallet as PalletCommon, Error as CommonError, CollectionHandle, CommonCollectionOperations};
+use pallet_common::{
+	Pallet as PalletCommon, Error as CommonError, CollectionHandle, CommonCollectionOperations,
+};
 use pallet_nonfungible::{Pallet as PalletNft, NonfungibleHandle, TokenData};
 use pallet_evm::account::CrossAccountId;
 use core::convert::AsRef;
@@ -38,18 +40,17 @@
 
 #[frame_support::pallet]
 pub mod pallet {
-    use super::*;
-    use pallet_evm::account;
+	use super::*;
+	use pallet_evm::account;
 
 	#[pallet::config]
-	pub trait Config: frame_system::Config
-                    + pallet_common::Config
-                    + pallet_nonfungible::Config
-                    + account::Config {
+	pub trait Config:
+		frame_system::Config + pallet_common::Config + pallet_nonfungible::Config + account::Config
+	{
 		type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
 	}
 
-    #[pallet::storage]
+	#[pallet::storage]
 	#[pallet::getter(fn collection_index)]
 	pub type CollectionIndex<T: Config> = StorageValue<_, RmrkCollectionId, ValueQuery>;
 
@@ -60,33 +61,33 @@
 	#[pallet::event]
 	#[pallet::generate_deposit(pub(super) fn deposit_event)]
 	pub enum Event<T: Config> {
-        CollectionCreated {
+		CollectionCreated {
 			issuer: T::AccountId,
 			collection_id: RmrkCollectionId,
 		},
-        CollectionDestroyed {
+		CollectionDestroyed {
 			issuer: T::AccountId,
 			collection_id: RmrkCollectionId,
 		},
-        IssuerChanged {
+		IssuerChanged {
 			old_issuer: T::AccountId,
 			new_issuer: T::AccountId,
 			collection_id: RmrkCollectionId,
 		},
-        CollectionLocked {
+		CollectionLocked {
 			issuer: T::AccountId,
 			collection_id: RmrkCollectionId,
 		},
-        NftMinted {
+		NftMinted {
 			owner: T::AccountId,
 			collection_id: RmrkCollectionId,
 			nft_id: RmrkNftId,
 		},
-        NFTBurned {
+		NFTBurned {
 			owner: T::AccountId,
 			nft_id: RmrkNftId,
 		},
-        PropertySet {
+		PropertySet {
 			collection_id: RmrkCollectionId,
 			maybe_nft_id: Option<RmrkNftId>,
 			key: RmrkKeyString,
@@ -96,24 +97,24 @@
 
 	#[pallet::error]
 	pub enum Error<T> {
-        /* Unique-specific events */
-        CorruptedCollectionType,
-        NftTypeEncodeError,
-        RmrkPropertyKeyIsTooLong,
-        RmrkPropertyValueIsTooLong,
+		/* Unique-specific events */
+		CorruptedCollectionType,
+		NftTypeEncodeError,
+		RmrkPropertyKeyIsTooLong,
+		RmrkPropertyValueIsTooLong,
 
-        /* RMRK compatible events */
-        CollectionNotEmpty,
-        NoAvailableCollectionId,
-        NoAvailableNftId,
-        CollectionUnknown,
-        NoPermission,
-        CollectionFullOrLocked,
+		/* RMRK compatible events */
+		CollectionNotEmpty,
+		NoAvailableCollectionId,
+		NoAvailableNftId,
+		CollectionUnknown,
+		NoPermission,
+		CollectionFullOrLocked,
 	}
 
 	#[pallet::call]
 	impl<T: Config> Pallet<T> {
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn create_collection(
 			origin: OriginFor<T>,
@@ -121,127 +122,141 @@
 			max: Option<u32>,
 			symbol: RmrkCollectionSymbol,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
+			let sender = ensure_signed(origin)?;
 
-            let limits = CollectionLimits {
-                owner_can_transfer: Some(false),
-                token_limit: max,
-                ..Default::default()
-            };
+			let limits = CollectionLimits {
+				owner_can_transfer: Some(false),
+				token_limit: max,
+				..Default::default()
+			};
 
-            let data = CreateCollectionData {
-                limits: Some(limits),
-                token_prefix: symbol.into_inner()
-                    .try_into()
-                    .map_err(|_| <CommonError<T>>::CollectionTokenPrefixLimitExceeded)?,
-                ..Default::default()
-            };
+			let data = CreateCollectionData {
+				limits: Some(limits),
+				token_prefix: symbol
+					.into_inner()
+					.try_into()
+					.map_err(|_| <CommonError<T>>::CollectionTokenPrefixLimitExceeded)?,
+				..Default::default()
+			};
 
-            let collection_id_res = <PalletNft<T>>::init_collection(sender.clone(), data);
+			let collection_id_res = <PalletNft<T>>::init_collection(sender.clone(), data);
 
-            if let Err(DispatchError::Arithmetic(_)) = &collection_id_res {
-                return Err(<Error<T>>::NoAvailableCollectionId.into());
-            }
+			if let Err(DispatchError::Arithmetic(_)) = &collection_id_res {
+				return Err(<Error<T>>::NoAvailableCollectionId.into());
+			}
 
-            let collection_id = collection_id_res?;
+			let collection_id = collection_id_res?;
 
-            <PalletCommon<T>>::set_scoped_collection_properties(
-                collection_id,
-                PropertyScope::Rmrk,
-                [
-                    Self::rmrk_property(Metadata, &metadata)?,
-                    Self::rmrk_property(CollectionType, &misc::CollectionType::Regular)?,
-                ].into_iter()
-            )?;
+			<PalletCommon<T>>::set_scoped_collection_properties(
+				collection_id,
+				PropertyScope::Rmrk,
+				[
+					Self::rmrk_property(Metadata, &metadata)?,
+					Self::rmrk_property(CollectionType, &misc::CollectionType::Regular)?,
+				]
+				.into_iter(),
+			)?;
 
-            <CollectionIndex<T>>::mutate(|n| *n += 1);
+			<CollectionIndex<T>>::mutate(|n| *n += 1);
 
-            Self::deposit_event(Event::CollectionCreated {
-                issuer: sender,
-                collection_id: collection_id.0
-            });
+			Self::deposit_event(Event::CollectionCreated {
+				issuer: sender,
+				collection_id: collection_id.0,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn destroy_collection(
 			origin: OriginFor<T>,
 			collection_id: RmrkCollectionId,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
-            let cross_sender = T::CrossAccountId::from_sub(sender.clone());
+			let sender = ensure_signed(origin)?;
+			let cross_sender = T::CrossAccountId::from_sub(sender.clone());
 
-            let unique_collection_id = collection_id.into();
+			let unique_collection_id = collection_id.into();
 
-            let collection = Self::get_typed_nft_collection(unique_collection_id, misc::CollectionType::Regular)?;
+			let collection = Self::get_typed_nft_collection(
+				unique_collection_id,
+				misc::CollectionType::Regular,
+			)?;
 
-            ensure!(collection.total_supply() == 0, <Error<T>>::CollectionNotEmpty);
+			ensure!(
+				collection.total_supply() == 0,
+				<Error<T>>::CollectionNotEmpty
+			);
 
-            <PalletNft<T>>::destroy_collection(collection, &cross_sender)
-                .map_err(Self::map_common_err_to_proxy)?;
+			<PalletNft<T>>::destroy_collection(collection, &cross_sender)
+				.map_err(Self::map_common_err_to_proxy)?;
 
-            Self::deposit_event(Event::CollectionDestroyed { issuer: sender, collection_id });
+			Self::deposit_event(Event::CollectionDestroyed {
+				issuer: sender,
+				collection_id,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn change_collection_issuer(
 			origin: OriginFor<T>,
 			collection_id: RmrkCollectionId,
 			new_issuer: <T::Lookup as StaticLookup>::Source,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
+			let sender = ensure_signed(origin)?;
 
-            let new_issuer = T::Lookup::lookup(new_issuer)?;
+			let new_issuer = T::Lookup::lookup(new_issuer)?;
 
-            Self::change_collection_owner(
-                collection_id.into(),
-                misc::CollectionType::Regular,
-                sender.clone(),
-                new_issuer.clone()
-            )?;
+			Self::change_collection_owner(
+				collection_id.into(),
+				misc::CollectionType::Regular,
+				sender.clone(),
+				new_issuer.clone(),
+			)?;
 
-            Self::deposit_event(Event::IssuerChanged {
+			Self::deposit_event(Event::IssuerChanged {
 				old_issuer: sender,
 				new_issuer,
 				collection_id,
 			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn lock_collection(
 			origin: OriginFor<T>,
 			collection_id: RmrkCollectionId,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
-            let cross_sender = T::CrossAccountId::from_sub(sender.clone());
+			let sender = ensure_signed(origin)?;
+			let cross_sender = T::CrossAccountId::from_sub(sender.clone());
 
-            let collection = Self::get_typed_nft_collection(
-                collection_id.into(),
-                misc::CollectionType::Regular
-            )?;
+			let collection = Self::get_typed_nft_collection(
+				collection_id.into(),
+				misc::CollectionType::Regular,
+			)?;
 
-            Self::check_collection_owner(&collection, &cross_sender)?;
+			Self::check_collection_owner(&collection, &cross_sender)?;
 
-            let token_count = collection.total_supply();
+			let token_count = collection.total_supply();
 
-            let mut collection = collection.into_inner();
-            collection.limits.token_limit = Some(token_count);
-            collection.save()?;
+			let mut collection = collection.into_inner();
+			collection.limits.token_limit = Some(token_count);
+			collection.save()?;
 
-			Self::deposit_event(Event::CollectionLocked { issuer: sender, collection_id });
+			Self::deposit_event(Event::CollectionLocked {
+				issuer: sender,
+				collection_id,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn mint_nft(
 			origin: OriginFor<T>,
@@ -251,47 +266,49 @@
 			royalty_amount: Option<Permill>,
 			metadata: RmrkString,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
-            let sender = T::CrossAccountId::from_sub(sender);
-            let cross_owner = T::CrossAccountId::from_sub(owner.clone());
+			let sender = ensure_signed(origin)?;
+			let sender = T::CrossAccountId::from_sub(sender);
+			let cross_owner = T::CrossAccountId::from_sub(owner.clone());
 
-            let royalty_info = royalty_amount.map(|amount| rmrk::RoyaltyInfo {
-                recipient: recipient.unwrap_or_else(|| owner.clone()),
-                amount
-            });
+			let royalty_info = royalty_amount.map(|amount| rmrk::RoyaltyInfo {
+				recipient: recipient.unwrap_or_else(|| owner.clone()),
+				amount,
+			});
 
-            let collection = Self::get_typed_nft_collection(
-                collection_id.into(),
-                misc::CollectionType::Regular,
-            )?;
+			let collection = Self::get_typed_nft_collection(
+				collection_id.into(),
+				misc::CollectionType::Regular,
+			)?;
 
-            let nft_id = Self::create_nft(
-                &sender,
-                &cross_owner,
-                &collection,
-                NftType::Regular,
-                [
-                    Self::rmrk_property(RoyaltyInfo, &royalty_info)?,
-                    Self::rmrk_property(Metadata, &metadata)?,
-                    Self::rmrk_property(Equipped, &false)?,
-                    Self::rmrk_property(ResourceCollection, &None::<CollectionId>)?,
-                    Self::rmrk_property(ResourcePriorities, &<Vec<u8>>::new())?,
-                ].into_iter()
-            ).map_err(|err| match err {
-                DispatchError::Arithmetic(_) => <Error<T>>::NoAvailableNftId.into(),
-                err => Self::map_common_err_to_proxy(err)
-            })?;
+			let nft_id = Self::create_nft(
+				&sender,
+				&cross_owner,
+				&collection,
+				NftType::Regular,
+				[
+					Self::rmrk_property(RoyaltyInfo, &royalty_info)?,
+					Self::rmrk_property(Metadata, &metadata)?,
+					Self::rmrk_property(Equipped, &false)?,
+					Self::rmrk_property(ResourceCollection, &None::<CollectionId>)?,
+					Self::rmrk_property(ResourcePriorities, &<Vec<u8>>::new())?,
+				]
+				.into_iter(),
+			)
+			.map_err(|err| match err {
+				DispatchError::Arithmetic(_) => <Error<T>>::NoAvailableNftId.into(),
+				err => Self::map_common_err_to_proxy(err),
+			})?;
 
-            Self::deposit_event(Event::NftMinted {
-                owner,
-                collection_id,
-                nft_id: nft_id.0
-            });
+			Self::deposit_event(Event::NftMinted {
+				owner,
+				collection_id,
+				nft_id: nft_id.0,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn burn_nft(
 			origin: OriginFor<T>,
@@ -299,21 +316,24 @@
 			nft_id: RmrkNftId,
 		) -> DispatchResult {
 			let sender = ensure_signed(origin)?;
-            let cross_sender = T::CrossAccountId::from_sub(sender.clone());
+			let cross_sender = T::CrossAccountId::from_sub(sender.clone());
 
-            Self::destroy_nft(
-                cross_sender,
-                collection_id.into(),
-                misc::CollectionType::Regular,
-                nft_id.into()
-            )?;
+			Self::destroy_nft(
+				cross_sender,
+				collection_id.into(),
+				misc::CollectionType::Regular,
+				nft_id.into(),
+			)?;
 
-            Self::deposit_event(Event::NFTBurned { owner: sender, nft_id });
+			Self::deposit_event(Event::NFTBurned {
+				owner: sender,
+				nft_id,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
 		#[transactional]
 		pub fn set_property(
 			origin: OriginFor<T>,
@@ -322,323 +342,346 @@
 			key: RmrkKeyString,
 			value: RmrkValueString,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
-            let sender = T::CrossAccountId::from_sub(sender);
+			let sender = ensure_signed(origin)?;
+			let sender = T::CrossAccountId::from_sub(sender);
 
-            let collection_id: CollectionId = rmrk_collection_id.into();
+			let collection_id: CollectionId = rmrk_collection_id.into();
 
-            match maybe_nft_id {
-                Some(nft_id) => {
-                    let token_id: TokenId = nft_id.into();
+			match maybe_nft_id {
+				Some(nft_id) => {
+					let token_id: TokenId = nft_id.into();
 
-                    Self::ensure_nft_owner(collection_id, token_id, &sender)?;
-                    Self::ensure_nft_type(collection_id, token_id, NftType::Regular)?;
+					Self::ensure_nft_owner(collection_id, token_id, &sender)?;
+					Self::ensure_nft_type(collection_id, token_id, NftType::Regular)?;
 
-                    <PalletNft<T>>::set_scoped_token_property(
-                        collection_id,
-                        token_id,
-                        PropertyScope::Rmrk,
-                        Self::rmrk_property(UserProperty(key.as_slice()), &value)?
-                    )?;
-                },
-                None => {
-                    let collection = Self::get_typed_nft_collection(
-                        collection_id,
-                        misc::CollectionType::Regular
-                    )?;
+					<PalletNft<T>>::set_scoped_token_property(
+						collection_id,
+						token_id,
+						PropertyScope::Rmrk,
+						Self::rmrk_property(UserProperty(key.as_slice()), &value)?,
+					)?;
+				}
+				None => {
+					let collection = Self::get_typed_nft_collection(
+						collection_id,
+						misc::CollectionType::Regular,
+					)?;
 
-                    Self::check_collection_owner(&collection, &sender)?;
+					Self::check_collection_owner(&collection, &sender)?;
 
-                    <PalletCommon<T>>::set_scoped_collection_property(
-                        collection_id,
-                        PropertyScope::Rmrk,
-                        Self::rmrk_property(UserProperty(key.as_slice()), &value)?
-                    )?;
-                }
-            }
+					<PalletCommon<T>>::set_scoped_collection_property(
+						collection_id,
+						PropertyScope::Rmrk,
+						Self::rmrk_property(UserProperty(key.as_slice()), &value)?,
+					)?;
+				}
+			}
 
-            Self::deposit_event(
-                Event::PropertySet {
-                    collection_id: rmrk_collection_id,
-                    maybe_nft_id,
-                    key,
-                    value
-                }
-            );
+			Self::deposit_event(Event::PropertySet {
+				collection_id: rmrk_collection_id,
+				maybe_nft_id,
+				key,
+				value,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 	}
 }
 
 impl<T: Config> Pallet<T> {
-    pub fn rmrk_property_key(rmrk_key: RmrkProperty) -> Result<PropertyKey, DispatchError> {
-        let key = rmrk_key.to_key::<T>()?;
+	pub fn rmrk_property_key(rmrk_key: RmrkProperty) -> Result<PropertyKey, DispatchError> {
+		let key = rmrk_key.to_key::<T>()?;
 
-        let scoped_key = PropertyScope::Rmrk.apply(key)
-            .map_err(|_| <Error<T>>::RmrkPropertyKeyIsTooLong)?;
+		let scoped_key = PropertyScope::Rmrk
+			.apply(key)
+			.map_err(|_| <Error<T>>::RmrkPropertyKeyIsTooLong)?;
 
-        Ok(scoped_key)
-    }
+		Ok(scoped_key)
+	}
 
-    pub fn rmrk_property<E: Encode>(rmrk_key: RmrkProperty, value: &E) -> Result<Property, DispatchError> {
-        let key = rmrk_key.to_key::<T>()?;
+	pub fn rmrk_property<E: Encode>(
+		rmrk_key: RmrkProperty,
+		value: &E,
+	) -> Result<Property, DispatchError> {
+		let key = rmrk_key.to_key::<T>()?;
 
-        let value = value.encode()
-            .try_into()
-            .map_err(|_| <Error<T>>::RmrkPropertyValueIsTooLong)?;
+		let value = value
+			.encode()
+			.try_into()
+			.map_err(|_| <Error<T>>::RmrkPropertyValueIsTooLong)?;
 
-        let property = Property {
-            key,
-            value,
-        };
+		let property = Property { key, value };
 
-        Ok(property)
-    }
+		Ok(property)
+	}
 
-    pub fn create_nft(
-        sender: &T::CrossAccountId,
-        owner: &T::CrossAccountId,
-        collection: &NonfungibleHandle<T>,
-        nft_type: NftType,
-        properties: impl Iterator<Item=Property>
-    ) -> Result<TokenId, DispatchError> {
-        todo!("store nft type");
-        let data = CreateNftExData {
-            properties: BoundedVec::default(),
-            owner: owner.clone(),
-        };
+	pub fn create_nft(
+		sender: &T::CrossAccountId,
+		owner: &T::CrossAccountId,
+		collection: &NonfungibleHandle<T>,
+		nft_type: NftType,
+		properties: impl Iterator<Item = Property>,
+	) -> Result<TokenId, DispatchError> {
+		todo!("store nft type");
+		let data = CreateNftExData {
+			properties: BoundedVec::default(),
+			owner: owner.clone(),
+		};
 
-        let budget = budget::Value::new(2);
+		let budget = budget::Value::new(2);
 
-        <PalletNft<T>>::create_item(
-            collection,
-            sender,
-            data,
-            &budget,
-        )?;
+		<PalletNft<T>>::create_item(collection, sender, data, &budget)?;
 
-        let nft_id = <PalletNft<T>>::current_token_id(collection.id);
+		let nft_id = <PalletNft<T>>::current_token_id(collection.id);
 
-        <PalletNft<T>>::set_scoped_token_properties(
-            collection.id,
-            nft_id,
-            PropertyScope::Rmrk,
-            properties
-        )?;
+		<PalletNft<T>>::set_scoped_token_properties(
+			collection.id,
+			nft_id,
+			PropertyScope::Rmrk,
+			properties,
+		)?;
 
-        Ok(nft_id)
-    }
+		Ok(nft_id)
+	}
 
-    fn destroy_nft(
-        sender: T::CrossAccountId,
-        collection_id: CollectionId,
-        collection_type: misc::CollectionType,
-        token_id: TokenId
-    ) -> DispatchResult {
-        let collection = Self::get_typed_nft_collection(
-            collection_id,
-            collection_type
-        )?;
+	fn destroy_nft(
+		sender: T::CrossAccountId,
+		collection_id: CollectionId,
+		collection_type: misc::CollectionType,
+		token_id: TokenId,
+	) -> DispatchResult {
+		let collection = Self::get_typed_nft_collection(collection_id, collection_type)?;
 
-        <PalletNft<T>>::burn(&collection, &sender, token_id)
-            .map_err(Self::map_common_err_to_proxy)?;
+		<PalletNft<T>>::burn(&collection, &sender, token_id)
+			.map_err(Self::map_common_err_to_proxy)?;
 
-        Ok(())
-    }
+		Ok(())
+	}
 
-    fn change_collection_owner(
-        collection_id: CollectionId,
-        collection_type: misc::CollectionType,
-        sender: T::AccountId,
-        new_owner: T::AccountId,
-    ) -> DispatchResult {
-        let collection = Self::get_typed_nft_collection(
-            collection_id,
-            collection_type
-        )?;
-        Self::check_collection_owner(&collection, &T::CrossAccountId::from_sub(sender))?;
+	fn change_collection_owner(
+		collection_id: CollectionId,
+		collection_type: misc::CollectionType,
+		sender: T::AccountId,
+		new_owner: T::AccountId,
+	) -> DispatchResult {
+		let collection = Self::get_typed_nft_collection(collection_id, collection_type)?;
+		Self::check_collection_owner(&collection, &T::CrossAccountId::from_sub(sender))?;
 
-        let mut collection = collection.into_inner();
+		let mut collection = collection.into_inner();
 
-        collection.owner = new_owner;
-        collection.save()
-    }
+		collection.owner = new_owner;
+		collection.save()
+	}
 
-    fn check_collection_owner(collection: &NonfungibleHandle<T>, account: &T::CrossAccountId) -> DispatchResult {
-        collection.check_is_owner(account)
-            .map_err(Self::map_common_err_to_proxy)
-    }
+	fn check_collection_owner(
+		collection: &NonfungibleHandle<T>,
+		account: &T::CrossAccountId,
+	) -> DispatchResult {
+		collection
+			.check_is_owner(account)
+			.map_err(Self::map_common_err_to_proxy)
+	}
 
-    pub fn last_collection_idx() -> RmrkCollectionId {
-        <CollectionIndex<T>>::get()
-    }
+	pub fn last_collection_idx() -> RmrkCollectionId {
+		<CollectionIndex<T>>::get()
+	}
 
-    pub fn get_nft_collection(collection_id: CollectionId) -> Result<NonfungibleHandle<T>, DispatchError> {
-        let collection = <CollectionHandle<T>>::try_get(collection_id)
-            .map_err(|_| <Error<T>>::CollectionUnknown)?;
+	pub fn get_nft_collection(
+		collection_id: CollectionId,
+	) -> Result<NonfungibleHandle<T>, DispatchError> {
+		let collection = <CollectionHandle<T>>::try_get(collection_id)
+			.map_err(|_| <Error<T>>::CollectionUnknown)?;
 
-        match collection.mode {
-            CollectionMode::NFT => Ok(NonfungibleHandle::cast(collection)),
-            _ => Err(<Error<T>>::CollectionUnknown.into())
-        }
-    }
+		match collection.mode {
+			CollectionMode::NFT => Ok(NonfungibleHandle::cast(collection)),
+			_ => Err(<Error<T>>::CollectionUnknown.into()),
+		}
+	}
 
-    pub fn collection_exists(collection_id: CollectionId) -> bool {
-        <CollectionHandle<T>>::try_get(collection_id).is_ok()
-    }
+	pub fn collection_exists(collection_id: CollectionId) -> bool {
+		<CollectionHandle<T>>::try_get(collection_id).is_ok()
+	}
 
-    pub fn nft_exists(collection_id: CollectionId, nft_id: TokenId) -> bool {
-        <TokenData<T>>::contains_key((collection_id, nft_id))
-    }
+	pub fn nft_exists(collection_id: CollectionId, nft_id: TokenId) -> bool {
+		<TokenData<T>>::contains_key((collection_id, nft_id))
+	}
 
-    pub fn get_collection_property(collection_id: CollectionId, key: RmrkProperty) -> Result<PropertyValue, DispatchError> {
-        let collection_property = <PalletCommon<T>>::collection_properties(collection_id)
-            .get(&Self::rmrk_property_key(key)?)
-            .ok_or(<Error<T>>::CollectionUnknown)?
-            .clone();
+	pub fn get_collection_property(
+		collection_id: CollectionId,
+		key: RmrkProperty,
+	) -> Result<PropertyValue, DispatchError> {
+		let collection_property = <PalletCommon<T>>::collection_properties(collection_id)
+			.get(&Self::rmrk_property_key(key)?)
+			.ok_or(<Error<T>>::CollectionUnknown)?
+			.clone();
 
-        Ok(collection_property)
-    }
+		Ok(collection_property)
+	}
 
-    pub fn get_collection_type(collection_id: CollectionId) -> Result<misc::CollectionType, DispatchError> {
-        let value = Self::get_collection_property(collection_id, CollectionType)?;
+	pub fn get_collection_type(
+		collection_id: CollectionId,
+	) -> Result<misc::CollectionType, DispatchError> {
+		let value = Self::get_collection_property(collection_id, CollectionType)?;
 
-        let mut value = value.as_slice();
+		let mut value = value.as_slice();
 
-        misc::CollectionType::decode(&mut value)
-            .map_err(|_| <Error<T>>::CorruptedCollectionType.into())
-    }
+		misc::CollectionType::decode(&mut value)
+			.map_err(|_| <Error<T>>::CorruptedCollectionType.into())
+	}
 
-    pub fn ensure_collection_type(collection_id: CollectionId, collection_type: misc::CollectionType) -> DispatchResult {
-        let actual_type = Self::get_collection_type(collection_id)?;
-        ensure!(actual_type == collection_type, <CommonError<T>>::NoPermission);
+	pub fn ensure_collection_type(
+		collection_id: CollectionId,
+		collection_type: misc::CollectionType,
+	) -> DispatchResult {
+		let actual_type = Self::get_collection_type(collection_id)?;
+		ensure!(
+			actual_type == collection_type,
+			<CommonError<T>>::NoPermission
+		);
 
-        Ok(())
-    }
+		Ok(())
+	}
 
-    pub fn get_nft_property(collection_id: CollectionId, nft_id: TokenId, key: RmrkProperty) -> Result<PropertyValue, DispatchError> {
-        let nft_property = <PalletNft<T>>::token_properties((collection_id, nft_id))
-            .get(&Self::rmrk_property_key(key)?)
-            .ok_or(<Error<T>>::NoAvailableNftId)?
-            .clone();
+	pub fn get_nft_property(
+		collection_id: CollectionId,
+		nft_id: TokenId,
+		key: RmrkProperty,
+	) -> Result<PropertyValue, DispatchError> {
+		let nft_property = <PalletNft<T>>::token_properties((collection_id, nft_id))
+			.get(&Self::rmrk_property_key(key)?)
+			.ok_or(<Error<T>>::NoAvailableNftId)?
+			.clone();
 
-        Ok(nft_property)
-    }
+		Ok(nft_property)
+	}
 
-    pub fn get_nft_type(_collection_id: CollectionId, _token_id: TokenId) -> Result<NftType, DispatchError> {
-        todo!("should get it from properties?")
-    }
+	pub fn get_nft_type(
+		_collection_id: CollectionId,
+		_token_id: TokenId,
+	) -> Result<NftType, DispatchError> {
+		todo!("should get it from properties?")
+	}
 
-    pub fn ensure_nft_type(collection_id: CollectionId, token_id: TokenId, nft_type: NftType) -> DispatchResult {
-        let actual_type = Self::get_nft_type(collection_id, token_id)?;
-        ensure!(actual_type == nft_type, <Error<T>>::NoPermission);
+	pub fn ensure_nft_type(
+		collection_id: CollectionId,
+		token_id: TokenId,
+		nft_type: NftType,
+	) -> DispatchResult {
+		let actual_type = Self::get_nft_type(collection_id, token_id)?;
+		ensure!(actual_type == nft_type, <Error<T>>::NoPermission);
 
-        Ok(())
-    }
+		Ok(())
+	}
 
-    pub fn ensure_nft_owner(
-        collection_id: CollectionId,
-        token_id: TokenId,
-        possible_owner: &T::CrossAccountId
-    ) -> DispatchResult {
-        let token_data = <TokenData<T>>::get((collection_id, token_id))
-            .ok_or(<Error<T>>::NoAvailableNftId)?;
+	pub fn ensure_nft_owner(
+		collection_id: CollectionId,
+		token_id: TokenId,
+		possible_owner: &T::CrossAccountId,
+	) -> DispatchResult {
+		let token_data =
+			<TokenData<T>>::get((collection_id, token_id)).ok_or(<Error<T>>::NoAvailableNftId)?;
 
-        ensure!(token_data.owner == *possible_owner, <Error<T>>::NoPermission);
+		ensure!(
+			token_data.owner == *possible_owner,
+			<Error<T>>::NoPermission
+		);
 
-        Ok(())
-    }
+		Ok(())
+	}
 
-    pub fn filter_user_properties<Key, Value, R, Mapper>(
-        collection_id: CollectionId,
-        token_id: Option<TokenId>,
-        filter_keys: Option<Vec<RmrkPropertyKey>>,
-        mapper: Mapper,
-    ) -> Result<Vec<R>, DispatchError>
-    where
-        Key: TryFrom<RmrkPropertyKey> + AsRef<[u8]>,
-        Value: Decode + Default,
-        Mapper: Fn(Key, Value) -> R
-    {
-        filter_keys.map(|keys| {
-            let properties = keys.into_iter()
-                .filter_map(|key| {
-                    let key: Key = key.try_into().ok()?;
+	pub fn filter_user_properties<Key, Value, R, Mapper>(
+		collection_id: CollectionId,
+		token_id: Option<TokenId>,
+		filter_keys: Option<Vec<RmrkPropertyKey>>,
+		mapper: Mapper,
+	) -> Result<Vec<R>, DispatchError>
+	where
+		Key: TryFrom<RmrkPropertyKey> + AsRef<[u8]>,
+		Value: Decode + Default,
+		Mapper: Fn(Key, Value) -> R,
+	{
+		filter_keys
+			.map(|keys| {
+				let properties = keys
+					.into_iter()
+					.filter_map(|key| {
+						let key: Key = key.try_into().ok()?;
 
-                    let value = match token_id {
-                        Some(token_id) => Self::get_nft_property(
-                            collection_id,
-                            token_id,
-                            UserProperty(key.as_ref())
-                        ),
-                        None => Self::get_collection_property(
-                            collection_id,
-                            UserProperty(key.as_ref())
-                        )
-                    }.ok()?.decode_or_default();
+						let value = match token_id {
+							Some(token_id) => Self::get_nft_property(
+								collection_id,
+								token_id,
+								UserProperty(key.as_ref()),
+							),
+							None => Self::get_collection_property(
+								collection_id,
+								UserProperty(key.as_ref()),
+							),
+						}
+						.ok()?
+						.decode_or_default();
 
-                    Some(mapper(key, value))
-                })
-                .collect();
+						Some(mapper(key, value))
+					})
+					.collect();
 
-            Ok(properties)
-        }).unwrap_or_else(|| {
-            let properties = Self::iterate_user_properties(collection_id, token_id, mapper)?
-                .collect();
+				Ok(properties)
+			})
+			.unwrap_or_else(|| {
+				let properties =
+					Self::iterate_user_properties(collection_id, token_id, mapper)?.collect();
 
-            Ok(properties)
-        })
-    }
+				Ok(properties)
+			})
+	}
 
-    pub fn iterate_user_properties<Key, Value, R, Mapper>(
-        collection_id: CollectionId,
-        token_id: Option<TokenId>,
-        mapper: Mapper,
-    ) -> Result<impl Iterator<Item=R>, DispatchError>
-    where
-        Key: TryFrom<RmrkPropertyKey> + AsRef<[u8]>,
-        Value: Decode + Default,
-        Mapper: Fn(Key, Value) -> R
-    {
-        let key_prefix = Self::rmrk_property_key(UserProperty(b""))?;
+	pub fn iterate_user_properties<Key, Value, R, Mapper>(
+		collection_id: CollectionId,
+		token_id: Option<TokenId>,
+		mapper: Mapper,
+	) -> Result<impl Iterator<Item = R>, DispatchError>
+	where
+		Key: TryFrom<RmrkPropertyKey> + AsRef<[u8]>,
+		Value: Decode + Default,
+		Mapper: Fn(Key, Value) -> R,
+	{
+		let key_prefix = Self::rmrk_property_key(UserProperty(b""))?;
 
-        let properties = match token_id {
-            Some(token_id) => <PalletNft<T>>::token_properties((collection_id, token_id)),
-            None => <PalletCommon<T>>::collection_properties(collection_id)
-        };
+		let properties = match token_id {
+			Some(token_id) => <PalletNft<T>>::token_properties((collection_id, token_id)),
+			None => <PalletCommon<T>>::collection_properties(collection_id),
+		};
 
-        let properties = properties
-            .into_iter()
-            .filter_map(move |(key, value)| {
-                let key = key.as_slice().strip_prefix(key_prefix.as_slice())?;
+		let properties = properties.into_iter().filter_map(move |(key, value)| {
+			let key = key.as_slice().strip_prefix(key_prefix.as_slice())?;
 
-                let key: Key = key.to_vec().try_into().ok()?;
-                let value: Value = value.decode_or_default();
+			let key: Key = key.to_vec().try_into().ok()?;
+			let value: Value = value.decode_or_default();
 
-                Some(mapper(key, value))
-            });
+			Some(mapper(key, value))
+		});
 
-        Ok(properties)
-    }
+		Ok(properties)
+	}
 
-    pub fn get_typed_nft_collection(
-        collection_id: CollectionId,
-        collection_type: misc::CollectionType
-    ) -> Result<NonfungibleHandle<T>, DispatchError> {
-        Self::ensure_collection_type(collection_id, collection_type)?;
+	pub fn get_typed_nft_collection(
+		collection_id: CollectionId,
+		collection_type: misc::CollectionType,
+	) -> Result<NonfungibleHandle<T>, DispatchError> {
+		Self::ensure_collection_type(collection_id, collection_type)?;
 
-        Self::get_nft_collection(collection_id)
-    }
+		Self::get_nft_collection(collection_id)
+	}
 
-    fn map_common_err_to_proxy(err: DispatchError) -> DispatchError {
-        map_common_err_to_proxy! {
-            match err {
-                NoPermission => NoPermission,
-                CollectionTokenLimitExceeded => CollectionFullOrLocked,
-                PublicMintingNotAllowed => NoPermission,
-                TokenNotFound => NoAvailableNftId
-            }
-        }
-    }
+	fn map_common_err_to_proxy(err: DispatchError) -> DispatchError {
+		map_common_err_to_proxy! {
+			match err {
+				NoPermission => NoPermission,
+				CollectionTokenLimitExceeded => CollectionFullOrLocked,
+				PublicMintingNotAllowed => NoPermission,
+				TokenNotFound => NoAvailableNftId
+			}
+		}
+	}
 }
modifiedpallets/proxy-rmrk-core/src/misc.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-core/src/misc.rs
+++ b/pallets/proxy-rmrk-core/src/misc.rs
@@ -15,41 +15,42 @@
 }
 
 pub trait RmrkDecode<T: Decode + Default, S> {
-    fn decode_or_default(&self) -> T;
+	fn decode_or_default(&self) -> T;
 }
 
 impl<T: Decode + Default, S> RmrkDecode<T, S> for BoundedVec<u8, S> {
-    fn decode_or_default(&self) -> T {
-        let mut value = self.as_slice();
+	fn decode_or_default(&self) -> T {
+		let mut value = self.as_slice();
 
-        T::decode(&mut value).unwrap_or_default()
-    }
+		T::decode(&mut value).unwrap_or_default()
+	}
 }
 
 pub trait RmrkRebind<T, S> {
-    fn rebind(&self) -> BoundedVec<u8, S>;
+	fn rebind(&self) -> BoundedVec<u8, S>;
 }
 
-impl<T, S> RmrkRebind<T, S> for BoundedVec<u8, T> where BoundedVec<u8, S>: TryFrom<Vec<u8>> {
-    fn rebind(&self) -> BoundedVec<u8, S> {
-        BoundedVec::<u8, S>::try_from(
-            self.clone().into_inner()
-        ).unwrap_or_default()
-    }
+impl<T, S> RmrkRebind<T, S> for BoundedVec<u8, T>
+where
+	BoundedVec<u8, S>: TryFrom<Vec<u8>>,
+{
+	fn rebind(&self) -> BoundedVec<u8, S> {
+		BoundedVec::<u8, S>::try_from(self.clone().into_inner()).unwrap_or_default()
+	}
 }
 
 #[derive(Encode, Decode, PartialEq, Eq)]
 pub enum CollectionType {
-    Regular,
-    Resource,
-    Base,
+	Regular,
+	Resource,
+	Base,
 }
 
 #[derive(Encode, Decode, PartialEq, Eq)]
 pub enum NftType {
-    Regular,
-    Resource,
-    FixedPart,
-    SlotPart,
-    Theme
+	Regular,
+	Resource,
+	FixedPart,
+	SlotPart,
+	Theme,
 }
modifiedpallets/proxy-rmrk-core/src/property.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-core/src/property.rs
+++ b/pallets/proxy-rmrk-core/src/property.rs
@@ -2,38 +2,38 @@
 use core::convert::AsRef;
 
 pub enum RmrkProperty<'r> {
-    Metadata,
-    CollectionType,
-    RoyaltyInfo,
-    Equipped,
-    ResourceCollection,
-    ResourcePriorities,
-    ResourceType,
-    PendingResourceAccept,
-    PendingResourceRemoval,
-    Parts,
-    Base,
-    Src,
-    Slot,
-    License,
-    Thumb,
-    EquippedNft,
-    BaseType,
-    ExternalPartId,
-    EquippableList,
-    ZIndex,
-    ThemeName,
-    ThemeInherit,
-    UserProperty(&'r [u8]),
+	Metadata,
+	CollectionType,
+	RoyaltyInfo,
+	Equipped,
+	ResourceCollection,
+	ResourcePriorities,
+	ResourceType,
+	PendingResourceAccept,
+	PendingResourceRemoval,
+	Parts,
+	Base,
+	Src,
+	Slot,
+	License,
+	Thumb,
+	EquippedNft,
+	BaseType,
+	ExternalPartId,
+	EquippableList,
+	ZIndex,
+	ThemeName,
+	ThemeInherit,
+	UserProperty(&'r [u8]),
 }
 
 impl<'r> RmrkProperty<'r> {
-    pub fn to_key<T: Config>(self) -> Result<PropertyKey, Error<T>> {
-        fn get_bytes<T: AsRef<[u8]>>(container: &T) -> &[u8] {
-            container.as_ref()
-        }
+	pub fn to_key<T: Config>(self) -> Result<PropertyKey, Error<T>> {
+		fn get_bytes<T: AsRef<[u8]>>(container: &T) -> &[u8] {
+			container.as_ref()
+		}
 
-        macro_rules! key {
+		macro_rules! key {
             ($($component:expr),+) => {
                 PropertyKey::try_from([$(key!(@ &$component)),+].concat())
                     .map_err(|_| <Error<T>>::RmrkPropertyKeyIsTooLong)
@@ -44,30 +44,30 @@
             };
         }
 
-        match self {
-            Self::Metadata => key!("metadata"),
-            Self::CollectionType => key!("collection-type"),
-            Self::RoyaltyInfo => key!("royalty-info"),
-            Self::Equipped => key!("equipped"),
-            Self::ResourceCollection => key!("resource-collection"),
-            Self::ResourcePriorities => key!("resource-priorities"),
-            Self::ResourceType => key!("resource-type"),
-            Self::PendingResourceAccept => key!("pending-accept"),
-            Self::PendingResourceRemoval => key!("pending-removal"),
-            Self::Parts => key!("parts"),
-            Self::Base => key!("base"),
-            Self::Src => key!("src"),
-            Self::Slot => key!("slot"),
-            Self::License => key!("license"),
-            Self::Thumb => key!("thumb"),
-            Self::EquippedNft => key!("equipped-nft"),
-            Self::BaseType => key!("base-type"),
-            Self::ExternalPartId => key!("ext-part-id"),
-            Self::EquippableList => key!("equippable-list"),
-            Self::ZIndex => key!("z-index"),
-            Self::ThemeName => key!("theme-name"),
-            Self::ThemeInherit => key!("theme-inherit"),
-            Self::UserProperty(name) => key!("userprop-", name),
-        }
-    }
+		match self {
+			Self::Metadata => key!("metadata"),
+			Self::CollectionType => key!("collection-type"),
+			Self::RoyaltyInfo => key!("royalty-info"),
+			Self::Equipped => key!("equipped"),
+			Self::ResourceCollection => key!("resource-collection"),
+			Self::ResourcePriorities => key!("resource-priorities"),
+			Self::ResourceType => key!("resource-type"),
+			Self::PendingResourceAccept => key!("pending-accept"),
+			Self::PendingResourceRemoval => key!("pending-removal"),
+			Self::Parts => key!("parts"),
+			Self::Base => key!("base"),
+			Self::Src => key!("src"),
+			Self::Slot => key!("slot"),
+			Self::License => key!("license"),
+			Self::Thumb => key!("thumb"),
+			Self::EquippedNft => key!("equipped-nft"),
+			Self::BaseType => key!("base-type"),
+			Self::ExternalPartId => key!("ext-part-id"),
+			Self::EquippableList => key!("equippable-list"),
+			Self::ZIndex => key!("z-index"),
+			Self::ThemeName => key!("theme-name"),
+			Self::ThemeInherit => key!("theme-inherit"),
+			Self::UserProperty(name) => key!("userprop-", name),
+		}
+	}
 }
modifiedpallets/proxy-rmrk-equip/src/lib.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-equip/src/lib.rs
+++ b/pallets/proxy-rmrk-equip/src/lib.rs
@@ -21,7 +21,11 @@
 use sp_runtime::DispatchError;
 use up_data_structs::*;
 use pallet_common::{Pallet as PalletCommon, Error as CommonError};
-use pallet_rmrk_core::{Pallet as PalletCore, misc::{self, *}, property::RmrkProperty::*};
+use pallet_rmrk_core::{
+	Pallet as PalletCore,
+	misc::{self, *},
+	property::RmrkProperty::*,
+};
 use pallet_nonfungible::{Pallet as PalletNft, NonfungibleHandle};
 use pallet_evm::account::CrossAccountId;
 
@@ -29,212 +33,206 @@
 
 #[frame_support::pallet]
 pub mod pallet {
-    use super::*;
+	use super::*;
 
 	#[pallet::config]
-	pub trait Config: frame_system::Config
-                    + pallet_rmrk_core::Config {
+	pub trait Config: frame_system::Config + pallet_rmrk_core::Config {
 		type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
 	}
 
-    #[pallet::storage]
+	#[pallet::storage]
 	#[pallet::getter(fn internal_part_id)]
-	pub type InernalPartId<T: Config> = StorageDoubleMap<
-        _,
-        Twox64Concat,
-        CollectionId,
-        Twox64Concat,
-        RmrkPartId,
-        TokenId
-    >;
+	pub type InernalPartId<T: Config> =
+		StorageDoubleMap<_, Twox64Concat, CollectionId, Twox64Concat, RmrkPartId, TokenId>;
 
-    #[pallet::storage]
+	#[pallet::storage]
 	#[pallet::getter(fn base_has_default_theme)]
-    pub type BaseHasDefaultTheme<T: Config> = StorageMap<
-        _,
-        Twox64Concat,
-        CollectionId,
-        bool,
-        ValueQuery
-    >;
+	pub type BaseHasDefaultTheme<T: Config> =
+		StorageMap<_, Twox64Concat, CollectionId, bool, ValueQuery>;
 
-    #[pallet::pallet]
+	#[pallet::pallet]
 	#[pallet::generate_store(pub(super) trait Store)]
 	pub struct Pallet<T>(_);
 
 	#[pallet::event]
 	#[pallet::generate_deposit(pub(super) fn deposit_event)]
 	pub enum Event<T: Config> {
-        BaseCreated {
+		BaseCreated {
 			issuer: T::AccountId,
 			base_id: RmrkBaseId,
 		},
-    }
+	}
 
-    #[pallet::error]
+	#[pallet::error]
 	pub enum Error<T> {
-        PermissionError,
-        NoAvailableBaseId,
-        NoAvailablePartId,
-        BaseDoesntExist,
-        NeedsDefaultThemeFirst,
-    }
+		PermissionError,
+		NoAvailableBaseId,
+		NoAvailablePartId,
+		BaseDoesntExist,
+		NeedsDefaultThemeFirst,
+	}
 
-    #[pallet::call]
+	#[pallet::call]
 	impl<T: Config> Pallet<T> {
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
-        #[transactional]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[transactional]
 		pub fn create_base(
 			origin: OriginFor<T>,
 			base_type: RmrkString,
 			symbol: RmrkString,
 			parts: BoundedVec<RmrkPartType, RmrkPartsLimit>,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
-            let cross_sender = T::CrossAccountId::from_sub(sender.clone());
+			let sender = ensure_signed(origin)?;
+			let cross_sender = T::CrossAccountId::from_sub(sender.clone());
 
-            let data = CreateCollectionData {
-                limits: None,
-                token_prefix: symbol.into_inner()
-                    .try_into()
-                    .map_err(|_| <CommonError<T>>::CollectionTokenPrefixLimitExceeded)?,
-                ..Default::default()
-            };
+			let data = CreateCollectionData {
+				limits: None,
+				token_prefix: symbol
+					.into_inner()
+					.try_into()
+					.map_err(|_| <CommonError<T>>::CollectionTokenPrefixLimitExceeded)?,
+				..Default::default()
+			};
 
-            let collection_id_res = <PalletNft<T>>::init_collection(sender.clone(), data);
+			let collection_id_res = <PalletNft<T>>::init_collection(sender.clone(), data);
 
-            if let Err(DispatchError::Arithmetic(_)) = &collection_id_res {
-                return Err(<Error<T>>::NoAvailableBaseId.into());
-            }
+			if let Err(DispatchError::Arithmetic(_)) = &collection_id_res {
+				return Err(<Error<T>>::NoAvailableBaseId.into());
+			}
 
-            let collection_id = collection_id_res?;
+			let collection_id = collection_id_res?;
 
-            <PalletCommon<T>>::set_scoped_collection_properties(
-                collection_id,
-                PropertyScope::Rmrk,
-                [
-                    <PalletCore<T>>::rmrk_property(CollectionType, &misc::CollectionType::Base)?,
-                    <PalletCore<T>>::rmrk_property(BaseType, &base_type)?,
-                ].into_iter()
-            )?;
+			<PalletCommon<T>>::set_scoped_collection_properties(
+				collection_id,
+				PropertyScope::Rmrk,
+				[
+					<PalletCore<T>>::rmrk_property(CollectionType, &misc::CollectionType::Base)?,
+					<PalletCore<T>>::rmrk_property(BaseType, &base_type)?,
+				]
+				.into_iter(),
+			)?;
 
-            let collection = <PalletCore<T>>::get_nft_collection(collection_id)?;
+			let collection = <PalletCore<T>>::get_nft_collection(collection_id)?;
 
-            for part in parts {
-                let part_id = part.id();
-                let part_token_id = Self::create_part(
-                    &cross_sender,
-                    &collection,
-                    part
-                )?;
+			for part in parts {
+				let part_id = part.id();
+				let part_token_id = Self::create_part(&cross_sender, &collection, part)?;
 
-                <InernalPartId<T>>::insert(collection_id, part_id, part_token_id);
+				<InernalPartId<T>>::insert(collection_id, part_id, part_token_id);
 
-                <PalletNft<T>>::set_scoped_token_property(
-                    collection_id,
-                    part_token_id,
-                    PropertyScope::Rmrk,
-                    <PalletCore<T>>::rmrk_property(ExternalPartId, &part_id)?
-                )?;
-            }
+				<PalletNft<T>>::set_scoped_token_property(
+					collection_id,
+					part_token_id,
+					PropertyScope::Rmrk,
+					<PalletCore<T>>::rmrk_property(ExternalPartId, &part_id)?,
+				)?;
+			}
 
-            Self::deposit_event(Event::BaseCreated { issuer: sender, base_id: collection_id.0 });
+			Self::deposit_event(Event::BaseCreated {
+				issuer: sender,
+				base_id: collection_id.0,
+			});
 
-            Ok(())
-        }
+			Ok(())
+		}
 
-        #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
-        #[transactional]
+		#[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))]
+		#[transactional]
 		pub fn theme_add(
 			origin: OriginFor<T>,
 			base_id: RmrkBaseId,
 			theme: RmrkTheme,
 		) -> DispatchResult {
-            let sender = ensure_signed(origin)?;
+			let sender = ensure_signed(origin)?;
 
-            let sender = T::CrossAccountId::from_sub(sender);
-            let owner = &sender;
+			let sender = T::CrossAccountId::from_sub(sender);
+			let owner = &sender;
 
-            let collection_id: CollectionId = base_id.into();
+			let collection_id: CollectionId = base_id.into();
 
-            let collection = <PalletCore<T>>::get_typed_nft_collection(
-                collection_id,
-                misc::CollectionType::Base
-            ).map_err(|_| <Error<T>>::BaseDoesntExist)?;
+			let collection = <PalletCore<T>>::get_typed_nft_collection(
+				collection_id,
+				misc::CollectionType::Base,
+			)
+			.map_err(|_| <Error<T>>::BaseDoesntExist)?;
 
-            if theme.name.as_slice() == b"default" {
-                <BaseHasDefaultTheme<T>>::insert(collection_id, true);
-            } else if !Self::base_has_default_theme(collection_id) {
-                return Err(<Error<T>>::NeedsDefaultThemeFirst.into());
-            }
+			if theme.name.as_slice() == b"default" {
+				<BaseHasDefaultTheme<T>>::insert(collection_id, true);
+			} else if !Self::base_has_default_theme(collection_id) {
+				return Err(<Error<T>>::NeedsDefaultThemeFirst.into());
+			}
 
-            let token_id = <PalletCore<T>>::create_nft(
-                &sender,
-                owner,
-                &collection,
-                NftType::Theme,
-                [
-                    <PalletCore<T>>::rmrk_property(ThemeName, &theme.name)?,
-                    <PalletCore<T>>::rmrk_property(ThemeInherit, &theme.inherit)?
-                ].into_iter()
-            ).map_err(|_| <Error<T>>::PermissionError)?;
+			let token_id = <PalletCore<T>>::create_nft(
+				&sender,
+				owner,
+				&collection,
+				NftType::Theme,
+				[
+					<PalletCore<T>>::rmrk_property(ThemeName, &theme.name)?,
+					<PalletCore<T>>::rmrk_property(ThemeInherit, &theme.inherit)?,
+				]
+				.into_iter(),
+			)
+			.map_err(|_| <Error<T>>::PermissionError)?;
 
-            for property in theme.properties {
-                <PalletNft<T>>::set_scoped_token_property(
-                    collection_id,
-                    token_id,
-                    PropertyScope::Rmrk,
-                    <PalletCore<T>>::rmrk_property(
-                        UserProperty(property.key.as_slice()),
-                        &property.value
-                    )?
-                )?;
-            }
+			for property in theme.properties {
+				<PalletNft<T>>::set_scoped_token_property(
+					collection_id,
+					token_id,
+					PropertyScope::Rmrk,
+					<PalletCore<T>>::rmrk_property(
+						UserProperty(property.key.as_slice()),
+						&property.value,
+					)?,
+				)?;
+			}
 
-            Ok(())
-        }
-    }
+			Ok(())
+		}
+	}
 }
 
 impl<T: Config> Pallet<T> {
-    fn create_part(
-        sender: &T::CrossAccountId,
-        collection: &NonfungibleHandle<T>,
-        part: RmrkPartType
-    ) -> Result<TokenId, DispatchError> {
-        let owner = sender;
+	fn create_part(
+		sender: &T::CrossAccountId,
+		collection: &NonfungibleHandle<T>,
+		part: RmrkPartType,
+	) -> Result<TokenId, DispatchError> {
+		let owner = sender;
 
-        let src = part.src();
-        let z_index = part.z_index();
+		let src = part.src();
+		let z_index = part.z_index();
 
-        let nft_type = match part {
-            RmrkPartType::FixedPart(_) => NftType::FixedPart,
-            RmrkPartType::SlotPart(_) => NftType::SlotPart,
-        };
+		let nft_type = match part {
+			RmrkPartType::FixedPart(_) => NftType::FixedPart,
+			RmrkPartType::SlotPart(_) => NftType::SlotPart,
+		};
 
-        let token_id = <PalletCore<T>>::create_nft(
-            sender,
-            owner,
-            collection,
-            nft_type,
-            [
-                <PalletCore<T>>::rmrk_property(Src, &src)?,
-                <PalletCore<T>>::rmrk_property(ZIndex, &z_index)?
-            ].into_iter()
-        ).map_err(|err| match err {
-            DispatchError::Arithmetic(_) => <Error<T>>::NoAvailablePartId.into(),
-            err => err
-        })?;
+		let token_id = <PalletCore<T>>::create_nft(
+			sender,
+			owner,
+			collection,
+			nft_type,
+			[
+				<PalletCore<T>>::rmrk_property(Src, &src)?,
+				<PalletCore<T>>::rmrk_property(ZIndex, &z_index)?,
+			]
+			.into_iter(),
+		)
+		.map_err(|err| match err {
+			DispatchError::Arithmetic(_) => <Error<T>>::NoAvailablePartId.into(),
+			err => err,
+		})?;
 
-        if let RmrkPartType::SlotPart(part) = part {
-            <PalletNft<T>>::set_scoped_token_property(
-                collection.id,
-                token_id,
-                PropertyScope::Rmrk,
-                <PalletCore<T>>::rmrk_property(EquippableList, &part.equippable)?
-            )?;
-        }
+		if let RmrkPartType::SlotPart(part) = part {
+			<PalletNft<T>>::set_scoped_token_property(
+				collection.id,
+				token_id,
+				PropertyScope::Rmrk,
+				<PalletCore<T>>::rmrk_property(EquippableList, &part.equippable)?,
+			)?;
+		}
 
-        Ok(token_id)
-    }
+		Ok(token_id)
+	}
 }
modifiedpallets/refungible/src/common.rsdiffbeforeafterboth
--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -313,17 +313,9 @@
 		fail!(<Error<T>>::RefungibleDisallowsNesting)
 	}
 
-	fn nest(
-		&self,
-		_under: TokenId,
-		_to_nest: (CollectionId, TokenId)
-	) {}
+	fn nest(&self, _under: TokenId, _to_nest: (CollectionId, TokenId)) {}
 
-	fn unnest(
-		&self,
-		_under: TokenId,
-		_to_nest: (CollectionId, TokenId)
-	) {}
+	fn unnest(&self, _under: TokenId, _to_nest: (CollectionId, TokenId)) {}
 
 	fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {
 		<Owned<T>>::iter_prefix((self.id, account))
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -22,9 +22,7 @@
 	CreateCollectionData, CreateRefungibleExData, mapping::TokenAddressMapping, budget::Budget,
 };
 use pallet_evm::account::CrossAccountId;
-use pallet_common::{
-	Error as CommonError, Event as CommonEvent, Pallet as PalletCommon,
-};
+use pallet_common::{Error as CommonError, Event as CommonEvent, Pallet as PalletCommon};
 use pallet_structure::Pallet as PalletStructure;
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
 use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
@@ -230,7 +228,9 @@
 	}
 
 	fn collection_has_tokens(collection_id: CollectionId) -> bool {
-		<TokenData<T>>::iter_prefix((collection_id,)).next().is_some()
+		<TokenData<T>>::iter_prefix((collection_id,))
+			.next()
+			.is_some()
 	}
 
 	pub fn burn_token(collection: &RefungibleHandle<T>, token_id: TokenId) -> DispatchResult {
@@ -388,18 +388,14 @@
 			to,
 			collection.id,
 			token,
-			nesting_budget
+			nesting_budget,
 		)?;
 
 		if let Some(balance_to) = balance_to {
 			// from != to
 			if balance_from == 0 {
 				<Balance<T>>::remove((collection.id, token, from));
-				<PalletStructure<T>>::unnest_if_nested(
-					from,
-					collection.id,
-					token
-				);
+				<PalletStructure<T>>::unnest_if_nested(from, collection.id, token);
 			} else {
 				<Balance<T>>::insert((collection.id, token, from), balance_from);
 			}
@@ -497,7 +493,6 @@
 		for (i, token) in data.iter().enumerate() {
 			let token_id = TokenId(first_token_id + i as u32 + 1);
 			for (to, _) in token.users.iter() {
-
 				<PalletStructure<T>>::check_nesting(
 					sender.clone(),
 					to,
@@ -531,7 +526,11 @@
 				}
 				<Balance<T>>::insert((collection.id, token_id, &user), amount);
 				<Owned<T>>::insert((collection.id, &user, TokenId(token_id)), true);
-				<PalletStructure<T>>::nest_if_sent_to_token_unchecked(&user, collection.id, TokenId(token_id));
+				<PalletStructure<T>>::nest_if_sent_to_token_unchecked(
+					&user,
+					collection.id,
+					TokenId(token_id),
+				);
 
 				// TODO: ERC20 transfer event
 				<PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
modifiedpallets/structure/src/lib.rsdiffbeforeafterboth
--- a/pallets/structure/src/lib.rs
+++ b/pallets/structure/src/lib.rs
@@ -189,17 +189,11 @@
 		under: &T::CrossAccountId,
 		collection_id: CollectionId,
 		token_id: TokenId,
-		nesting_budget: &dyn Budget
+		nesting_budget: &dyn Budget,
 	) -> DispatchResult {
-		Self::try_exec_if_owner_is_valid_nft(
-			under,
-			|d, parent_id| d.check_nesting(
-				from,
-				(collection_id, token_id),
-				parent_id,
-				nesting_budget
-			)
-		)
+		Self::try_exec_if_owner_is_valid_nft(under, |d, parent_id| {
+			d.check_nesting(from, (collection_id, token_id), parent_id, nesting_budget)
+		})
 	}
 
 	pub fn nest_if_sent_to_token(
@@ -207,69 +201,51 @@
 		under: &T::CrossAccountId,
 		collection_id: CollectionId,
 		token_id: TokenId,
-		nesting_budget: &dyn Budget
+		nesting_budget: &dyn Budget,
 	) -> DispatchResult {
-		Self::try_exec_if_owner_is_valid_nft(
-			under,
-			|d, parent_id| {
-				d.check_nesting(
-					from,
-					(collection_id, token_id),
-					parent_id,
-					nesting_budget
-				)?;
+		Self::try_exec_if_owner_is_valid_nft(under, |d, parent_id| {
+			d.check_nesting(from, (collection_id, token_id), parent_id, nesting_budget)?;
 
-				d.nest(parent_id, (collection_id, token_id));
+			d.nest(parent_id, (collection_id, token_id));
 
-				Ok(())
-			}
-		)
+			Ok(())
+		})
 	}
 
 	pub fn nest_if_sent_to_token_unchecked(
 		owner: &T::CrossAccountId,
 		collection_id: CollectionId,
-		token_id: TokenId
+		token_id: TokenId,
 	) {
-		Self::exec_if_owner_is_valid_nft(
-			owner,
-			|d, parent_id| d.nest(
-				parent_id,
-				(collection_id, token_id)
-			)
-		);
+		Self::exec_if_owner_is_valid_nft(owner, |d, parent_id| {
+			d.nest(parent_id, (collection_id, token_id))
+		});
 	}
 
 	pub fn unnest_if_nested(
 		owner: &T::CrossAccountId,
 		collection_id: CollectionId,
-		token_id: TokenId
+		token_id: TokenId,
 	) {
-		Self::exec_if_owner_is_valid_nft(
-			owner,
-			|d, parent_id| d.unnest(
-			parent_id,
-			(collection_id, token_id)
-			)
-		);
+		Self::exec_if_owner_is_valid_nft(owner, |d, parent_id| {
+			d.unnest(parent_id, (collection_id, token_id))
+		});
 	}
 
 	fn exec_if_owner_is_valid_nft(
 		account: &T::CrossAccountId,
-		action: impl FnOnce(&dyn CommonCollectionOperations<T>, TokenId)
+		action: impl FnOnce(&dyn CommonCollectionOperations<T>, TokenId),
 	) {
-		Self::try_exec_if_owner_is_valid_nft(
-			account,
-			|d, id| {
-				action(d, id);
-				Ok(())
-			}
-		).unwrap();
+		Self::try_exec_if_owner_is_valid_nft(account, |d, id| {
+			action(d, id);
+			Ok(())
+		})
+		.unwrap();
 	}
 
 	fn try_exec_if_owner_is_valid_nft(
 		account: &T::CrossAccountId,
-		action: impl FnOnce(&dyn CommonCollectionOperations<T>, TokenId) -> DispatchResult
+		action: impl FnOnce(&dyn CommonCollectionOperations<T>, TokenId) -> DispatchResult,
 	) -> DispatchResult {
 		let account = T::CrossTokenAddressMapping::address_to_token(account);
 
modifiedpallets/unique/src/lib.rsdiffbeforeafterboth
--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -37,11 +37,10 @@
 use frame_system::{self as system, ensure_signed};
 use sp_runtime::{sp_std::prelude::Vec};
 use up_data_structs::{
-	MAX_COLLECTION_NAME_LENGTH,
-	MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH, AccessMode, CreateItemData,
-	CollectionLimits, CollectionPermissions, CollectionId, CollectionMode, TokenId, SponsorshipState,
-	CreateCollectionData, CreateItemExData, budget, Property, PropertyKey,
-	PropertyKeyPermission,
+	MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH,
+	AccessMode, CreateItemData, CollectionLimits, CollectionPermissions, CollectionId,
+	CollectionMode, TokenId, SponsorshipState, CreateCollectionData, CreateItemExData, budget,
+	Property, PropertyKey, PropertyKeyPermission,
 };
 use pallet_evm::account::CrossAccountId;
 use pallet_common::{
modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -49,7 +49,8 @@
 	},
 	NftChild as RmrkNftChild, AccountIdOrCollectionNftTuple as RmrkAccountIdOrCollectionNftTuple,
 	FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart, EquippableList as RmrkEquippableList,
-	BasicResource as RmrkBasicResource, ComposableResource as RmrkComposableResource, SlotResource as RmrkSlotResource,
+	BasicResource as RmrkBasicResource, ComposableResource as RmrkComposableResource,
+	SlotResource as RmrkSlotResource,
 };
 
 mod bounded;
@@ -361,8 +362,7 @@
 pub type CollectionPropertiesPermissionsVec =
 	BoundedVec<PropertyKeyPermission, ConstU32<MAX_PROPERTIES_PER_ITEM>>;
 
-pub type CollectionPropertiesVec =
-	BoundedVec<Property, ConstU32<MAX_PROPERTIES_PER_ITEM>>;
+pub type CollectionPropertiesVec = BoundedVec<Property, ConstU32<MAX_PROPERTIES_PER_ITEM>>;
 
 /// All fields are wrapped in `Option`s, where None means chain default
 // When adding/removing fields from this struct - don't forget to also update clamp_limits
@@ -790,8 +790,8 @@
 	>::IntoIter;
 
 	fn into_iter(self) -> Self::IntoIter {
-        self.0.into_iter()
-    }
+		self.0.into_iter()
+	}
 }
 
 impl<Value> TrySetProperty for PropertiesMap<Value> {
@@ -853,8 +853,8 @@
 	type IntoIter = <PropertiesMap<PropertyValue> as IntoIterator>::IntoIter;
 
 	fn into_iter(self) -> Self::IntoIter {
-        self.map.into_iter()
-    }
+		self.map.into_iter()
+	}
 }
 
 impl TrySetProperty for Properties {
@@ -932,11 +932,7 @@
 pub type RmrkCollectionInfo<AccountId> =
 	CollectionInfo<RmrkString, RmrkCollectionSymbol, AccountId>;
 pub type RmrkInstanceInfo<AccountId> = NftInfo<AccountId, Permill, RmrkString>;
-pub type RmrkResourceInfo = ResourceInfo<
-	RmrkBoundedResource,
-	RmrkString,
-	RmrkBoundedParts,
->;
+pub type RmrkResourceInfo = ResourceInfo<RmrkBoundedResource, RmrkString, RmrkBoundedParts>;
 pub type RmrkPropertyInfo = PropertyInfo<RmrkKeyString, RmrkValueString>;
 pub type RmrkBaseInfo<AccountId> = BaseInfo<AccountId, RmrkString>;
 pub type RmrkPartType =
modifiedprimitives/data-structs/src/rmrk.rsdiffbeforeafterboth
--- a/primitives/data-structs/src/rmrk.rs
+++ b/primitives/data-structs/src/rmrk.rs
@@ -20,37 +20,37 @@
 
 #[cfg(feature = "std")]
 mod serialize {
-    use core::convert::AsRef;
-    use serde::ser::{self, Serialize};
+	use core::convert::AsRef;
+	use serde::ser::{self, Serialize};
 
-    pub mod vec {
-        use super::*;
+	pub mod vec {
+		use super::*;
 
-        pub fn serialize<D, V, C>(value: &C, serializer: D) -> Result<D::Ok, D::Error>
-        where
-            D: ser::Serializer,
-            V: Serialize,
-            C: AsRef<[V]>,
-        {
-            value.as_ref().serialize(serializer)
-        }
-    }
+		pub fn serialize<D, V, C>(value: &C, serializer: D) -> Result<D::Ok, D::Error>
+		where
+			D: ser::Serializer,
+			V: Serialize,
+			C: AsRef<[V]>,
+		{
+			value.as_ref().serialize(serializer)
+		}
+	}
 
-    pub mod opt_vec {
-        use super::*;
+	pub mod opt_vec {
+		use super::*;
 
-        pub fn serialize<D, V, C>(value: &Option<C>, serializer: D) -> Result<D::Ok, D::Error>
-        where
-            D: ser::Serializer,
-            V: Serialize,
-            C: AsRef<[V]>,
-        {
-            match value {
-                Some(value) => super::vec::serialize(value, serializer),
-                None => serializer.serialize_none()
-            }
-        }
-    }
+		pub fn serialize<D, V, C>(value: &Option<C>, serializer: D) -> Result<D::Ok, D::Error>
+		where
+			D: ser::Serializer,
+			V: Serialize,
+			C: AsRef<[V]>,
+		{
+			match value {
+				Some(value) => super::vec::serialize(value, serializer),
+				None => serializer.serialize_none(),
+			}
+		}
+	}
 }
 
 /// Collection info.
@@ -58,13 +58,11 @@
 #[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			AccountId: Serialize,
 			BoundedString: AsRef<[u8]>,
 			BoundedSymbol: AsRef<[u8]>
-		"#
-	)
+		"#)
 )]
 pub struct CollectionInfo<BoundedString, BoundedSymbol, AccountId> {
 	/// Current bidder and bid price.
@@ -91,9 +89,9 @@
 #[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]
 pub struct RoyaltyInfo<AccountId, RoyaltyAmount> {
 	/// Recipient (AccountId) of the royalty
-    pub recipient: AccountId,
+	pub recipient: AccountId,
 	/// Amount (Permill) of the royalty
-    pub amount: RoyaltyAmount,
+	pub amount: RoyaltyAmount,
 }
 
 /// Nft info.
@@ -101,13 +99,11 @@
 #[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			AccountId: Serialize,
 			RoyaltyAmount: Serialize,
 			BoundedString: AsRef<[u8]>
-		"#
-	)
+		"#)
 )]
 pub struct NftInfo<AccountId, RoyaltyAmount, BoundedString> {
 	/// The owner of the NFT, can be either an Account or a tuple (CollectionId, NftId)
@@ -129,22 +125,19 @@
 #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)]
 pub struct NftChild {
 	pub collection_id: CollectionId,
-	pub nft_id: NftId
+	pub nft_id: NftId,
 }
 
 #[cfg_attr(feature = "std", derive(Serialize))]
 #[derive(Encode, Decode, PartialEq, TypeInfo)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedKey: AsRef<[u8]>,
 			BoundedValue: AsRef<[u8]>
-		"#
-	)
+		"#)
 )]
-pub struct PropertyInfo<BoundedKey, BoundedValue>
-{
+pub struct PropertyInfo<BoundedKey, BoundedValue> {
 	/// Key of the property
 	#[cfg_attr(feature = "std", serde(with = "serialize::vec"))]
 	pub key: BoundedKey,
@@ -156,10 +149,7 @@
 
 #[derive(Encode, Decode, Default, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]
 #[cfg_attr(feature = "std", derive(Serialize))]
-#[cfg_attr(
-	feature = "std",
-	serde(bound = "BoundedString: AsRef<[u8]>")
-)]
+#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]
 pub struct BasicResource<BoundedString> {
 	/// If the resource is Media, the base property is absent. Media src should be a URI like an
 	/// IPFS hash.
@@ -188,12 +178,10 @@
 #[cfg_attr(feature = "std", derive(Serialize))]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedString: AsRef<[u8]>,
 			BoundedParts: AsRef<[PartId]>
-		"#
-	)
+		"#)
 )]
 pub struct ComposableResource<BoundedString, BoundedParts> {
 	/// If a resource is composed, it will have an array of parts that compose it
@@ -235,10 +223,7 @@
 
 #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]
 #[cfg_attr(feature = "std", derive(Serialize))]
-#[cfg_attr(
-	feature = "std",
-	serde(bound = "BoundedString: AsRef<[u8]>")
-)]
+#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]
 pub struct SlotResource<BoundedString> {
 	/// A Base is uniquely identified by the combination of the word `base`, its minting block
 	/// number, and user provided symbol during Base creation, glued by dashes `-`, e.g.
@@ -279,14 +264,12 @@
 #[cfg_attr(feature = "std", derive(Serialize))]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedString: AsRef<[u8]>,
 			BoundedParts: AsRef<[PartId]>
-		"#
-	)
+		"#)
 )]
-#[derivative(Default(bound=""))]
+#[derivative(Default(bound = ""))]
 pub enum ResourceTypes<BoundedString: Default, BoundedParts> {
 	#[derivative(Default)]
 	Basic(BasicResource<BoundedString>),
@@ -294,18 +277,15 @@
 	Slot(SlotResource<BoundedString>),
 }
 
-
 #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, TypeInfo, MaxEncodedLen)]
 #[cfg_attr(feature = "std", derive(Serialize))]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedResource: AsRef<[u8]>,
 			BoundedString: AsRef<[u8]>,
 			BoundedParts: AsRef<[PartId]>
-		"#
-	)
+		"#)
 )]
 pub struct ResourceInfo<BoundedResource, BoundedString: Default, BoundedParts> {
 	/// id is a 5-character string of reasonable uniqueness.
@@ -328,12 +308,10 @@
 #[derive(Encode, Decode, Debug, TypeInfo, MaxEncodedLen)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			AccountId: Serialize,
 			BoundedString: AsRef<[u8]>
-		"#
-	)
+		"#)
 )]
 pub struct BaseInfo<AccountId, BoundedString> {
 	/// Original creator of the Base
@@ -350,10 +328,7 @@
 
 #[cfg_attr(feature = "std", derive(Serialize))]
 #[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]
-#[cfg_attr(
-	feature = "std",
-	serde(bound = "BoundedString: AsRef<[u8]>")
-)]
+#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]
 pub struct FixedPart<BoundedString> {
 	pub id: PartId,
 	pub z: ZIndex,
@@ -368,29 +343,24 @@
 	feature = "std",
 	serde(bound = "BoundedCollectionList: AsRef<[CollectionId]>")
 )]
-#[derivative(Default(bound=""))]
+#[derivative(Default(bound = ""))]
 pub enum EquippableList<BoundedCollectionList> {
 	All,
 
 	#[derivative(Default)]
 	Empty,
 
-	Custom(
-		#[cfg_attr(feature = "std", serde(with = "serialize::vec"))]
-		BoundedCollectionList
-	),
+	Custom(#[cfg_attr(feature = "std", serde(with = "serialize::vec"))] BoundedCollectionList),
 }
 
 #[cfg_attr(feature = "std", derive(Serialize))]
 #[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedString: AsRef<[u8]>,
 			BoundedCollectionList: AsRef<[CollectionId]>
-		"#
-	)
+		"#)
 )]
 pub struct SlotPart<BoundedString, BoundedCollectionList> {
 	pub id: PartId,
@@ -406,12 +376,10 @@
 #[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, Eq, MaxEncodedLen)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedString: AsRef<[u8]>,
 			BoundedCollectionList: AsRef<[CollectionId]>
-		"#
-	)
+		"#)
 )]
 pub enum PartType<BoundedString, BoundedCollectionList> {
 	FixedPart(FixedPart<BoundedString>),
@@ -422,21 +390,21 @@
 	pub fn id(&self) -> PartId {
 		match self {
 			Self::FixedPart(part) => part.id,
-			Self::SlotPart(part) => part.id
+			Self::SlotPart(part) => part.id,
 		}
 	}
 
 	pub fn src(&self) -> &BoundedString {
 		match self {
 			Self::FixedPart(part) => &part.src,
-			Self::SlotPart(part) => &part.src
+			Self::SlotPart(part) => &part.src,
 		}
 	}
 
 	pub fn z_index(&self) -> ZIndex {
 		match self {
 			Self::FixedPart(part) => part.z,
-			Self::SlotPart(part) => part.z
+			Self::SlotPart(part) => part.z,
 		}
 	}
 }
@@ -445,12 +413,10 @@
 #[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq)]
 #[cfg_attr(
 	feature = "std",
-	serde(
-		bound = r#"
+	serde(bound = r#"
 			BoundedString: AsRef<[u8]>,
 			PropertyList: AsRef<[ThemeProperty<BoundedString>]>,
-		"#
-	)
+		"#)
 )]
 pub struct Theme<BoundedString, PropertyList> {
 	/// Name of the theme
@@ -466,10 +432,7 @@
 
 #[cfg_attr(feature = "std", derive(Eq, Serialize))]
 #[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq)]
-#[cfg_attr(
-	feature = "std",
-	serde(bound = "BoundedString: AsRef<[u8]>")
-)]
+#[cfg_attr(feature = "std", serde(bound = "BoundedString: AsRef<[u8]>"))]
 pub struct ThemeProperty<BoundedString> {
 	/// Key of the property
 	#[cfg_attr(feature = "std", serde(with = "serialize::vec"))]
modifiedruntime/tests/src/tests.rsdiffbeforeafterboth
--- a/runtime/tests/src/tests.rs
+++ b/runtime/tests/src/tests.rs
@@ -19,9 +19,9 @@
 use up_data_structs::{
 	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,
 	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, TokenId,
-	MAX_TOKEN_OWNERSHIP, CreateCollectionData, CollectionMode,
-	AccessMode, CollectionPermissions, PropertyKeyPermission, PropertyPermission,
-	Property, CollectionPropertiesVec, CollectionPropertiesPermissionsVec,
+	MAX_TOKEN_OWNERSHIP, CreateCollectionData, CollectionMode, AccessMode, CollectionPermissions,
+	PropertyKeyPermission, PropertyPermission, Property, CollectionPropertiesVec,
+	CollectionPropertiesPermissionsVec,
 };
 use frame_support::{assert_noop, assert_ok, assert_err};
 use sp_std::convert::TryInto;
@@ -47,12 +47,12 @@
 
 fn default_nft_data() -> CreateNftData {
 	CreateNftData {
-		properties: vec![
-			Property {
-				key: b"test-prop".to_vec().try_into().unwrap(),
-				value: b"test-nft-prop".to_vec().try_into().unwrap(),
-			},
-		].try_into().unwrap(),
+		properties: vec![Property {
+			key: b"test-prop".to_vec().try_into().unwrap(),
+			value: b"test-nft-prop".to_vec().try_into().unwrap(),
+		}]
+		.try_into()
+		.unwrap(),
 	}
 }
 
@@ -77,22 +77,23 @@
 	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
 	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
 	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-	let token_property_permissions: CollectionPropertiesPermissionsVec = vec![
-		PropertyKeyPermission {
+	let token_property_permissions: CollectionPropertiesPermissionsVec =
+		vec![PropertyKeyPermission {
 			key: b"test-prop".to_vec().try_into().unwrap(),
 			permission: PropertyPermission {
 				mutable: true,
 				collection_admin: false,
 				token_owner: true,
 			},
-		},
-	].try_into().unwrap();
-	let properties: CollectionPropertiesVec = vec![
-		Property {
-			key: b"test-collection-prop".to_vec().try_into().unwrap(),
-			value: b"test-collection-value".to_vec().try_into().unwrap(),
-		}
-	].try_into().unwrap();
+		}]
+		.try_into()
+		.unwrap();
+	let properties: CollectionPropertiesVec = vec![Property {
+		key: b"test-collection-prop".to_vec().try_into().unwrap(),
+		value: b"test-collection-value".to_vec().try_into().unwrap(),
+	}]
+	.try_into()
+	.unwrap();
 
 	let data: CreateCollectionData<u64> = CreateCollectionData {
 		name: col_name1.try_into().unwrap(),
@@ -150,30 +151,21 @@
 fn get_collection_property_permissions(collection_id: CollectionId) -> Vec<PropertyKeyPermission> {
 	<pallet_common::Pallet<Test>>::property_permissions(collection_id)
 		.into_iter()
-		.map(|(key, permission)| PropertyKeyPermission {
-			key,
-			permission,
-		})
+		.map(|(key, permission)| PropertyKeyPermission { key, permission })
 		.collect()
 }
 
 fn get_collection_properties(collection_id: CollectionId) -> Vec<Property> {
 	<pallet_common::Pallet<Test>>::collection_properties(collection_id)
 		.into_iter()
-		.map(|(key, value)| Property {
-			key,
-			value,
-		})
+		.map(|(key, value)| Property { key, value })
 		.collect()
 }
 
 fn get_token_properties(collection_id: CollectionId, token_id: TokenId) -> Vec<Property> {
 	<pallet_nonfungible::Pallet<Test>>::token_properties((collection_id, token_id))
 		.into_iter()
-		.map(|(key, value)| Property {
-			key,
-			value,
-		})
+		.map(|(key, value)| Property { key, value })
 		.collect()
 }