difftreelog
feature: add benchmarks for scheduler v2
in: master
3 files changed
pallets/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);
+}
pallets/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];
runtime/opal/Cargo.tomldiffbeforeafterboth1################################################################################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-xcm/runtime-benchmarks',46 'sp-runtime/runtime-benchmarks',47 'xcm-builder/runtime-benchmarks',48 'pallet-maintenance/runtime-benchmarks',49]50try-runtime = [51 'frame-try-runtime',52 'frame-executive/try-runtime',53 'frame-support/try-runtime',54 'frame-system/try-runtime',55 'cumulus-pallet-parachain-system/try-runtime',56 'parachain-info/try-runtime',57 'pallet-aura/try-runtime',58 'cumulus-pallet-aura-ext/try-runtime',59 'pallet-balances/try-runtime',60 'pallet-randomness-collective-flip/try-runtime',61 'pallet-timestamp/try-runtime',62 'pallet-transaction-payment/try-runtime',63 'pallet-treasury/try-runtime',64 'pallet-sudo/try-runtime',65 'orml-vesting/try-runtime',66 'orml-xtokens/try-runtime',67 'orml-tokens/try-runtime',68 'cumulus-pallet-xcmp-queue/try-runtime',69 'pallet-xcm/try-runtime',70 'cumulus-pallet-xcm/try-runtime',71 'cumulus-pallet-dmp-queue/try-runtime',72 'pallet-inflation/try-runtime',73 'pallet-unique/try-runtime',74 'pallet-unique-scheduler/try-runtime',75 'pallet-configuration/try-runtime',76 'pallet-charge-transaction/try-runtime',77 'pallet-common/try-runtime',78 'pallet-fungible/try-runtime',79 'pallet-refungible/try-runtime',80 'pallet-nonfungible/try-runtime',81 'pallet-structure/try-runtime',82 'pallet-proxy-rmrk-core/try-runtime',83 'pallet-proxy-rmrk-equip/try-runtime',84 'pallet-app-promotion/try-runtime',85 'pallet-foreign-assets/try-runtime',86 'pallet-evm/try-runtime',87 'pallet-ethereum/try-runtime',88 'pallet-evm-coder-substrate/try-runtime',89 'pallet-evm-contract-helpers/try-runtime',90 'pallet-evm-transaction-payment/try-runtime',91 'pallet-evm-migration/try-runtime',92 'pallet-maintenance/try-runtime',93 'pallet-test-utils?/try-runtime',94]95std = [96 'codec/std',97 'cumulus-pallet-aura-ext/std',98 'cumulus-pallet-parachain-system/std',99 'cumulus-pallet-xcm/std',100 'cumulus-pallet-xcmp-queue/std',101 'cumulus-primitives-core/std',102 'cumulus-primitives-utility/std',103 'frame-try-runtime/std',104 'frame-executive/std',105 'frame-support/std',106 'frame-system/std',107 'frame-system-rpc-runtime-api/std',108 'pallet-aura/std',109 'pallet-balances/std',110 # 'pallet-contracts/std',111 # 'pallet-contracts-primitives/std',112 # 'pallet-contracts-rpc-runtime-api/std',113 # 'pallet-contract-helpers/std',114 'pallet-randomness-collective-flip/std',115 'pallet-sudo/std',116 'pallet-timestamp/std',117 'pallet-transaction-payment/std',118 'pallet-transaction-payment-rpc-runtime-api/std',119 'pallet-treasury/std',120 'pallet-evm/std',121 'pallet-evm-migration/std',122 'pallet-evm-contract-helpers/std',123 'pallet-evm-transaction-payment/std',124 'pallet-evm-coder-substrate/std',125 'pallet-ethereum/std',126 'pallet-base-fee/std',127 'fp-rpc/std',128 'up-rpc/std',129 'app-promotion-rpc/std',130 'fp-evm-mapping/std',131 'fp-self-contained/std',132 'parachain-info/std',133 'serde',134 'pallet-inflation/std',135 'pallet-configuration/std',136 'pallet-app-promotion/std',137 'pallet-common/std',138 'pallet-structure/std',139 'pallet-fungible/std',140 'pallet-refungible/std',141 'pallet-nonfungible/std',142 'pallet-proxy-rmrk-core/std',143 'pallet-proxy-rmrk-equip/std',144 'pallet-unique/std',145 'pallet-unique-scheduler/std',146 'pallet-unique-scheduler-v2/std',147 'pallet-charge-transaction/std',148 'up-data-structs/std',149 'sp-api/std',150 'sp-block-builder/std',151 "sp-consensus-aura/std",152 'sp-core/std',153 'sp-inherents/std',154 'sp-io/std',155 'sp-offchain/std',156 'sp-runtime/std',157 'sp-session/std',158 'sp-std/std',159 'sp-transaction-pool/std',160 'sp-version/std',161 'xcm/std',162 'xcm-builder/std',163 'xcm-executor/std',164 'up-common/std',165 'rmrk-rpc/std',166 'evm-coder/std',167 'up-sponsorship/std',168169 "orml-vesting/std",170 "orml-tokens/std",171 "orml-xtokens/std",172 "orml-traits/std",173 "pallet-foreign-assets/std",174175 'pallet-maintenance/std',176 'pallet-test-utils?/std',177]178limit-testing = ['pallet-unique/limit-testing', 'up-data-structs/limit-testing']179opal-runtime = ['refungible', 'scheduler', 'rmrk', 'app-promotion', 'foreign-assets', 'pallet-test-utils']180181refungible = []182scheduler = []183rmrk = []184foreign-assets = []185app-promotion = []186187################################################################################188# Substrate Dependencies189190[dependencies.codec]191default-features = false192features = ['derive']193package = 'parity-scale-codec'194version = '3.1.2'195196[dependencies.frame-benchmarking]197default-features = false198git = "https://github.com/paritytech/substrate"199optional = true200branch = "polkadot-v0.9.30"201202[dependencies.frame-try-runtime]203default-features = false204git = "https://github.com/paritytech/substrate"205optional = true206branch = "polkadot-v0.9.30"207208[dependencies.frame-executive]209default-features = false210git = "https://github.com/paritytech/substrate"211branch = "polkadot-v0.9.30"212213[dependencies.frame-support]214default-features = false215git = "https://github.com/paritytech/substrate"216branch = "polkadot-v0.9.30"217218[dependencies.frame-system]219default-features = false220git = "https://github.com/paritytech/substrate"221branch = "polkadot-v0.9.30"222223[dependencies.frame-system-benchmarking]224default-features = false225git = "https://github.com/paritytech/substrate"226optional = true227branch = "polkadot-v0.9.30"228229[dependencies.frame-system-rpc-runtime-api]230default-features = false231git = "https://github.com/paritytech/substrate"232branch = "polkadot-v0.9.30"233234[dependencies.hex-literal]235optional = true236version = '0.3.3'237238[dependencies.serde]239default-features = false240features = ['derive']241optional = true242version = '1.0.130'243244[dependencies.pallet-aura]245default-features = false246git = "https://github.com/paritytech/substrate"247branch = "polkadot-v0.9.30"248249[dependencies.pallet-balances]250default-features = false251git = "https://github.com/paritytech/substrate"252branch = "polkadot-v0.9.30"253254# Contracts specific packages255# [dependencies.pallet-contracts]256# git = 'https://github.com/paritytech/substrate'257# default-features = false258# branch = 'master'259# version = '4.0.0-dev'260261# [dependencies.pallet-contracts-primitives]262# git = 'https://github.com/paritytech/substrate'263# default-features = false264# branch = 'master'265# version = '4.0.0-dev'266267# [dependencies.pallet-contracts-rpc-runtime-api]268# git = 'https://github.com/paritytech/substrate'269# default-features = false270# branch = 'master'271# version = '4.0.0-dev'272273[dependencies.pallet-randomness-collective-flip]274default-features = false275git = "https://github.com/paritytech/substrate"276branch = "polkadot-v0.9.30"277278[dependencies.pallet-sudo]279default-features = false280git = "https://github.com/paritytech/substrate"281branch = "polkadot-v0.9.30"282283[dependencies.pallet-timestamp]284default-features = false285git = "https://github.com/paritytech/substrate"286branch = "polkadot-v0.9.30"287288[dependencies.pallet-transaction-payment]289default-features = false290git = "https://github.com/paritytech/substrate"291branch = "polkadot-v0.9.30"292293[dependencies.pallet-transaction-payment-rpc-runtime-api]294default-features = false295git = "https://github.com/paritytech/substrate"296branch = "polkadot-v0.9.30"297298[dependencies.pallet-treasury]299default-features = false300git = "https://github.com/paritytech/substrate"301branch = "polkadot-v0.9.30"302303[dependencies.sp-arithmetic]304default-features = false305git = "https://github.com/paritytech/substrate"306branch = "polkadot-v0.9.30"307308[dependencies.sp-api]309default-features = false310git = "https://github.com/paritytech/substrate"311branch = "polkadot-v0.9.30"312313[dependencies.sp-block-builder]314default-features = false315git = "https://github.com/paritytech/substrate"316branch = "polkadot-v0.9.30"317318[dependencies.sp-core]319default-features = false320git = "https://github.com/paritytech/substrate"321branch = "polkadot-v0.9.30"322323[dependencies.sp-consensus-aura]324default-features = false325git = "https://github.com/paritytech/substrate"326branch = "polkadot-v0.9.30"327328[dependencies.sp-inherents]329default-features = false330git = "https://github.com/paritytech/substrate"331branch = "polkadot-v0.9.30"332333[dependencies.sp-io]334default-features = false335git = "https://github.com/paritytech/substrate"336branch = "polkadot-v0.9.30"337338[dependencies.sp-offchain]339default-features = false340git = "https://github.com/paritytech/substrate"341branch = "polkadot-v0.9.30"342343[dependencies.sp-runtime]344default-features = false345git = "https://github.com/paritytech/substrate"346branch = "polkadot-v0.9.30"347348[dependencies.sp-session]349default-features = false350git = "https://github.com/paritytech/substrate"351branch = "polkadot-v0.9.30"352353[dependencies.sp-std]354default-features = false355git = "https://github.com/paritytech/substrate"356branch = "polkadot-v0.9.30"357358[dependencies.sp-transaction-pool]359default-features = false360git = "https://github.com/paritytech/substrate"361branch = "polkadot-v0.9.30"362363[dependencies.sp-version]364default-features = false365git = "https://github.com/paritytech/substrate"366branch = "polkadot-v0.9.30"367368[dependencies.smallvec]369version = '1.6.1'370371################################################################################372# Cumulus dependencies373374[dependencies.parachain-info]375default-features = false376git = "https://github.com/paritytech/cumulus"377branch = "polkadot-v0.9.30"378379[dependencies.cumulus-pallet-aura-ext]380git = "https://github.com/paritytech/cumulus"381branch = "polkadot-v0.9.30"382default-features = false383384[dependencies.cumulus-pallet-parachain-system]385git = "https://github.com/paritytech/cumulus"386branch = "polkadot-v0.9.30"387default-features = false388389[dependencies.cumulus-primitives-core]390git = "https://github.com/paritytech/cumulus"391branch = "polkadot-v0.9.30"392default-features = false393394[dependencies.cumulus-pallet-xcm]395git = "https://github.com/paritytech/cumulus"396branch = "polkadot-v0.9.30"397default-features = false398399[dependencies.cumulus-pallet-dmp-queue]400git = "https://github.com/paritytech/cumulus"401branch = "polkadot-v0.9.30"402default-features = false403404[dependencies.cumulus-pallet-xcmp-queue]405git = "https://github.com/paritytech/cumulus"406branch = "polkadot-v0.9.30"407default-features = false408409[dependencies.cumulus-primitives-utility]410git = "https://github.com/paritytech/cumulus"411branch = "polkadot-v0.9.30"412default-features = false413414[dependencies.cumulus-primitives-timestamp]415git = "https://github.com/paritytech/cumulus"416branch = "polkadot-v0.9.30"417default-features = false418419################################################################################420# Polkadot dependencies421422[dependencies.polkadot-parachain]423git = "https://github.com/paritytech/polkadot"424branch = "release-v0.9.30"425default-features = false426427[dependencies.xcm]428git = "https://github.com/paritytech/polkadot"429branch = "release-v0.9.30"430default-features = false431432[dependencies.xcm-builder]433git = "https://github.com/paritytech/polkadot"434branch = "release-v0.9.30"435default-features = false436437[dependencies.xcm-executor]438git = "https://github.com/paritytech/polkadot"439branch = "release-v0.9.30"440default-features = false441442[dependencies.pallet-xcm]443git = "https://github.com/paritytech/polkadot"444branch = "release-v0.9.30"445default-features = false446447################################################################################448# local dependencies449450[dependencies]451orml-vesting.workspace = true452orml-xtokens.workspace = true453orml-tokens.workspace = true454orml-traits.workspace = true455456log = { version = "0.4.16", default-features = false }457up-common = { path = "../../primitives/common", default-features = false }458scale-info = { version = "2.0.1", default-features = false, features = [459 "derive",460] }461derivative = "2.2.0"462pallet-unique = { path = '../../pallets/unique', default-features = false }463up-rpc = { path = "../../primitives/rpc", default-features = false }464app-promotion-rpc = { path = "../../primitives/app_promotion_rpc", default-features = false }465rmrk-rpc = { path = "../../primitives/rmrk-rpc", default-features = false }466fp-evm-mapping = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }467pallet-inflation = { path = '../../pallets/inflation', default-features = false }468pallet-app-promotion = { path = '../../pallets/app-promotion', default-features = false }469up-data-structs = { path = '../../primitives/data-structs', default-features = false }470pallet-configuration = { default-features = false, path = "../../pallets/configuration" }471pallet-common = { default-features = false, path = "../../pallets/common" }472pallet-structure = { default-features = false, path = "../../pallets/structure" }473pallet-fungible = { default-features = false, path = "../../pallets/fungible" }474pallet-refungible = { default-features = false, path = "../../pallets/refungible" }475pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" }476pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" }477pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" }478pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false }479pallet-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" }480pallet-unique-scheduler-v2 = { path = '../../pallets/scheduler-v2', default-features = false }481pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false }482pallet-evm-contract-helpers = { path = '../../pallets/evm-contract-helpers', default-features = false }483pallet-evm-transaction-payment = { path = '../../pallets/evm-transaction-payment', default-features = false }484pallet-evm-coder-substrate = { default-features = false, path = "../../pallets/evm-coder-substrate" }485pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }486pallet-ethereum = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }487pallet-base-fee = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }488fp-rpc = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }489fp-self-contained = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.30" }490evm-coder = { default-features = false, path = '../../crates/evm-coder' }491up-sponsorship = { default-features = false, git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = 'polkadot-v0.9.30' }492pallet-foreign-assets = { default-features = false, path = "../../pallets/foreign-assets" }493pallet-maintenance = { default-features = false, path = "../../pallets/maintenance" }494495################################################################################496# Test dependencies497498pallet-test-utils = { optional = true, default-features = false, path = "../../test-pallets/utils" }499500################################################################################501# Other Dependencies502503impl-trait-for-tuples = "0.2.2"504505################################################################################506# Dev Dependencies507508[dev-dependencies.logtest]509version = "2.0.0"510511################################################################################512# Build Dependencies513514[build-dependencies.substrate-wasm-builder]515git = "https://github.com/paritytech/substrate"516branch = "polkadot-v0.9.30"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"