Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions runtime/common/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down
42 changes: 42 additions & 0 deletions runtime/common/src/xcm_sender.rs
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.

//! 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<T>(PhantomData<T>);

impl<T: configuration::Config + dmp::Config> SendXcm for RelayChainXcmSender<T> {
fn send_xcm(dest: MultiLocation, msg: Xcm) -> Result {
if let MultiLocation::X1(Junction::Parachain { id }) = dest {
// Downward message passing.
let config = <configuration::Module<T>>::config();
<dmp::Module<T>>::queue_downward_message(
&config,
id.into(),
VersionedXcm::from(msg).encode(),
).map_err(Into::<Error>::into)?;
Ok(())
} else {
Err(Error::CannotReachDestination)
}
}
}
9 changes: 9 additions & 0 deletions runtime/parachains/src/dmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))]
Expand All @@ -30,6 +31,14 @@ pub enum QueueDownwardMessageError {
ExceedsMaxMessageSize,
}

impl From<QueueDownwardMessageError> 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 {
Expand Down
4 changes: 2 additions & 2 deletions runtime/rococo/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Runtime>;
type AssetTransactor = LocalAssetTransactor;
type OriginConverter = LocalOriginConverter;
type IsReserve = ();
Expand Down
1 change: 1 addition & 0 deletions xcm/src/v0/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ pub enum Error {
MultiLocationFull,
FailedToDecode,
BadOrigin,
ExceedsMaxMessageSize,
}

impl From<()> for Error {
Expand Down