git.delta.rocks / unique-network / refs/commits / 18b6b278d214

difftreelog

feature: add benchmarks for scheduler v2

Daniel Shiposha2022-10-19parent: #67ae8db.patch.diff
in: master

3 files changed

addedpallets/scheduler-v2/src/benchmarking.rsdiffbeforeafterboth
--- /dev/null
+++ b/pallets/scheduler-v2/src/benchmarking.rs
@@ -0,0 +1,315 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+// Original license:
+// This file is part of Substrate.
+
+// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Scheduler pallet benchmarking.
+
+use super::*;
+use frame_benchmarking::{account, benchmarks};
+use frame_support::{
+	ensure,
+	traits::{schedule::Priority, PreimageRecipient},
+};
+use frame_system::RawOrigin;
+use sp_std::{prelude::*, vec};
+
+use crate::{Pallet as Scheduler, ScheduledCall, EncodedCall};
+use frame_system::Call as SystemCall;
+
+const SEED: u32 = 0;
+
+const BLOCK_NUMBER: u32 = 2;
+
+type SystemOrigin<T> = <T as frame_system::Config>::Origin;
+
+/// Add `n` items to the schedule.
+///
+/// For `resolved`:
+/// - `
+/// - `None`: aborted (hash without preimage)
+/// - `Some(true)`: hash resolves into call if possible, plain call otherwise
+/// - `Some(false)`: plain call
+fn fill_schedule<T: Config>(when: T::BlockNumber, n: u32) -> Result<(), &'static str> {
+	let t = DispatchTime::At(when);
+	let origin: <T as Config>::PalletsOrigin = frame_system::RawOrigin::Root.into();
+	for i in 0..n {
+		let call = make_call::<T>(None);
+		let period = Some(((i + 100).into(), 100));
+		let name = u32_to_name(i);
+		Scheduler::<T>::do_schedule_named(name, t, period, 0, origin.clone(), call)?;
+	}
+	ensure!(Agenda::<T>::get(when).len() == n as usize, "didn't fill schedule");
+	Ok(())
+}
+
+fn u32_to_name(i: u32) -> TaskName {
+	i.using_encoded(blake2_256)
+}
+
+fn make_task<T: Config>(
+	periodic: bool,
+	named: bool,
+	signed: bool,
+	maybe_lookup_len: Option<u32>,
+	priority: Priority,
+) -> ScheduledOf<T> {
+	let call = make_call::<T>(maybe_lookup_len);
+	let maybe_periodic = match periodic {
+		true => Some((100u32.into(), 100)),
+		false => None,
+	};
+	let maybe_id = match named {
+		true => Some(u32_to_name(0)),
+		false => None,
+	};
+	let origin = make_origin::<T>(signed);
+	Scheduled { maybe_id, priority, call, maybe_periodic, origin, _phantom: PhantomData }
+}
+
+fn bounded<T: Config>(len: u32) -> Option<ScheduledCall<T>> {
+	let call =
+		<<T as Config>::Call>::from(SystemCall::remark { remark: vec![0; len as usize] });
+    ScheduledCall::new(call).ok()
+}
+
+fn make_call<T: Config>(maybe_lookup_len: Option<u32>) -> ScheduledCall<T> {
+	let bound = EncodedCall::bound() as u32;
+	let mut len = match maybe_lookup_len {
+		Some(len) => len.min(<T::Preimages as PreimageRecipient<T::Hash>>::MaxSize::get() - 2).max(bound) - 3,
+		None => bound.saturating_sub(4),
+	};
+
+	loop {
+		let c = match bounded::<T>(len) {
+			Some(x) => x,
+			None => {
+				len -= 1;
+				continue
+			},
+		};
+		if c.lookup_needed() == maybe_lookup_len.is_some() {
+			break c
+		}
+		if maybe_lookup_len.is_some() {
+			len += 1;
+		} else {
+			if len > 0 {
+				len -= 1;
+			} else {
+				break c
+			}
+		}
+	}
+}
+
+fn make_origin<T: Config>(signed: bool) -> <T as Config>::PalletsOrigin {
+	match signed {
+		true => frame_system::RawOrigin::Signed(account("origin", 0, SEED)).into(),
+		false => frame_system::RawOrigin::Root.into(),
+	}
+}
+
+fn dummy_counter() -> WeightCounter {
+	WeightCounter { used: Weight::zero(), limit: Weight::MAX }
+}
+
+benchmarks! {
+    // `service_agendas` when no work is done.
+	service_agendas_base {
+		let now = T::BlockNumber::from(BLOCK_NUMBER);
+		IncompleteSince::<T>::put(now - One::one());
+	}: {
+		Scheduler::<T>::service_agendas(&mut dummy_counter(), now, 0);
+	} verify {
+		assert_eq!(IncompleteSince::<T>::get(), Some(now - One::one()));
+	}
+
+    // `service_agenda` when no work is done.
+	service_agenda_base {
+		let now = BLOCK_NUMBER.into();
+		let s in 0 .. T::MaxScheduledPerBlock::get();
+		fill_schedule::<T>(now, s)?;
+		let mut executed = 0;
+	}: {
+		Scheduler::<T>::service_agenda(&mut dummy_counter(), &mut executed, now, now, 0);
+	} verify {
+		assert_eq!(executed, 0);
+	}
+
+    // `service_task` when the task is a non-periodic, non-named, non-fetched call which is not
+	// dispatched (e.g. due to being overweight).
+	service_task_base {
+		let now = BLOCK_NUMBER.into();
+		let task = make_task::<T>(false, false, false, None, 0);
+		// prevent any tasks from actually being executed as we only want the surrounding weight.
+		let mut counter = WeightCounter { used: Weight::zero(), limit: Weight::zero() };
+	}: {
+		let result = Scheduler::<T>::service_task(&mut counter, now, now, 0, true, task);
+	} verify {
+		//assert_eq!(result, Ok(()));
+	}
+
+    // `service_task` when the task is a non-periodic, non-named, fetched call (with a known
+	// preimage length) and which is not dispatched (e.g. due to being overweight).
+	service_task_fetched {
+		let s in (EncodedCall::bound() as u32) .. (<T::Preimages as PreimageRecipient<T::Hash>>::MaxSize::get());
+		let now = BLOCK_NUMBER.into();
+		let task = make_task::<T>(false, false, false, Some(s), 0);
+		// prevent any tasks from actually being executed as we only want the surrounding weight.
+		let mut counter = WeightCounter { used: Weight::zero(), limit: Weight::zero() };
+	}: {
+		let result = Scheduler::<T>::service_task(&mut counter, now, now, 0, true, task);
+	} verify {
+	}
+
+    // `service_task` when the task is a non-periodic, named, non-fetched call which is not
+	// dispatched (e.g. due to being overweight).
+	service_task_named {
+		let now = BLOCK_NUMBER.into();
+		let task = make_task::<T>(false, true, false, None, 0);
+		// prevent any tasks from actually being executed as we only want the surrounding weight.
+		let mut counter = WeightCounter { used: Weight::zero(), limit: Weight::zero() };
+	}: {
+		let result = Scheduler::<T>::service_task(&mut counter, now, now, 0, true, task);
+	} verify {
+	}
+
+    // `service_task` when the task is a periodic, non-named, non-fetched call which is not
+	// dispatched (e.g. due to being overweight).
+	service_task_periodic {
+		let now = BLOCK_NUMBER.into();
+		let task = make_task::<T>(true, false, false, None, 0);
+		// prevent any tasks from actually being executed as we only want the surrounding weight.
+		let mut counter = WeightCounter { used: Weight::zero(), limit: Weight::zero() };
+	}: {
+		let result = Scheduler::<T>::service_task(&mut counter, now, now, 0, true, task);
+	} verify {
+	}
+
+    // `execute_dispatch` when the origin is `Signed`, not counting the dispatable's weight.
+	execute_dispatch_signed {
+		let mut counter = WeightCounter { used: Weight::zero(), limit: Weight::MAX };
+		let origin = make_origin::<T>(true);
+		let call = T::Preimages::realize(&make_call::<T>(None)).unwrap().0;
+	}: {
+		assert!(Scheduler::<T>::execute_dispatch(&mut counter, origin, call).is_ok());
+	}
+	verify {
+	}
+
+    // `execute_dispatch` when the origin is not `Signed`, not counting the dispatable's weight.
+	execute_dispatch_unsigned {
+		let mut counter = WeightCounter { used: Weight::zero(), limit: Weight::MAX };
+		let origin = make_origin::<T>(false);
+		let call = T::Preimages::realize(&make_call::<T>(None)).unwrap().0;
+	}: {
+		assert!(Scheduler::<T>::execute_dispatch(&mut counter, origin, call).is_ok());
+	}
+	verify {
+	}
+
+    schedule {
+		let s in 0 .. (T::MaxScheduledPerBlock::get() - 1);
+		let when = BLOCK_NUMBER.into();
+		let periodic = Some((T::BlockNumber::one(), 100));
+		let priority = 0;
+		// Essentially a no-op call.
+		let call = Box::new(SystemCall::set_storage { items: vec![] }.into());
+
+		fill_schedule::<T>(when, s)?;
+	}: _(RawOrigin::Root, when, periodic, priority, call)
+	verify {
+		ensure!(
+			Agenda::<T>::get(when).len() == (s + 1) as usize,
+			"didn't add to schedule"
+		);
+	}
+
+    cancel {
+		let s in 1 .. T::MaxScheduledPerBlock::get();
+		let when = BLOCK_NUMBER.into();
+
+		fill_schedule::<T>(when, s)?;
+		assert_eq!(Agenda::<T>::get(when).len(), s as usize);
+		let schedule_origin = T::ScheduleOrigin::successful_origin();
+	}: _<SystemOrigin<T>>(schedule_origin, when, 0)
+	verify {
+		ensure!(
+			Lookup::<T>::get(u32_to_name(0)).is_none(),
+			"didn't remove from lookup"
+		);
+		// Removed schedule is NONE
+		ensure!(
+			Agenda::<T>::get(when)[0].is_none(),
+			"didn't remove from schedule"
+		);
+	}
+
+    schedule_named {
+		let s in 0 .. (T::MaxScheduledPerBlock::get() - 1);
+		let id = u32_to_name(s);
+		let when = BLOCK_NUMBER.into();
+		let periodic = Some((T::BlockNumber::one(), 100));
+		let priority = 0;
+		// Essentially a no-op call.
+		let call = Box::new(SystemCall::set_storage { items: vec![] }.into());
+
+		fill_schedule::<T>(when, s)?;
+	}: _(RawOrigin::Root, id, when, periodic, priority, call)
+	verify {
+		ensure!(
+			Agenda::<T>::get(when).len() == (s + 1) as usize,
+			"didn't add to schedule"
+		);
+	}
+
+    cancel_named {
+		let s in 1 .. T::MaxScheduledPerBlock::get();
+		let when = BLOCK_NUMBER.into();
+
+		fill_schedule::<T>(when, s)?;
+	}: _(RawOrigin::Root, u32_to_name(0))
+	verify {
+		ensure!(
+			Lookup::<T>::get(u32_to_name(0)).is_none(),
+			"didn't remove from lookup"
+		);
+		// Removed schedule is NONE
+		ensure!(
+			Agenda::<T>::get(when)[0].is_none(),
+			"didn't remove from schedule"
+		);
+	}
+
+    // impl_benchmark_test_suite!(Scheduler, crate::mock::new_test_ext(), crate::mock::Test);
+}
modifiedpallets/scheduler-v2/src/lib.rsdiffbeforeafterboth
--- a/pallets/scheduler-v2/src/lib.rs
+++ b/pallets/scheduler-v2/src/lib.rs
@@ -143,6 +143,14 @@
 		}
 	}
 
