From 5b3fa6f7f62b8e9ea65c0253029c8ac3a3809203 Mon Sep 17 00:00:00 2001 From: Amar Singh Date: Sun, 7 Mar 2021 13:54:30 -0800 Subject: [PATCH] add accountkey20 conversion impls (#2576) --- polkadot/xcm/xcm-builder/src/lib.rs | 4 ++-- .../xcm-builder/src/location_conversion.rs | 24 +++++++++++++++++++ .../xcm/xcm-builder/src/origin_conversion.rs | 21 ++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/polkadot/xcm/xcm-builder/src/lib.rs b/polkadot/xcm/xcm-builder/src/lib.rs index 9dd62f8430..ea54f81ce3 100644 --- a/polkadot/xcm/xcm-builder/src/lib.rs +++ b/polkadot/xcm/xcm-builder/src/lib.rs @@ -18,13 +18,13 @@ mod location_conversion; pub use location_conversion::{ - Account32Hash, ParentIsDefault, ChildParachainConvertsVia, SiblingParachainConvertsVia, AccountId32Aliases + Account32Hash, ParentIsDefault, ChildParachainConvertsVia, SiblingParachainConvertsVia, AccountId32Aliases, AccountKey20Aliases, }; mod origin_conversion; pub use origin_conversion::{ SovereignSignedViaLocation, ParentAsSuperuser, ChildSystemParachainAsSuperuser, SiblingSystemParachainAsSuperuser, - ChildParachainAsNative, SiblingParachainAsNative, RelayChainAsNative, SignedAccountId32AsNative + ChildParachainAsNative, SiblingParachainAsNative, RelayChainAsNative, SignedAccountId32AsNative, SignedAccountKey20AsNative, }; mod currency_adapter; diff --git a/polkadot/xcm/xcm-builder/src/location_conversion.rs b/polkadot/xcm/xcm-builder/src/location_conversion.rs index 88575b6df6..be563448e3 100644 --- a/polkadot/xcm/xcm-builder/src/location_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/location_conversion.rs @@ -124,3 +124,27 @@ impl< Ok(Junction::AccountId32 { id: who.into(), network: Network::get() }.into()) } } + +pub struct AccountKey20Aliases(PhantomData<(Network, AccountId)>); + +impl< + Network: Get, + AccountId: From<[u8; 20]> + Into<[u8; 20]> +> LocationConversion for AccountKey20Aliases { + fn from_location(location: &MultiLocation) -> Option { + if let MultiLocation::X1(Junction::AccountKey20 { key, network }) = location { + if matches!(network, NetworkId::Any) || network == &Network::get() { + return Some((*key).into()); + } + } + None + } + + fn try_into_location(who: AccountId) -> Result { + Ok(Junction::AccountKey20 { + key: who.into(), + network: Network::get(), + } + .into()) + } +} diff --git a/polkadot/xcm/xcm-builder/src/origin_conversion.rs b/polkadot/xcm/xcm-builder/src/origin_conversion.rs index 86b9b26360..3c8d05d54b 100644 --- a/polkadot/xcm/xcm-builder/src/origin_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/origin_conversion.rs @@ -148,3 +148,24 @@ impl< } } } + +pub struct SignedAccountKey20AsNative( + PhantomData<(Network, Origin)> +); +impl< + Network: Get, + Origin: OriginTrait +> ConvertOrigin for SignedAccountKey20AsNative where + Origin::AccountId: From<[u8; 20]>, +{ + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Native, MultiLocation::X1(Junction::AccountKey20 { key, network })) + if matches!(network, NetworkId::Any) || network == Network::get() => + { + Ok(Origin::signed(key.into())) + } + (_, origin) => Err(origin), + } + } +}