[BridgeHub] Init stuff for Haul/Dispatch xcm blobs

This commit is contained in:
Branislav Kontur
2022-10-25 16:41:10 +02:00
parent 990041a299
commit cc2a65369e
7 changed files with 393 additions and 325 deletions
@@ -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),
}
}
}