+	/// Returns whether the image will require a lookup to be peeked.
+	pub fn lookup_needed(&self) -> bool {
+		match self {
+			Self::Inline(_) => false,
+			Self::PreimageLookup { .. } => true,
+		}
+	}
+
 	fn decode(mut data: &[u8]) -> Result<<T as Config>::Call, DispatchError> {
 		<T as Config>::Call::decode(&mut data)
 				.map_err(|_| <Error<T>>::ScheduledCallCorrupted.into())
@@ -153,6 +161,11 @@
     fn drop(call: &ScheduledCall<T>);
 
 	fn peek(call: &ScheduledCall<T>) -> Result<(<T as pallet::Config>::Call, Option<u32>), DispatchError>;
+
+	/// Convert the given scheduled `call` value back into its original instance. If successful,
+	/// `drop` any data backing it. This will not break the realisability of independently
+	/// created instances of `ScheduledCall` which happen to have identical data.
+	fn realize(call: &ScheduledCall<T>) -> Result<(<T as pallet::Config>::Call, Option<u32>), DispatchError>;
 }
 
 impl<T: Config, PP: PreimageRecipient<T::Hash>> SchedulerPreimages<T> for PP {
@@ -175,6 +188,12 @@
 			},
 		}
 	}
+
+	fn realize(call: &ScheduledCall<T>) -> Result<(<T as pallet::Config>::Call, Option<u32>), DispatchError> {
+		let r = Self::peek(call)?;
+		Self::drop(call);
+		Ok(r)
+	}
 }
 
 pub type TaskName = [u8; 32];
