diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs
index 2f62eb956606..0177f48138f7 100644
--- a/runtime/common/src/lib.rs
+++ b/runtime/common/src/lib.rs
@@ -26,6 +26,7 @@ pub mod purchase;
pub mod impls;
pub mod paras_sudo_wrapper;
pub mod paras_registrar;
+pub mod xcm_sender;
use primitives::v1::{BlockNumber, ValidatorId, AssignmentId};
use sp_runtime::{Perquintill, Perbill, FixedPointNumber};
diff --git a/runtime/common/src/xcm_sender.rs b/runtime/common/src/xcm_sender.rs
new file mode 100644
index 000000000000..3b81516c7fb7
--- /dev/null
+++ b/runtime/common/src/xcm_sender.rs
@@ -0,0 +1,42 @@
+// Copyright 2021 Parity Technologies (UK) Ltd.
+// This file is part of Polkadot.
+
+// Polkadot 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.
+
+// Polkadot 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 Polkadot. If not, see .
+
+//! Xcm sender for relay chain.
+
+use parity_scale_codec::Encode;
+use sp_std::marker::PhantomData;
+use xcm::{VersionedXcm, v0::{SendXcm, MultiLocation, Junction, Xcm, Result, Error}};
+use runtime_parachains::{configuration, dmp};
+
+/// Xcm sender for relay chain. It only sends downward message.
+pub struct RelayChainXcmSender(PhantomData);
+
+impl SendXcm for RelayChainXcmSender {
+ 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)
+ }
+ }
+}
diff --git a/runtime/parachains/src/dmp.rs b/runtime/parachains/src/dmp.rs
index 7b04ae03407f..43d40745d3bb 100644
--- a/runtime/parachains/src/dmp.rs
+++ b/runtime/parachains/src/dmp.rs
@@ -22,6 +22,7 @@ use frame_support::{decl_module, decl_storage, StorageMap, weights::Weight, trai
use sp_std::{fmt, prelude::*};
use sp_runtime::traits::{BlakeTwo256, Hash as HashT, SaturatedConversion};
use primitives::v1::{Id as ParaId, DownwardMessage, InboundDownwardMessage, Hash};
+use xcm::v0::Error as XcmError;
/// An error sending a downward message.
#[cfg_attr(test, derive(Debug))]
@@ -30,6 +31,14 @@ pub enum QueueDownwardMessageError {
ExceedsMaxMessageSize,
}
+impl From for XcmError {
+ fn from(err: QueueDownwardMessageError) -> Self {
+ match err {
+ QueueDownwardMessageError::ExceedsMaxMessageSize => XcmError::ExceedsMaxMessageSize,
+ }
+ }
+}
+
/// An error returned by [`check_processed_downward_messages`] that indicates an acceptance check
/// didn't pass.
pub enum ProcessedDownwardMessagesAcceptanceErr {
diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs
index ba2d833eaa2f..843578b08cdf 100644
--- a/runtime/rococo/src/lib.rs
+++ b/runtime/rococo/src/lib.rs
@@ -61,7 +61,7 @@ use sp_core::OpaqueMetadata;
use sp_staking::SessionIndex;
use pallet_session::historical as session_historical;
use frame_system::{EnsureRoot, EnsureOneOf, EnsureSigned};
-use runtime_common::{paras_sudo_wrapper, paras_registrar};
+use runtime_common::{paras_sudo_wrapper, paras_registrar, xcm_sender};
use runtime_parachains::origin as parachains_origin;
use runtime_parachains::configuration as parachains_configuration;
@@ -553,7 +553,7 @@ type LocalOriginConverter = (
pub struct XcmConfig;
impl xcm_executor::Config for XcmConfig {
type Call = Call;
- type XcmSender = ();
+ type XcmSender = xcm_sender::RelayChainXcmSender;
type AssetTransactor = LocalAssetTransactor;
type OriginConverter = LocalOriginConverter;
type IsReserve = ();
diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs
index 661e71fe0877..eafeca8661c7 100644
--- a/xcm/src/v0/traits.rs
+++ b/xcm/src/v0/traits.rs
@@ -36,6 +36,7 @@ pub enum Error {
MultiLocationFull,
FailedToDecode,
BadOrigin,
+ ExceedsMaxMessageSize,
}
impl From<()> for Error {