mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-09 20:11:09 +00:00
[BridgeHub] Init stuff for Haul/Dispatch xcm blobs
This commit is contained in:
@@ -80,6 +80,7 @@ pallet-bridge-messages = { path = "../../../../bridges/modules/messages", defaul
|
||||
pallet-bridge-parachains = { path = "../../../../bridges/modules/parachains", default-features = false }
|
||||
pallet-bridge-relayers = { path = "../../../../bridges/modules/relayers", default-features = false }
|
||||
pallet-shift-session-manager = { path = "../../../../bridges/modules/shift-session-manager", default-features = false }
|
||||
bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", default-features = false }
|
||||
|
||||
[features]
|
||||
default = [
|
||||
@@ -93,6 +94,7 @@ std = [
|
||||
"bp-runtime/std",
|
||||
"bp-rococo/std",
|
||||
"bp-wococo/std",
|
||||
"bridge-runtime-common/std",
|
||||
"codec/std",
|
||||
"log/std",
|
||||
"scale-info/std",
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus 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.
|
||||
|
||||
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use crate::universal_exports::HaulBlob;
|
||||
use bp_messages::{
|
||||
source_chain::MessagesBridge,
|
||||
target_chain::{DispatchMessage, MessageDispatch},
|
||||
LaneId,
|
||||
};
|
||||
use bp_runtime::{messages::MessageDispatchResult, AccountIdOf, BalanceOf, Chain};
|
||||
use codec::Encode;
|
||||
use frame_support::{dispatch::Weight, parameter_types};
|
||||
use xcm::latest::prelude::*;
|
||||
|
||||
// TODO:check-parameter - we could possibly use BridgeMessage from xcm:v3 stuff
|
||||
/// PLain "XCM" payload, which we transfer through bridge
|
||||
pub type XcmAsPlainPayload = sp_std::prelude::Vec<u8>;
|
||||
|
||||
// TODO:check-parameter
|
||||
parameter_types! {
|
||||
pub const MaxMessagesToPruneAtOnce: bp_messages::MessageNonce = 8;
|
||||
pub const MaxRequests: u32 = 64;
|
||||
pub const HeadersToKeep: u32 = 1024;
|
||||
}
|
||||
|
||||
/// [`XcmBlobMessageDispatch`] is responsible for dispatching received messages from other BridgeHub
|
||||
pub struct XcmBlobMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain, DispatchBlob> {
|
||||
_marker:
|
||||
sp_std::marker::PhantomData<(SourceBridgeHubChain, TargetBridgeHubChain, DispatchBlob)>,
|
||||
}
|
||||
|
||||
impl<
|
||||
SourceBridgeHubChain: Chain,
|
||||
TargetBridgeHubChain: Chain,
|
||||
DispatchBlob: crate::universal_exports::DispatchBlob,
|
||||
> MessageDispatch<AccountIdOf<SourceBridgeHubChain>, BalanceOf<TargetBridgeHubChain>>
|
||||
for XcmBlobMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain, DispatchBlob>
|
||||
{
|
||||
type DispatchPayload = XcmAsPlainPayload;
|
||||
|
||||
fn dispatch_weight(
|
||||
message: &mut DispatchMessage<Self::DispatchPayload, BalanceOf<TargetBridgeHubChain>>,
|
||||
) -> Weight {
|
||||
log::error!(
|
||||
"[XcmBlobMessageDispatch] TODO: change here to XCMv3 dispatch_weight with XcmExecutor"
|
||||
);
|
||||
0
|
||||
}
|
||||
|
||||
fn dispatch(
|
||||
_relayer_account: &AccountIdOf<SourceBridgeHubChain>,
|
||||
message: DispatchMessage<Self::DispatchPayload, BalanceOf<TargetBridgeHubChain>>,
|
||||
) -> MessageDispatchResult {
|
||||
log::warn!("[XcmBlobMessageDispatch] DispatchBlob::dispatch_blob triggering");
|
||||
let payload = match message.data.payload {
|
||||
Ok(payload) => payload,
|
||||
Err(e) => {
|
||||
log::error!("[XcmBlobMessageDispatch] payload error: {:?}", e);
|
||||
return MessageDispatchResult {
|
||||
dispatch_result: false,
|
||||
unspent_weight: 0,
|
||||
dispatch_fee_paid_during_dispatch: false,
|
||||
}
|
||||
},
|
||||
};
|
||||
let dispatch_result = match DispatchBlob::dispatch_blob(payload) {
|
||||
Ok(_) => true,
|
||||
Err(e) => {
|
||||
log::error!(
|
||||
"[XcmBlobMessageDispatch] DispatchBlob::dispatch_blob failed, error: {:?}",
|
||||
e
|
||||
);
|
||||
false
|
||||
},
|
||||
};
|
||||
MessageDispatchResult {
|
||||
dispatch_result,
|
||||
dispatch_fee_paid_during_dispatch: false,
|
||||
unspent_weight: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// [`XcmBlobHauler`] is responsible for sending messages to the bridge "point-to-point link" from one side,
|
||||
/// where on the other it can be dispatched by [`XcmBlobMessageDispatch`].
|
||||
pub trait XcmBlobHauler {
|
||||
/// Which chain is sending
|
||||
type SenderChain: Chain;
|
||||
|
||||
/// Runtime message sender adapter.
|
||||
type MessageSender: MessagesBridge<
|
||||
super::Origin,
|
||||
AccountIdOf<Self::SenderChain>,
|
||||
BalanceOf<Self::SenderChain>,
|
||||
XcmAsPlainPayload,
|
||||
>;
|
||||
|
||||
/// Our location within the Consensus Universe.
|
||||
fn message_sender_origin() -> InteriorMultiLocation;
|
||||
|
||||
/// Return message lane (as "point-to-point link") used to deliver XCM messages.
|
||||
fn xcm_lane() -> LaneId;
|
||||
}
|
||||
|
||||
impl<T: XcmBlobHauler> HaulBlob for T {
|
||||
fn haul_blob(blob: sp_std::prelude::Vec<u8>) {
|
||||
let lane = T::xcm_lane();
|
||||
// TODO:check-parameter - fee could be taken from BridgeMessage - or add as optional fo send_message
|
||||
// TODO:check-parameter - or add here something like PriceForSiblingDelivery
|
||||
let fee = <T::SenderChain as Chain>::Balance::from(0u8);
|
||||
|
||||
let result = T::MessageSender::send_message(
|
||||
pallet_xcm::Origin::from(MultiLocation::from(T::message_sender_origin())).into(),
|
||||
lane,
|
||||
blob,
|
||||
fee,
|
||||
);
|
||||
let result = result
|
||||
.map(|artifacts| {
|
||||
let hash = (lane, artifacts.nonce).using_encoded(sp_io::hashing::blake2_256);
|
||||
hash
|
||||
})
|
||||
.map_err(|e| {
|
||||
e
|
||||
});
|
||||
log::info!(target: "runtime::bridge-hub", "haul_blob result: {:?} on lane: {:?}", result, lane);
|
||||
result.expect("failed to process: TODO:check-parameter - wait for origin/gav-xcm-v3, there is a comment about handliing errors for HaulBlob");
|
||||
}
|
||||
}
|
||||
@@ -1,261 +0,0 @@
|
||||
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus 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.
|
||||
|
||||
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use bp_messages::{
|
||||
source_chain::{LaneMessageVerifier, TargetHeaderChain},
|
||||
target_chain::{DispatchMessage, MessageDispatch, ProvedMessages, SourceHeaderChain},
|
||||
InboundLaneData, LaneId, Message, OutboundLaneData,
|
||||
};
|
||||
use bp_polkadot_core::Balance;
|
||||
use bp_runtime::{messages::MessageDispatchResult, AccountIdOf, BalanceOf, Chain};
|
||||
use codec::Decode;
|
||||
use frame_support::{dispatch::Weight, parameter_types, RuntimeDebug};
|
||||
|
||||
parameter_types! {
|
||||
// TODO:check-parameter
|
||||
pub const BridgeHubRococoMaxMessagesToPruneAtOnce: bp_messages::MessageNonce = 8;
|
||||
pub const BridgeHubWococoMaxMessagesToPruneAtOnce: bp_messages::MessageNonce = 8;
|
||||
// TODO:check-parameter
|
||||
pub const BridgeHubRococoMaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
|
||||
pub const BridgeHubWococoMaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
|
||||
// TODO:check-parameter
|
||||
pub const BridgeHubRococoMaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
|
||||
pub const BridgeHubWococoMaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
|
||||
|
||||
pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID;
|
||||
pub const BridgeHubWococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID;
|
||||
}
|
||||
|
||||
// TODO:check-parameter - when integration XCMv3 change this to struct
|
||||
pub type PlainXcmPayload = sp_std::prelude::Vec<u8>;
|
||||
|
||||
// TODO:check-parameter - when integration XCMv3 change this to struct
|
||||
pub type FromBridgeHubRococoMessagePayload = PlainXcmPayload;
|
||||
pub type FromBridgeHubWococoMessagePayload = PlainXcmPayload;
|
||||
pub type ToBridgeHubRococoMessagePayload = PlainXcmPayload;
|
||||
pub type ToBridgeHubWococoMessagePayload = PlainXcmPayload;
|
||||
|
||||
// TODO:check-parameter - when integrating XCMv3 change this to FromBridgedChainMessagePayload
|
||||
pub struct FromBridgeHubRococoMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain> {
|
||||
_marker: sp_std::marker::PhantomData<(SourceBridgeHubChain, TargetBridgeHubChain)>,
|
||||
}
|
||||
pub struct FromBridgeHubWococoMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain> {
|
||||
_marker: sp_std::marker::PhantomData<(SourceBridgeHubChain, TargetBridgeHubChain)>,
|
||||
}
|
||||
|
||||
impl<SourceBridgeHubChain: Chain, TargetBridgeHubChain: Chain>
|
||||
MessageDispatch<AccountIdOf<SourceBridgeHubChain>, BalanceOf<TargetBridgeHubChain>>
|
||||
for FromBridgeHubRococoMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain>
|
||||
{
|
||||
type DispatchPayload = FromBridgeHubRococoMessagePayload;
|
||||
|
||||
fn dispatch_weight(
|
||||
message: &mut DispatchMessage<Self::DispatchPayload, BalanceOf<TargetBridgeHubChain>>,
|
||||
) -> Weight {
|
||||
log::error!("[FromBridgeHubRococoMessageDispatch] TODO: change here to XCMv3 dispatch_weight with XcmExecutor");
|
||||
0
|
||||
}
|
||||
|
||||
fn dispatch(
|
||||
relayer_account: &AccountIdOf<SourceBridgeHubChain>,
|
||||
message: DispatchMessage<Self::DispatchPayload, BalanceOf<TargetBridgeHubChain>>,
|
||||
) -> MessageDispatchResult {
|
||||
log::error!("[FromBridgeHubRococoMessageDispatch] TODO: change here to XCMv3 dispatch with XcmExecutor");
|
||||
todo!("TODO: implement XCMv3 dispatch")
|
||||
}
|
||||
}
|
||||
|
||||
impl<SourceBridgeHubChain: Chain, TargetBridgeHubChain: Chain>
|
||||
MessageDispatch<AccountIdOf<SourceBridgeHubChain>, BalanceOf<TargetBridgeHubChain>>
|
||||
for FromBridgeHubWococoMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain>
|
||||
{
|
||||
type DispatchPayload = FromBridgeHubWococoMessagePayload;
|
||||
|
||||
fn dispatch_weight(
|
||||
message: &mut DispatchMessage<Self::DispatchPayload, BalanceOf<TargetBridgeHubChain>>,
|
||||
) -> Weight {
|
||||
log::error!("[FromBridgeHubWococoMessageDispatch] TODO: change here to XCMv3 dispatch_weight with XcmExecutor");
|
||||
0
|
||||
}
|
||||
|
||||
fn dispatch(
|
||||
relayer_account: &AccountIdOf<SourceBridgeHubChain>,
|
||||
message: DispatchMessage<Self::DispatchPayload, BalanceOf<TargetBridgeHubChain>>,
|
||||
) -> MessageDispatchResult {
|
||||
log::error!("[FromBridgeHubWococoMessageDispatch] TODO: change here to XCMv3 dispatch with XcmExecutor");
|
||||
todo!("TODO: implement XCMv3 dispatch")
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ToBridgeHubRococoMessageVerifier<Origin, Sender> {
|
||||
_marker: sp_std::marker::PhantomData<(Origin, Sender)>,
|
||||
}
|
||||
pub struct ToBridgeHubWococoMessageVerifier<Origin, Sender> {
|
||||
_marker: sp_std::marker::PhantomData<(Origin, Sender)>,
|
||||
}
|
||||
|
||||
impl<Origin: Clone, Sender: Chain>
|
||||
LaneMessageVerifier<
|
||||
Origin,
|
||||
ToBridgeHubRococoMessagePayload,
|
||||
BalanceOf<Sender>,
|
||||
> for ToBridgeHubRococoMessageVerifier<Origin, Sender>
|
||||
{
|
||||
type Error = &'static str;
|
||||
|
||||
fn verify_message(
|
||||
submitter: &Origin,
|
||||
delivery_and_dispatch_fee: &BalanceOf<Sender>,
|
||||
lane: &LaneId,
|
||||
outbound_data: &OutboundLaneData,
|
||||
payload: &ToBridgeHubRococoMessagePayload,
|
||||
) -> Result<(), Self::Error> {
|
||||
todo!("TODO: ToBridgeHubRococoMessageVerifier - fix verify_message - at the begining to allow all")
|
||||
}
|
||||
}
|
||||
|
||||
impl<Origin: Clone, Sender: Chain>
|
||||
LaneMessageVerifier<
|
||||
Origin,
|
||||
ToBridgeHubWococoMessagePayload,
|
||||
BalanceOf<Sender>,
|
||||
> for ToBridgeHubWococoMessageVerifier<Origin, Sender>
|
||||
{
|
||||
type Error = &'static str;
|
||||
|
||||
fn verify_message(
|
||||
submitter: &Origin,
|
||||
delivery_and_dispatch_fee: &BalanceOf<Sender>,
|
||||
lane: &LaneId,
|
||||
outbound_data: &OutboundLaneData,
|
||||
payload: &ToBridgeHubWococoMessagePayload,
|
||||
) -> Result<(), Self::Error> {
|
||||
todo!("TODO: ToBridgeHubWococoMessageVerifier - fix verify_message - at the begining to allow all")
|
||||
}
|
||||
}
|
||||
|
||||
/// BridgeHubRococo chain from message lane point of view.
|
||||
#[derive(RuntimeDebug, Clone, Copy)]
|
||||
pub struct BridgeHubRococoMessagingSupport;
|
||||
/// BridgeHubWococo chain from message lane point of view.
|
||||
#[derive(RuntimeDebug, Clone, Copy)]
|
||||
pub struct BridgeHubWococoMessagingSupport;
|
||||
|
||||
impl SourceHeaderChain<crate::Balance /* bp_bridge_hub_rococo::Balance */>
|
||||
for BridgeHubRococoMessagingSupport
|
||||
{
|
||||
type Error = &'static str;
|
||||
type MessagesProof = ();
|
||||
|
||||
fn verify_messages_proof(
|
||||
proof: Self::MessagesProof,
|
||||
messages_count: u32,
|
||||
) -> Result<ProvedMessages<Message<crate::Balance>>, Self::Error> {
|
||||
// TODO: need to add, bridges-runtime-common and refactor out of bin
|
||||
// messages::target::verify_messages_proof_from_parachain::<
|
||||
// WithRialtoParachainMessageBridge,
|
||||
// bp_bridge_hub_rococo::Header,
|
||||
// crate::Runtime,
|
||||
// crate::WithRialtoParachainsInstance,
|
||||
// >(ParaId(bp_rialto_parachain::RIALTO_PARACHAIN_ID), proof, messages_count)
|
||||
todo!("TODO: fix and implement SourceHeaderChain::verify_messages_proof")
|
||||
}
|
||||
}
|
||||
|
||||
impl
|
||||
TargetHeaderChain<
|
||||
ToBridgeHubRococoMessagePayload,
|
||||
crate::AccountId, /* bp_bridge_hub_wococo::AccountId */
|
||||
> for BridgeHubRococoMessagingSupport
|
||||
{
|
||||
type Error = &'static str;
|
||||
type MessagesDeliveryProof = ();
|
||||
|
||||
fn verify_message(payload: &ToBridgeHubRococoMessagePayload) -> Result<(), Self::Error> {
|
||||
// messages::source::verify_chain_message::<WithRialtoParachainMessageBridge>(payload)
|
||||
todo!("TODO: fix implementation: TargetHeaderChain::verify_message")
|
||||
}
|
||||
|
||||
fn verify_messages_delivery_proof(
|
||||
proof: Self::MessagesDeliveryProof,
|
||||
) -> Result<
|
||||
(LaneId, InboundLaneData<crate::AccountId /* bp_bridge_hub_wococo::AccountId */>),
|
||||
Self::Error,
|
||||
> {
|
||||
// messages::source::verify_messages_delivery_proof_from_parachain::<
|
||||
// WithRialtoParachainMessageBridge,
|
||||
// bp_rialto_parachain::Header,
|
||||
// Runtime,
|
||||
// crate::WithRialtoParachainsInstance,
|
||||
// >(ParaId(bp_rialto_parachain::RIALTO_PARACHAIN_ID), proof)
|
||||
todo!("TODO: fix implementation: TargetHeaderChain::verify_messages_delivery_proof")
|
||||
}
|
||||
}
|
||||
|
||||
impl SourceHeaderChain<crate::Balance /* bp_bridge_hub_wococo::Balance */>
|
||||
for BridgeHubWococoMessagingSupport
|
||||
{
|
||||
type Error = &'static str;
|
||||
type MessagesProof = ();
|
||||
|
||||
fn verify_messages_proof(
|
||||
proof: Self::MessagesProof,
|
||||
messages_count: u32,
|
||||
) -> Result<ProvedMessages<Message<crate::Balance>>, Self::Error> {
|
||||
// TODO: need to add, bridges-runtime-common and refactor out of bin
|
||||
// messages::target::verify_messages_proof_from_parachain::<
|
||||
// WithMIllauParachainMessageBridge,
|
||||
// bp_bridge_hub_wococo::Header,
|
||||
// crate::Runtime,
|
||||
// crate::WithRialtoParachainsInstance,
|
||||
// >(ParaId(bp_rialto_parachain::RIALTO_PARACHAIN_ID), proof, messages_count)
|
||||
todo!("TODO: fix and implement SourceHeaderChain::verify_messages_proof")
|
||||
}
|
||||
}
|
||||
|
||||
impl
|
||||
TargetHeaderChain<
|
||||
ToBridgeHubWococoMessagePayload,
|
||||
crate::AccountId, /* bp_bridge_hub_rococo::AccountId */
|
||||
> for BridgeHubWococoMessagingSupport
|
||||
{
|
||||
type Error = &'static str;
|
||||
type MessagesDeliveryProof = ();
|
||||
|
||||
fn verify_message(payload: &ToBridgeHubWococoMessagePayload) -> Result<(), Self::Error> {
|
||||
// messages::source::verify_chain_message::<WithRialtoParachainMessageBridge>(payload)
|
||||
todo!("TODO: fix implementation: TargetHeaderChain::verify_message")
|
||||
}
|
||||
|
||||
fn verify_messages_delivery_proof(
|
||||
proof: Self::MessagesDeliveryProof,
|
||||
) -> Result<
|
||||
(LaneId, InboundLaneData<crate::AccountId /* bp_bridge_hub_rococo::AccountId */>),
|
||||
Self::Error,
|
||||
> {
|
||||
// messages::source::verify_messages_delivery_proof_from_parachain::<
|
||||
// WithRialtoParachainMessageBridge,
|
||||
// bp_rialto_parachain::Header,
|
||||
// Runtime,
|
||||
// crate::WithRialtoParachainsInstance,
|
||||
// >(ParaId(bp_rialto_parachain::RIALTO_PARACHAIN_ID), proof)
|
||||
todo!("TODO: fix implementation: TargetHeaderChain::verify_messages_delivery_proof")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus 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.
|
||||
|
||||
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use bp_messages::{source_chain::{LaneMessageVerifier, TargetHeaderChain}, target_chain::{ProvedMessages, SourceHeaderChain}, InboundLaneData, LaneId, Message, OutboundLaneData, MessageKey, MessageData};
|
||||
use bp_runtime::{BalanceOf, Chain};
|
||||
use frame_support::{parameter_types, RuntimeDebug};
|
||||
use xcm::prelude::{InteriorMultiLocation, NetworkId};
|
||||
use bp_messages::target_chain::ProvedLaneMessages;
|
||||
use bridge_runtime_common::messages::target::FromBridgedChainMessagesProof;
|
||||
use crate::universal_exports::{BridgeBlobDispatcher, HaulBlobExporter};
|
||||
use crate::{WithBridgeHubWococoMessagesInstance, XcmAsPlainPayload, XcmBlobHauler, XcmRouter};
|
||||
use crate::Runtime;
|
||||
use crate::ParachainInfo;
|
||||
use xcm::latest::prelude::*;
|
||||
|
||||
// TODO:check-parameter
|
||||
parameter_types! {
|
||||
pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
|
||||
pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
|
||||
pub const BridgeHubWococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID;
|
||||
pub BridgeHubRococoUniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Rococo), Parachain(ParachainInfo::parachain_id().into()));
|
||||
pub WococoGlobalConsensusNetwork: NetworkId = NetworkId::Wococo;
|
||||
}
|
||||
|
||||
/// Dispatches received XCM messages from other bridge
|
||||
pub type OnBridgeHubRococoBlobDispatcher = BridgeBlobDispatcher<XcmRouter, BridgeHubRococoUniversalLocation>;
|
||||
|
||||
/// Export XCM messages to be relayed to the otherside
|
||||
pub type ToBridgeHubWococoHaulBlobExporter = HaulBlobExporter<ToBridgeHubWococoXcmBlobHauler, WococoGlobalConsensusNetwork, ()>;
|
||||
pub struct ToBridgeHubWococoXcmBlobHauler;
|
||||
pub const DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO: LaneId = [0, 0, 0, 1];
|
||||
impl XcmBlobHauler for ToBridgeHubWococoXcmBlobHauler {
|
||||
type SenderChain = bp_bridge_hub_rococo::BridgeHubRococo;
|
||||
type MessageSender = pallet_bridge_messages::Pallet<Runtime, WithBridgeHubWococoMessagesInstance>;
|
||||
|
||||
fn message_sender_origin() -> InteriorMultiLocation {
|
||||
crate::xcm_config::UniversalLocation::get()
|
||||
}
|
||||
|
||||
fn xcm_lane() -> LaneId {
|
||||
DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||
// This file is part of Cumulus.
|
||||
|
||||
// Cumulus 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.
|
||||
|
||||
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use bp_messages::{source_chain::{LaneMessageVerifier, TargetHeaderChain}, target_chain::{ProvedMessages, SourceHeaderChain}, InboundLaneData, LaneId, Message, OutboundLaneData, MessageKey, MessageData};
|
||||
use bp_runtime::{BalanceOf, Chain};
|
||||
use frame_support::{parameter_types, RuntimeDebug};
|
||||
use xcm::prelude::{InteriorMultiLocation, NetworkId};
|
||||
use bp_messages::target_chain::ProvedLaneMessages;
|
||||
use bridge_runtime_common::messages::target::FromBridgedChainMessagesProof;
|
||||
use crate::universal_exports::{BridgeBlobDispatcher, HaulBlobExporter};
|
||||
use crate::{WithBridgeHubRococoMessagesInstance, XcmAsPlainPayload, XcmBlobHauler, XcmRouter};
|
||||
use crate::Runtime;
|
||||
use crate::ParachainInfo;
|
||||
use xcm::latest::prelude::*;
|
||||
|
||||
// TODO:check-parameter
|
||||
parameter_types! {
|
||||
pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
|
||||
pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce =
|
||||
bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
|
||||
pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID;
|
||||
pub BridgeHubWococoUniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Wococo), Parachain(ParachainInfo::parachain_id().into()));
|
||||
pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo;
|
||||
}
|
||||
|
||||
/// Dispatches received XCM messages from other bridge
|
||||
pub type OnBridgeHubWococoBlobDispatcher = BridgeBlobDispatcher<XcmRouter, BridgeHubWococoUniversalLocation>;
|
||||
|
||||
/// Export XCM messages to be relayed to the otherside
|
||||
pub type ToBridgeHubRococoHaulBlobExporter = HaulBlobExporter<ToBridgeHubRococoXcmBlobHauler, RococoGlobalConsensusNetwork, ()>;
|
||||
pub struct ToBridgeHubRococoXcmBlobHauler;
|
||||
pub const DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO: LaneId = [0, 0, 0, 1];
|
||||
impl XcmBlobHauler for ToBridgeHubRococoXcmBlobHauler {
|
||||
type SenderChain = bp_bridge_hub_wococo::BridgeHubWococo;
|
||||
type MessageSender = pallet_bridge_messages::Pallet<Runtime, WithBridgeHubRococoMessagesInstance>;
|
||||
|
||||
fn message_sender_origin() -> InteriorMultiLocation {
|
||||
crate::xcm_config::UniversalLocation::get()
|
||||
}
|
||||
|
||||
fn xcm_lane() -> LaneId {
|
||||
DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,10 +22,13 @@
|
||||
#[cfg(feature = "std")]
|
||||
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
|
||||
|
||||
pub mod bridge_common_config;
|
||||
pub mod bridge_hub_rococo_config;
|
||||
pub mod bridge_hub_wococo_config;
|
||||
mod weights;
|
||||
pub mod xcm_config;
|
||||
mod bridge_config;
|
||||
|
||||
use bridge_common_config::*;
|
||||
use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases;
|
||||
use smallvec::smallvec;
|
||||
use sp_api::impl_runtime_apis;
|
||||
@@ -59,18 +62,20 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
|
||||
pub use sp_runtime::{MultiAddress, Perbill, Permill};
|
||||
use xcm_config::{XcmConfig, XcmOriginToTransactDispatchOrigin};
|
||||
|
||||
use bp_polkadot_core::parachains::ParaId;
|
||||
use bp_runtime::{HeaderId, HeaderIdProvider};
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
pub use sp_runtime::BuildStorage;
|
||||
|
||||
// Polkadot imports
|
||||
use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate};
|
||||
use sp_runtime::traits::ConstU32;
|
||||
|
||||
use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight};
|
||||
|
||||
// XCM Imports
|
||||
use crate::{
|
||||
bridge_hub_rococo_config::OnBridgeHubRococoBlobDispatcher,
|
||||
bridge_hub_wococo_config::OnBridgeHubWococoBlobDispatcher, xcm_config::XcmRouter,
|
||||
};
|
||||
use parachains_common::{AccountId, Signature};
|
||||
use xcm::latest::prelude::BodyId;
|
||||
use xcm_executor::XcmExecutor;
|
||||
@@ -238,11 +243,18 @@ pub fn native_version() -> NativeVersion {
|
||||
}
|
||||
|
||||
// TODO:check-parameter - move to bridges/primitives, once rebased and would compile with bp_bridge_hub_xyz dependencies
|
||||
mod runtime_api {
|
||||
use super::BlockNumber;
|
||||
use super::Hash;
|
||||
pub mod runtime_api {
|
||||
use super::{BlockNumber, Hash};
|
||||
bp_runtime::decl_bridge_finality_runtime_apis!(rococo);
|
||||
bp_runtime::decl_bridge_finality_runtime_apis!(wococo);
|
||||
|
||||
use bp_messages::{
|
||||
InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
|
||||
};
|
||||
use frame_support::{sp_runtime::FixedU128, Parameter};
|
||||
use sp_std::prelude::Vec;
|
||||
bp_runtime::decl_bridge_messages_runtime_apis!(bridge_hub_rococo);
|
||||
bp_runtime::decl_bridge_messages_runtime_apis!(bridge_hub_wococo);
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
@@ -412,11 +424,12 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime {
|
||||
type Event = Event;
|
||||
type XcmExecutor = XcmExecutor<XcmConfig>;
|
||||
type ChannelInfo = ParachainSystem;
|
||||
type VersionWrapper = ();
|
||||
type VersionWrapper = PolkadotXcm;
|
||||
type ExecuteOverweightOrigin = EnsureRoot<AccountId>;
|
||||
type ControllerOrigin = EnsureRoot<AccountId>;
|
||||
type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;
|
||||
type WeightInfo = ();
|
||||
type PriceForSiblingDelivery = ();
|
||||
type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo<Runtime>;
|
||||
}
|
||||
|
||||
impl cumulus_pallet_dmp_queue::Config for Runtime {
|
||||
@@ -485,12 +498,6 @@ impl pallet_sudo::Config for Runtime {
|
||||
}
|
||||
|
||||
// Add bridge pallets (GPA)
|
||||
parameter_types! {
|
||||
// TODO:check-parameter
|
||||
pub const MaxRequests: u32 = 64;
|
||||
// TODO:check-parameter
|
||||
pub const HeadersToKeep: u32 = 1024;
|
||||
}
|
||||
|
||||
/// Add granda bridge pallet to track Wococo relay chain on Rococo BridgeHub
|
||||
pub type BridgeGrandpaWococoInstance = pallet_bridge_grandpa::Instance1;
|
||||
@@ -523,9 +530,9 @@ parameter_types! {
|
||||
/// Add parachain bridge pallet to track Wococo bridge hub parachain
|
||||
pub type BridgeParachainWococoInstance = pallet_bridge_parachains::Instance1;
|
||||
impl pallet_bridge_parachains::Config<BridgeParachainWococoInstance> for Runtime {
|
||||
type Event = Event;
|
||||
// TODO:check-parameter
|
||||
type WeightInfo = ();
|
||||
type Event = Event;
|
||||
type BridgesGrandpaPalletInstance = BridgeGrandpaWococoInstance;
|
||||
type ParasPalletName = WococoBridgeParachainPalletName;
|
||||
type TrackedParachains = Everything;
|
||||
@@ -544,24 +551,25 @@ impl pallet_bridge_parachains::Config<BridgeParachainRococoInstance> for Runtime
|
||||
type HeadsToKeep = ParachainHeadsToKeep;
|
||||
}
|
||||
|
||||
/// Add XCM messages support for BrigdeHubRococo to support Wococo->Rococo XCM messages
|
||||
/// Add XCM messages support for BrigdeHubRococo to support Rococo->Wococo XCM messages
|
||||
pub type WithBridgeHubWococoMessagesInstance = pallet_bridge_messages::Instance1;
|
||||
impl pallet_bridge_messages::Config<WithBridgeHubWococoMessagesInstance> for Runtime {
|
||||
type Event = Event;
|
||||
// TODO:check-parameter - copy of MillauWeigth + refactor
|
||||
type WeightInfo = ();
|
||||
type BridgedChainId = bridge_config::BridgeHubWococoChainId;
|
||||
// TODO:check-parameter - do we need any conversion rate or what ever?
|
||||
type BridgedChainId = bridge_hub_rococo_config::BridgeHubWococoChainId;
|
||||
type Parameter = ();
|
||||
type MaxMessagesToPruneAtOnce = bridge_config::BridgeHubWococoMaxMessagesToPruneAtOnce;
|
||||
type MaxUnrewardedRelayerEntriesAtInboundLane = bridge_config::BridgeHubWococoMaxUnrewardedRelayerEntriesAtInboundLane;
|
||||
type MaxUnconfirmedMessagesAtInboundLane = bridge_config::BridgeHubWococoMaxUnconfirmedMessagesAtInboundLane;
|
||||
type MaxMessagesToPruneAtOnce = MaxMessagesToPruneAtOnce;
|
||||
type MaxUnrewardedRelayerEntriesAtInboundLane =
|
||||
bridge_hub_rococo_config::MaxUnrewardedRelayerEntriesAtInboundLane;
|
||||
type MaxUnconfirmedMessagesAtInboundLane =
|
||||
bridge_hub_rococo_config::MaxUnconfirmedMessagesAtInboundLane;
|
||||
|
||||
type MaximalOutboundPayloadSize = ();
|
||||
type OutboundPayload = bridge_config::ToBridgeHubWococoMessagePayload;
|
||||
type OutboundMessageFee = crate::Balance; /* bp_bridge_hub_rococo::Balance */
|
||||
type OutboundPayload = XcmAsPlainPayload;
|
||||
type OutboundMessageFee = crate::Balance; /* bp_bridge_hub_rococo::Balance */
|
||||
|
||||
type InboundPayload = bridge_config::FromBridgeHubWococoMessagePayload;
|
||||
type InboundPayload = XcmAsPlainPayload;
|
||||
type InboundMessageFee = crate::Balance; /* bp_bridge_hub_wococo::Balance */
|
||||
type InboundRelayer = crate::AccountId; /* bp_bridge_hub_wococo::AccountId */
|
||||
|
||||
@@ -573,27 +581,32 @@ impl pallet_bridge_messages::Config<WithBridgeHubWococoMessagesInstance> for Run
|
||||
type OnDeliveryConfirmed = ();
|
||||
|
||||
type SourceHeaderChain = bridge_config::BridgeHubWococoMessagingSupport;
|
||||
type MessageDispatch = bridge_config::FromBridgeHubWococoMessageDispatch<bp_bridge_hub_wococo::BridgeHubWococo, bp_bridge_hub_rococo::BridgeHubRococo>;
|
||||
type MessageDispatch = XcmBlobMessageDispatch<
|
||||
bp_bridge_hub_wococo::BridgeHubWococo,
|
||||
bp_bridge_hub_rococo::BridgeHubRococo,
|
||||
OnBridgeHubRococoBlobDispatcher,
|
||||
>;
|
||||
}
|
||||
|
||||
/// Add XCM messages support for BrigdeHubWococo to support Rococo->Wococo XCM messages
|
||||
/// Add XCM messages support for BrigdeHubWococo to support Wococo->Rococo XCM messages
|
||||
pub type WithBridgeHubRococoMessagesInstance = pallet_bridge_messages::Instance2;
|
||||
impl pallet_bridge_messages::Config<WithBridgeHubRococoMessagesInstance> for Runtime {
|
||||
type Event = Event;
|
||||
// TODO:check-parameter - copy of MillauWeigth + refactor
|
||||
type WeightInfo = ();
|
||||
type BridgedChainId = bridge_config::BridgeHubRococoChainId;
|
||||
// TODO:check-parameter - do we need any conversion rate or what ever?
|
||||
type BridgedChainId = bridge_hub_wococo_config::BridgeHubRococoChainId;
|
||||
type Parameter = ();
|
||||
type MaxMessagesToPruneAtOnce = bridge_config::BridgeHubRococoMaxMessagesToPruneAtOnce;
|
||||
type MaxUnrewardedRelayerEntriesAtInboundLane = bridge_config::BridgeHubRococoMaxUnrewardedRelayerEntriesAtInboundLane;
|
||||
type MaxUnconfirmedMessagesAtInboundLane = bridge_config::BridgeHubRococoMaxUnconfirmedMessagesAtInboundLane;
|
||||
type MaxMessagesToPruneAtOnce = MaxMessagesToPruneAtOnce;
|
||||
type MaxUnrewardedRelayerEntriesAtInboundLane =
|
||||
bridge_hub_wococo_config::MaxUnrewardedRelayerEntriesAtInboundLane;
|
||||
type MaxUnconfirmedMessagesAtInboundLane =
|
||||
bridge_hub_wococo_config::MaxUnconfirmedMessagesAtInboundLane;
|
||||
|
||||
type MaximalOutboundPayloadSize = ();
|
||||
type OutboundPayload = bridge_config::ToBridgeHubRococoMessagePayload;
|
||||
type OutboundMessageFee = crate::Balance; /* bp_bridge_hub_wococo::Balance */
|
||||
type OutboundPayload = XcmAsPlainPayload;
|
||||
type OutboundMessageFee = crate::Balance; /* bp_bridge_hub_wococo::Balance */
|
||||
|
||||
type InboundPayload = bridge_config::FromBridgeHubRococoMessagePayload;
|
||||
type InboundPayload = XcmAsPlainPayload;
|
||||
type InboundMessageFee = crate::Balance; /* bp_bridge_hub_rococo::Balance */
|
||||
type InboundRelayer = crate::AccountId; /* bp_bridge_hub_rococo::AccountId */
|
||||
|
||||
@@ -605,7 +618,11 @@ impl pallet_bridge_messages::Config<WithBridgeHubRococoMessagesInstance> for Run
|
||||
type OnDeliveryConfirmed = ();
|
||||
|
||||
type SourceHeaderChain = bridge_config::BridgeHubRococoMessagingSupport;
|
||||
type MessageDispatch = bridge_config::FromBridgeHubRococoMessageDispatch<bp_bridge_hub_rococo::BridgeHubRococo, bp_bridge_hub_wococo::BridgeHubWococo>;
|
||||
type MessageDispatch = XcmBlobMessageDispatch<
|
||||
bp_bridge_hub_rococo::BridgeHubRococo,
|
||||
bp_bridge_hub_wococo::BridgeHubWococo,
|
||||
OnBridgeHubWococoBlobDispatcher,
|
||||
>;
|
||||
}
|
||||
|
||||
/// Add shift session manager
|
||||
@@ -796,6 +813,41 @@ impl_runtime_apis! {
|
||||
}
|
||||
}
|
||||
|
||||
// This exposed by BridgeHubRococo
|
||||
impl runtime_api::ToBridgeHubWococoOutboundLaneApi<Block, Balance, XcmAsPlainPayload> for Runtime {
|
||||
fn estimate_message_delivery_and_dispatch_fee(
|
||||
_lane_id: bp_messages::LaneId,
|
||||
payload: XcmAsPlainPayload,
|
||||
_conversion_rate: Option<frame_support::sp_runtime::FixedU128>,
|
||||
) -> Option<Balance> {
|
||||
None
|
||||
}
|
||||
|
||||
fn message_details(
|
||||
lane: bp_messages::LaneId,
|
||||
begin: bp_messages::MessageNonce,
|
||||
end: bp_messages::MessageNonce,
|
||||
) -> Vec<bp_messages::OutboundMessageDetails<Balance>> {
|
||||
bridge_runtime_common::messages_api::outbound_message_details::<
|
||||
Runtime,
|
||||
WithBridgeHubWococoMessagesInstance,
|
||||
>(lane, begin, end)
|
||||
}
|
||||
}
|
||||
|
||||
// This is exposed by BridgeHubWococo
|
||||
impl runtime_api::FromBridgeHubRococoInboundLaneApi<Block, Balance> for Runtime {
|
||||
fn message_details(
|
||||
lane: bp_messages::LaneId,
|
||||
messages: Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails<Balance>)>,
|
||||
) -> Vec<bp_messages::InboundMessageDetails> {
|
||||
bridge_runtime_common::messages_api::inbound_message_details::<
|
||||
Runtime,
|
||||
WithBridgeHubRococoMessagesInstance,
|
||||
>(lane, messages)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "try-runtime")]
|
||||
impl frame_try_runtime::TryRuntime<Block> for Runtime {
|
||||
fn on_runtime_upgrade() -> (Weight, Weight) {
|
||||
|
||||
@@ -15,15 +15,18 @@
|
||||
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use super::{
|
||||
AccountId, Balance, Balances, Call, Event, Origin, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime,
|
||||
XcmpQueue,
|
||||
AccountId, Balance, Balances, Call, Event, Origin, ParachainInfo, ParachainSystem, PolkadotXcm,
|
||||
Runtime, XcmpQueue,
|
||||
};
|
||||
use crate::{
|
||||
bridge_hub_rococo_config::ToBridgeHubWococoHaulBlobExporter,
|
||||
bridge_hub_wococo_config::ToBridgeHubRococoHaulBlobExporter,
|
||||
};
|
||||
use frame_support::{
|
||||
match_types, parameter_types,
|
||||
traits::{Everything, Nothing},
|
||||
weights::Weight,
|
||||
weights::{IdentityFee, Weight},
|
||||
};
|
||||
use frame_support::weights::IdentityFee;
|
||||
use pallet_xcm::XcmPassthrough;
|
||||
use polkadot_parachain::primitives::Sibling;
|
||||
use xcm::latest::prelude::*;
|
||||
@@ -34,7 +37,7 @@ use xcm_builder::{
|
||||
SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
|
||||
UsingComponents,
|
||||
};
|
||||
use xcm_executor::XcmExecutor;
|
||||
use xcm_executor::{traits::ExportXcm, XcmExecutor};
|
||||
|
||||
parameter_types! {
|
||||
pub const RelayLocation: MultiLocation = MultiLocation::parent();
|
||||
@@ -192,6 +195,8 @@ pub type Barrier = (
|
||||
TakeWeightCredit,
|
||||
AllowTopLevelPaidExecutionFrom<Everything>,
|
||||
AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
|
||||
// TODO:check-parameter - supporting unpaid execution at first then SovereignPaid
|
||||
AllowUnpaidExecutionFrom<Everything>,
|
||||
// ^^^ Parent & its unit plurality gets free execution
|
||||
);
|
||||
|
||||
@@ -219,7 +224,7 @@ impl xcm_executor::Config for XcmConfig {
|
||||
type AssetLocker = ();
|
||||
type AssetExchanger = ();
|
||||
type FeeManager = ();
|
||||
type MessageExporter = ();
|
||||
type MessageExporter = BridgeHubRococoOrBridgeHubWococoSwitchExporter;
|
||||
type UniversalAliases = Nothing;
|
||||
type CallDispatcher = Call;
|
||||
}
|
||||
@@ -231,32 +236,11 @@ pub type LocalOriginToLocation = SignedToAccountId32<Origin, AccountId, RelayNet
|
||||
/// queues.
|
||||
pub type XcmRouter = (
|
||||
// Two routers - use UMP to communicate with the relay chain:
|
||||
cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,
|
||||
cumulus_primitives_utility::ParentAsUmp<ParachainSystem, PolkadotXcm, ()>,
|
||||
// ..and XCMP to communicate with the sibling chains.
|
||||
XcmpQueue,
|
||||
);
|
||||
|
||||
// TODO: hacked
|
||||
// impl pallet_xcm::Config for Runtime {
|
||||
// type Event = Event;
|
||||
// type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
|
||||
// type XcmRouter = XcmRouter;
|
||||
// type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
|
||||
// type XcmExecuteFilter = Nothing;
|
||||
// // ^ Disable dispatchable execute on the XCM pallet.
|
||||
// // Needs to be `Everything` for local testing.
|
||||
// type XcmExecutor = XcmExecutor<XcmConfig>;
|
||||
// type XcmTeleportFilter = Everything;
|
||||
// type XcmReserveTransferFilter = Nothing;
|
||||
// type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;
|
||||
// type LocationInverter = LocationInverter<Ancestry>;
|
||||
// type Origin = Origin;
|
||||
// type Call = Call;
|
||||
//
|
||||
// const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
|
||||
// // ^ Override for AdvertisedXcmVersion default
|
||||
// type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
|
||||
// }
|
||||
impl pallet_xcm::Config for Runtime {
|
||||
type Event = Event;
|
||||
type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;
|
||||
@@ -283,3 +267,35 @@ impl cumulus_pallet_xcm::Config for Runtime {
|
||||
type Event = Event;
|
||||
type XcmExecutor = XcmExecutor<XcmConfig>;
|
||||
}
|
||||
|
||||
/// Hacky switch implementation, because we have just one runtime for Rococo and Wococo BridgeHub, so it means we have just one XcmConfig
|
||||
pub struct BridgeHubRococoOrBridgeHubWococoSwitchExporter;
|
||||
impl ExportXcm for BridgeHubRococoOrBridgeHubWococoSwitchExporter {
|
||||
type Ticket = (NetworkId, (sp_std::prelude::Vec<u8>, XcmHash));
|
||||
|
||||
fn validate(
|
||||
network: NetworkId,
|
||||
channel: u32,
|
||||
destination: &mut Option<InteriorMultiLocation>,
|
||||
message: &mut Option<Xcm<()>>,
|
||||
) -> SendResult<Self::Ticket> {
|
||||
match network {
|
||||
Rococo =>
|
||||
ToBridgeHubRococoHaulBlobExporter::validate(network, channel, destination, message)
|
||||
.map(|result| ((Rococo, result.0), result.1)),
|
||||
Wococo =>
|
||||
ToBridgeHubWococoHaulBlobExporter::validate(network, channel, destination, message)
|
||||
.map(|result| ((Wococo, result.0), result.1)),
|
||||
_ => unimplemented!("Unsupported network: {:?}", network),
|
||||
}
|
||||
}
|
||||
|
||||
fn deliver(ticket: Self::Ticket) -> Result<XcmHash, SendError> {
|
||||
let (network, ticket) = ticket;
|
||||
match network {
|
||||
Rococo => ToBridgeHubRococoHaulBlobExporter::deliver(ticket),
|
||||
Wococo => ToBridgeHubWococoHaulBlobExporter::deliver(ticket),
|
||||
_ => unimplemented!("Unsupported network: {:?}", network),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user