modifiedruntime/opal/Cargo.tomldiffbeforeafterboth
after · runtime/opal/Cargo.toml
1################################################################################2# Package34cargo-features = ["workspace-inheritance"]56[package]7authors = ['Unique Network <support@uniquenetwork.io>']8build = 'build.rs'9description = 'Opal Runtime'10edition = '2021'11homepage = 'https://unique.network'12license = 'GPLv3'13name = 'opal-runtime'14repository = 'https://github.com/UniqueNetwork/unique-chain'15version = "0.9.30"1617[package.metadata.docs.rs]18targets = ['x86_64-unknown-linux-gnu']1920[features]21default = ['std', 'opal-runtime']22runtime-benchmarks = [23    'hex-literal',24    'frame-benchmarking',25    'frame-support/runtime-benchmarks',26    'frame-system-benchmarking',27    'frame-system/runtime-benchmarks',28    'pallet-ethereum/runtime-benchmarks',29    'pallet-evm-migration/runtime-benchmarks',30    'pallet-evm-coder-substrate/runtime-benchmarks',31    'pallet-balances/runtime-benchmarks',32    'pallet-timestamp/runtime-benchmarks',33    'pallet-common/runtime-benchmarks',34    'pallet-structure/runtime-benchmarks',35    'pallet-fungible/runtime-benchmarks',36    'pallet-refungible/runtime-benchmarks',37    'pallet-nonfungible/runtime-benchmarks',38    'pallet-proxy-rmrk-core/runtime-benchmarks',39    'pallet-proxy-rmrk-equip/runtime-benchmarks',40    'pallet-foreign-assets/runtime-benchmarks',41    'pallet-unique/runtime-benchmarks',42    'pallet-inflation/runtime-benchmarks',43    'pallet-app-promotion/runtime-benchmarks',44    'pallet-unique-scheduler/runtime-benchmarks',45    'pallet-unique-scheduler-v2/runtime-benchmarks',46    'pallet-xcm/runtime-benchmarks',47    'sp-runtime/runtime-benchmarks',48    'xcm-builder/runtime-benchmarks',49    'pallet-maintenance/runtime-benchmarks',50]51try-runtime = [52    'frame-try-runtime',53    'frame-executive/try-runtime',54    'frame-support/try-runtime',55    'frame-system/try-runtime',56    'cumulus-pallet-parachain-system/try-runtime',57    'parachain-info/try-runtime',58    'pallet-aura/try-runtime',59    'cumulus-pallet-aura-ext/try-runtime',60    'pallet-balances/try-runtime',61    'pallet-randomness-collective-flip/try-runtime',62    'pallet-timestamp/try-runtime',63    'pallet-transaction-payment/try-runtime',64    'pallet-treasury/try-runtime',65    'pallet-sudo/try-runtime',66    'orml-vesting/try-runtime',67    'orml-xtokens/try-runtime',68    'orml-tokens/try-runtime',69    'cumulus-pallet-xcmp-queue/try-runtime',70    'pallet-xcm/try-runtime',71    'cumulus-pallet-xcm/try-runtime',72    'cumulus-pallet-dmp-queue/try-runtime',73    'pallet-inflation/try-runtime',74    'pallet-unique/try-runtime',75    'pallet-unique-scheduler/try-runtime',76    'pallet-configuration/try-runtime',77    'pallet-charge-transaction/try-runtime',78    'pallet-common/try-runtime',79    'pallet-fungible/try-runtime',80    'pallet-refungible/try-runtime',81    'pallet-nonfungible/try-runtime',82    'pallet-structure/try-runtime',83    'pallet-proxy-rmrk-core/try-runtime',84    'pallet-proxy-rmrk-equip/try-runtime',85    'pallet-app-promotion/try-runtime',86    'pallet-foreign-assets/try-runtime',87    'pallet-evm/try-runtime',88    'pallet-ethereum/try-runtime',89    'pallet-evm-coder-substrate/try-runtime',90    'pallet-evm-contract-helpers/try-runtime',91    'pallet-evm-transaction-payment/try-runtime',92    'pallet-evm-migration/try-runtime',93    'pallet-maintenance/try-runtime',94    'pallet-test-utils?/try-runtime',95]96std = [97    'codec/std',98    'cumulus-pallet-aura-ext/std',99    'cumulus-pallet-parachain-system/std',100    'cumulus-pallet-xcm/std',101    'cumulus-pallet-xcmp-queue/std',102    'cumulus-primitives-core/std',103    'cumulus-primitives-utility/std',104    'frame-try-runtime/std',105    'frame-executive/std',106    'frame-support/std',107    'frame-system/std',108    'frame-system-rpc-runtime-api/std',109    'pallet-aura/std',110    'pallet-balances/std',111    # 'pallet-contracts/std',112    # 'pallet-contracts-primitives/std',113    # 'pallet-contracts-rpc-runtime-api/std',114    # 'pallet-contract-helpers/std',115    'pallet-randomness-collective-flip/std',116    'pallet-sudo/std',117    'pallet-timestamp/std',118    'pallet-transaction-payment/std',119    'pallet-transaction-payment-rpc-runtime-api/std',120    'pallet-treasury/std',121    'pallet-evm/std',122    'pallet-evm-migration/std',123    'pallet-evm-contract-helpers/std',124    'pallet-evm-transaction-payment/std',125    'pallet-evm-coder-substrate/std',126    'pallet-ethereum/std',127    'pallet-base-fee/std',128    'fp-rpc/std',129    'up-rpc/std',130    'app-promotion-rpc/std',131    'fp-evm-mapping/std',132    'fp-self-contained/std',133    'parachain-info/std',134    'serde',135    'pallet-inflation/std',136    'pallet-configuration/std',137    'pallet-app-promotion/std',138    'pallet-common/std',139    'pallet-structure/std',140    'pallet-fungible/std',141    'pallet-refungible/std',142    'pallet-nonfungible/std',143    'pallet-proxy-rmrk-core/std',144    'pallet-proxy-rmrk-equip/std',145    'pallet-unique/std',146    'pallet-unique-scheduler/std',147    'pallet-unique-scheduler-v2/std',148    'pallet-charge-transaction/std',149    'up-data-structs/std',150    'sp-api/std',151    'sp-block-builder/std',152    "sp-consensus-aura/std",153    'sp-core/std',154    'sp-inherents/std',155    'sp-io/std',156    'sp-offchain/std',157    'sp-runtime/std',158    'sp-session/std',159    'sp-std/std',160    'sp-transaction-pool/std',161    'sp-version/std',162    'xcm/std',163    'xcm-builder/std',164    'xcm-executor/std',165    'up-common/std',166    'rmrk-rpc/std',167    'evm-coder/std',168    'up-sponsorship/std',169170    "orml-vesting/std",171    "orml-tokens/std",172    "orml-xtokens/std",173    "orml-traits/std",174    "pallet-foreign-assets/std",175176    'pallet-maintenance/std',177    'pallet-test-utils?/std',178]179limit-testing = ['pallet-unique/limit-testing', 'up-data-structs/limit-testing']180opal-runtime = ['refungible', 'scheduler', 'rmrk', 'app-promotion', 'foreign-assets', 'pallet-test-utils']181182refungible = []183scheduler = []184rmrk = []185foreign-assets = []186app-promotion = []187188################################################################################189# Substrate Dependencies190191[dependencies.codec]192default-features = false193features = ['derive']194package = 'parity-scale-codec'195version = '3.1.2'196197[dependencies.frame-benchmarking]198default-features = false199git = "https://github.com/paritytech/substrate"200optional = true201branch = "polkadot-v0.9.30"202203[dependencies.frame-try-runtime]204default-features = false205git = "https://github.com/paritytech/substrate"206optional = true207branch = "polkadot-v0.9.30"208209[dependencies.frame-executive]210default-features = false211git = "https://github.com/paritytech/substrate"212branch = "polkadot-v0.9.30"213214[dependencies.frame-support]215default-features = false216git = "https://github.com/paritytech/substrate"217branch = "polkadot-v0.9.30"218219[dependencies.frame-system]220default-features = false221git = "https://github.com/paritytech/substrate"222branch = "polkadot-v0.9.30"223224[dependencies.frame-system-benchmarking]225default-features = false226git = "https://github.com/paritytech/substrate"227optional = true228branch = "polkadot-v0.9.30"229230[dependencies.frame-system-rpc-runtime-api]231default-features = false232git = "https://github.com/paritytech/substrate"233branch = "polkadot-v0.9.30"234235[dependencies.hex-literal]236optional = true237version = '0.3.3'238239[dependencies.serde]240default-features = false241features = ['derive']242optional = true243version = '1.0.130'244245[dependencies.pallet-aura]246default-features = false247git = "https://github.com/paritytech/substrate"248branch = "polkadot-v0.9.30"249250[dependencies.pallet-balances]251default-features = false252git = "https://github.com/paritytech/substrate"253branch = "polkadot-v0.9.30"254255# Contracts specific packages256# [dependencies.pallet-contracts]257# git = 'https://github.com/paritytech/substrate'258# default-features = false259# branch = 'master'260# version = '4.0.0-dev'261262# [dependencies.pallet-contracts-primitives]263# git = 'https://github.com/paritytech/substrate'264# default-features = false265# branch = 'master'266# version = '4.0.0-dev'267268# [dependencies.pallet-contracts-rpc-runtime-api]269# git = 'https://github.com/paritytech/substrate'270# default-features = false271# branch = 'master'272# version = '4.0.0-dev'273274[dependencies.pallet-randomness-collective-flip]275default-features = false276git = "https://github.com/paritytech/substrate"277branch = "polkadot-v0.9.30"278279[dependencies.pallet-sudo]280default-features = false281git = "https://github.com/paritytech/substrate"282branch = "polkadot-v0.9.30"283284[dependencies.pallet-timestamp]285default-features = false286git = "https://github.com/paritytech/substrate"287branch = "polkadot-v0.9.30"288289[dependencies.pallet-transaction-payment]290default-features = false291git = "https://github.com/paritytech/substrate"292branch = "polkadot-v0.9.30"293294[dependencies.pallet-transaction-payment-rpc-runtime-api]295default-features = false296git = "https://github.com/paritytech/substrate"297branch = "polkadot-v0.9.30"298299[dependencies.pallet-treasury]300default-features = false301git = "https://github.com/paritytech/substrate"302branch = "polkadot-v0.9.30"303304[dependencies.sp-arithmetic]305default-features = false306git = "https://github.com/paritytech/substrate"307branch = "polkadot-v0.9.30"308309[dependencies.sp-api]310default-features = false311git = "https://github.com/paritytech/substrate"312branch = "polkadot-v0.9.30"313314[dependencies.sp-block-builder]315default-features = false316git = "https://github.com/paritytech/substrate"317branch = "polkadot-v0.9.30"318319[dependencies.sp-core]320default-features = false321git = "https://github.com/paritytech/substrate"322branch = "polkadot-v0.9.30"323324[dependencies.sp-consensus-aura]325default-features = false326git = "https://github.com/paritytech/substrate"327branch = "polkadot-v0.9.30"328329[dependencies.sp-inherents]330default-features = false331git = "https://github.com/paritytech/substrate"332branch = "polkadot-v0.9.30"333334[dependencies.sp-io]335default-features = false336git = "https://github.com/paritytech/substrate"337branch = "polkadot-v0.9.30"338339[dependencies.sp-offchain]340default-features = false341git = "https://github.com/paritytech/substrate"342branch = "polkadot-v0.9.30"343344[dependencies.sp-runtime]345default-features = false346git = "https://github.com/paritytech/substrate"347branch = "polkadot-v0.9.30"348349[dependencies.sp-session]350default-features = false351git = "https://github.com/paritytech/substrate"352branch = "polkadot-v0.9.30"353354[dependencies.sp-std]355default-features = false356git = "https://github.com/paritytech/substrate"357branch = "polkadot-v0.9.30"358359[dependencies.sp-transaction-pool]360default-features = false361git = "https://github.com/paritytech/substrate"362branch = "polkadot-v0.9.30"363364[dependencies.sp-version]365default-features = false366git = "https://github.com/paritytech/substrate"367branch = "polkadot-v0.9.30"368369[dependencies.smallvec]370version = '1.6.1'371372################################################################################373# Cumulus dependencies374375[dependencies.parachain-info]376default-features = false377git = "https://github.com/paritytech/cumulus"378branch = "polkadot-v0.9.30"379380[dependencies.cumulus-pallet-aura-ext]381git = "https://github.com/paritytech/cumulus"382branch = "polkadot-v0.9.30"383default-features = false384385[dependencies.cumulus-pallet-parachain-system]386git = "https://github.com/paritytech/cumulus"387branch = "polkadot-v0.9.30"388default-features = false389390[dependencies.cumulus-primitives-core]391git = "https://github.com/paritytech/cumulus"392branch = "polkadot-v0.9.30"393default-features = false394395[dependencies.cumulus-pallet-xcm]396git = "https://github.com/paritytech/cumulus"397branch = "polkadot-v0.9.30"398default-features = false399400[dependencies.cumulus-pallet-dmp-queue]401git = "https://github.com/paritytech/cumulus"402branch = "polkadot-v0.9.30"403default-features = false404405[dependencies.cumulus-pallet-xcmp-queue]406git = "https://github.com/paritytech/cumulus"407branch = "polkadot-v0.9.30"408default-features = false409410[dependencies.cumulus-primitives-utility]411git = "https://github.com/paritytech/cumulus"412branch = "polkadot-v0.9.30"413default-features = false414415[dependencies.cumulus-primitives-timestamp]416git = "https://github.com/paritytech/cumulus"417branch = "polkadot-v0.9.30"418default-features = false419420################################################################################421# Polkadot dependencies422423[dependencies.polkadot-parachain]424git = "https://github.com/paritytech/polkadot"425branch = "release-v0.9.30"426default-features = false427428[dependencies.xcm]429git = "https://github.com/paritytech/polkadot"430branch = "release-v0.9.30"431default-features = false432433[dependencies.xcm-builder]434git = "https://github.com/paritytech/polkadot"435branch = "release-v0.9.30"436default-features = false437438[dependencies.xcm-executor]439git = "https://github.com/paritytech/polkadot"440branch = "release-v0.9.30"441default-features = false442443[dependencies.pallet-xcm]444git = "https://github.com/paritytech/polkadot"445branch = "release-v0.9.30"446default-features = false447448################################################################################449# local dependencies450451[dependencies]452orml-vesting.workspace = true453orml-xtokens.workspace = true454orml-tokens.workspace = true455orml-traits.workspace = true456457log = { version = "0.4.16", default-features = false }458up-common = { path = "../../primitives/common", default-features = false }459scale-info = { version = "2.0.1", default-features = false, features = [460    "derive",461] }462derivative = "2.2.0"463pallet-unique = { path = '../../pallets/unique', default-features = false }464up-rpc = { path = "../../primitives/rpc", default-features = false }465app-promotion-rpc = { path = "../../primitives/app_promotion_rpc", default-features = false }466rmrk-rpc = { path = "../../primitives/rmrk-rpc", default-features = false }467fp-evm-mapping = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }468pallet-inflation = { path = '../../pallets/inflation', default-features = false }469pallet-app-promotion = { path = '../../pallets/app-promotion', default-features = false }470up-data-structs = { path = '../../primitives/data-structs', default-features = false }471pallet-configuration = { default-features = false, path = "../../pallets/configuration" }472pallet-common = { default-features = false, path = "../../pallets/common" }473pallet-structure = { default-features = false, path = "../../pallets/structure" }474pallet-fungible = { default-features = false, path = "../../pallets/fungible" }475pallet-refungible = { default-features = false, path = "../../pallets/refungible" }476pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" }477pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" }478pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" }479pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false }480pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.30", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" }481pallet-unique-scheduler-v2 = { path = '../../pallets/scheduler-v2', default-features = false }482pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false }483pallet-evm-contract-helpers = { path = '../../pallets/evm-contract-helpers', default-features = false }484pallet-evm-transaction-payment = { path = '../../pallets/evm-transaction-payment', default-features = false }485pallet-evm-coder-substrate = { default-features = false, path = "../../pallets/evm-coder-substrate" }486pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }487pallet-ethereum = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }488pallet-base-fee = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }489fp-rpc = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }490fp-self-contained = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }491evm-coder = { default-features = false, path = '../../crates/evm-coder' }492up-sponsorship = { default-features = false, git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = 'polkadot-v0.9.30' }493pallet-foreign-assets = { default-features = false, path = "../../pallets/foreign-assets" }494pallet-maintenance = { default-features = false, path = "../../pallets/maintenance" }495496################################################################################497# Test dependencies498499pallet-test-utils = { optional = true, default-features = false, path = "../../test-pallets/utils" }500501################################################################################502# Other Dependencies503504impl-trait-for-tuples = "0.2.2"505506################################################################################507# Dev Dependencies508509[dev-dependencies.logtest]510version = "2.0.0"511512################################################################################513# Build Dependencies514515[build-dependencies.substrate-wasm-builder]516git = "https://github.com/paritytech/substrate"517branch = "polkadot-v0.9.30"