From 4dcf1aebc15470d44955d8e17418a59a7afe3cc8 Mon Sep 17 00:00:00 2001 From: Shaopeng Wang Date: Mon, 15 Mar 2021 11:28:21 +1300 Subject: [PATCH 1/2] Use cumulus xcm-handler to execute XCM locally. --- xcm-support/src/lib.rs | 8 ++++-- xtokens/Cargo.toml | 4 ++- xtokens/src/lib.rs | 60 +++++++++++------------------------------- 3 files changed, 24 insertions(+), 48 deletions(-) diff --git a/xcm-support/src/lib.rs b/xcm-support/src/lib.rs index a5d55ed10..656968748 100644 --- a/xcm-support/src/lib.rs +++ b/xcm-support/src/lib.rs @@ -12,10 +12,14 @@ use sp_std::{ result, }; -use xcm::v0::{Error, Junction, MultiAsset, MultiLocation, Result}; +use xcm::v0::{Error, Junction, MultiAsset, MultiLocation, Result, Xcm}; use xcm_executor::traits::{FilterAssetLocation, LocationConversion, MatchesFungible, NativeAsset, TransactAsset}; -use frame_support::{log, traits::Get}; +use frame_support::{dispatch::DispatchResult, log, traits::Get}; + +pub trait XcmHandler { + fn execute_xcm(origin: AccountId, xcm: Xcm) -> DispatchResult; +} pub trait CurrencyIdConversion { fn from_asset(asset: &MultiAsset) -> Option; diff --git a/xtokens/Cargo.toml b/xtokens/Cargo.toml index 5124431b1..8bce15bc9 100644 --- a/xtokens/Cargo.toml +++ b/xtokens/Cargo.toml @@ -20,7 +20,8 @@ frame-system = { git = "https://github.com/paritytech/substrate", branch = "roco cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "rococo-v1", default-features = false } xcm = { git = "https://github.com/paritytech/polkadot", branch = "rococo-v1", default-features = false } -xcm-executor = { git = "https://github.com/paritytech/polkadot", branch = "rococo-v1", default-features = false } + +orml-xcm-support = { path = "../xcm-support", default-features = false } [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "rococo-v1" } @@ -39,4 +40,5 @@ std = [ "frame-system/std", "cumulus-primitives-core/std", "xcm/std", + "orml-xcm-support/std", ] diff --git a/xtokens/src/lib.rs b/xtokens/src/lib.rs index 94f1ea3e8..b19ada205 100644 --- a/xtokens/src/lib.rs +++ b/xtokens/src/lib.rs @@ -17,8 +17,9 @@ pub mod module { use sp_std::prelude::*; use cumulus_primitives_core::{relay_chain::Balance as RelayChainBalance, ParaId}; - use xcm::v0::{Error as XcmError, ExecuteXcm, Junction, MultiAsset, MultiLocation, NetworkId, Order, Xcm}; - use xcm_executor::traits::LocationConversion; + use xcm::v0::{Junction, MultiAsset, MultiLocation, NetworkId, Order, Xcm}; + + use orml_xcm_support::XcmHandler; #[derive(Encode, Decode, Eq, PartialEq, Clone, Copy, RuntimeDebug)] /// Identity of chain. @@ -74,9 +75,7 @@ pub mod module { /// Parachain ID. type ParaId: Get; - type AccountIdConverter: LocationConversion; - - type XcmExecutor: ExecuteXcm; + type XcmHandler: XcmHandler; } #[pallet::event] @@ -85,23 +84,13 @@ pub mod module { /// Transferred to relay chain. \[src, dest, amount\] TransferredToRelayChain(T::AccountId, T::AccountId, T::Balance), - /// Transfer to relay chain failed. \[src, dest, amount, error\] - TransferToRelayChainFailed(T::AccountId, T::AccountId, T::Balance, XcmError), - /// Transferred to parachain. \[x_currency_id, src, para_id, dest, /// dest_network, amount\] TransferredToParachain(XCurrencyId, T::AccountId, ParaId, MultiLocation, T::Balance), - - /// Transfer to parachain failed. \[x_currency_id, src, para_id, dest, - /// dest_network, amount, error\] - TransferToParachainFailed(XCurrencyId, T::AccountId, ParaId, MultiLocation, T::Balance, XcmError), } #[pallet::error] - pub enum Error { - /// Bad location. - BadLocation, - } + pub enum Error {} #[pallet::hooks] impl Hooks for Pallet {} @@ -138,15 +127,9 @@ pub mod module { }], }], }; + T::XcmHandler::execute_xcm(who.clone(), xcm)?; - let xcm_origin = - T::AccountIdConverter::try_into_location(who.clone()).map_err(|_| Error::::BadLocation)?; - // TODO: revert state on xcm execution failure. - match T::XcmExecutor::execute_xcm(xcm_origin, xcm) { - Ok(_) => Self::deposit_event(Event::::TransferredToRelayChain(who, dest, amount)), - Err(err) => Self::deposit_event(Event::::TransferToRelayChainFailed(who, dest, amount, err)), - } - + Self::deposit_event(Event::::TransferredToRelayChain(who, dest, amount)); Ok(().into()) } @@ -182,28 +165,15 @@ pub mod module { } } }; + T::XcmHandler::execute_xcm(who.clone(), xcm)?; - let xcm_origin = - T::AccountIdConverter::try_into_location(who.clone()).map_err(|_| Error::::BadLocation)?; - // TODO: revert state on xcm execution failure. - match T::XcmExecutor::execute_xcm(xcm_origin, xcm) { - Ok(_) => Self::deposit_event(Event::::TransferredToParachain( - x_currency_id, - who, - para_id, - dest, - amount, - )), - Err(err) => Self::deposit_event(Event::::TransferToParachainFailed( - x_currency_id, - who, - para_id, - dest, - amount, - err, - )), - } - + Self::deposit_event(Event::::TransferredToParachain( + x_currency_id, + who, + para_id, + dest, + amount, + )); Ok(().into()) } } From 9ff267da3c7a3ebfd6d643fdfc128a325f62d152 Mon Sep 17 00:00:00 2001 From: Shaun Wang Date: Mon, 15 Mar 2021 11:32:59 +1300 Subject: [PATCH 2/2] Add docstring for xtokens config. --- xtokens/src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/xtokens/src/lib.rs b/xtokens/src/lib.rs index b19ada205..cada34e21 100644 --- a/xtokens/src/lib.rs +++ b/xtokens/src/lib.rs @@ -65,16 +65,20 @@ pub mod module { + MaybeSerializeDeserialize + Into; - /// Convertor `Balance` to `RelayChainBalance`. + /// Convert `Balance` to `RelayChainBalance`. type ToRelayChainBalance: Convert; + /// Convert `Self::Account` to `AccountId32` type AccountId32Convert: Convert; + /// The network id of relay chain. Typically `NetworkId::Polkadot` or + /// `NetworkId::Kusama`. type RelayChainNetworkId: Get; - /// Parachain ID. + /// Self parachain ID. type ParaId: Get; + /// Xcm handler to execute XCM. type XcmHandler: XcmHandler; }