From 7a31f8b882124c6e9b9a2864b9d9e464b4a5a798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Andr=C3=A9s=20Dorado=20Su=C3=A1rez?= Date: Tue, 7 May 2024 21:14:53 -0500 Subject: [PATCH] change(kreivo-runtime): add community accounts as xcm senders --- runtime/kreivo/src/xcm_config.rs | 11 +++++--- ...{plurality_community.rs => communities.rs} | 28 ++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) rename runtime/kreivo/src/xcm_config/{plurality_community.rs => communities.rs} (54%) diff --git a/runtime/kreivo/src/xcm_config.rs b/runtime/kreivo/src/xcm_config.rs index 57e85388..f40785b0 100644 --- a/runtime/kreivo/src/xcm_config.rs +++ b/runtime/kreivo/src/xcm_config.rs @@ -29,8 +29,8 @@ use xcm_builder::{ use xcm_executor::traits::JustTry; use xcm_executor::XcmExecutor; -mod plurality_community; -use plurality_community::*; +mod communities; +use communities::*; parameter_types! { pub const RelayLocation: MultiLocation = MultiLocation::parent(); @@ -237,7 +237,10 @@ impl xcm_executor::Config for XcmConfig { } /// Only communities are allowed to dispatch xcm messages -pub type CanSendXcmMessages = pallet_communities::Origin; +pub type CanSendXcmMessages = ( + pallet_communities::Origin, + SignedByCommunityToPlurality, +); /// Only signed origins are allowed to execute xcm transactions pub type CanExecuteXcmTransactions = ( @@ -257,8 +260,8 @@ pub type XcmRouter = ( impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; type XcmExecuteFilter = Nothing; // ^ Disable dispatchable execute on the XCM pallet. type XcmExecutor = XcmExecutor; diff --git a/runtime/kreivo/src/xcm_config/plurality_community.rs b/runtime/kreivo/src/xcm_config/communities.rs similarity index 54% rename from runtime/kreivo/src/xcm_config/plurality_community.rs rename to runtime/kreivo/src/xcm_config/communities.rs index 975ad902..a5f7c48b 100644 --- a/runtime/kreivo/src/xcm_config/plurality_community.rs +++ b/runtime/kreivo/src/xcm_config/communities.rs @@ -1,7 +1,13 @@ use super::*; use crate::Communities; -use sp_runtime::SaturatedConversion; +use core::marker::PhantomData; +use frame_support::{traits::OriginTrait, PalletId}; +use pallet_communities::AccountIdOf; +use sp_runtime::{ + traits::{AccountIdConversion, TryConvert}, + SaturatedConversion, +}; use xcm::v3::{BodyId, Junction::Plurality}; use xcm_executor::traits::ConvertLocation; @@ -40,3 +46,23 @@ impl>, AccountId: From<[u8; 32]> + Into<[u8; 32]> Some((*id).into()) } } + +pub struct SignedByCommunityToPlurality(PhantomData); +impl TryConvert for SignedByCommunityToPlurality +where + OuterOrigin: OriginTrait> + Clone, + T: pallet_communities::Config, + xcm::v3::Junction: TryFrom>, +{ + fn try_convert(o: OuterOrigin) -> Result { + let Some(account_id) = o.clone().into_signer() else { + return Err(o.clone()); + }; + let Some((_, community_id)) = PalletId::try_from_sub_account(&account_id) else { + return Err(o.clone()); + }; + let origin = pallet_communities::Origin::::new(community_id); + let j = xcm::v3::Junction::try_from(origin).map_err(|_| o)?; + Ok(j.into()) + } +}