Kusama origins as xcm multi_location (#6273)

* Kusamsa origins as xcm multilocation

* Fellows origin index

* origins to xcm plurality body

* cleanup

* fix cargo spellcheck

* Apply suggestions from code review

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* include Fellows into scope

* include Fellows into scope

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
Co-authored-by: Gavin Wood <gavin@parity.io>
This commit is contained in:
Muharem Ismailov
2022-12-21 09:33:01 +01:00
committed by GitHub
parent 87f9e4e140
commit dd46523f82
6 changed files with 74 additions and 11 deletions
+1 -1
View File
@@ -106,7 +106,7 @@ pub mod xcm_config;
// Governance configurations. // Governance configurations.
pub mod governance; pub mod governance;
use governance::{ use governance::{
old::CouncilCollective, pallet_custom_origins, AuctionAdmin, GeneralAdmin, LeaseAdmin, old::CouncilCollective, pallet_custom_origins, AuctionAdmin, Fellows, GeneralAdmin, LeaseAdmin,
StakingAdmin, Treasurer, TreasurySpender, StakingAdmin, Treasurer, TreasurySpender,
}; };
use xcm_config::CheckAccount; use xcm_config::CheckAccount;
+33 -9
View File
@@ -17,8 +17,8 @@
//! XCM configurations for the Kusama runtime. //! XCM configurations for the Kusama runtime.
use super::{ use super::{
parachains_origin, AccountId, Balances, CouncilCollective, ParaId, Runtime, RuntimeCall, parachains_origin, AccountId, Balances, CouncilCollective, Fellows, ParaId, Runtime,
RuntimeEvent, RuntimeOrigin, WeightToFee, XcmPallet, RuntimeCall, RuntimeEvent, RuntimeOrigin, StakingAdmin, WeightToFee, XcmPallet,
}; };
use frame_support::{match_types, parameter_types, traits::Everything}; use frame_support::{match_types, parameter_types, traits::Everything};
use runtime_common::{xcm_sender, ToAuthor}; use runtime_common::{xcm_sender, ToAuthor};
@@ -28,8 +28,8 @@ use xcm_builder::{
AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, BackingToPlurality, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, BackingToPlurality,
ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser,
CurrencyAdapter as XcmCurrencyAdapter, FixedWeightBounds, IsChildSystemParachain, IsConcrete, CurrencyAdapter as XcmCurrencyAdapter, FixedWeightBounds, IsChildSystemParachain, IsConcrete,
LocationInverter, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, LocationInverter, OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32,
TakeWeightCredit, UsingComponents, WeightInfoBounds, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds,
}; };
parameter_types! { parameter_types! {
@@ -154,6 +154,10 @@ impl xcm_executor::Config for XcmConfig {
parameter_types! { parameter_types! {
pub const CouncilBodyId: BodyId = BodyId::Executive; pub const CouncilBodyId: BodyId = BodyId::Executive;
// StakingAdmin pluralistic body.
pub const StakingAdminBodyId: BodyId = BodyId::Defense;
// Fellows pluralistic body.
pub const FellowsBodyId: BodyId = BodyId::Technical;
} }
/// Type to convert the council origin to a Plurality `MultiLocation` value. /// Type to convert the council origin to a Plurality `MultiLocation` value.
@@ -172,13 +176,33 @@ pub type LocalOriginToLocation = (
// And a usual Signed origin to be used in XCM as a corresponding AccountId32 // And a usual Signed origin to be used in XCM as a corresponding AccountId32
SignedToAccountId32<RuntimeOrigin, AccountId, KusamaNetwork>, SignedToAccountId32<RuntimeOrigin, AccountId, KusamaNetwork>,
); );
/// Type to convert the `StakingAdmin` origin to a Plurality `MultiLocation` value.
pub type StakingAdminToPlurality =
OriginToPluralityVoice<RuntimeOrigin, StakingAdmin, StakingAdminBodyId>;
/// Type to convert the Fellows origin to a Plurality `MultiLocation` value.
pub type FellowsToPlurality = OriginToPluralityVoice<RuntimeOrigin, Fellows, FellowsBodyId>;
/// Type to convert a pallet `Origin` type value into a `MultiLocation` value which represents an interior location
/// of this chain for a destination chain.
pub type LocalPalletOriginToLocation = (
// We allow an origin from the Collective pallet to be used in XCM as a corresponding Plurality of the
// `Unit` body.
CouncilToPlurality,
// StakingAdmin origin to be used in XCM as a corresponding Plurality `MultiLocation` value.
StakingAdminToPlurality,
// Fellows origin to be used in XCM as a corresponding Plurality `MultiLocation` value.
FellowsToPlurality,
);
impl pallet_xcm::Config for Runtime { impl pallet_xcm::Config for Runtime {
type RuntimeEvent = RuntimeEvent; type RuntimeEvent = RuntimeEvent;
// We only allow the council to send messages. This is basically safe to enable for everyone // We only allow the root, the council, fellows and the staking admin to send messages.
// (safe the possibility of someone spamming the parachain if they're willing to pay the KSM to // This is basically safe to enable for everyone (safe the possibility of someone spamming the parachain
// send from the Relay-chain), but it's useless until we bring in XCM v3 which will make // if they're willing to pay the KSM to send from the Relay-chain), but it's useless until we bring in XCM v3
// `DescendOrigin` a bit more useful. // which will make `DescendOrigin` a bit more useful.
type SendXcmOrigin = xcm_builder::EnsureXcmOrigin<RuntimeOrigin, CouncilToPlurality>; type SendXcmOrigin = xcm_builder::EnsureXcmOrigin<RuntimeOrigin, LocalPalletOriginToLocation>;
type XcmRouter = XcmRouter; type XcmRouter = XcmRouter;
// Anyone can execute XCM messages locally. // Anyone can execute XCM messages locally.
type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>; type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>;
+13
View File
@@ -1527,6 +1527,19 @@ impl<Prefix: Get<MultiLocation>, Body: Get<BodyId>> Contains<MultiLocation>
} }
} }
/// Filter for `MultiLocation` to find those which represent a voice of an identified plurality.
///
/// May reasonably be used with `EnsureXcm`.
pub struct IsVoiceOfBody<Prefix, Body>(PhantomData<(Prefix, Body)>);
impl<Prefix: Get<MultiLocation>, Body: Get<BodyId>> Contains<MultiLocation>
for IsVoiceOfBody<Prefix, Body>
{
fn contains(l: &MultiLocation) -> bool {
let maybe_suffix = l.match_and_split(&Prefix::get());
matches!(maybe_suffix, Some(Plurality { id, part }) if id == &Body::get() && part == &BodyPart::Voice)
}
}
/// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and filter the /// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and filter the
/// `Origin::Xcm` item. /// `Origin::Xcm` item.
pub struct EnsureXcm<F>(PhantomData<F>); pub struct EnsureXcm<F>(PhantomData<F>);
+9
View File
@@ -52,6 +52,15 @@ pub enum BodyId {
/// The unambiguous judicial body (this doesn't exist on Polkadot, but if it were to get a "grand oracle", it /// 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). /// may be considered as that).
Judicial, Judicial,
/// The unambiguous defense body (for Polkadot, an opinion on the topic given via a public referendum
/// on the `staking_admin` track).
Defense,
/// The unambiguous administration body (for Polkadot, an opinion on the topic given via a public referendum
/// on the `general_admin` track).
Administration,
/// The unambiguous treasury body (for Polkadot, an opinion on the topic given via a public referendum
/// on the `treasurer` track).
Treasury,
} }
/// A part of a pluralistic body. /// A part of a pluralistic body.
+1 -1
View File
@@ -37,7 +37,7 @@ pub use location_conversion::{
mod origin_conversion; mod origin_conversion;
pub use origin_conversion::{ pub use origin_conversion::{
BackingToPlurality, ChildParachainAsNative, ChildSystemParachainAsSuperuser, EnsureXcmOrigin, BackingToPlurality, ChildParachainAsNative, ChildSystemParachainAsSuperuser, EnsureXcmOrigin,
ParentAsSuperuser, RelayChainAsNative, SiblingParachainAsNative, OriginToPluralityVoice, ParentAsSuperuser, RelayChainAsNative, SiblingParachainAsNative,
SiblingSystemParachainAsSuperuser, SignedAccountId32AsNative, SignedAccountKey20AsNative, SiblingSystemParachainAsSuperuser, SignedAccountId32AsNative, SignedAccountKey20AsNative,
SignedToAccountId32, SovereignSignedViaLocation, SignedToAccountId32, SovereignSignedViaLocation,
}; };
@@ -321,3 +321,20 @@ where
}) })
} }
} }
/// `Convert` implementation to convert from an origin which passes the check of an `EnsureOrigin`
/// into a voice of a given pluralistic `Body`.
pub struct OriginToPluralityVoice<RuntimeOrigin, EnsureBodyOrigin, Body>(
PhantomData<(RuntimeOrigin, EnsureBodyOrigin, Body)>,
);
impl<RuntimeOrigin: Clone, EnsureBodyOrigin: EnsureOrigin<RuntimeOrigin>, Body: Get<BodyId>>
Convert<RuntimeOrigin, MultiLocation>
for OriginToPluralityVoice<RuntimeOrigin, EnsureBodyOrigin, Body>
{
fn convert(o: RuntimeOrigin) -> Result<MultiLocation, RuntimeOrigin> {
match EnsureBodyOrigin::try_origin(o) {
Ok(_) => Ok(Junction::Plurality { id: Body::get(), part: BodyPart::Voice }.into()),
Err(o) => Err(o),
}
}
}