From 4834cd8a444382d87f4d5db06c8eafda695b1177 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 7 Apr 2021 22:39:37 +0200 Subject: [PATCH 01/22] Introduce plurality XCM locations --- xcm/src/v0/junction.rs | 58 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/xcm/src/v0/junction.rs b/xcm/src/v0/junction.rs index b5493cd31fe0..b5d5077fbfac 100644 --- a/xcm/src/v0/junction.rs +++ b/xcm/src/v0/junction.rs @@ -32,6 +32,41 @@ pub enum NetworkId { Kusama, } +/// An identifier of a pluralistic body. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum BodyId { + /// The only body in its context. + Unit, + /// A named body. + Named(Vec), + /// An indexed body. + // TODO: parity-scale-codec#262: Change to be a tuple. + Index { #[codec(compact)] id: u32 }, + /// The unambiguous executive body (for Polkadot, this would be the Polkadot council). + Executive, + /// The unambiguous technical body (for Polkadot, this would be the Technical Committee). + Technical, + /// The unambiguous legislative body (for Polkadot, this could be considered the opinion of a majority of + /// lock-voters). + Legislative, + /// The unambiguous judicial body (this doesn't exist on Polkadot, but if it were to get a "grand oracle", it + /// may be considered as that). + Judicial, +} + +/// A part of a pluralistic body. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum BodyPart { + /// The body's declaration, under whatever means it decides. + Voice, + /// A given number of members of the body. + Members { #[codec(compact)] count: u32 }, + /// No less than the given proportion of members of the body. + AtLeastProportion { #[codec(compact)] nom: u32, #[codec(compact)] denom: u32 }, + /// More than than the given proportion of members of the body. + MoreThanProportion { #[codec(compact)] nom: u32, #[codec(compact)] denom: u32 }, +} + /// A single item in a path to describe the relative location of a consensus system. /// /// Each item assumes a pre-existing location as its context and is defined in terms of it. @@ -85,6 +120,11 @@ pub enum Junction { /// /// Not currently used except as a fallback when deriving ancestry. OnlyChild, + /// A pluralistic body existing within consensus. + /// + /// Typical to be used to represent a governance origin of a chain, but could in principle be used to represent + /// things such as multisigs also. + Plurality { id: BodyId, part: BodyPart }, } impl Junction { @@ -92,14 +132,16 @@ impl Junction { match self { Junction::Parent => false, - Junction::Parachain { .. } | - Junction::AccountId32 { .. } | - Junction::AccountIndex64 { .. } | - Junction::AccountKey20 { .. } | - Junction::PalletInstance { .. } | - Junction::GeneralIndex { .. } | - Junction::GeneralKey(..) | - Junction::OnlyChild => true, + Junction::Parachain { .. } + | Junction::AccountId32 { .. } + | Junction::AccountIndex64 { .. } + | Junction::AccountKey20 { .. } + | Junction::PalletInstance { .. } + | Junction::GeneralIndex { .. } + | Junction::GeneralKey(..) + | Junction::OnlyChild + | Junction::Plurality { .. } + => true, } } } From a9caeb6c9009f69b13b58f1151c61c96779bdd1a Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Thu, 8 Apr 2021 13:24:40 +0200 Subject: [PATCH 02/22] Add RelayedFrom --- xcm/src/v0/junction.rs | 4 +++- xcm/src/v0/mod.rs | 18 +++++++++++++++++- xcm/src/v0/multi_location.rs | 23 +++++++++++++++++++++++ xcm/xcm-executor/src/lib.rs | 8 ++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/xcm/src/v0/junction.rs b/xcm/src/v0/junction.rs index b5d5077fbfac..fd0104a48feb 100644 --- a/xcm/src/v0/junction.rs +++ b/xcm/src/v0/junction.rs @@ -128,7 +128,9 @@ pub enum Junction { } impl Junction { - pub fn is_sub_consensus(&self) -> bool { + /// Returns true if this junction can be considered an interior part of its context. This is generally `true`, + /// except for the `Parent` item. + pub fn is_interior(&self) -> bool { match self { Junction::Parent => false, diff --git a/xcm/src/v0/mod.rs b/xcm/src/v0/mod.rs index e2add5364253..3beb0ee98e87 100644 --- a/xcm/src/v0/mod.rs +++ b/xcm/src/v0/mod.rs @@ -227,6 +227,20 @@ pub enum Xcm { #[codec(compact)] sender: u32, #[codec(compact)] recipient: u32, }, + + /// A message to indicate that the embedded XCM is actually arriving on behalf of some consensus + /// location within the origin. + /// + /// Safety: No concerns. + /// + /// Kind: *Instruction* + /// + /// Errors: + #[codec(index = 10)] + RelayedFrom { + who: MultiLocation, + message: alloc::boxed::Box>, + }, } impl From> for VersionedXcm { @@ -268,7 +282,9 @@ impl Xcm { HrmpChannelClosing { initiator, sender, recipient} => HrmpChannelClosing { initiator, sender, recipient}, Transact { origin_type, require_weight_at_most, call} - => Transact { origin_type, require_weight_at_most, call: call.into() } + => Transact { origin_type, require_weight_at_most, call: call.into() }, + RelayedFrom { who, message } + => RelayedFrom { who, message: alloc::boxed::Box::new((*message).into()) }, } } } diff --git a/xcm/src/v0/multi_location.rs b/xcm/src/v0/multi_location.rs index f2ac7f891e58..2dd448c745bb 100644 --- a/xcm/src/v0/multi_location.rs +++ b/xcm/src/v0/multi_location.rs @@ -539,6 +539,23 @@ impl MultiLocation { } } + /// Mutate `self` so that it is suffixed with `prefix`. The correct normalised form is returned, removing any + /// internal `Parent`s. + /// + /// Does not modify `self` and returns `Err` with `prefix` in case of overflow. + pub fn append_with(&mut self, suffix: MultiLocation) -> Result<(), MultiLocation> { + let mut prefix = suffix; + core::mem::swap(self, &mut prefix); + match self.prepend_with(prefix) { + Ok(()) => Ok(()), + Err(prefix) => { + let mut suffix = prefix; + core::mem::swap(self, &mut suffix); + Err(suffix) + } + } + } + /// Mutate `self` so that it is prefixed with `prefix`. The correct normalised form is returned, removing any /// internal `Parent`s. /// @@ -566,6 +583,12 @@ impl MultiLocation { } Ok(()) } + + /// Returns true iff `self` is an interior location. For this it may not contain any `Junction`s for which + /// `Junction::is_interior` returns `false`. This + pub fn is_interior(&self) -> bool { + self.iter().all(Junction::is_interior) + } } impl From for VersionedMultiLocation { diff --git a/xcm/xcm-executor/src/lib.rs b/xcm/xcm-executor/src/lib.rs index 885b7a78c47f..143ab1113839 100644 --- a/xcm/xcm-executor/src/lib.rs +++ b/xcm/xcm-executor/src/lib.rs @@ -182,6 +182,14 @@ impl XcmExecutor { Config::ResponseHandler::on_response(origin, query_id, response); None } + (origin, Xcm::RelayedFrom { who, message }) => { + ensure!(who.is_interior(), XcmError::EscalationOfPrivilege); + let mut origin = origin; + origin.append_with(who).map_err(|_| XcmError::MultiLocationFull)?; + let surplus = Self::do_execute_xcm(origin, top_level, *message, weight_credit, None, trader)?; + total_surplus = total_surplus.saturating_add(surplus); + None + } _ => Err(XcmError::UnhandledXcmMessage)?, // Unhandled XCM message. }; From 944bf19cce63c90ac856ba1efb6aa14612531ea4 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 00:42:55 +0200 Subject: [PATCH 03/22] DMP dispatch weight handling. --- Cargo.lock | 2 + runtime/parachains/src/ump.rs | 57 +++++++++++++----------- runtime/rococo/Cargo.toml | 1 + runtime/rococo/src/lib.rs | 53 +++++++++++++++++++++- xcm/src/v0/junction.rs | 2 + xcm/src/v0/mod.rs | 2 +- xcm/src/v0/traits.rs | 2 + xcm/xcm-builder/Cargo.toml | 1 + xcm/xcm-builder/src/lib.rs | 2 +- xcm/xcm-builder/src/origin_conversion.rs | 55 ++++++++++++++++++++++- xcm/xcm-executor/src/lib.rs | 1 + 11 files changed, 147 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b5f9f3c923d7..c1ccb707da54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7292,6 +7292,7 @@ dependencies = [ "pallet-babe", "pallet-balances", "pallet-beefy", + "pallet-collective", "pallet-grandpa", "pallet-im-online", "pallet-indices", @@ -11333,6 +11334,7 @@ name = "xcm-builder" version = "0.8.30" dependencies = [ "frame-support", + "frame-system", "impl-trait-for-tuples", "parity-scale-codec", "polkadot-parachain", diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 5c40844af790..1c7ae61a605c 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -18,7 +18,7 @@ use crate::{ configuration::{self, HostConfiguration}, initializer, }; -use sp_std::{fmt, prelude::*}; +use sp_std::{prelude::*, fmt, marker::PhantomData}; use sp_std::collections::{btree_map::BTreeMap, vec_deque::VecDeque}; use sp_runtime::traits::Zero; use frame_support::{decl_module, decl_storage, StorageMap, StorageValue, weights::Weight, traits::Get}; @@ -45,36 +45,36 @@ pub trait UmpSink { /// Process an incoming upward message and return the amount of weight it consumed. /// /// See the trait docs for more details. - fn process_upward_message(origin: ParaId, msg: Vec) -> Weight; + fn process_upward_message(origin: ParaId, msg: &[u8], max_weight: Weight) -> Option; } /// An implementation of a sink that just swallows the message without consuming any weight. impl UmpSink for () { - fn process_upward_message(_: ParaId, _: Vec) -> Weight { - 0 + fn process_upward_message(_: ParaId, _: &[u8], _: Weight) -> Option { + None } } /// A specific implementation of a UmpSink where messages are in the XCM format /// and will be forwarded to the XCM Executor. -pub struct XcmSink(sp_std::marker::PhantomData); +pub struct XcmSink(PhantomData<(XcmExecutor, Call)>); -impl UmpSink for XcmSink { - fn process_upward_message(origin: ParaId, msg: Vec) -> Weight { +impl, Call> UmpSink for XcmSink { + fn process_upward_message(origin: ParaId, mut msg: &[u8], max_weight: Weight) -> Option { use parity_scale_codec::Decode; use xcm::VersionedXcm; - use xcm::v0::{Junction, MultiLocation, ExecuteXcm}; - use xcm_executor::XcmExecutor; + use xcm::v0::{Junction, MultiLocation, ExecuteXcm, Outcome, Error as XcmError}; - // TODO: #2841 #UMPQUEUE Get a proper weight limit here. Probably from Relay Chain Config - let weight_limit = Weight::max_value(); - let weight = if let Ok(versioned_xcm_message) = VersionedXcm::decode(&mut &msg[..]) { + if let Ok(versioned_xcm_message) = VersionedXcm::decode(&mut msg) { match versioned_xcm_message { VersionedXcm::V0(xcm_message) => { let xcm_junction: Junction = Junction::Parachain { id: origin.into() }; let xcm_location: MultiLocation = xcm_junction.into(); - let result = XcmExecutor::::execute_xcm(xcm_location, xcm_message, weight_limit); - result.weight_used() + match XcmExecutor::execute_xcm(xcm_location, xcm_message, max_weight) { + Outcome::Complete(w) | Outcome::Incomplete(w, _) => Some(w), + Outcome::Error(XcmError::WeightLimitReached) => None, + Outcome::Error(_) => Some(0), + } } } } else { @@ -82,13 +82,8 @@ impl UmpSink for XcmSink { target: LOG_TARGET, "Failed to decode versioned XCM from upward message.", ); - Weight::zero() - }; - - // TODO: #2841 #UMPQUEUE to be sound, this implementation must ensure that returned (and thus consumed) - // weight is limited to some small portion of the total block weight (as a ballpark, 1/4, 1/8 - // or lower). - weight + None + } } } @@ -337,12 +332,22 @@ impl Module { // if so - bail. break; } + let max_weight = if used_weight_so_far == 0 { + // we increase the amount of weight that we're allowed to use on the first message to try to prevent + // the possibility of blockage of the queue. + // TODO: This should be a parameter. + config.preferred_dispatchable_upward_messages_step_weight * 2 + } else { + config.preferred_dispatchable_upward_messages_step_weight - used_weight_so_far + }; // dequeue the next message from the queue of the dispatchee let (upward_message, became_empty) = queue_cache.dequeue::(dispatchee); if let Some(upward_message) = upward_message { - used_weight_so_far += - T::UmpSink::process_upward_message(dispatchee, upward_message); + match T::UmpSink::process_upward_message(dispatchee, &upward_message[..], max_weight) { + None => break, + Some(used) => used_weight_so_far += used, + } } if became_empty { @@ -555,7 +560,7 @@ pub(crate) mod mock_sink { pub struct MockUmpSink; impl UmpSink for MockUmpSink { - fn process_upward_message(actual_origin: ParaId, actual_msg: Vec) -> Weight { + fn process_upward_message(actual_origin: ParaId, actual_msg: &[u8], _max_weight: Weight) -> Option { HOOK.with(|opt_hook| match &mut *opt_hook.borrow_mut() { Some(hook) => { let UmpExpectation { @@ -572,8 +577,8 @@ pub(crate) mod mock_sink { } }; assert_eq!(expected_origin, actual_origin); - assert_eq!(expected_msg, actual_msg); - mock_weight + assert_eq!(expected_msg, &actual_msg[..]); + Some(mock_weight) } None => 0, }) diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index e7c4b5581ea5..45521c2b0908 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -36,6 +36,7 @@ pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-beefy = { git = "https://github.com/paritytech/grandpa-bridge-gadget", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index d194fd60d96a..99c7183e9a6f 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -81,6 +81,7 @@ pub use pallet_balances::Call as BalancesCall; use polkadot_parachain::primitives::Id as ParaId; use xcm::v0::{MultiLocation, NetworkId}; +use xcm_executor::XcmExecutor; use xcm_builder::{ AccountId32Aliases, ChildParachainConvertsVia, SovereignSignedViaLocation, CurrencyAdapter as XcmCurrencyAdapter, ChildParachainAsNative, @@ -621,6 +622,56 @@ parameter_types! { pub const RocFee: (MultiLocation, u128) = (RocLocation::get(), 1 * CENTS); } +// TODO repot into frame-support +pub struct Backing { + approvals: u32, + eligible: u32, +} +pub trait GetBacking { + fn get_backing(&self) -> Option; +} + +// TODO repot into pallet-collective +use xcm::v0::{BodyId, BodyPart}; +impl GetBacking for pallet_collective::RawOrigin { + fn get_backing(&self) -> Option { + match self { + pallet_collective::RawOrigin::Members(n, d) => Some(Backing { approvals: *n, eligible: *d }), + _ => None, + } + } +} + +// TODO repot into xcm-builder +use xcm::v0::Junction; +use sp_std::{marker::PhantomData, convert::TryInto}; +use xcm_executor::traits::Convert; +use frame_support::traits::{Get, OriginTrait}; +pub struct CollectiveToPlurality( + PhantomData<(Origin, COrigin, Body)> +); +impl< + Origin: OriginTrait + Clone, + COrigin: GetBacking, + Body: Get, +> Convert for CollectiveToPlurality where + Origin::PalletsOrigin: From + + TryInto +{ + fn convert(o: Origin) -> Result { + o.try_with_caller(|caller| match caller.try_into() { + Ok(co) => match co.get_backing() { + Some(backing) => Ok(Junction::Plurality { + id: Body::get(), + part: BodyPart::Fraction { nom: backing.approvals, denom: backing.eligible }, + }.into()), + None => Err(co.into()), + } + Err(other) => Err(other), + }) + } +} + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type Call = Call; @@ -639,7 +690,7 @@ impl xcm_executor::Config for XcmConfig { impl parachains_session_info::Config for Runtime {} impl parachains_ump::Config for Runtime { - type UmpSink = crate::parachains_ump::XcmSink; + type UmpSink = crate::parachains_ump::XcmSink, Call>; } impl parachains_dmp::Config for Runtime {} diff --git a/xcm/src/v0/junction.rs b/xcm/src/v0/junction.rs index fd0104a48feb..b066316e9d98 100644 --- a/xcm/src/v0/junction.rs +++ b/xcm/src/v0/junction.rs @@ -61,6 +61,8 @@ pub enum BodyPart { Voice, /// A given number of members of the body. Members { #[codec(compact)] count: u32 }, + /// A given number of members of the body, out of some larger caucus. + Fraction { #[codec(compact)] nom: u32, #[codec(compact)] denom: u32 }, /// No less than the given proportion of members of the body. AtLeastProportion { #[codec(compact)] nom: u32, #[codec(compact)] denom: u32 }, /// More than than the given proportion of members of the body. diff --git a/xcm/src/v0/mod.rs b/xcm/src/v0/mod.rs index 3beb0ee98e87..47a16e336f69 100644 --- a/xcm/src/v0/mod.rs +++ b/xcm/src/v0/mod.rs @@ -27,7 +27,7 @@ mod multi_asset; mod multi_location; mod order; mod traits; -pub use junction::{Junction, NetworkId}; +pub use junction::{Junction, NetworkId, BodyId, BodyPart}; pub use multi_asset::{MultiAsset, AssetInstance}; pub use multi_location::MultiLocation; pub use order::Order; diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs index 0a5092f3cc57..8ec7f1b4289f 100644 --- a/xcm/src/v0/traits.rs +++ b/xcm/src/v0/traits.rs @@ -121,10 +121,12 @@ impl Outcome { } pub trait ExecuteXcm { + type Call; fn execute_xcm(origin: MultiLocation, message: Xcm, weight_limit: Weight) -> Outcome; } impl ExecuteXcm for () { + type Call = C; fn execute_xcm(_origin: MultiLocation, _message: Xcm, _weight_limit: Weight) -> Outcome { Outcome::Error(Error::Unimplemented) } diff --git a/xcm/xcm-builder/Cargo.toml b/xcm/xcm-builder/Cargo.toml index d3a5316f61bf..f4306fbd6a4e 100644 --- a/xcm/xcm-builder/Cargo.toml +++ b/xcm/xcm-builder/Cargo.toml @@ -15,6 +15,7 @@ sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "mas sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } # Polkadot dependencies polkadot-parachain = { path = "../../parachain", default-features = false } diff --git a/xcm/xcm-builder/src/lib.rs b/xcm/xcm-builder/src/lib.rs index 5cfc7249fa9b..7620a617af47 100644 --- a/xcm/xcm-builder/src/lib.rs +++ b/xcm/xcm-builder/src/lib.rs @@ -31,7 +31,7 @@ mod origin_conversion; pub use origin_conversion::{ SovereignSignedViaLocation, ParentAsSuperuser, ChildSystemParachainAsSuperuser, SiblingSystemParachainAsSuperuser, ChildParachainAsNative, SiblingParachainAsNative, RelayChainAsNative, SignedAccountId32AsNative, - SignedAccountKey20AsNative, + SignedAccountKey20AsNative, EnsureXcmOrigin, SignedToAccountId32 }; mod barriers; diff --git a/xcm/xcm-builder/src/origin_conversion.rs b/xcm/xcm-builder/src/origin_conversion.rs index f7871b6bca76..e4d27018f152 100644 --- a/xcm/xcm-builder/src/origin_conversion.rs +++ b/xcm/xcm-builder/src/origin_conversion.rs @@ -14,11 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use sp_std::marker::PhantomData; -use frame_support::traits::{Get, OriginTrait}; +use sp_std::{marker::PhantomData, convert::TryInto}; +use frame_support::traits::{EnsureOrigin, Get, OriginTrait}; use xcm::v0::{MultiLocation, OriginKind, NetworkId, Junction}; use xcm_executor::traits::{Convert, ConvertOrigin}; use polkadot_parachain::primitives::IsSystem; +use frame_system::RawOrigin as SystemRawOrigin; /// Sovereign accounts use the system's `Signed` origin with an account ID derived from the /// `LocationConverter`. @@ -169,3 +170,53 @@ impl< } } } + +/// EnsureOrigin barrier to convert from dispatch origin to XCM origin, if one exists. +pub struct EnsureXcmOrigin(PhantomData<(Origin, Conversion)>); +impl< + Origin: OriginTrait + Clone, + Conversion: Convert, +> EnsureOrigin for EnsureXcmOrigin where + Origin::PalletsOrigin: PartialEq, +{ + type Success = MultiLocation; + fn try_origin(o: Origin) -> Result { + let o = match Conversion::convert(o) { + Ok(location) => return Ok(location), + Err(o) => o, + }; + // We institute a root fallback so root can always represent the context. This + // guarantees that `successful_origin` will work. + if o.caller() == Origin::root().caller() { + Ok(MultiLocation::Null) + } else { + Err(o) + } + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin() -> Origin { + Origin::root() + } +} + +pub struct SignedToAccountId32( + PhantomData<(Origin, AccountId, Network)> +); +impl< + Origin: OriginTrait + Clone, + AccountId: Into<[u8; 32]>, + Network: Get, +> Convert for SignedToAccountId32 where + Origin::PalletsOrigin: From> + + TryInto, Error=Origin::PalletsOrigin> +{ + fn convert(o: Origin) -> Result { + o.try_with_caller(|caller| match caller.try_into() { + Ok(SystemRawOrigin::Signed(who)) => + Ok(Junction::AccountId32 { network: Network::get(), id: who.into() }.into()), + Ok(other) => Err(other.into()), + Err(other) => Err(other), + }) + } +} diff --git a/xcm/xcm-executor/src/lib.rs b/xcm/xcm-executor/src/lib.rs index 143ab1113839..5c51341543b1 100644 --- a/xcm/xcm-executor/src/lib.rs +++ b/xcm/xcm-executor/src/lib.rs @@ -40,6 +40,7 @@ pub use config::Config; pub struct XcmExecutor(PhantomData); impl ExecuteXcm for XcmExecutor { + type Call = Config::Call; fn execute_xcm(origin: MultiLocation, message: Xcm, weight_limit: Weight) -> Outcome { // TODO: #2841 #HARDENXCM We should identify recursive bombs here and bail. let mut message = Xcm::::from(message); From 5f63df59281f70be1b5937ccfeff8e400746916a Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 12:45:58 +0200 Subject: [PATCH 04/22] Add pallet for XCM sending, add routing logic. --- Cargo.lock | 15 +++++ Cargo.toml | 1 + runtime/common/src/xcm_sender.rs | 27 ++++---- runtime/parachains/src/ump.rs | 3 +- runtime/rococo/Cargo.toml | 2 + runtime/rococo/src/lib.rs | 70 ++++++-------------- xcm/Cargo.toml | 1 + xcm/pallet-xcm/Cargo.toml | 28 ++++++++ xcm/pallet-xcm/src/lib.rs | 84 ++++++++++++++++++++++++ xcm/src/v0/traits.rs | 29 ++++++-- xcm/xcm-builder/src/origin_conversion.rs | 31 ++++++++- 11 files changed, 217 insertions(+), 74 deletions(-) create mode 100644 xcm/pallet-xcm/Cargo.toml create mode 100644 xcm/pallet-xcm/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6b2748712902..9f93aa06cbae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5046,6 +5046,19 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-xcm" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", + "xcm", +] + [[package]] name = "parity-db" version = "0.2.3" @@ -7334,6 +7347,7 @@ dependencies = [ "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-utility", + "pallet-xcm", "parity-scale-codec", "polkadot-parachain", "polkadot-primitives", @@ -11369,6 +11383,7 @@ name = "xcm" version = "0.8.30" dependencies = [ "derivative", + "impl-trait-for-tuples", "parity-scale-codec", ] diff --git a/Cargo.toml b/Cargo.toml index 65627b1fafce..f8914a160df7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "xcm", "xcm/xcm-builder", "xcm/xcm-executor", + "xcm/pallet-xcm", "node/collation-generation", "node/core/approval-voting", "node/core/av-store", diff --git a/runtime/common/src/xcm_sender.rs b/runtime/common/src/xcm_sender.rs index 84699d6b58b7..4ccd9074d87b 100644 --- a/runtime/common/src/xcm_sender.rs +++ b/runtime/common/src/xcm_sender.rs @@ -22,21 +22,22 @@ use xcm::opaque::{VersionedXcm, v0::{SendXcm, MultiLocation, Junction, Xcm, Resu use runtime_parachains::{configuration, dmp}; /// Xcm sender for relay chain. It only sends downward message. -pub struct RelayChainXcmSender(PhantomData); +pub struct ChildParachainRouter(PhantomData); -impl SendXcm for RelayChainXcmSender { +impl SendXcm for ChildParachainRouter { fn send_xcm(dest: MultiLocation, msg: Xcm) -> Result { - if let MultiLocation::X1(Junction::Parachain { id }) = dest { - // Downward message passing. - let config = >::config(); - >::queue_downward_message( - &config, - id.into(), - VersionedXcm::from(msg).encode(), - ).map_err(Into::::into)?; - Ok(()) - } else { - Err(Error::CannotReachDestination("UnsupportedDestination")) + match dest { + MultiLocation::X1(Junction::Parachain { id }) => { + // Downward message passing. + let config = >::config(); + >::queue_downward_message( + &config, + id.into(), + VersionedXcm::from(msg).encode(), + ).map_err(Into::::into)?; + Ok(()) + } + d => Err(Error::CannotReachDestination(d, msg)), } } } diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 1c7ae61a605c..8653a3e0191b 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -20,7 +20,6 @@ use crate::{ }; use sp_std::{prelude::*, fmt, marker::PhantomData}; use sp_std::collections::{btree_map::BTreeMap, vec_deque::VecDeque}; -use sp_runtime::traits::Zero; use frame_support::{decl_module, decl_storage, StorageMap, StorageValue, weights::Weight, traits::Get}; use primitives::v1::{Id as ParaId, UpwardMessage}; @@ -63,7 +62,7 @@ impl, Call> UmpSink for XcmSink Option { use parity_scale_codec::Decode; use xcm::VersionedXcm; - use xcm::v0::{Junction, MultiLocation, ExecuteXcm, Outcome, Error as XcmError}; + use xcm::v0::{Junction, MultiLocation, Outcome, Error as XcmError}; if let Ok(versioned_xcm_message) = VersionedXcm::decode(&mut msg) { match versioned_xcm_message { diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index 45521c2b0908..39d6bf5e535b 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -65,6 +65,7 @@ runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parac xcm = { package = "xcm", path = "../../xcm", default-features = false } xcm-executor = { package = "xcm-executor", path = "../../xcm/xcm-executor", default-features = false } xcm-builder = { package = "xcm-builder", path = "../../xcm/xcm-builder", default-features = false } +pallet-xcm = { path = "../../xcm/pallet-xcm", default-features = false } [build-dependencies] substrate-wasm-builder = "3.0.0" @@ -119,6 +120,7 @@ std = [ "xcm/std", "xcm-executor/std", "xcm-builder/std", + "pallet-xcm/std", "log/std", ] # When enabled, the runtime api will not be build. diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 89e287241257..c4cf5bf0b8ba 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -275,6 +275,9 @@ construct_runtime! { Utility: pallet_utility::{Pallet, Call, Event} = 90, Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 91, + + // Pallet for sending XCM. + XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event} = 99, } } @@ -620,60 +623,17 @@ parameter_types! { pub const RocFee: (MultiLocation, u128) = (RocLocation::get(), 1 * CENTS); } -// TODO repot into frame-support -pub struct Backing { - approvals: u32, - eligible: u32, -} -pub trait GetBacking { - fn get_backing(&self) -> Option; -} - -// TODO repot into pallet-collective -use xcm::v0::{BodyId, BodyPart}; -impl GetBacking for pallet_collective::RawOrigin { - fn get_backing(&self) -> Option { - match self { - pallet_collective::RawOrigin::Members(n, d) => Some(Backing { approvals: *n, eligible: *d }), - _ => None, - } - } -} - -// TODO repot into xcm-builder -use xcm::v0::Junction; -use sp_std::{marker::PhantomData, convert::TryInto}; -use xcm_executor::traits::Convert; -use frame_support::traits::{Get, OriginTrait}; -pub struct CollectiveToPlurality( - PhantomData<(Origin, COrigin, Body)> +/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our +/// individual routers. +pub type XcmRouter = ( + // Only one router so far - use DMP to communicate with child parachains. + xcm_sender::ChildParachainRouter, ); -impl< - Origin: OriginTrait + Clone, - COrigin: GetBacking, - Body: Get, -> Convert for CollectiveToPlurality where - Origin::PalletsOrigin: From + - TryInto -{ - fn convert(o: Origin) -> Result { - o.try_with_caller(|caller| match caller.try_into() { - Ok(co) => match co.get_backing() { - Some(backing) => Ok(Junction::Plurality { - id: Body::get(), - part: BodyPart::Fraction { nom: backing.approvals, denom: backing.eligible }, - }.into()), - None => Err(co.into()), - } - Err(other) => Err(other), - }) - } -} pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type Call = Call; - type XcmSender = xcm_sender::RelayChainXcmSender; + type XcmSender = XcmRouter; type AssetTransactor = LocalAssetTransactor; type OriginConverter = LocalOriginConverter; type IsReserve = (); @@ -685,6 +645,18 @@ impl xcm_executor::Config for XcmConfig { type ResponseHandler = (); } +/// Type to convert an `Origin` type value into a `MultiLocation` value which represents an interior location +/// of this chain. +// TODO: Instance a membership collective pallet and use it with BackingToPlurality. +pub type LocalOriginToLocation = ( +); + +impl pallet_xcm::Config for Runtime { + type Event = Event; + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmRouter = XcmRouter; +} + impl parachains_session_info::Config for Runtime {} impl parachains_ump::Config for Runtime { diff --git a/xcm/Cargo.toml b/xcm/Cargo.toml index 660c29476b7c..2f3e8de4e675 100644 --- a/xcm/Cargo.toml +++ b/xcm/Cargo.toml @@ -6,6 +6,7 @@ description = "The basic XCM datastructures." edition = "2018" [dependencies] +impl-trait-for-tuples = "0.2.0" parity-scale-codec = { version = "2.0.0", default-features = false, features = [ "derive" ] } derivative = {version = "2.2.0", default-features = false, features = [ "use_core" ] } diff --git a/xcm/pallet-xcm/Cargo.toml b/xcm/pallet-xcm/Cargo.toml new file mode 100644 index 000000000000..eb9eeac805a6 --- /dev/null +++ b/xcm/pallet-xcm/Cargo.toml @@ -0,0 +1,28 @@ +[package] +authors = ["Parity Technologies "] +edition = "2018" +name = "pallet-xcm" +version = "0.1.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.101", optional = true, features = ["derive"] } + +sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } +frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } + +xcm = { path = "..", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "serde", + "sp-std/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "xcm/std", +] diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs new file mode 100644 index 000000000000..74a1e8c34fae --- /dev/null +++ b/xcm/pallet-xcm/src/lib.rs @@ -0,0 +1,84 @@ +// Copyright 2020-2021 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus 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. + +// Cumulus 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 Cumulus. If not, see . + +//! Pallet to handle XCM messages. + +#![cfg_attr(not(feature = "std"), no_std)] + +use sp_std::prelude::*; +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + use xcm::v0::{Xcm, MultiLocation, Error as XcmError, SendXcm}; + use super::*; + + #[pallet::pallet] + #[pallet::generate_store(pub(super) trait Store)] + pub struct Pallet(_); + + #[pallet::config] + /// The module configuration trait. + pub trait Config: frame_system::Config { + /// The overarching event type. + type Event: From> + IsType<::Event>; + + /// Required origin for sending XCM messages. If successful, the it resolves to `MultiLocation` + /// which exists as an interior location within this chain's XCM context. + type SendXcmOrigin: EnsureOrigin; + + /// The type used to actually dispatch an XCM to its destination. + type XcmRouter: SendXcm; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + #[pallet::metadata(T::AccountId = "AccountId", BalanceOf = "Balance", AssetIdOf = "AssetId")] + pub enum Event {} + + #[pallet::error] + pub enum Error { + FailedToSend, + } + + #[pallet::hooks] + impl Hooks> for Pallet {} + + #[pallet::call] + impl Pallet { + #[pallet::weight(1_000)] + fn send(origin: OriginFor, dest: MultiLocation, message: Xcm<()>) -> DispatchResult { + let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; + Self::send_xcm(origin_location, dest, message) + .map_err(|_| Error::::FailedToSend)?; + Ok(()) + } + } + + impl Pallet { + /// Relay an XCM `message` from a given `interior` location in this context to a given `dest` + /// location. A null `dest` is not handled. + pub fn send_xcm(interior: MultiLocation, dest: MultiLocation, message: Xcm<()>) -> Result<(), XcmError> { + let message = match interior { + MultiLocation::Null => message, + who => Xcm::<()>::RelayedFrom { who, message: sp_std::boxed::Box::new(message) }, + }; + T::XcmRouter::send_xcm(dest, message) + } + } +} diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs index 8ec7f1b4289f..4a8cbf2d263f 100644 --- a/xcm/src/v0/traits.rs +++ b/xcm/src/v0/traits.rs @@ -21,7 +21,7 @@ use parity_scale_codec::{Encode, Decode}; use super::{MultiLocation, Xcm}; -#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] pub enum Error { Undefined, Overflow, @@ -33,7 +33,7 @@ pub enum Error { UntrustedReserveLocation, UntrustedTeleportLocation, DestinationBufferOverflow, - CannotReachDestination(#[codec(skip)] &'static str), + CannotReachDestination(MultiLocation, Xcm<()>), MultiLocationFull, FailedToDecode, BadOrigin, @@ -85,7 +85,7 @@ pub type Result = result::Result<(), Error>; pub type Weight = u64; /// Outcome of an XCM excution. -#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug)] pub enum Outcome { /// Execution completed successfully; given weight was used. Complete(Weight), @@ -132,12 +132,27 @@ impl ExecuteXcm for () { } } +/// Utility for sending an XCM message. +/// +/// These can be amalgamted in tuples to form sophisticated routing systems. pub trait SendXcm { - fn send_xcm(dest: MultiLocation, msg: Xcm<()>) -> Result; + /// Send an XCM `message` to a given `destination`. + /// + /// If it is not a destination which can be reached with this type but possibly could by others, + /// then it *MUST* return `CannotReachDestination`. Any other error will cause the tuple implementation to + /// exit early without trying other type fields. + fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result; } -impl SendXcm for () { - fn send_xcm(_dest: MultiLocation, _msg: Xcm<()>) -> Result { - Err(Error::Unimplemented) +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl SendXcm for Tuple { + fn send_xcm(destination: MultiLocation, message: Xcm<()>) -> Result { + for_tuples!( #( + let (destination, message) = match Tuple::send_xcm(destination, message) { + Err(Error::CannotReachDestination(d, m)) => (d, m), + o @ _ => return o, + }; + )* ); + Err(Error::CannotReachDestination(destination, message)) } } diff --git a/xcm/xcm-builder/src/origin_conversion.rs b/xcm/xcm-builder/src/origin_conversion.rs index e4d27018f152..519d1fd5eeb0 100644 --- a/xcm/xcm-builder/src/origin_conversion.rs +++ b/xcm/xcm-builder/src/origin_conversion.rs @@ -15,11 +15,11 @@ // along with Polkadot. If not, see . use sp_std::{marker::PhantomData, convert::TryInto}; -use frame_support::traits::{EnsureOrigin, Get, OriginTrait}; -use xcm::v0::{MultiLocation, OriginKind, NetworkId, Junction}; +use xcm::v0::{MultiLocation, OriginKind, NetworkId, Junction, BodyId, BodyPart}; use xcm_executor::traits::{Convert, ConvertOrigin}; -use polkadot_parachain::primitives::IsSystem; +use frame_support::traits::{EnsureOrigin, Get, OriginTrait, GetBacking}; use frame_system::RawOrigin as SystemRawOrigin; +use polkadot_parachain::primitives::IsSystem; /// Sovereign accounts use the system's `Signed` origin with an account ID derived from the /// `LocationConverter`. @@ -220,3 +220,28 @@ impl< }) } } + +pub struct BackingToPlurality( + PhantomData<(Origin, COrigin, Body)> +); +impl< + Origin: OriginTrait + Clone, + COrigin: GetBacking, + Body: Get, +> Convert for BackingToPlurality where + Origin::PalletsOrigin: From + + TryInto +{ + fn convert(o: Origin) -> Result { + o.try_with_caller(|caller| match caller.try_into() { + Ok(co) => match co.get_backing() { + Some(backing) => Ok(Junction::Plurality { + id: Body::get(), + part: BodyPart::Fraction { nom: backing.approvals, denom: backing.eligible }, + }.into()), + None => Err(co.into()), + } + Err(other) => Err(other), + }) + } +} From ce2c616c248346aad1fb39271c5ba75c41ce03a3 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 13:14:23 +0200 Subject: [PATCH 05/22] Update error types & doc --- xcm/src/v0/traits.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs index 4a8cbf2d263f..b4601023555a 100644 --- a/xcm/src/v0/traits.rs +++ b/xcm/src/v0/traits.rs @@ -33,6 +33,10 @@ pub enum Error { UntrustedReserveLocation, UntrustedTeleportLocation, DestinationBufferOverflow, + /// The message and destination was recognised as being reachable but the operation could not be completed. + /// A human-readable explanation of the specific issue is provided. + SendFailed(#[codec(skip)] &'static str), + /// The message and destination combination was not recognised as being reachable. CannotReachDestination(MultiLocation, Xcm<()>), MultiLocationFull, FailedToDecode, @@ -68,9 +72,6 @@ pub enum Error { NotWithdrawable, /// Indicates that the consensus system cannot deposit an asset under the ownership of a particular location. LocationCannotHold, - /// We attempted to send an XCM to the local consensus system. Execution was not possible probably due to - /// no execution weight being assigned. - DestinationIsLocal, } impl From<()> for Error { From 79e9c9643cae8073f0db2cba64a6c70337f52ba1 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 13:22:06 +0200 Subject: [PATCH 06/22] Fix warnings. --- xcm/pallet-xcm/src/lib.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 74a1e8c34fae..576206a82af9 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -18,7 +18,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::prelude::*; pub use pallet::*; #[frame_support::pallet] @@ -26,7 +25,6 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use xcm::v0::{Xcm, MultiLocation, Error as XcmError, SendXcm}; - use super::*; #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] @@ -47,13 +45,12 @@ pub mod pallet { } #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - #[pallet::metadata(T::AccountId = "AccountId", BalanceOf = "Balance", AssetIdOf = "AssetId")] pub enum Event {} #[pallet::error] pub enum Error { - FailedToSend, + Unreachable, + SendFailure, } #[pallet::hooks] @@ -65,7 +62,10 @@ pub mod pallet { fn send(origin: OriginFor, dest: MultiLocation, message: Xcm<()>) -> DispatchResult { let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; Self::send_xcm(origin_location, dest, message) - .map_err(|_| Error::::FailedToSend)?; + .map_err(|e| match e { + XcmError::CannotReachDestination(..) => Error::::Unreachable, + _ => Error::::SendFailure, + })?; Ok(()) } } From fb7f45ae2de03599ddc606be08e82992abb5f5e6 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 17:02:55 +0200 Subject: [PATCH 07/22] Fixes --- xcm/pallet-xcm/src/lib.rs | 98 ++++++++++++++++++++++++++++++++++++++- xcm/src/v0/junction.rs | 12 +++++ 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 576206a82af9..52fd6e8d925a 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -18,13 +18,19 @@ #![cfg_attr(not(feature = "std"), no_std)] +use sp_std::{marker::PhantomData, convert::TryInto}; +use codec::{Encode, Decode}; +use xcm::v0::{BodyId, MultiLocation::{self, X1}, Junction::Plurality}; +use sp_runtime::{RuntimeDebug, traits::BadOrigin}; +use frame_support::traits::{EnsureOrigin, OriginTrait, Filter, Get}; + pub use pallet::*; #[frame_support::pallet] pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use xcm::v0::{Xcm, MultiLocation, Error as XcmError, SendXcm}; + use xcm::v0::{Xcm, MultiLocation, Error as XcmError, SendXcm, ExecuteXcm}; #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] @@ -42,10 +48,20 @@ pub mod pallet { /// The type used to actually dispatch an XCM to its destination. type XcmRouter: SendXcm; + + /// Required origin for executing XCM messages. If successful, the it resolves to `MultiLocation` + /// which exists as an interior location within this chain's XCM context. + type ExecuteXcmOrigin: EnsureOrigin; + + /// Something to execute an XCM message. + type XcmExecutor: ExecuteXcm; } #[pallet::event] - pub enum Event {} + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + Attempted(xcm::v0::Outcome), + } #[pallet::error] pub enum Error { @@ -68,6 +84,30 @@ pub mod pallet { })?; Ok(()) } + + /// Execute an XCM message from a local, signed, origin. + /// + /// Returns `DispatchError` if execution was not possible. Otherwise returns the amount of + /// weight that was used in its attempted execution. + /// + /// An event is deposited indicating whether `msg` could be executed completely or only + /// partially. + /// + /// No more than `max_weight` will be used in its attempted execution. If this is less than the + /// maximum amount of weight that the message could take to be executed, then no execution + /// attempt will be made. + /// + /// NOTE: A successful return to this does *not* imply that the `msg` was executed successfully + /// to completion; only that *some* of it was executed. + #[pallet::weight(1_000 + max_weight)] + fn execute(origin: OriginFor, message: Xcm, max_weight: Weight) + -> DispatchResult + { + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + let outcome = T::XcmExecutor::execute_xcm(origin_location, message, max_weight); + Self::deposit_event(Event::Attempted(outcome)); + Ok(()) + } } impl Pallet { @@ -82,3 +122,57 @@ pub mod pallet { } } } + +/// Origin for the parachains module. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] +pub enum Origin { + /// It comes from somewhere in the XCM space. + Xcm(MultiLocation), +} + +impl From for Origin { + fn from(location: MultiLocation) -> Origin { + Origin::Xcm(location) + } +} + +/// Ensure that the origin `o` represents a sibling parachain. +/// Returns `Ok` with the parachain ID of the sibling or an `Err` otherwise. +pub fn ensure_xcm(o: OuterOrigin) -> Result + where OuterOrigin: Into> +{ + match o.into() { + Ok(Origin::Xcm(location)) => Ok(location), + _ => Err(BadOrigin), + } +} + +pub struct IsMajorityOfBody(PhantomData); +impl> Filter for IsMajorityOfBody { + fn filter(l: &MultiLocation) -> bool { + matches!(l, X1(Plurality { id, part }) if id == &Body::get() && part.is_majority()) + } +} + +pub struct EnsureXcm(PhantomData); +impl> EnsureOrigin for EnsureXcm + where O::PalletsOrigin: From + TryInto +{ + type Success = MultiLocation; + + fn try_origin(outer: O) -> Result { + outer.try_with_caller(|caller| caller.try_into() + .and_then(|Origin::Xcm(location)| + if F::filter(&location) { + Ok(location) + } else { + Err(Origin::Xcm(location).into()) + } + )) + } + + #[cfg(feature = "runtime-benchmarks")] + fn successful_origin() -> O { + Origin::Xcm(MultiLocation::Null).into() + } +} diff --git a/xcm/src/v0/junction.rs b/xcm/src/v0/junction.rs index b066316e9d98..1cde3cf86430 100644 --- a/xcm/src/v0/junction.rs +++ b/xcm/src/v0/junction.rs @@ -69,6 +69,18 @@ pub enum BodyPart { MoreThanProportion { #[codec(compact)] nom: u32, #[codec(compact)] denom: u32 }, } +impl BodyPart { + /// Returns `true` if the part represents a strict majority (> 50%) of the body in question. + pub fn is_majority(&self) -> bool { + match self { + BodyPart::Fraction { nom, denom } if *nom * 2 > *denom => true, + BodyPart::AtLeastProportion { nom, denom } if *nom * 2 > *denom => true, + BodyPart::MoreThanProportion { nom, denom } if *nom * 2 >= *denom => true, + _ => false, + } + } +} + /// A single item in a path to describe the relative location of a consensus system. /// /// Each item assumes a pre-existing location as its context and is defined in terms of it. From c41105ba8148fd4b455371dacf86b880dddd7657 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 17:41:55 +0200 Subject: [PATCH 08/22] Fixes --- runtime/rococo/src/lib.rs | 3 +++ xcm/pallet-xcm/src/lib.rs | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index c4cf5bf0b8ba..8b709a680e2d 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -655,6 +655,9 @@ impl pallet_xcm::Config for Runtime { type Event = Event; type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; type XcmRouter = XcmRouter; + // Right now nobody but root is allowed to dispatch local XCM messages. + type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmExecutor = XcmExecutor; } impl parachains_session_info::Config for Runtime {} diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 52fd6e8d925a..9f6a0ddb0d1e 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -18,7 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::{marker::PhantomData, convert::TryInto}; +use sp_std::{marker::PhantomData, convert::TryInto, boxed::Box}; use codec::{Encode, Decode}; use xcm::v0::{BodyId, MultiLocation::{self, X1}, Junction::Plurality}; use sp_runtime::{RuntimeDebug, traits::BadOrigin}; @@ -28,6 +28,7 @@ pub use pallet::*; #[frame_support::pallet] pub mod pallet { + use super::*; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use xcm::v0::{Xcm, MultiLocation, Error as XcmError, SendXcm, ExecuteXcm}; @@ -100,11 +101,11 @@ pub mod pallet { /// NOTE: A successful return to this does *not* imply that the `msg` was executed successfully /// to completion; only that *some* of it was executed. #[pallet::weight(1_000 + max_weight)] - fn execute(origin: OriginFor, message: Xcm, max_weight: Weight) + fn execute(origin: OriginFor, message: Box>, max_weight: Weight) -> DispatchResult { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; - let outcome = T::XcmExecutor::execute_xcm(origin_location, message, max_weight); + let outcome = T::XcmExecutor::execute_xcm(origin_location, *message, max_weight); Self::deposit_event(Event::Attempted(outcome)); Ok(()) } @@ -116,7 +117,7 @@ pub mod pallet { pub fn send_xcm(interior: MultiLocation, dest: MultiLocation, message: Xcm<()>) -> Result<(), XcmError> { let message = match interior { MultiLocation::Null => message, - who => Xcm::<()>::RelayedFrom { who, message: sp_std::boxed::Box::new(message) }, + who => Xcm::<()>::RelayedFrom { who, message: Box::new(message) }, }; T::XcmRouter::send_xcm(dest, message) } From 0c3088a205802833c367075529f4fb60dcf025ab Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 18:12:50 +0200 Subject: [PATCH 09/22] Fixes --- runtime/parachains/src/ump.rs | 2 +- runtime/rococo/Cargo.toml | 1 + xcm/pallet-xcm/Cargo.toml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 8653a3e0191b..8dfd7a89069b 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -579,7 +579,7 @@ pub(crate) mod mock_sink { assert_eq!(expected_msg, &actual_msg[..]); Some(mock_weight) } - None => 0, + None => None, }) } } diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index 39d6bf5e535b..508d69673ac6 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -141,6 +141,7 @@ runtime-benchmarks = [ "pallet-indices/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", ] try-runtime = [ "frame-executive/try-runtime", diff --git a/xcm/pallet-xcm/Cargo.toml b/xcm/pallet-xcm/Cargo.toml index eb9eeac805a6..c0448c312c62 100644 --- a/xcm/pallet-xcm/Cargo.toml +++ b/xcm/pallet-xcm/Cargo.toml @@ -26,3 +26,4 @@ std = [ "frame-system/std", "xcm/std", ] +runtime-benchmarks = [] \ No newline at end of file From f2843ae01a2dd4ca2f7ed23cc617ddc4ed8886bb Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 18:18:42 +0200 Subject: [PATCH 10/22] Bump Substrate --- Cargo.lock | 299 +++++++++++++++++++++++++++-------------------------- 1 file changed, 150 insertions(+), 149 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9f93aa06cbae..82bb3111d398 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1784,7 +1784,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", ] @@ -1802,7 +1802,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "3.1.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -1821,7 +1821,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "Inflector", "chrono", @@ -1844,7 +1844,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -1857,7 +1857,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -1873,7 +1873,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "13.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "serde", @@ -1884,7 +1884,7 @@ dependencies = [ [[package]] name = "frame-support" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "bitflags", "frame-metadata", @@ -1910,7 +1910,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -1922,7 +1922,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate 1.0.0", @@ -1934,7 +1934,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro2", "quote", @@ -1944,7 +1944,7 @@ dependencies = [ [[package]] name = "frame-support-test" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-metadata", "frame-support", @@ -1965,7 +1965,7 @@ dependencies = [ [[package]] name = "frame-system" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "impl-trait-for-tuples", @@ -1982,7 +1982,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -1996,7 +1996,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-api", @@ -2005,7 +2005,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "parity-scale-codec", @@ -4387,7 +4387,7 @@ checksum = "13370dae44474229701bb69b90b4f4dca6404cb0357a2d50d635f1171dc3aa7b" [[package]] name = "pallet-authority-discovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4403,7 +4403,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4418,7 +4418,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4442,7 +4442,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4472,7 +4472,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4487,7 +4487,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4504,7 +4504,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4519,7 +4519,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4540,7 +4540,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4556,7 +4556,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4578,7 +4578,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4594,7 +4594,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4614,7 +4614,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4631,7 +4631,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4645,7 +4645,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "ckb-merkle-mountain-range", "frame-benchmarking", @@ -4663,7 +4663,7 @@ dependencies = [ [[package]] name = "pallet-mmr-primitives" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4679,7 +4679,7 @@ dependencies = [ [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4697,7 +4697,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4713,7 +4713,7 @@ dependencies = [ [[package]] name = "pallet-nicks" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4727,7 +4727,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4743,7 +4743,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4765,7 +4765,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4781,7 +4781,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4794,7 +4794,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "enumflags2", "frame-support", @@ -4809,7 +4809,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4825,7 +4825,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4845,7 +4845,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4861,7 +4861,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4875,7 +4875,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -4899,7 +4899,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2", @@ -4910,7 +4910,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4924,7 +4924,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4943,7 +4943,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-support", "frame-system", @@ -4974,7 +4974,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4991,7 +4991,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -5002,7 +5002,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -5018,7 +5018,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-benchmarking", "frame-support", @@ -5034,7 +5034,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -7241,7 +7241,7 @@ dependencies = [ [[package]] name = "remote-externalities" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "env_logger 0.8.2", "hex-literal", @@ -7526,7 +7526,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "derive_more", @@ -7554,7 +7554,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "futures-timer 3.0.2", @@ -7577,7 +7577,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -7593,7 +7593,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7614,7 +7614,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2", @@ -7625,7 +7625,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "chrono", "fdlimit", @@ -7663,7 +7663,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "fnv", @@ -7697,7 +7697,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "blake2-rfc", "hash-db", @@ -7727,7 +7727,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parking_lot 0.11.1", "sc-client-api", @@ -7739,7 +7739,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "derive_more", @@ -7786,7 +7786,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "futures 0.3.13", @@ -7810,7 +7810,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "fork-tree", "parity-scale-codec", @@ -7823,7 +7823,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "futures 0.3.13", @@ -7850,7 +7850,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "sc-client-api", @@ -7864,7 +7864,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "lazy_static", @@ -7894,7 +7894,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "parity-scale-codec", @@ -7911,7 +7911,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "parity-scale-codec", @@ -7926,7 +7926,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "parity-scale-codec", @@ -7944,7 +7944,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "derive_more", @@ -7984,7 +7984,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "finality-grandpa", @@ -8008,7 +8008,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-warp-sync" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "futures 0.3.13", @@ -8029,7 +8029,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "ansi_term 0.12.1", "futures 0.3.13", @@ -8047,7 +8047,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "derive_more", @@ -8067,7 +8067,7 @@ dependencies = [ [[package]] name = "sc-light" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "hash-db", "lazy_static", @@ -8086,7 +8086,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-std", "async-trait", @@ -8139,7 +8139,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "futures-timer 3.0.2", @@ -8156,7 +8156,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "bytes 0.5.6", "fnv", @@ -8184,7 +8184,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "libp2p", @@ -8197,7 +8197,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -8206,7 +8206,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "hash-db", @@ -8240,7 +8240,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "futures 0.3.13", @@ -8264,7 +8264,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.1.29", "jsonrpc-core", @@ -8282,7 +8282,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "directories", @@ -8346,7 +8346,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "parity-scale-codec", @@ -8361,7 +8361,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -8381,7 +8381,7 @@ dependencies = [ [[package]] name = "sc-telemetry" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "chrono", "futures 0.3.13", @@ -8401,7 +8401,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "ansi_term 0.12.1", "atty", @@ -8428,7 +8428,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2", @@ -8439,7 +8439,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "futures 0.3.13", @@ -8461,7 +8461,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "futures-diagnose", @@ -8882,7 +8882,7 @@ dependencies = [ [[package]] name = "sp-allocator" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "sp-core", @@ -8894,7 +8894,7 @@ dependencies = [ [[package]] name = "sp-api" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "hash-db", "log", @@ -8911,7 +8911,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "blake2-rfc", "proc-macro-crate 1.0.0", @@ -8923,7 +8923,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "serde", @@ -8935,7 +8935,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "integer-sqrt", "num-traits", @@ -8943,12 +8943,13 @@ dependencies = [ "serde", "sp-debug-derive", "sp-std", + "static_assertions", ] [[package]] name = "sp-authority-discovery" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-api", @@ -8960,7 +8961,7 @@ dependencies = [ [[package]] name = "sp-authorship" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -8971,7 +8972,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-api", @@ -8983,7 +8984,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "log", @@ -9001,7 +9002,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "serde", "serde_json", @@ -9010,7 +9011,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "futures 0.3.13", @@ -9037,7 +9038,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "merlin", "parity-scale-codec", @@ -9058,7 +9059,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-arithmetic", @@ -9068,7 +9069,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -9080,7 +9081,7 @@ dependencies = [ [[package]] name = "sp-core" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "base58", "blake2-rfc", @@ -9124,7 +9125,7 @@ dependencies = [ [[package]] name = "sp-database" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "kvdb", "parking_lot 0.11.1", @@ -9133,7 +9134,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro2", "quote", @@ -9143,7 +9144,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "environmental", "parity-scale-codec", @@ -9154,7 +9155,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "finality-grandpa", "log", @@ -9171,7 +9172,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", @@ -9183,7 +9184,7 @@ dependencies = [ [[package]] name = "sp-io" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "hash-db", @@ -9207,7 +9208,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "lazy_static", "sp-core", @@ -9218,7 +9219,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "derive_more", @@ -9235,7 +9236,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "ruzstd", "zstd", @@ -9244,7 +9245,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "serde", @@ -9257,7 +9258,7 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2", @@ -9268,7 +9269,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "sp-api", "sp-core", @@ -9278,7 +9279,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "backtrace", ] @@ -9286,7 +9287,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "serde", "sp-core", @@ -9295,7 +9296,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "either", "hash256-std-hasher", @@ -9316,7 +9317,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9333,7 +9334,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "Inflector", "proc-macro-crate 1.0.0", @@ -9345,7 +9346,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "serde", "serde_json", @@ -9354,7 +9355,7 @@ dependencies = [ [[package]] name = "sp-session" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-api", @@ -9367,7 +9368,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -9377,7 +9378,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "hash-db", "log", @@ -9399,12 +9400,12 @@ dependencies = [ [[package]] name = "sp-std" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" [[package]] name = "sp-storage" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "impl-serde", "parity-scale-codec", @@ -9417,7 +9418,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "sp-core", @@ -9430,7 +9431,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "parity-scale-codec", "sp-api", @@ -9443,7 +9444,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "log", "parity-scale-codec", @@ -9456,7 +9457,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "derive_more", "futures 0.3.13", @@ -9472,7 +9473,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "hash-db", "memory-db", @@ -9486,7 +9487,7 @@ dependencies = [ [[package]] name = "sp-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "futures-core", @@ -9498,7 +9499,7 @@ dependencies = [ [[package]] name = "sp-version" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "impl-serde", "parity-scale-codec", @@ -9510,7 +9511,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -9667,7 +9668,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "chrono", "console_error_panic_hook", @@ -9693,7 +9694,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "platforms", ] @@ -9701,7 +9702,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.13", @@ -9724,7 +9725,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-std", "derive_more", @@ -9738,7 +9739,7 @@ dependencies = [ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "async-trait", "futures 0.1.29", @@ -9767,7 +9768,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "futures 0.3.13", "substrate-test-utils-derive", @@ -9777,7 +9778,7 @@ dependencies = [ [[package]] name = "substrate-test-utils-derive" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "proc-macro-crate 1.0.0", "quote", @@ -10519,7 +10520,7 @@ checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "try-runtime-cli" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#35b74db34833c7e9787f33e700a8db32982e9e18" +source = "git+https://github.com/paritytech/substrate#2425d14121a6988804a2c299477d7df32498f2d8" dependencies = [ "frame-try-runtime", "log", From 356376648a5badaefefd3c67e47462d1052444cc Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 18:34:26 +0200 Subject: [PATCH 11/22] Fixes --- runtime/parachains/src/mock.rs | 6 ++++++ runtime/parachains/src/ump.rs | 14 +++++++++----- runtime/rococo/src/lib.rs | 5 +++++ runtime/test-runtime/src/lib.rs | 5 +++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index 68a47718733e..c3f26dd94f40 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -30,6 +30,7 @@ use crate::{ inclusion, scheduler, dmp, ump, hrmp, session_info, paras, configuration, initializer, shared, }; +use frame_benchmarking::frame_support::pallet_prelude::Get; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; @@ -117,8 +118,13 @@ impl crate::paras::Config for Test { impl crate::dmp::Config for Test { } +parameter_types! { + const FirstMessageFactorPercent: u64 = 100; +} + impl crate::ump::Config for Test { type UmpSink = crate::ump::mock_sink::MockUmpSink; + type FirstMessageFactorPercent = FirstMessageFactorPercent; } impl crate::hrmp::Config for Test { diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 8dfd7a89069b..4e072cbbe11d 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -41,16 +41,18 @@ const LOG_TARGET: &str = "runtime::ump-sink"; /// It is possible that by the time the message is sank the origin parachain was offboarded. It is /// up to the implementer to check that if it cares. pub trait UmpSink { - /// Process an incoming upward message and return the amount of weight it consumed. + /// Process an incoming upward message and return the amount of weight it consumed, or `None` if + /// it did not begin processing a message since it would otherwise exceed `max_weight`. /// /// See the trait docs for more details. fn process_upward_message(origin: ParaId, msg: &[u8], max_weight: Weight) -> Option; } -/// An implementation of a sink that just swallows the message without consuming any weight. +/// An implementation of a sink that just swallows the message without consuming any weight. Returns +/// `Some(0)` indicating that no messages existed for it to process. impl UmpSink for () { fn process_upward_message(_: ParaId, _: &[u8], _: Weight) -> Option { - None + Some(0) } } @@ -142,6 +144,9 @@ impl fmt::Debug for AcceptanceCheckErr { pub trait Config: frame_system::Config + configuration::Config { /// A place where all received upward messages are funneled. type UmpSink: UmpSink; + + /// The factor by which the weight limit it multiplied for the first UMP message to execute with. + type FirstMessageFactorPercent: Get; } decl_storage! { @@ -334,8 +339,7 @@ impl Module { let max_weight = if used_weight_so_far == 0 { // we increase the amount of weight that we're allowed to use on the first message to try to prevent // the possibility of blockage of the queue. - // TODO: This should be a parameter. - config.preferred_dispatchable_upward_messages_step_weight * 2 + config.preferred_dispatchable_upward_messages_step_weight * T::FirstMessageFactorPercent::get() / 100 } else { config.preferred_dispatchable_upward_messages_step_weight - used_weight_so_far }; diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 8b709a680e2d..881943e2f50a 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -662,8 +662,13 @@ impl pallet_xcm::Config for Runtime { impl parachains_session_info::Config for Runtime {} +parameter_types! { + const FirstMessageFactorPercent: u64 = 100; +} + impl parachains_ump::Config for Runtime { type UmpSink = crate::parachains_ump::XcmSink, Call>; + type FirstMessageFactorPercent = FirstMessageFactorPercent; } impl parachains_dmp::Config for Runtime {} diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index 63f6cfae58e8..fa4a0bfed5fe 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -474,8 +474,13 @@ impl parachains_paras::Config for Runtime { impl parachains_dmp::Config for Runtime {} +parameter_types! { + const FirstMessageFactorPercent: u64 = 100; +} + impl parachains_ump::Config for Runtime { type UmpSink = (); + type FirstMessageFactorPercent = FirstMessageFactorPercent; } impl parachains_hrmp::Config for Runtime { From 214a0adbe19d85956ef4e0fe07393901fb894c6b Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 18:37:09 +0200 Subject: [PATCH 12/22] Docs --- runtime/rococo/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 881943e2f50a..c5b0696ca489 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -647,7 +647,6 @@ impl xcm_executor::Config for XcmConfig { /// Type to convert an `Origin` type value into a `MultiLocation` value which represents an interior location /// of this chain. -// TODO: Instance a membership collective pallet and use it with BackingToPlurality. pub type LocalOriginToLocation = ( ); From f0de65a13352946194c6fb3aeda425f0159a6f05 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 18:44:30 +0200 Subject: [PATCH 13/22] Docs --- xcm/pallet-xcm/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 9f6a0ddb0d1e..58e1880bd304 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -148,6 +148,10 @@ pub fn ensure_xcm(o: OuterOrigin) -> Result(PhantomData); impl> Filter for IsMajorityOfBody { fn filter(l: &MultiLocation) -> bool { @@ -155,6 +159,8 @@ impl> Filter for IsMajorityOfBody { } } +/// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognise and filter the +/// `Origin::Xcm` item. pub struct EnsureXcm(PhantomData); impl> EnsureOrigin for EnsureXcm where O::PalletsOrigin: From + TryInto From 347d177d68268eae539e2fcb7ac89a23011b0242 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 18:50:08 +0200 Subject: [PATCH 14/22] Docs --- xcm/xcm-builder/src/origin_conversion.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xcm/xcm-builder/src/origin_conversion.rs b/xcm/xcm-builder/src/origin_conversion.rs index 519d1fd5eeb0..37037171ba4d 100644 --- a/xcm/xcm-builder/src/origin_conversion.rs +++ b/xcm/xcm-builder/src/origin_conversion.rs @@ -200,6 +200,10 @@ impl< } } +/// `Convert` implementation to convert from some a `Signed` (system) `Origin` into an `AccountId32`. +/// +/// Typically used when configuring `pallet-xcm` for allowing normal accounts to dispatch an XCM from an `AccountId32` +/// origin. pub struct SignedToAccountId32( PhantomData<(Origin, AccountId, Network)> ); @@ -221,6 +225,11 @@ impl< } } +/// `Convert` implementation to convert from some an origin which implements `Backing` into a corresponding `Plurality` +/// MultiLocation. +/// +/// Typically used when configuring `pallet-xcm` for allowing a collective's Origin to dispatch an XCM from a +/// `Plurality` origin. pub struct BackingToPlurality( PhantomData<(Origin, COrigin, Body)> ); From 5fb2d1ebc418ddfe22ec4a1812775aff06d3c2de Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 19:16:25 +0200 Subject: [PATCH 15/22] Fixes --- runtime/parachains/src/mock.rs | 2 +- runtime/rococo/src/lib.rs | 2 +- runtime/test-runtime/src/lib.rs | 2 +- xcm/pallet-xcm/src/lib.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index c3f26dd94f40..5e9e65381ea3 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -119,7 +119,7 @@ impl crate::paras::Config for Test { impl crate::dmp::Config for Test { } parameter_types! { - const FirstMessageFactorPercent: u64 = 100; + pub const FirstMessageFactorPercent: u64 = 100; } impl crate::ump::Config for Test { diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index c5b0696ca489..dd3b6647399f 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -662,7 +662,7 @@ impl pallet_xcm::Config for Runtime { impl parachains_session_info::Config for Runtime {} parameter_types! { - const FirstMessageFactorPercent: u64 = 100; + pub const FirstMessageFactorPercent: u64 = 100; } impl parachains_ump::Config for Runtime { diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index fa4a0bfed5fe..fd5253fe21fd 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -475,7 +475,7 @@ impl parachains_paras::Config for Runtime { impl parachains_dmp::Config for Runtime {} parameter_types! { - const FirstMessageFactorPercent: u64 = 100; + pub const FirstMessageFactorPercent: u64 = 100; } impl parachains_ump::Config for Runtime { diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 58e1880bd304..8d1dd8acd1fb 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -180,6 +180,6 @@ impl> EnsureOrigin for EnsureXcm #[cfg(feature = "runtime-benchmarks")] fn successful_origin() -> O { - Origin::Xcm(MultiLocation::Null).into() + O::PalletsOrigin::from(Origin::Xcm(MultiLocation::Null)).into() } } From 1222fe5a25d9110263edb7dbc9105accd81879c2 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 19:23:16 +0200 Subject: [PATCH 16/22] Fixes --- runtime/rococo/Cargo.toml | 1 + xcm/pallet-xcm/src/lib.rs | 4 ++-- xcm/xcm-builder/Cargo.toml | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index 508d69673ac6..d1394f102721 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -142,6 +142,7 @@ runtime-benchmarks = [ "pallet-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", ] try-runtime = [ "frame-executive/try-runtime", diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 8d1dd8acd1fb..80e62d446a61 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -162,7 +162,7 @@ impl> Filter for IsMajorityOfBody { /// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognise and filter the /// `Origin::Xcm` item. pub struct EnsureXcm(PhantomData); -impl> EnsureOrigin for EnsureXcm +impl, F: Filter> EnsureOrigin for EnsureXcm where O::PalletsOrigin: From + TryInto { type Success = MultiLocation; @@ -180,6 +180,6 @@ impl> EnsureOrigin for EnsureXcm #[cfg(feature = "runtime-benchmarks")] fn successful_origin() -> O { - O::PalletsOrigin::from(Origin::Xcm(MultiLocation::Null)).into() + O::from(Origin::Xcm(MultiLocation::Null)) } } diff --git a/xcm/xcm-builder/Cargo.toml b/xcm/xcm-builder/Cargo.toml index f4306fbd6a4e..3f6f0a451e7f 100644 --- a/xcm/xcm-builder/Cargo.toml +++ b/xcm/xcm-builder/Cargo.toml @@ -22,6 +22,7 @@ polkadot-parachain = { path = "../../parachain", default-features = false } [features] default = ["std"] +runtime-benchmarks = [] std = [ "parity-scale-codec/std", "xcm/std", From ae11ae3994cac0e44e2fc9f133824c55306e0555 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 19:31:09 +0200 Subject: [PATCH 17/22] Fixes --- runtime/parachains/src/mock.rs | 1 - runtime/rococo/Cargo.toml | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index 5e9e65381ea3..270e93734867 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -30,7 +30,6 @@ use crate::{ inclusion, scheduler, dmp, ump, hrmp, session_info, paras, configuration, initializer, shared, }; -use frame_benchmarking::frame_support::pallet_prelude::Get; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; diff --git a/runtime/rococo/Cargo.toml b/runtime/rococo/Cargo.toml index d1394f102721..db5494d5cd06 100644 --- a/runtime/rococo/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -83,6 +83,7 @@ std = [ "pallet-babe/std", "beefy-primitives/std", "pallet-balances/std", + "pallet-collective/std", "pallet-beefy/std", "pallet-grandpa/std", "pallet-sudo/std", @@ -136,6 +137,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", "pallet-grandpa/runtime-benchmarks", "pallet-im-online/runtime-benchmarks", "pallet-indices/runtime-benchmarks", @@ -152,6 +154,7 @@ try-runtime = [ "pallet-authorship/try-runtime", "pallet-babe/try-runtime", "pallet-balances/try-runtime", + "pallet-collective/try-runtime", "pallet-grandpa/try-runtime", "pallet-sudo/try-runtime", "pallet-indices/try-runtime", From 4b38227b58ec06628992bc701420d9d0df8e8e4e Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Fri, 9 Apr 2021 19:45:58 +0200 Subject: [PATCH 18/22] Update xcm/pallet-xcm/src/lib.rs Co-authored-by: Shawn Tabrizi --- xcm/pallet-xcm/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index 80e62d446a61..fdeef82a362d 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -100,7 +100,7 @@ pub mod pallet { /// /// NOTE: A successful return to this does *not* imply that the `msg` was executed successfully /// to completion; only that *some* of it was executed. - #[pallet::weight(1_000 + max_weight)] + #[pallet::weight(1_000.saturating_add(max_weight))] fn execute(origin: OriginFor, message: Box>, max_weight: Weight) -> DispatchResult { From 97196231158ac435e910813c910594e7b941808e Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 19:47:43 +0200 Subject: [PATCH 19/22] Docs --- xcm/pallet-xcm/src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index fdeef82a362d..fdddfcf9757a 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -88,9 +88,6 @@ pub mod pallet { /// Execute an XCM message from a local, signed, origin. /// - /// Returns `DispatchError` if execution was not possible. Otherwise returns the amount of - /// weight that was used in its attempted execution. - /// /// An event is deposited indicating whether `msg` could be executed completely or only /// partially. /// From d8fe3572db2fdc72a54804f50643ce53483ed72c Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 19:54:16 +0200 Subject: [PATCH 20/22] Fixes --- runtime/parachains/src/ump.rs | 39 ++++++++++++++++------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 4e072cbbe11d..37b3195ea429 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -564,27 +564,24 @@ pub(crate) mod mock_sink { pub struct MockUmpSink; impl UmpSink for MockUmpSink { fn process_upward_message(actual_origin: ParaId, actual_msg: &[u8], _max_weight: Weight) -> Option { - HOOK.with(|opt_hook| match &mut *opt_hook.borrow_mut() { - Some(hook) => { - let UmpExpectation { - expected_origin, - expected_msg, - mock_weight, - } = match hook.pop_front() { - Some(expectation) => expectation, - None => { - panic!( - "The probe is active but didn't expect the message:\n\n\t{:?}.", - actual_msg, - ); - } - }; - assert_eq!(expected_origin, actual_origin); - assert_eq!(expected_msg, &actual_msg[..]); - Some(mock_weight) - } - None => None, - }) + HOOK.with(|opt_hook| opt_hook.borrow_mut().map(|mut hook| { + let UmpExpectation { + expected_origin, + expected_msg, + mock_weight, + } = match hook.pop_front() { + Some(expectation) => expectation, + None => { + panic!( + "The probe is active but didn't expect the message:\n\n\t{:?}.", + actual_msg, + ); + } + }; + assert_eq!(expected_origin, actual_origin); + assert_eq!(expected_msg, &actual_msg[..]); + mock_weight + })) } } From 86a2606baf0c8ff4cf910ffe3f957924d00c47f5 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 9 Apr 2021 20:04:24 +0200 Subject: [PATCH 21/22] Update lib.rs --- xcm/pallet-xcm/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcm/pallet-xcm/src/lib.rs b/xcm/pallet-xcm/src/lib.rs index fdddfcf9757a..17035f98f70e 100644 --- a/xcm/pallet-xcm/src/lib.rs +++ b/xcm/pallet-xcm/src/lib.rs @@ -97,7 +97,7 @@ pub mod pallet { /// /// NOTE: A successful return to this does *not* imply that the `msg` was executed successfully /// to completion; only that *some* of it was executed. - #[pallet::weight(1_000.saturating_add(max_weight))] + #[pallet::weight(max_weight.saturating_add(1_000u64))] fn execute(origin: OriginFor, message: Box>, max_weight: Weight) -> DispatchResult { From 749fda2bdd41497eb05b2b0880e5208219b6f562 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 9 Apr 2021 20:10:36 +0200 Subject: [PATCH 22/22] Fixes --- runtime/parachains/src/ump.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index 37b3195ea429..f1998ba7ddf6 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -564,7 +564,7 @@ pub(crate) mod mock_sink { pub struct MockUmpSink; impl UmpSink for MockUmpSink { fn process_upward_message(actual_origin: ParaId, actual_msg: &[u8], _max_weight: Weight) -> Option { - HOOK.with(|opt_hook| opt_hook.borrow_mut().map(|mut hook| { + HOOK.with(|opt_hook| opt_hook.borrow_mut().as_mut().map(|hook| { let UmpExpectation { expected_origin, expected_msg,