mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-17 10:11:03 +00:00
Merge bulletin chain changes into polkadot staging (#2574)
* polkadot-staging for v1.0.0 * Add polkadot bulletin chain primitives (#2542) * add polkadot bulletin chain primitives * also impl ChainWithMessages * clippy * instead of requiring sp_std::vec::Vec import when using runtime API generation macro, let's use full type path directly in macro (#2551) * Polkadot Bulletin Chain client (#2552) * relay-polkadot-bulletin-client * generate Polkadot Bulletin Chain Runtime * Add relays that will be used in Polkadot Bulletin <> Polkadot.BH bridge (#2556) * added Polkadot.BH <> Polkadot Bulletin chain relays * uncommented ED stuff * complex PolkadotBulletin <> Polkadot.BH relay * removed TODO * spelling * prepare refund extension infra to add refund extension for messages from standalone chain (#2558) * prepare refund extension infra to add refund extension for messages from standalone chain * spelling * apply adapter to fix compilation * clippy * added POLKADOT_BULLETIN_CHAIN_ID constant * RefundBridgedGrandpaMessages to refund transaction costs for messages coming to/from bridged standalone/relay chain (#2566) * RefundBridgedGrandpaMessages to refund transaction costs for messages coming to/from bridged standalone/relay chain * clippy * fix compilation * fix codec dependency (#2567) * Support message relay limits override (#2570) * support message relay limits overrides for bridges * spelling * export EXTRA_STORAGE_PROOF_SIZE for Polkadot Bulletin (#2572)
This commit is contained in:
committed by
Bastian Köcher
parent
4cd9e2fe79
commit
0bbd2b20a2
@@ -88,8 +88,8 @@ pub use pallet_xcm::Call as XcmCall;
|
|||||||
use bridge_runtime_common::{
|
use bridge_runtime_common::{
|
||||||
generate_bridge_reject_obsolete_headers_and_messages,
|
generate_bridge_reject_obsolete_headers_and_messages,
|
||||||
refund_relayer_extension::{
|
refund_relayer_extension::{
|
||||||
ActualFeeRefund, RefundBridgedParachainMessages, RefundableMessagesLane,
|
ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter,
|
||||||
RefundableParachain,
|
RefundableMessagesLane, RefundableParachain,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#[cfg(any(feature = "std", test))]
|
#[cfg(any(feature = "std", test))]
|
||||||
@@ -625,13 +625,15 @@ generate_bridge_reject_obsolete_headers_and_messages! {
|
|||||||
bp_runtime::generate_static_str_provider!(BridgeRefundRialtoPara2000Lane0Msgs);
|
bp_runtime::generate_static_str_provider!(BridgeRefundRialtoPara2000Lane0Msgs);
|
||||||
/// Signed extension that refunds relayers that are delivering messages from the Rialto parachain.
|
/// Signed extension that refunds relayers that are delivering messages from the Rialto parachain.
|
||||||
pub type PriorityBoostPerMessage = ConstU64<324_316_715>;
|
pub type PriorityBoostPerMessage = ConstU64<324_316_715>;
|
||||||
pub type BridgeRefundRialtoParachainMessages = RefundBridgedParachainMessages<
|
pub type BridgeRefundRialtoParachainMessages = RefundSignedExtensionAdapter<
|
||||||
Runtime,
|
RefundBridgedParachainMessages<
|
||||||
RefundableParachain<WithRialtoParachainsInstance, bp_rialto_parachain::RialtoParachain>,
|
Runtime,
|
||||||
RefundableMessagesLane<WithRialtoParachainMessagesInstance, RialtoParachainMessagesLane>,
|
RefundableParachain<WithRialtoParachainsInstance, bp_rialto_parachain::RialtoParachain>,
|
||||||
ActualFeeRefund<Runtime>,
|
RefundableMessagesLane<WithRialtoParachainMessagesInstance, RialtoParachainMessagesLane>,
|
||||||
PriorityBoostPerMessage,
|
ActualFeeRefund<Runtime>,
|
||||||
StrBridgeRefundRialtoPara2000Lane0Msgs,
|
PriorityBoostPerMessage,
|
||||||
|
StrBridgeRefundRialtoPara2000Lane0Msgs,
|
||||||
|
>,
|
||||||
>;
|
>;
|
||||||
|
|
||||||
/// The address format for describing accounts.
|
/// The address format for describing accounts.
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -29,7 +29,6 @@ use frame_support::{
|
|||||||
sp_runtime::{MultiAddress, MultiSigner},
|
sp_runtime::{MultiAddress, MultiSigner},
|
||||||
};
|
};
|
||||||
use sp_runtime::RuntimeDebug;
|
use sp_runtime::RuntimeDebug;
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// BridgeHubKusama parachain.
|
/// BridgeHubKusama parachain.
|
||||||
#[derive(RuntimeDebug)]
|
#[derive(RuntimeDebug)]
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ use bp_runtime::{
|
|||||||
};
|
};
|
||||||
use frame_support::dispatch::DispatchClass;
|
use frame_support::dispatch::DispatchClass;
|
||||||
use sp_runtime::RuntimeDebug;
|
use sp_runtime::RuntimeDebug;
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// BridgeHubPolkadot parachain.
|
/// BridgeHubPolkadot parachain.
|
||||||
#[derive(RuntimeDebug)]
|
#[derive(RuntimeDebug)]
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ use bp_runtime::{
|
|||||||
};
|
};
|
||||||
use frame_support::dispatch::DispatchClass;
|
use frame_support::dispatch::DispatchClass;
|
||||||
use sp_runtime::{MultiAddress, MultiSigner, RuntimeDebug};
|
use sp_runtime::{MultiAddress, MultiSigner, RuntimeDebug};
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
/// BridgeHubRococo parachain.
|
/// BridgeHubRococo parachain.
|
||||||
#[derive(RuntimeDebug)]
|
#[derive(RuntimeDebug)]
|
||||||
pub struct BridgeHubRococo;
|
pub struct BridgeHubRococo;
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ use bp_runtime::{
|
|||||||
};
|
};
|
||||||
use frame_support::dispatch::DispatchClass;
|
use frame_support::dispatch::DispatchClass;
|
||||||
use sp_runtime::RuntimeDebug;
|
use sp_runtime::RuntimeDebug;
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// BridgeHubWococo parachain.
|
/// BridgeHubWococo parachain.
|
||||||
#[derive(RuntimeDebug)]
|
#[derive(RuntimeDebug)]
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ pub use bp_polkadot_core::*;
|
|||||||
use bp_header_chain::ChainWithGrandpa;
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
use bp_runtime::{decl_bridge_finality_runtime_apis, Chain};
|
use bp_runtime::{decl_bridge_finality_runtime_apis, Chain};
|
||||||
use frame_support::weights::Weight;
|
use frame_support::weights::Weight;
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// Kusama Chain
|
/// Kusama Chain
|
||||||
pub struct Kusama;
|
pub struct Kusama;
|
||||||
|
|||||||
@@ -22,9 +22,7 @@ mod millau_hash;
|
|||||||
|
|
||||||
use bp_beefy::ChainWithBeefy;
|
use bp_beefy::ChainWithBeefy;
|
||||||
use bp_header_chain::ChainWithGrandpa;
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
use bp_messages::{
|
use bp_messages::MessageNonce;
|
||||||
InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
|
|
||||||
};
|
|
||||||
use bp_runtime::{decl_bridge_finality_runtime_apis, decl_bridge_runtime_apis, Chain};
|
use bp_runtime::{decl_bridge_finality_runtime_apis, decl_bridge_runtime_apis, Chain};
|
||||||
use frame_support::{
|
use frame_support::{
|
||||||
dispatch::DispatchClass,
|
dispatch::DispatchClass,
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
[package]
|
||||||
|
name = "bp-polkadot-bulletin"
|
||||||
|
description = "Primitives of Polkadot Bulletin chain runtime."
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
edition = "2021"
|
||||||
|
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] }
|
||||||
|
scale-info = { version = "2.9.0", default-features = false, features = ["derive"] }
|
||||||
|
|
||||||
|
# Bridge Dependencies
|
||||||
|
|
||||||
|
bp-header-chain = { path = "../header-chain", default-features = false }
|
||||||
|
bp-messages = { path = "../messages", default-features = false }
|
||||||
|
bp-polkadot-core = { path = "../polkadot-core", default-features = false }
|
||||||
|
bp-runtime = { path = "../runtime", default-features = false }
|
||||||
|
|
||||||
|
# Substrate Based Dependencies
|
||||||
|
|
||||||
|
frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
|
||||||
|
frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
|
||||||
|
sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
|
||||||
|
sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
|
||||||
|
sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["std"]
|
||||||
|
std = [
|
||||||
|
"bp-header-chain/std",
|
||||||
|
"bp-messages/std",
|
||||||
|
"bp-polkadot-core/std",
|
||||||
|
"bp-runtime/std",
|
||||||
|
"codec/std",
|
||||||
|
"frame-support/std",
|
||||||
|
"frame-system/std",
|
||||||
|
"sp-api/std",
|
||||||
|
"sp-runtime/std",
|
||||||
|
"sp-std/std",
|
||||||
|
]
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Polkadot Bulletin Chain primitives.
|
||||||
|
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
|
||||||
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
|
use bp_messages::MessageNonce;
|
||||||
|
use bp_runtime::{
|
||||||
|
decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis,
|
||||||
|
extensions::{
|
||||||
|
CheckEra, CheckGenesis, CheckNonZeroSender, CheckNonce, CheckSpecVersion, CheckTxVersion,
|
||||||
|
CheckWeight, GenericSignedExtension, GenericSignedExtensionSchema,
|
||||||
|
},
|
||||||
|
Chain, TransactionEra,
|
||||||
|
};
|
||||||
|
use codec::{Decode, Encode};
|
||||||
|
use frame_support::{
|
||||||
|
dispatch::DispatchClass,
|
||||||
|
parameter_types,
|
||||||
|
weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight},
|
||||||
|
};
|
||||||
|
use frame_system::limits;
|
||||||
|
use scale_info::TypeInfo;
|
||||||
|
use sp_runtime::{traits::DispatchInfoOf, transaction_validity::TransactionValidityError, Perbill};
|
||||||
|
|
||||||
|
// This chain reuses most of Polkadot primitives.
|
||||||
|
pub use bp_polkadot_core::{
|
||||||
|
AccountAddress, AccountId, Balance, Block, BlockNumber, Hash, Hasher, Header, Nonce, Signature,
|
||||||
|
SignedBlock, UncheckedExtrinsic, AVERAGE_HEADER_SIZE_IN_JUSTIFICATION,
|
||||||
|
EXTRA_STORAGE_PROOF_SIZE, MAX_HEADER_SIZE, REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Maximal number of GRANDPA authorities at Polkadot Bulletin chain.
|
||||||
|
pub const MAX_AUTHORITIES_COUNT: u32 = 100;
|
||||||
|
|
||||||
|
/// Name of the With-Polkadot Bulletin chain GRANDPA pallet instance that is deployed at bridged
|
||||||
|
/// chains.
|
||||||
|
pub const WITH_POLKADOT_BULLETIN_GRANDPA_PALLET_NAME: &str = "BridgePolkadotBulletinGrandpa";
|
||||||
|
/// Name of the With-Polkadot Bulletin chain messages pallet instance that is deployed at bridged
|
||||||
|
/// chains.
|
||||||
|
pub const WITH_POLKADOT_BULLETIN_MESSAGES_PALLET_NAME: &str = "BridgePolkadotBulletinMessages";
|
||||||
|
|
||||||
|
// There are fewer system operations on this chain (e.g. staking, governance, etc.). Use a higher
|
||||||
|
// percentage of the block for data storage.
|
||||||
|
const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(90);
|
||||||
|
|
||||||
|
// Re following constants - we are using the same values at Cumulus parachains. They are limited
|
||||||
|
// by the maximal transaction weight/size. Since block limits at Bulletin Chain are larger than
|
||||||
|
// at the Cumulus Bridgeg Hubs, we could reuse the same values.
|
||||||
|
|
||||||
|
/// Maximal number of unrewarded relayer entries at inbound lane for Cumulus-based parachains.
|
||||||
|
pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024;
|
||||||
|
|
||||||
|
/// Maximal number of unconfirmed messages at inbound lane for Cumulus-based parachains.
|
||||||
|
pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096;
|
||||||
|
|
||||||
|
/// This signed extension is used to ensure that the chain transactions are signed by proper
|
||||||
|
pub type ValidateSigned = GenericSignedExtensionSchema<(), ()>;
|
||||||
|
|
||||||
|
/// Signed extension schema, used by Polkadot Bulletin.
|
||||||
|
pub type SignedExtensionSchema = GenericSignedExtension<(
|
||||||
|
(
|
||||||
|
CheckNonZeroSender,
|
||||||
|
CheckSpecVersion,
|
||||||
|
CheckTxVersion,
|
||||||
|
CheckGenesis<Hash>,
|
||||||
|
CheckEra<Hash>,
|
||||||
|
CheckNonce<Nonce>,
|
||||||
|
CheckWeight,
|
||||||
|
),
|
||||||
|
ValidateSigned,
|
||||||
|
)>;
|
||||||
|
|
||||||
|
/// Signed extension, used by Polkadot Bulletin.
|
||||||
|
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
|
||||||
|
pub struct SignedExtension(SignedExtensionSchema);
|
||||||
|
|
||||||
|
impl sp_runtime::traits::SignedExtension for SignedExtension {
|
||||||
|
const IDENTIFIER: &'static str = "Not needed.";
|
||||||
|
type AccountId = ();
|
||||||
|
type Call = ();
|
||||||
|
type AdditionalSigned =
|
||||||
|
<SignedExtensionSchema as sp_runtime::traits::SignedExtension>::AdditionalSigned;
|
||||||
|
type Pre = ();
|
||||||
|
|
||||||
|
fn additional_signed(&self) -> Result<Self::AdditionalSigned, TransactionValidityError> {
|
||||||
|
self.0.additional_signed()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pre_dispatch(
|
||||||
|
self,
|
||||||
|
_who: &Self::AccountId,
|
||||||
|
_call: &Self::Call,
|
||||||
|
_info: &DispatchInfoOf<Self::Call>,
|
||||||
|
_len: usize,
|
||||||
|
) -> Result<Self::Pre, TransactionValidityError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SignedExtension {
|
||||||
|
/// Create signed extension from its components.
|
||||||
|
pub fn from_params(
|
||||||
|
spec_version: u32,
|
||||||
|
transaction_version: u32,
|
||||||
|
era: TransactionEra<BlockNumber, Hash>,
|
||||||
|
genesis_hash: Hash,
|
||||||
|
nonce: Nonce,
|
||||||
|
) -> Self {
|
||||||
|
Self(GenericSignedExtension::new(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(), // non-zero sender
|
||||||
|
(), // spec version
|
||||||
|
(), // tx version
|
||||||
|
(), // genesis
|
||||||
|
era.frame_era(), // era
|
||||||
|
nonce.into(), // nonce (compact encoding)
|
||||||
|
(), // Check weight
|
||||||
|
),
|
||||||
|
(),
|
||||||
|
),
|
||||||
|
Some((
|
||||||
|
(
|
||||||
|
(),
|
||||||
|
spec_version,
|
||||||
|
transaction_version,
|
||||||
|
genesis_hash,
|
||||||
|
era.signed_payload(genesis_hash),
|
||||||
|
(),
|
||||||
|
(),
|
||||||
|
),
|
||||||
|
(),
|
||||||
|
)),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return transaction nonce.
|
||||||
|
pub fn nonce(&self) -> Nonce {
|
||||||
|
let common_payload = self.0.payload.0;
|
||||||
|
common_payload.5 .0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parameter_types! {
|
||||||
|
/// We allow for 2 seconds of compute with a 6 second average block time.
|
||||||
|
pub BlockWeights: limits::BlockWeights = limits::BlockWeights::with_sensible_defaults(
|
||||||
|
Weight::from_parts(2u64 * WEIGHT_REF_TIME_PER_SECOND, u64::MAX),
|
||||||
|
NORMAL_DISPATCH_RATIO,
|
||||||
|
);
|
||||||
|
// Note: Max transaction size is 8 MB. Set max block size to 10 MB to facilitate data storage.
|
||||||
|
// This is double the "normal" Relay Chain block length limit.
|
||||||
|
/// Maximal block length at Polkadot Bulletin chain.
|
||||||
|
pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio(
|
||||||
|
10 * 1024 * 1024,
|
||||||
|
NORMAL_DISPATCH_RATIO,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Polkadot Bulletin Chain declaration.
|
||||||
|
pub struct PolkadotBulletin;
|
||||||
|
|
||||||
|
impl Chain for PolkadotBulletin {
|
||||||
|
type BlockNumber = BlockNumber;
|
||||||
|
type Hash = Hash;
|
||||||
|
type Hasher = Hasher;
|
||||||
|
type Header = Header;
|
||||||
|
|
||||||
|
type AccountId = AccountId;
|
||||||
|
// The Bulletin Chain is a permissioned blockchain without any balances. Our `Chain` trait
|
||||||
|
// requires balance type, which is then used by various bridge infrastructure code. However
|
||||||
|
// this code is optional and we are not planning to use it in our bridge.
|
||||||
|
type Balance = Balance;
|
||||||
|
type Nonce = Nonce;
|
||||||
|
type Signature = Signature;
|
||||||
|
|
||||||
|
fn max_extrinsic_size() -> u32 {
|
||||||
|
*BlockLength::get().max.get(DispatchClass::Normal)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn max_extrinsic_weight() -> Weight {
|
||||||
|
BlockWeights::get()
|
||||||
|
.get(DispatchClass::Normal)
|
||||||
|
.max_extrinsic
|
||||||
|
.unwrap_or(Weight::MAX)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChainWithGrandpa for PolkadotBulletin {
|
||||||
|
const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_BULLETIN_GRANDPA_PALLET_NAME;
|
||||||
|
const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT;
|
||||||
|
const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 =
|
||||||
|
REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY;
|
||||||
|
const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE;
|
||||||
|
const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
decl_bridge_finality_runtime_apis!(polkadot_bulletin, grandpa);
|
||||||
|
decl_bridge_messages_runtime_apis!(polkadot_bulletin);
|
||||||
@@ -23,7 +23,6 @@ pub use bp_polkadot_core::*;
|
|||||||
use bp_header_chain::ChainWithGrandpa;
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
use bp_runtime::{decl_bridge_finality_runtime_apis, extensions::PrevalidateAttests, Chain};
|
use bp_runtime::{decl_bridge_finality_runtime_apis, extensions::PrevalidateAttests, Chain};
|
||||||
use frame_support::weights::Weight;
|
use frame_support::weights::Weight;
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// Polkadot Chain
|
/// Polkadot Chain
|
||||||
pub struct Polkadot;
|
pub struct Polkadot;
|
||||||
|
|||||||
@@ -18,9 +18,7 @@
|
|||||||
// RuntimeApi generated functions
|
// RuntimeApi generated functions
|
||||||
#![allow(clippy::too_many_arguments)]
|
#![allow(clippy::too_many_arguments)]
|
||||||
|
|
||||||
use bp_messages::{
|
use bp_messages::MessageNonce;
|
||||||
InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
|
|
||||||
};
|
|
||||||
use bp_runtime::{decl_bridge_runtime_apis, Chain, Parachain};
|
use bp_runtime::{decl_bridge_runtime_apis, Chain, Parachain};
|
||||||
use frame_support::{
|
use frame_support::{
|
||||||
dispatch::DispatchClass,
|
dispatch::DispatchClass,
|
||||||
@@ -32,7 +30,6 @@ use sp_runtime::{
|
|||||||
traits::{BlakeTwo256, IdentifyAccount, Verify},
|
traits::{BlakeTwo256, IdentifyAccount, Verify},
|
||||||
MultiSignature, MultiSigner, Perbill, RuntimeDebug,
|
MultiSignature, MultiSigner, Perbill, RuntimeDebug,
|
||||||
};
|
};
|
||||||
use sp_std::vec::Vec;
|
|
||||||
|
|
||||||
/// Identifier of RialtoParachain in the Rialto relay chain.
|
/// Identifier of RialtoParachain in the Rialto relay chain.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -19,9 +19,7 @@
|
|||||||
#![allow(clippy::too_many_arguments)]
|
#![allow(clippy::too_many_arguments)]
|
||||||
|
|
||||||
use bp_header_chain::ChainWithGrandpa;
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
use bp_messages::{
|
use bp_messages::MessageNonce;
|
||||||
InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
|
|
||||||
};
|
|
||||||
use bp_runtime::{decl_bridge_finality_runtime_apis, decl_bridge_runtime_apis, Chain};
|
use bp_runtime::{decl_bridge_finality_runtime_apis, decl_bridge_runtime_apis, Chain};
|
||||||
use frame_support::{
|
use frame_support::{
|
||||||
dispatch::DispatchClass,
|
dispatch::DispatchClass,
|
||||||
@@ -33,7 +31,6 @@ use sp_runtime::{
|
|||||||
traits::{BlakeTwo256, IdentifyAccount, Verify},
|
traits::{BlakeTwo256, IdentifyAccount, Verify},
|
||||||
MultiSignature, MultiSigner, Perbill, RuntimeDebug,
|
MultiSignature, MultiSigner, Perbill, RuntimeDebug,
|
||||||
};
|
};
|
||||||
use sp_std::prelude::*;
|
|
||||||
|
|
||||||
/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at
|
/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at
|
||||||
/// Rialto chain. This mostly depends on number of entries (and their density) in the storage trie.
|
/// Rialto chain. This mostly depends on number of entries (and their density) in the storage trie.
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ pub use bp_polkadot_core::*;
|
|||||||
use bp_header_chain::ChainWithGrandpa;
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
use bp_runtime::{decl_bridge_finality_runtime_apis, Chain};
|
use bp_runtime::{decl_bridge_finality_runtime_apis, Chain};
|
||||||
use frame_support::{parameter_types, weights::Weight};
|
use frame_support::{parameter_types, weights::Weight};
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// Rococo Chain
|
/// Rococo Chain
|
||||||
pub struct Rococo;
|
pub struct Rococo;
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ pub use bp_rococo::{
|
|||||||
use bp_header_chain::ChainWithGrandpa;
|
use bp_header_chain::ChainWithGrandpa;
|
||||||
use bp_runtime::{decl_bridge_finality_runtime_apis, Chain};
|
use bp_runtime::{decl_bridge_finality_runtime_apis, Chain};
|
||||||
use frame_support::weights::Weight;
|
use frame_support::weights::Weight;
|
||||||
use sp_std::prelude::Vec;
|
|
||||||
|
|
||||||
/// Wococo Chain
|
/// Wococo Chain
|
||||||
pub struct Wococo;
|
pub struct Wococo;
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ macro_rules! decl_bridge_finality_runtime_apis {
|
|||||||
$(
|
$(
|
||||||
/// Returns the justifications accepted in the current block.
|
/// Returns the justifications accepted in the current block.
|
||||||
fn [<synced_headers_ $consensus:lower _info>](
|
fn [<synced_headers_ $consensus:lower _info>](
|
||||||
) -> Vec<$justification_type>;
|
) -> sp_std::vec::Vec<$justification_type>;
|
||||||
)?
|
)?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -360,10 +360,10 @@ macro_rules! decl_bridge_messages_runtime_apis {
|
|||||||
/// If some (or all) messages are missing from the storage, they'll also will
|
/// If some (or all) messages are missing from the storage, they'll also will
|
||||||
/// be missing from the resulting vector. The vector is ordered by the nonce.
|
/// be missing from the resulting vector. The vector is ordered by the nonce.
|
||||||
fn message_details(
|
fn message_details(
|
||||||
lane: LaneId,
|
lane: bp_messages::LaneId,
|
||||||
begin: MessageNonce,
|
begin: bp_messages::MessageNonce,
|
||||||
end: MessageNonce,
|
end: bp_messages::MessageNonce,
|
||||||
) -> Vec<OutboundMessageDetails>;
|
) -> sp_std::vec::Vec<bp_messages::OutboundMessageDetails>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inbound message lane API for messages sent by this chain.
|
/// Inbound message lane API for messages sent by this chain.
|
||||||
@@ -376,9 +376,9 @@ macro_rules! decl_bridge_messages_runtime_apis {
|
|||||||
pub trait [<From $chain:camel InboundLaneApi>] {
|
pub trait [<From $chain:camel InboundLaneApi>] {
|
||||||
/// Return details of given inbound messages.
|
/// Return details of given inbound messages.
|
||||||
fn message_details(
|
fn message_details(
|
||||||
lane: LaneId,
|
lane: bp_messages::LaneId,
|
||||||
messages: Vec<(MessagePayload, OutboundMessageDetails)>,
|
messages: sp_std::vec::Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>,
|
||||||
) -> Vec<InboundMessageDetails>;
|
) -> sp_std::vec::Vec<bp_messages::InboundMessageDetails>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,9 @@ pub const MILLAU_CHAIN_ID: ChainId = *b"mlau";
|
|||||||
/// Polkadot chain id.
|
/// Polkadot chain id.
|
||||||
pub const POLKADOT_CHAIN_ID: ChainId = *b"pdot";
|
pub const POLKADOT_CHAIN_ID: ChainId = *b"pdot";
|
||||||
|
|
||||||
|
/// Polkadot Bulletin chain id.
|
||||||
|
pub const POLKADOT_BULLETIN_CHAIN_ID: ChainId = *b"pdbc";
|
||||||
|
|
||||||
/// Kusama chain id.
|
/// Kusama chain id.
|
||||||
pub const KUSAMA_CHAIN_ID: ChainId = *b"ksma";
|
pub const KUSAMA_CHAIN_ID: ChainId = *b"ksma";
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ bp-header-chain = { path = "../../primitives/header-chain" }
|
|||||||
bp-messages = { path = "../../primitives/messages" }
|
bp-messages = { path = "../../primitives/messages" }
|
||||||
bp-parachains = { path = "../../primitives/parachains" }
|
bp-parachains = { path = "../../primitives/parachains" }
|
||||||
bp-millau = { path = "../../primitives/chain-millau" }
|
bp-millau = { path = "../../primitives/chain-millau" }
|
||||||
|
bp-polkadot-bulletin = { path = "../../primitives/chain-polkadot-bulletin" }
|
||||||
bp-polkadot-core = { path = "../../primitives/polkadot-core" }
|
bp-polkadot-core = { path = "../../primitives/polkadot-core" }
|
||||||
bp-rialto = { path = "../../primitives/chain-rialto" }
|
bp-rialto = { path = "../../primitives/chain-rialto" }
|
||||||
bp-rialto-parachain = { path = "../../primitives/chain-rialto-parachain" }
|
bp-rialto-parachain = { path = "../../primitives/chain-rialto-parachain" }
|
||||||
@@ -43,6 +44,7 @@ relay-bridge-hub-rococo-client = { path = "../client-bridge-hub-rococo" }
|
|||||||
relay-bridge-hub-wococo-client = { path = "../client-bridge-hub-wococo" }
|
relay-bridge-hub-wococo-client = { path = "../client-bridge-hub-wococo" }
|
||||||
relay-kusama-client = { path = "../client-kusama" }
|
relay-kusama-client = { path = "../client-kusama" }
|
||||||
relay-polkadot-client = { path = "../client-polkadot" }
|
relay-polkadot-client = { path = "../client-polkadot" }
|
||||||
|
relay-polkadot-bulletin-client = { path = "../client-polkadot-bulletin" }
|
||||||
relay-rococo-client = { path = "../client-rococo" }
|
relay-rococo-client = { path = "../client-rococo" }
|
||||||
relay-substrate-client = { path = "../client-substrate" }
|
relay-substrate-client = { path = "../client-substrate" }
|
||||||
relay-utils = { path = "../utils" }
|
relay-utils = { path = "../utils" }
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
//! Declaration of all bridges that the relay is able to serve.
|
//! Declaration of all bridges that the relay is able to serve.
|
||||||
|
|
||||||
pub mod kusama_polkadot;
|
pub mod kusama_polkadot;
|
||||||
|
pub mod polkadot_bulletin;
|
||||||
pub mod rialto_millau;
|
pub mod rialto_millau;
|
||||||
pub mod rialto_parachain_millau;
|
pub mod rialto_parachain_millau;
|
||||||
pub mod rococo_wococo;
|
pub mod rococo_wococo;
|
||||||
|
|||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! BridgeHubPolkadot-to-PolkadotBulletin messages sync entrypoint.
|
||||||
|
|
||||||
|
use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge};
|
||||||
|
use relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
use relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder};
|
||||||
|
|
||||||
|
/// BridgeHubPolkadot-to-PolkadotBulletin messages bridge.
|
||||||
|
pub struct BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge {}
|
||||||
|
|
||||||
|
impl CliBridgeBase for BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge {
|
||||||
|
type Source = BridgeHubPolkadot;
|
||||||
|
type Target = PolkadotBulletin;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessagesCliBridge for BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge {
|
||||||
|
type MessagesLane = BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane;
|
||||||
|
}
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_receive_message_proof_call_builder!(
|
||||||
|
BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane,
|
||||||
|
BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesProofCallBuilder,
|
||||||
|
relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotBridgeHubMessages,
|
||||||
|
relay_polkadot_bulletin_client::BridgePolkadotBridgeHubMessagesCall::receive_messages_proof
|
||||||
|
);
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!(
|
||||||
|
BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane,
|
||||||
|
BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesDeliveryProofCallBuilder,
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinMessages,
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinMessagesCall::receive_messages_delivery_proof
|
||||||
|
);
|
||||||
|
|
||||||
|
/// BridgeHubPolkadot-to-PolkadotBulletin messages lane.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane;
|
||||||
|
|
||||||
|
impl SubstrateMessageLane for BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane {
|
||||||
|
type SourceChain = BridgeHubPolkadot;
|
||||||
|
type TargetChain = PolkadotBulletin;
|
||||||
|
|
||||||
|
type ReceiveMessagesProofCallBuilder =
|
||||||
|
BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesProofCallBuilder;
|
||||||
|
type ReceiveMessagesDeliveryProofCallBuilder =
|
||||||
|
BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesDeliveryProofCallBuilder;
|
||||||
|
|
||||||
|
type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder<BridgeHubPolkadot>;
|
||||||
|
type TargetBatchCallBuilder = ();
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
// Copyright 2019-2021 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Declaration of all bridges between Polkadot Bulletin Chain and Polkadot Bridge Hub.
|
||||||
|
|
||||||
|
pub mod bridge_hub_polkadot_messages_to_polkadot_bulletin;
|
||||||
|
pub mod polkadot_bulletin_headers_to_bridge_hub_polkadot;
|
||||||
|
pub mod polkadot_bulletin_messages_to_bridge_hub_polkadot;
|
||||||
|
pub mod polkadot_headers_to_polkadot_bulletin;
|
||||||
|
pub mod polkadot_parachains_to_polkadot_bulletin;
|
||||||
+101
@@ -0,0 +1,101 @@
|
|||||||
|
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! PolkadotBulletin-to-BridgeHubPolkadot headers sync entrypoint.
|
||||||
|
|
||||||
|
use crate::cli::bridge::{
|
||||||
|
CliBridgeBase, MessagesCliBridge, RelayToRelayEquivocationDetectionCliBridge,
|
||||||
|
RelayToRelayHeadersCliBridge,
|
||||||
|
};
|
||||||
|
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use relay_substrate_client::{AccountKeyPairOf, Client};
|
||||||
|
use substrate_relay_helper::{
|
||||||
|
equivocation::SubstrateEquivocationDetectionPipeline,
|
||||||
|
finality::SubstrateFinalitySyncPipeline,
|
||||||
|
finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline},
|
||||||
|
TransactionParams,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Description of `PolkadotBulletin` -> `PolkadotBridgeHub` finalized headers bridge.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct PolkadotBulletinFinalityToBridgeHubPolkadot;
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_submit_finality_proof_call_builder!(
|
||||||
|
PolkadotBulletinFinalityToBridgeHubPolkadot,
|
||||||
|
SubmitFinalityProofCallBuilder,
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinGrandpa,
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinGrandpaCall::submit_finality_proof
|
||||||
|
);
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_report_equivocation_call_builder!(
|
||||||
|
PolkadotBulletinFinalityToBridgeHubPolkadot,
|
||||||
|
ReportEquivocationCallBuilder,
|
||||||
|
relay_polkadot_bulletin_client::RuntimeCall::Grandpa,
|
||||||
|
relay_polkadot_bulletin_client::GrandpaCall::report_equivocation
|
||||||
|
);
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl SubstrateFinalityPipeline for PolkadotBulletinFinalityToBridgeHubPolkadot {
|
||||||
|
type SourceChain = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
type TargetChain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
|
||||||
|
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl SubstrateFinalitySyncPipeline for PolkadotBulletinFinalityToBridgeHubPolkadot {
|
||||||
|
type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder;
|
||||||
|
|
||||||
|
async fn start_relay_guards(
|
||||||
|
target_client: &Client<Self::TargetChain>,
|
||||||
|
_transaction_params: &TransactionParams<AccountKeyPairOf<Self::TargetChain>>,
|
||||||
|
enable_version_guard: bool,
|
||||||
|
) -> relay_substrate_client::Result<()> {
|
||||||
|
if enable_version_guard {
|
||||||
|
relay_substrate_client::guard::abort_on_spec_version_change(
|
||||||
|
target_client.clone(),
|
||||||
|
target_client.simple_runtime_version().await?.spec_version,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl SubstrateEquivocationDetectionPipeline for PolkadotBulletinFinalityToBridgeHubPolkadot {
|
||||||
|
type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `PolkadotBulletin` to BridgeHub `Polkadot` bridge definition.
|
||||||
|
pub struct PolkadotBulletinToBridgeHubPolkadotCliBridge {}
|
||||||
|
|
||||||
|
impl CliBridgeBase for PolkadotBulletinToBridgeHubPolkadotCliBridge {
|
||||||
|
type Source = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
type Target = relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RelayToRelayHeadersCliBridge for PolkadotBulletinToBridgeHubPolkadotCliBridge {
|
||||||
|
type Finality = PolkadotBulletinFinalityToBridgeHubPolkadot;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RelayToRelayEquivocationDetectionCliBridge for PolkadotBulletinToBridgeHubPolkadotCliBridge {
|
||||||
|
type Equivocation = PolkadotBulletinFinalityToBridgeHubPolkadot;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessagesCliBridge for PolkadotBulletinToBridgeHubPolkadotCliBridge {
|
||||||
|
type MessagesLane = crate::bridges::polkadot_bulletin::polkadot_bulletin_messages_to_bridge_hub_polkadot::PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane;
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! PolkadotBulletin-to-BridgeHubPolkadot messages sync entrypoint.
|
||||||
|
|
||||||
|
use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge};
|
||||||
|
use relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
use relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder};
|
||||||
|
|
||||||
|
/// PolkadotBulletin-to-BridgeHubPolkadot messages bridge.
|
||||||
|
pub struct PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge {}
|
||||||
|
|
||||||
|
impl CliBridgeBase for PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge {
|
||||||
|
type Source = PolkadotBulletin;
|
||||||
|
type Target = BridgeHubPolkadot;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessagesCliBridge for PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge {
|
||||||
|
type MessagesLane = PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane;
|
||||||
|
}
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_receive_message_proof_call_builder!(
|
||||||
|
PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane,
|
||||||
|
PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesProofCallBuilder,
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinMessages,
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinMessagesCall::receive_messages_proof
|
||||||
|
);
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!(
|
||||||
|
PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane,
|
||||||
|
PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesDeliveryProofCallBuilder,
|
||||||
|
relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotBridgeHubMessages,
|
||||||
|
relay_polkadot_bulletin_client::BridgePolkadotBridgeHubMessagesCall::receive_messages_delivery_proof
|
||||||
|
);
|
||||||
|
|
||||||
|
/// PolkadotBulletin-to-BridgeHubPolkadot messages lane.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane;
|
||||||
|
|
||||||
|
impl SubstrateMessageLane for PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane {
|
||||||
|
type SourceChain = PolkadotBulletin;
|
||||||
|
type TargetChain = BridgeHubPolkadot;
|
||||||
|
|
||||||
|
type ReceiveMessagesProofCallBuilder =
|
||||||
|
PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesProofCallBuilder;
|
||||||
|
type ReceiveMessagesDeliveryProofCallBuilder =
|
||||||
|
PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesDeliveryProofCallBuilder;
|
||||||
|
|
||||||
|
type SourceBatchCallBuilder = ();
|
||||||
|
type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder<BridgeHubPolkadot>;
|
||||||
|
}
|
||||||
+96
@@ -0,0 +1,96 @@
|
|||||||
|
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Polkadot-to-PolkadotBulletin headers sync entrypoint.
|
||||||
|
|
||||||
|
use crate::cli::bridge::{
|
||||||
|
CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge,
|
||||||
|
};
|
||||||
|
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use relay_substrate_client::{AccountKeyPairOf, Client};
|
||||||
|
use substrate_relay_helper::{
|
||||||
|
equivocation::SubstrateEquivocationDetectionPipeline,
|
||||||
|
finality::SubstrateFinalitySyncPipeline,
|
||||||
|
finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline},
|
||||||
|
TransactionParams,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Description of Polkadot -> `PolkadotBulletin` finalized headers bridge.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct PolkadotFinalityToPolkadotBulletin;
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_submit_finality_proof_call_builder!(
|
||||||
|
PolkadotFinalityToPolkadotBulletin,
|
||||||
|
SubmitFinalityProofCallBuilder,
|
||||||
|
relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotGrandpa,
|
||||||
|
relay_polkadot_bulletin_client::BridgePolkadotGrandpaCall::submit_finality_proof
|
||||||
|
);
|
||||||
|
|
||||||
|
substrate_relay_helper::generate_report_equivocation_call_builder!(
|
||||||
|
PolkadotFinalityToPolkadotBulletin,
|
||||||
|
ReportEquivocationCallBuilder,
|
||||||
|
relay_polkadot_client::RuntimeCall::Grandpa,
|
||||||
|
relay_polkadot_client::GrandpaCall::report_equivocation
|
||||||
|
);
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl SubstrateFinalityPipeline for PolkadotFinalityToPolkadotBulletin {
|
||||||
|
type SourceChain = relay_polkadot_client::Polkadot;
|
||||||
|
type TargetChain = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
|
||||||
|
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl SubstrateFinalitySyncPipeline for PolkadotFinalityToPolkadotBulletin {
|
||||||
|
type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder;
|
||||||
|
|
||||||
|
async fn start_relay_guards(
|
||||||
|
target_client: &Client<Self::TargetChain>,
|
||||||
|
_transaction_params: &TransactionParams<AccountKeyPairOf<Self::TargetChain>>,
|
||||||
|
enable_version_guard: bool,
|
||||||
|
) -> relay_substrate_client::Result<()> {
|
||||||
|
if enable_version_guard {
|
||||||
|
relay_substrate_client::guard::abort_on_spec_version_change(
|
||||||
|
target_client.clone(),
|
||||||
|
target_client.simple_runtime_version().await?.spec_version,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl SubstrateEquivocationDetectionPipeline for PolkadotFinalityToPolkadotBulletin {
|
||||||
|
type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Polkadot` to BridgeHub `PolkadotBulletin` bridge definition.
|
||||||
|
pub struct PolkadotToPolkadotBulletinCliBridge {}
|
||||||
|
|
||||||
|
impl CliBridgeBase for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type Source = relay_polkadot_client::Polkadot;
|
||||||
|
type Target = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RelayToRelayHeadersCliBridge for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type Finality = PolkadotFinalityToPolkadotBulletin;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RelayToRelayEquivocationDetectionCliBridge for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type Equivocation = PolkadotFinalityToPolkadotBulletin;
|
||||||
|
}
|
||||||
+92
@@ -0,0 +1,92 @@
|
|||||||
|
// Copyright 2019-2021 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Polkadot-to-PolkadotBulletin parachains sync entrypoint.
|
||||||
|
|
||||||
|
use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge};
|
||||||
|
|
||||||
|
use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId};
|
||||||
|
use bp_runtime::Chain;
|
||||||
|
use relay_substrate_client::{CallOf, HeaderIdOf};
|
||||||
|
use substrate_relay_helper::{
|
||||||
|
messages_lane::MessagesRelayLimits,
|
||||||
|
parachains::{SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline},
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Polkadot-to-PolkadotBulletin parachain sync description.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct PolkadotToPolkadotBulletin;
|
||||||
|
|
||||||
|
impl SubstrateParachainsPipeline for PolkadotToPolkadotBulletin {
|
||||||
|
type SourceParachain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
type SourceRelayChain = relay_polkadot_client::Polkadot;
|
||||||
|
type TargetChain = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
|
||||||
|
type SubmitParachainHeadsCallBuilder = PolkadotToPolkadotBulletinCallBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PolkadotToPolkadotBulletinCallBuilder;
|
||||||
|
impl SubmitParachainHeadsCallBuilder<PolkadotToPolkadotBulletin>
|
||||||
|
for PolkadotToPolkadotBulletinCallBuilder
|
||||||
|
{
|
||||||
|
fn build_submit_parachain_heads_call(
|
||||||
|
at_relay_block: HeaderIdOf<relay_polkadot_client::Polkadot>,
|
||||||
|
parachains: Vec<(ParaId, ParaHash)>,
|
||||||
|
parachain_heads_proof: ParaHeadsProof,
|
||||||
|
) -> CallOf<relay_polkadot_bulletin_client::PolkadotBulletin> {
|
||||||
|
relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotParachains(
|
||||||
|
relay_polkadot_bulletin_client::BridgePolkadotParachainsCall::submit_parachain_heads {
|
||||||
|
at_relay_block: (at_relay_block.0, at_relay_block.1),
|
||||||
|
parachains,
|
||||||
|
parachain_heads_proof,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Polkadot-to-PolkadotBulletin parachain sync description for the CLI.
|
||||||
|
pub struct PolkadotToPolkadotBulletinCliBridge {}
|
||||||
|
|
||||||
|
impl ParachainToRelayHeadersCliBridge for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type SourceRelay = relay_polkadot_client::Polkadot;
|
||||||
|
type ParachainFinality = PolkadotToPolkadotBulletin;
|
||||||
|
type RelayFinality =
|
||||||
|
crate::bridges::polkadot_bulletin::polkadot_headers_to_polkadot_bulletin::PolkadotFinalityToPolkadotBulletin;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CliBridgeBase for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type Source = relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
type Target = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessagesCliBridge for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type MessagesLane =
|
||||||
|
crate::bridges::polkadot_bulletin::bridge_hub_polkadot_messages_to_polkadot_bulletin::BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane;
|
||||||
|
|
||||||
|
fn maybe_messages_limits() -> Option<MessagesRelayLimits> {
|
||||||
|
// Polkadot Bulletin chain is missing the `TransactionPayment` runtime API (as well as the
|
||||||
|
// transaction payment pallet itself), so we can't estimate limits using runtime calls.
|
||||||
|
// Let's do it here.
|
||||||
|
//
|
||||||
|
// Folloiung constants are just safe **underestimations**. Normally, we are able to deliver
|
||||||
|
// and dispatch thousands of messages in the same transaction.
|
||||||
|
Some(MessagesRelayLimits {
|
||||||
|
max_messages_in_single_batch: 128,
|
||||||
|
max_messages_weight_in_single_batch:
|
||||||
|
bp_polkadot_bulletin::PolkadotBulletin::max_extrinsic_weight() / 20,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
mod kusama;
|
mod kusama;
|
||||||
mod millau;
|
mod millau;
|
||||||
mod polkadot;
|
mod polkadot;
|
||||||
|
mod polkadot_bulletin;
|
||||||
mod rialto;
|
mod rialto;
|
||||||
mod rialto_parachain;
|
mod rialto_parachain;
|
||||||
mod rococo;
|
mod rococo;
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// Copyright 2022 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Polkadot + Polkadot parachains specification for CLI.
|
||||||
|
|
||||||
|
use crate::cli::CliChain;
|
||||||
|
use relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
use relay_substrate_client::SimpleRuntimeVersion;
|
||||||
|
|
||||||
|
impl CliChain for PolkadotBulletin {
|
||||||
|
const RUNTIME_VERSION: Option<SimpleRuntimeVersion> =
|
||||||
|
Some(SimpleRuntimeVersion { spec_version: 100, transaction_version: 1 });
|
||||||
|
}
|
||||||
@@ -19,8 +19,10 @@ use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumbe
|
|||||||
use relay_substrate_client::{Chain, ChainWithTransactions, Parachain, RelayChain};
|
use relay_substrate_client::{Chain, ChainWithTransactions, Parachain, RelayChain};
|
||||||
use strum::{EnumString, EnumVariantNames};
|
use strum::{EnumString, EnumVariantNames};
|
||||||
use substrate_relay_helper::{
|
use substrate_relay_helper::{
|
||||||
equivocation::SubstrateEquivocationDetectionPipeline, finality::SubstrateFinalitySyncPipeline,
|
equivocation::SubstrateEquivocationDetectionPipeline,
|
||||||
messages_lane::SubstrateMessageLane, parachains::SubstrateParachainsPipeline,
|
finality::SubstrateFinalitySyncPipeline,
|
||||||
|
messages_lane::{MessagesRelayLimits, SubstrateMessageLane},
|
||||||
|
parachains::SubstrateParachainsPipeline,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, EnumString, EnumVariantNames)]
|
#[derive(Debug, PartialEq, Eq, EnumString, EnumVariantNames)]
|
||||||
@@ -35,6 +37,8 @@ pub enum FullBridge {
|
|||||||
BridgeHubWococoToBridgeHubRococo,
|
BridgeHubWococoToBridgeHubRococo,
|
||||||
BridgeHubKusamaToBridgeHubPolkadot,
|
BridgeHubKusamaToBridgeHubPolkadot,
|
||||||
BridgeHubPolkadotToBridgeHubKusama,
|
BridgeHubPolkadotToBridgeHubKusama,
|
||||||
|
PolkadotBulletinToBridgeHubPolkadot,
|
||||||
|
BridgeHubPolkadotToPolkadotBulletin,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Minimal bridge representation that can be used from the CLI.
|
/// Minimal bridge representation that can be used from the CLI.
|
||||||
@@ -109,4 +113,11 @@ where
|
|||||||
pub trait MessagesCliBridge: CliBridgeBase {
|
pub trait MessagesCliBridge: CliBridgeBase {
|
||||||
/// The Source -> Destination messages synchronization pipeline.
|
/// The Source -> Destination messages synchronization pipeline.
|
||||||
type MessagesLane: SubstrateMessageLane<SourceChain = Self::Source, TargetChain = Self::Target>;
|
type MessagesLane: SubstrateMessageLane<SourceChain = Self::Source, TargetChain = Self::Target>;
|
||||||
|
|
||||||
|
/// Optional messages delivery transaction limits that the messages relay is going
|
||||||
|
/// to use. If it returns `None`, limits are estimated using `TransactionPayment` API
|
||||||
|
/// at the target chain.
|
||||||
|
fn maybe_messages_limits() -> Option<MessagesRelayLimits> {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ use crate::{
|
|||||||
kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge,
|
kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge,
|
||||||
polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge,
|
polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge,
|
||||||
},
|
},
|
||||||
|
polkadot_bulletin::{
|
||||||
|
polkadot_bulletin_headers_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotCliBridge,
|
||||||
|
polkadot_headers_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge,
|
||||||
|
},
|
||||||
rialto_millau::{
|
rialto_millau::{
|
||||||
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
||||||
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
||||||
@@ -72,6 +76,8 @@ pub enum InitBridgeName {
|
|||||||
WococoToBridgeHubRococo,
|
WococoToBridgeHubRococo,
|
||||||
KusamaToBridgeHubPolkadot,
|
KusamaToBridgeHubPolkadot,
|
||||||
PolkadotToBridgeHubKusama,
|
PolkadotToBridgeHubKusama,
|
||||||
|
PolkadotToPolkadotBulletin,
|
||||||
|
PolkadotBulletinToBridgeHubPolkadot,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@@ -232,6 +238,37 @@ impl BridgeInitializer for PolkadotToBridgeHubKusamaCliBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl BridgeInitializer for PolkadotToPolkadotBulletinCliBridge {
|
||||||
|
type Engine = GrandpaFinalityEngine<Self::Source>;
|
||||||
|
|
||||||
|
fn encode_init_bridge(
|
||||||
|
init_data: <Self::Engine as Engine<Self::Source>>::InitializationData,
|
||||||
|
) -> <Self::Target as Chain>::Call {
|
||||||
|
type RuntimeCall = relay_polkadot_bulletin_client::RuntimeCall;
|
||||||
|
type BridgePolkadotGrandpaCall = relay_polkadot_bulletin_client::BridgePolkadotGrandpaCall;
|
||||||
|
type SudoCall = relay_polkadot_bulletin_client::SudoCall;
|
||||||
|
|
||||||
|
let initialize_call =
|
||||||
|
RuntimeCall::BridgePolkadotGrandpa(BridgePolkadotGrandpaCall::initialize { init_data });
|
||||||
|
|
||||||
|
RuntimeCall::Sudo(SudoCall::sudo { call: Box::new(initialize_call) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BridgeInitializer for PolkadotBulletinToBridgeHubPolkadotCliBridge {
|
||||||
|
type Engine = GrandpaFinalityEngine<Self::Source>;
|
||||||
|
|
||||||
|
fn encode_init_bridge(
|
||||||
|
init_data: <Self::Engine as Engine<Self::Source>>::InitializationData,
|
||||||
|
) -> <Self::Target as Chain>::Call {
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinGrandpa(
|
||||||
|
relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinGrandpaCall::initialize {
|
||||||
|
init_data,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl InitBridge {
|
impl InitBridge {
|
||||||
/// Run the command.
|
/// Run the command.
|
||||||
pub async fn run(self) -> anyhow::Result<()> {
|
pub async fn run(self) -> anyhow::Result<()> {
|
||||||
@@ -249,6 +286,10 @@ impl InitBridge {
|
|||||||
KusamaToBridgeHubPolkadotCliBridge::init_bridge(self),
|
KusamaToBridgeHubPolkadotCliBridge::init_bridge(self),
|
||||||
InitBridgeName::PolkadotToBridgeHubKusama =>
|
InitBridgeName::PolkadotToBridgeHubKusama =>
|
||||||
PolkadotToBridgeHubKusamaCliBridge::init_bridge(self),
|
PolkadotToBridgeHubKusamaCliBridge::init_bridge(self),
|
||||||
|
InitBridgeName::PolkadotToPolkadotBulletin =>
|
||||||
|
PolkadotToPolkadotBulletinCliBridge::init_bridge(self),
|
||||||
|
InitBridgeName::PolkadotBulletinToBridgeHubPolkadot =>
|
||||||
|
PolkadotBulletinToBridgeHubPolkadotCliBridge::init_bridge(self),
|
||||||
}
|
}
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ use crate::bridges::{
|
|||||||
kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge,
|
kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge,
|
||||||
polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge,
|
polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge,
|
||||||
},
|
},
|
||||||
|
polkadot_bulletin::{
|
||||||
|
polkadot_bulletin_headers_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotCliBridge,
|
||||||
|
polkadot_headers_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge,
|
||||||
|
},
|
||||||
rialto_millau::{
|
rialto_millau::{
|
||||||
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
||||||
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
||||||
@@ -71,6 +75,8 @@ pub enum RelayHeadersBridge {
|
|||||||
WococoToBridgeHubRococo,
|
WococoToBridgeHubRococo,
|
||||||
KusamaToBridgeHubPolkadot,
|
KusamaToBridgeHubPolkadot,
|
||||||
PolkadotToBridgeHubKusama,
|
PolkadotToBridgeHubKusama,
|
||||||
|
PolkadotToPolkadotBulletin,
|
||||||
|
PolkadotBulletinToBridgeHubPolkadot,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@@ -116,6 +122,8 @@ impl HeadersRelayer for RococoToBridgeHubWococoCliBridge {}
|
|||||||
impl HeadersRelayer for WococoToBridgeHubRococoCliBridge {}
|
impl HeadersRelayer for WococoToBridgeHubRococoCliBridge {}
|
||||||
impl HeadersRelayer for KusamaToBridgeHubPolkadotCliBridge {}
|
impl HeadersRelayer for KusamaToBridgeHubPolkadotCliBridge {}
|
||||||
impl HeadersRelayer for PolkadotToBridgeHubKusamaCliBridge {}
|
impl HeadersRelayer for PolkadotToBridgeHubKusamaCliBridge {}
|
||||||
|
impl HeadersRelayer for PolkadotToPolkadotBulletinCliBridge {}
|
||||||
|
impl HeadersRelayer for PolkadotBulletinToBridgeHubPolkadotCliBridge {}
|
||||||
|
|
||||||
impl RelayHeaders {
|
impl RelayHeaders {
|
||||||
/// Run the command.
|
/// Run the command.
|
||||||
@@ -134,6 +142,10 @@ impl RelayHeaders {
|
|||||||
KusamaToBridgeHubPolkadotCliBridge::relay_headers(self),
|
KusamaToBridgeHubPolkadotCliBridge::relay_headers(self),
|
||||||
RelayHeadersBridge::PolkadotToBridgeHubKusama =>
|
RelayHeadersBridge::PolkadotToBridgeHubKusama =>
|
||||||
PolkadotToBridgeHubKusamaCliBridge::relay_headers(self),
|
PolkadotToBridgeHubKusamaCliBridge::relay_headers(self),
|
||||||
|
RelayHeadersBridge::PolkadotToPolkadotBulletin =>
|
||||||
|
PolkadotToPolkadotBulletinCliBridge::relay_headers(self),
|
||||||
|
RelayHeadersBridge::PolkadotBulletinToBridgeHubPolkadot =>
|
||||||
|
PolkadotBulletinToBridgeHubPolkadotCliBridge::relay_headers(self),
|
||||||
}
|
}
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ use crate::{
|
|||||||
kusama_parachains_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotCliBridge,
|
kusama_parachains_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotCliBridge,
|
||||||
polkadot_parachains_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaCliBridge,
|
polkadot_parachains_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaCliBridge,
|
||||||
},
|
},
|
||||||
|
polkadot_bulletin::{
|
||||||
|
polkadot_bulletin_headers_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotCliBridge,
|
||||||
|
polkadot_parachains_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge,
|
||||||
|
},
|
||||||
rialto_millau::{
|
rialto_millau::{
|
||||||
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
||||||
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
||||||
@@ -77,7 +81,9 @@ use relay_substrate_client::{
|
|||||||
use relay_utils::metrics::MetricsParams;
|
use relay_utils::metrics::MetricsParams;
|
||||||
use sp_core::Pair;
|
use sp_core::Pair;
|
||||||
use substrate_relay_helper::{
|
use substrate_relay_helper::{
|
||||||
messages_lane::MessagesRelayParams, on_demand::OnDemandRelay, TaggedAccount, TransactionParams,
|
messages_lane::{MessagesRelayLimits, MessagesRelayParams},
|
||||||
|
on_demand::OnDemandRelay,
|
||||||
|
TaggedAccount, TransactionParams,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Parameters that have the same names across all bridges.
|
/// Parameters that have the same names across all bridges.
|
||||||
@@ -176,6 +182,7 @@ where
|
|||||||
source_to_target_headers_relay: Arc<dyn OnDemandRelay<Source, Target>>,
|
source_to_target_headers_relay: Arc<dyn OnDemandRelay<Source, Target>>,
|
||||||
target_to_source_headers_relay: Arc<dyn OnDemandRelay<Target, Source>>,
|
target_to_source_headers_relay: Arc<dyn OnDemandRelay<Target, Source>>,
|
||||||
lane_id: LaneId,
|
lane_id: LaneId,
|
||||||
|
maybe_limits: Option<MessagesRelayLimits>,
|
||||||
) -> MessagesRelayParams<Bridge::MessagesLane> {
|
) -> MessagesRelayParams<Bridge::MessagesLane> {
|
||||||
MessagesRelayParams {
|
MessagesRelayParams {
|
||||||
source_client: self.source.client.clone(),
|
source_client: self.source.client.clone(),
|
||||||
@@ -185,6 +192,7 @@ where
|
|||||||
source_to_target_headers_relay: Some(source_to_target_headers_relay),
|
source_to_target_headers_relay: Some(source_to_target_headers_relay),
|
||||||
target_to_source_headers_relay: Some(target_to_source_headers_relay),
|
target_to_source_headers_relay: Some(target_to_source_headers_relay),
|
||||||
lane_id,
|
lane_id,
|
||||||
|
limits: maybe_limits,
|
||||||
metrics_params: self.metrics_params.clone().disable(),
|
metrics_params: self.metrics_params.clone().disable(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -202,6 +210,7 @@ declare_chain_cli_schema!(Kusama, kusama);
|
|||||||
declare_chain_cli_schema!(BridgeHubKusama, bridge_hub_kusama);
|
declare_chain_cli_schema!(BridgeHubKusama, bridge_hub_kusama);
|
||||||
declare_chain_cli_schema!(Polkadot, polkadot);
|
declare_chain_cli_schema!(Polkadot, polkadot);
|
||||||
declare_chain_cli_schema!(BridgeHubPolkadot, bridge_hub_polkadot);
|
declare_chain_cli_schema!(BridgeHubPolkadot, bridge_hub_polkadot);
|
||||||
|
declare_chain_cli_schema!(PolkadotBulletin, polkadot_bulletin);
|
||||||
// Means to override signers of different layer transactions.
|
// Means to override signers of different layer transactions.
|
||||||
declare_chain_cli_schema!(MillauHeadersToRialto, millau_headers_to_rialto);
|
declare_chain_cli_schema!(MillauHeadersToRialto, millau_headers_to_rialto);
|
||||||
declare_chain_cli_schema!(MillauHeadersToRialtoParachain, millau_headers_to_rialto_parachain);
|
declare_chain_cli_schema!(MillauHeadersToRialtoParachain, millau_headers_to_rialto_parachain);
|
||||||
@@ -227,11 +236,21 @@ declare_chain_cli_schema!(
|
|||||||
PolkadotParachainsToBridgeHubKusama,
|
PolkadotParachainsToBridgeHubKusama,
|
||||||
polkadot_parachains_to_bridge_hub_kusama
|
polkadot_parachains_to_bridge_hub_kusama
|
||||||
);
|
);
|
||||||
|
declare_chain_cli_schema!(
|
||||||
|
PolkadotBulletinHeadersToBridgeHubPolkadot,
|
||||||
|
polkadot_bulletin_headers_to_bridge_hub_polkadot
|
||||||
|
);
|
||||||
|
declare_chain_cli_schema!(PolkadotHeadersToPolkadotBulletin, polkadot_headers_to_polkadot_bulletin);
|
||||||
|
declare_chain_cli_schema!(
|
||||||
|
PolkadotParachainsToPolkadotBulletin,
|
||||||
|
polkadot_parachains_to_polkadot_bulletin
|
||||||
|
);
|
||||||
// All supported bridges.
|
// All supported bridges.
|
||||||
declare_relay_to_relay_bridge_schema!(Millau, Rialto);
|
declare_relay_to_relay_bridge_schema!(Millau, Rialto);
|
||||||
declare_relay_to_parachain_bridge_schema!(Millau, RialtoParachain, Rialto);
|
declare_relay_to_parachain_bridge_schema!(Millau, RialtoParachain, Rialto);
|
||||||
declare_parachain_to_parachain_bridge_schema!(BridgeHubRococo, Rococo, BridgeHubWococo, Wococo);
|
declare_parachain_to_parachain_bridge_schema!(BridgeHubRococo, Rococo, BridgeHubWococo, Wococo);
|
||||||
declare_parachain_to_parachain_bridge_schema!(BridgeHubKusama, Kusama, BridgeHubPolkadot, Polkadot);
|
declare_parachain_to_parachain_bridge_schema!(BridgeHubKusama, Kusama, BridgeHubPolkadot, Polkadot);
|
||||||
|
declare_relay_to_parachain_bridge_schema!(PolkadotBulletin, BridgeHubPolkadot, Polkadot);
|
||||||
|
|
||||||
/// Base portion of the bidirectional complex relay.
|
/// Base portion of the bidirectional complex relay.
|
||||||
///
|
///
|
||||||
@@ -370,6 +389,7 @@ where
|
|||||||
left_to_right_on_demand_headers.clone(),
|
left_to_right_on_demand_headers.clone(),
|
||||||
right_to_left_on_demand_headers.clone(),
|
right_to_left_on_demand_headers.clone(),
|
||||||
lane,
|
lane,
|
||||||
|
Self::L2R::maybe_messages_limits(),
|
||||||
))
|
))
|
||||||
.map_err(|e| anyhow::format_err!("{}", e))
|
.map_err(|e| anyhow::format_err!("{}", e))
|
||||||
.boxed();
|
.boxed();
|
||||||
@@ -381,6 +401,7 @@ where
|
|||||||
right_to_left_on_demand_headers.clone(),
|
right_to_left_on_demand_headers.clone(),
|
||||||
left_to_right_on_demand_headers.clone(),
|
left_to_right_on_demand_headers.clone(),
|
||||||
lane,
|
lane,
|
||||||
|
Self::R2L::maybe_messages_limits(),
|
||||||
))
|
))
|
||||||
.map_err(|e| anyhow::format_err!("{}", e))
|
.map_err(|e| anyhow::format_err!("{}", e))
|
||||||
.boxed();
|
.boxed();
|
||||||
@@ -500,6 +521,32 @@ impl Full2WayBridge for BridgeHubKusamaBridgeHubPolkadotFull2WayBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `PolkadotBulletin` <> `BridgeHubPolkadot` complex relay.
|
||||||
|
pub struct PolkadotBulletinBridgeHubPolkadotFull2WayBridge {
|
||||||
|
base: <Self as Full2WayBridge>::Base,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl Full2WayBridge for PolkadotBulletinBridgeHubPolkadotFull2WayBridge {
|
||||||
|
type Base = RelayToParachainBridge<Self::L2R, Self::R2L>;
|
||||||
|
type Left = relay_polkadot_bulletin_client::PolkadotBulletin;
|
||||||
|
type Right = relay_bridge_hub_polkadot_client::BridgeHubPolkadot;
|
||||||
|
type L2R = PolkadotBulletinToBridgeHubPolkadotCliBridge;
|
||||||
|
type R2L = PolkadotToPolkadotBulletinCliBridge;
|
||||||
|
|
||||||
|
fn new(base: Self::Base) -> anyhow::Result<Self> {
|
||||||
|
Ok(Self { base })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn base(&self) -> &Self::Base {
|
||||||
|
&self.base
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mut_base(&mut self) -> &mut Self::Base {
|
||||||
|
&mut self.base
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Complex headers+messages relay.
|
/// Complex headers+messages relay.
|
||||||
#[derive(Debug, PartialEq, StructOpt)]
|
#[derive(Debug, PartialEq, StructOpt)]
|
||||||
pub enum RelayHeadersAndMessages {
|
pub enum RelayHeadersAndMessages {
|
||||||
@@ -511,6 +558,8 @@ pub enum RelayHeadersAndMessages {
|
|||||||
BridgeHubRococoBridgeHubWococo(BridgeHubRococoBridgeHubWococoHeadersAndMessages),
|
BridgeHubRococoBridgeHubWococo(BridgeHubRococoBridgeHubWococoHeadersAndMessages),
|
||||||
/// BridgeHubKusama <> BridgeHubPolkadot relay.
|
/// BridgeHubKusama <> BridgeHubPolkadot relay.
|
||||||
BridgeHubKusamaBridgeHubPolkadot(BridgeHubKusamaBridgeHubPolkadotHeadersAndMessages),
|
BridgeHubKusamaBridgeHubPolkadot(BridgeHubKusamaBridgeHubPolkadotHeadersAndMessages),
|
||||||
|
/// `PolkadotBulletin` <> `BridgeHubPolkadot` relay.
|
||||||
|
PolkadotBulletinBridgeHubPolkadot(PolkadotBulletinBridgeHubPolkadotHeadersAndMessages),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RelayHeadersAndMessages {
|
impl RelayHeadersAndMessages {
|
||||||
@@ -531,6 +580,10 @@ impl RelayHeadersAndMessages {
|
|||||||
BridgeHubKusamaBridgeHubPolkadotFull2WayBridge::new(params.into_bridge().await?)?
|
BridgeHubKusamaBridgeHubPolkadotFull2WayBridge::new(params.into_bridge().await?)?
|
||||||
.run()
|
.run()
|
||||||
.await,
|
.await,
|
||||||
|
RelayHeadersAndMessages::PolkadotBulletinBridgeHubPolkadot(params) =>
|
||||||
|
PolkadotBulletinBridgeHubPolkadotFull2WayBridge::new(params.into_bridge().await?)?
|
||||||
|
.run()
|
||||||
|
.await,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ use crate::bridges::{
|
|||||||
bridge_hub_kusama_messages_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge,
|
bridge_hub_kusama_messages_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge,
|
||||||
bridge_hub_polkadot_messages_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge,
|
bridge_hub_polkadot_messages_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge,
|
||||||
},
|
},
|
||||||
|
polkadot_bulletin::{
|
||||||
|
bridge_hub_polkadot_messages_to_polkadot_bulletin::BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge,
|
||||||
|
polkadot_bulletin_messages_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge,
|
||||||
|
},
|
||||||
rialto_millau::{
|
rialto_millau::{
|
||||||
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
millau_headers_to_rialto::MillauToRialtoCliBridge,
|
||||||
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
rialto_headers_to_millau::RialtoToMillauCliBridge,
|
||||||
@@ -93,6 +97,7 @@ where
|
|||||||
source_to_target_headers_relay: None,
|
source_to_target_headers_relay: None,
|
||||||
target_to_source_headers_relay: None,
|
target_to_source_headers_relay: None,
|
||||||
lane_id: data.lane.into(),
|
lane_id: data.lane.into(),
|
||||||
|
limits: Self::maybe_messages_limits(),
|
||||||
metrics_params: data.prometheus_params.into_metrics_params()?,
|
metrics_params: data.prometheus_params.into_metrics_params()?,
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
@@ -108,6 +113,8 @@ impl MessagesRelayer for BridgeHubRococoToBridgeHubWococoMessagesCliBridge {}
|
|||||||
impl MessagesRelayer for BridgeHubWococoToBridgeHubRococoMessagesCliBridge {}
|
impl MessagesRelayer for BridgeHubWococoToBridgeHubRococoMessagesCliBridge {}
|
||||||
impl MessagesRelayer for BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge {}
|
impl MessagesRelayer for BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge {}
|
||||||
impl MessagesRelayer for BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge {}
|
impl MessagesRelayer for BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge {}
|
||||||
|
impl MessagesRelayer for PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge {}
|
||||||
|
impl MessagesRelayer for BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge {}
|
||||||
|
|
||||||
impl RelayMessages {
|
impl RelayMessages {
|
||||||
/// Run the command.
|
/// Run the command.
|
||||||
@@ -127,6 +134,10 @@ impl RelayMessages {
|
|||||||
BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge::relay_messages(self),
|
BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge::relay_messages(self),
|
||||||
FullBridge::BridgeHubPolkadotToBridgeHubKusama =>
|
FullBridge::BridgeHubPolkadotToBridgeHubKusama =>
|
||||||
BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge::relay_messages(self),
|
BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge::relay_messages(self),
|
||||||
|
FullBridge::PolkadotBulletinToBridgeHubPolkadot =>
|
||||||
|
PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge::relay_messages(self),
|
||||||
|
FullBridge::BridgeHubPolkadotToPolkadotBulletin =>
|
||||||
|
BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge::relay_messages(self),
|
||||||
}
|
}
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ use crate::bridges::{
|
|||||||
kusama_parachains_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotCliBridge,
|
kusama_parachains_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotCliBridge,
|
||||||
polkadot_parachains_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaCliBridge,
|
polkadot_parachains_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaCliBridge,
|
||||||
},
|
},
|
||||||
|
polkadot_bulletin::polkadot_parachains_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge,
|
||||||
rialto_parachain_millau::rialto_parachains_to_millau::RialtoParachainToMillauCliBridge,
|
rialto_parachain_millau::rialto_parachains_to_millau::RialtoParachainToMillauCliBridge,
|
||||||
rococo_wococo::{
|
rococo_wococo::{
|
||||||
rococo_parachains_to_bridge_hub_wococo::BridgeHubRococoToBridgeHubWococoCliBridge,
|
rococo_parachains_to_bridge_hub_wococo::BridgeHubRococoToBridgeHubWococoCliBridge,
|
||||||
@@ -71,6 +72,7 @@ pub enum RelayParachainsBridge {
|
|||||||
WococoToBridgeHubRococo,
|
WococoToBridgeHubRococo,
|
||||||
KusamaToBridgeHubPolkadot,
|
KusamaToBridgeHubPolkadot,
|
||||||
PolkadotToBridgeHubKusama,
|
PolkadotToBridgeHubKusama,
|
||||||
|
PolkadotToPolkadotBulletin,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@@ -120,6 +122,7 @@ impl ParachainsRelayer for BridgeHubRococoToBridgeHubWococoCliBridge {}
|
|||||||
impl ParachainsRelayer for BridgeHubWococoToBridgeHubRococoCliBridge {}
|
impl ParachainsRelayer for BridgeHubWococoToBridgeHubRococoCliBridge {}
|
||||||
impl ParachainsRelayer for BridgeHubKusamaToBridgeHubPolkadotCliBridge {}
|
impl ParachainsRelayer for BridgeHubKusamaToBridgeHubPolkadotCliBridge {}
|
||||||
impl ParachainsRelayer for BridgeHubPolkadotToBridgeHubKusamaCliBridge {}
|
impl ParachainsRelayer for BridgeHubPolkadotToBridgeHubKusamaCliBridge {}
|
||||||
|
impl ParachainsRelayer for PolkadotToPolkadotBulletinCliBridge {}
|
||||||
|
|
||||||
impl RelayParachains {
|
impl RelayParachains {
|
||||||
/// Run the command.
|
/// Run the command.
|
||||||
@@ -137,6 +140,8 @@ impl RelayParachains {
|
|||||||
BridgeHubKusamaToBridgeHubPolkadotCliBridge::relay_parachains(self),
|
BridgeHubKusamaToBridgeHubPolkadotCliBridge::relay_parachains(self),
|
||||||
RelayParachainsBridge::PolkadotToBridgeHubKusama =>
|
RelayParachainsBridge::PolkadotToBridgeHubKusama =>
|
||||||
BridgeHubPolkadotToBridgeHubKusamaCliBridge::relay_parachains(self),
|
BridgeHubPolkadotToBridgeHubKusamaCliBridge::relay_parachains(self),
|
||||||
|
RelayParachainsBridge::PolkadotToPolkadotBulletin =>
|
||||||
|
PolkadotToPolkadotBulletinCliBridge::relay_parachains(self),
|
||||||
}
|
}
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,18 +109,8 @@ impl SendMessage {
|
|||||||
MillauToRialtoParachainCliBridge::send_message(self),
|
MillauToRialtoParachainCliBridge::send_message(self),
|
||||||
FullBridge::RialtoParachainToMillau =>
|
FullBridge::RialtoParachainToMillau =>
|
||||||
RialtoParachainToMillauCliBridge::send_message(self),
|
RialtoParachainToMillauCliBridge::send_message(self),
|
||||||
FullBridge::BridgeHubRococoToBridgeHubWococo => unimplemented!(
|
// all our (soon to retire_ testnets are above, so if is fine to use `_`
|
||||||
"Sending message from BridgeHubRococo to BridgeHubWococo is not supported"
|
_ => unimplemented!("Sending message from in {:?} is not supported", self.bridge,),
|
||||||
),
|
|
||||||
FullBridge::BridgeHubWococoToBridgeHubRococo => unimplemented!(
|
|
||||||
"Sending message from BridgeHubWococo to BridgeHubRococo is not supported"
|
|
||||||
),
|
|
||||||
FullBridge::BridgeHubKusamaToBridgeHubPolkadot => unimplemented!(
|
|
||||||
"Sending message from BridgeHubKusama to BridgeHubPolkadot is not supported"
|
|
||||||
),
|
|
||||||
FullBridge::BridgeHubPolkadotToBridgeHubKusama => unimplemented!(
|
|
||||||
"Sending message from BridgeHubPolkadot to BridgeHubKusama is not supported"
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ bp-bridge-hub-polkadot = { path = "../../primitives/chain-bridge-hub-polkadot" }
|
|||||||
bp-header-chain = { path = "../../primitives/header-chain" }
|
bp-header-chain = { path = "../../primitives/header-chain" }
|
||||||
bp-messages = { path = "../../primitives/messages" }
|
bp-messages = { path = "../../primitives/messages" }
|
||||||
bp-parachains = { path = "../../primitives/parachains" }
|
bp-parachains = { path = "../../primitives/parachains" }
|
||||||
bp-polkadot-core= { path = "../../primitives/polkadot-core" }
|
bp-polkadot-bulletin = { path = "../../primitives/chain-polkadot-bulletin" }
|
||||||
|
bp-polkadot-core = { path = "../../primitives/polkadot-core" }
|
||||||
bp-kusama = { path = "../../primitives/chain-kusama" }
|
bp-kusama = { path = "../../primitives/chain-kusama" }
|
||||||
bp-runtime = { path = "../../primitives/runtime" }
|
bp-runtime = { path = "../../primitives/runtime" }
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,18 @@ pub use relay_substrate_client::calls::{SystemCall, UtilityCall};
|
|||||||
/// Unchecked BridgeHubPolkadot extrinsic.
|
/// Unchecked BridgeHubPolkadot extrinsic.
|
||||||
pub type UncheckedExtrinsic = bp_bridge_hub_polkadot::UncheckedExtrinsic<Call, SignedExtension>;
|
pub type UncheckedExtrinsic = bp_bridge_hub_polkadot::UncheckedExtrinsic<Call, SignedExtension>;
|
||||||
|
|
||||||
// The indirect pallet call used to sync `Kusama` GRANDPA finality to `BHPolkadot`.
|
/// The indirect pallet call used to sync `Kusama` GRANDPA finality to `BHPolkadot`.
|
||||||
pub type BridgeKusamaGrandpaCall = BridgeGrandpaCallOf<bp_kusama::Kusama>;
|
pub type BridgeKusamaGrandpaCall = BridgeGrandpaCallOf<bp_kusama::Kusama>;
|
||||||
// The indirect pallet call used to sync `BridgeHubKusama` messages to `BridgeHubPolkadot`.
|
/// The indirect pallet call used to sync `BridgeHubKusama` messages to `BridgeHubPolkadot`.
|
||||||
pub type BridgeKusamaMessagesCall = BridgeMessagesCallOf<bp_bridge_hub_kusama::BridgeHubKusama>;
|
pub type BridgeKusamaMessagesCall = BridgeMessagesCallOf<bp_bridge_hub_kusama::BridgeHubKusama>;
|
||||||
|
|
||||||
|
/// The indirect pallet call used to sync `PolkadotBulletin` GRANDPA finality to `BHPolkadot`.
|
||||||
|
pub type BridgePolkadotBulletinGrandpaCall =
|
||||||
|
BridgeGrandpaCallOf<bp_polkadot_bulletin::PolkadotBulletin>;
|
||||||
|
/// The indirect pallet call used to sync `PolkadotBulletin` messages to `BridgeHubPolkadot`.
|
||||||
|
pub type BridgePolkadotBulletinMessagesCall =
|
||||||
|
BridgeMessagesCallOf<bp_polkadot_bulletin::PolkadotBulletin>;
|
||||||
|
|
||||||
/// `BridgeHubPolkadot` Runtime `Call` enum.
|
/// `BridgeHubPolkadot` Runtime `Call` enum.
|
||||||
///
|
///
|
||||||
/// The enum represents a subset of possible `Call`s we can send to `BridgeHubPolkadot` chain.
|
/// The enum represents a subset of possible `Call`s we can send to `BridgeHubPolkadot` chain.
|
||||||
@@ -52,15 +59,22 @@ pub enum Call {
|
|||||||
#[codec(index = 40)]
|
#[codec(index = 40)]
|
||||||
Utility(UtilityCall<Call>),
|
Utility(UtilityCall<Call>),
|
||||||
|
|
||||||
/// Kusama bridge pallet.
|
/// Kusama grandpa bridge pallet.
|
||||||
#[codec(index = 51)]
|
#[codec(index = 51)]
|
||||||
BridgeKusamaGrandpa(BridgeKusamaGrandpaCall),
|
BridgeKusamaGrandpa(BridgeKusamaGrandpaCall),
|
||||||
/// Kusama parachain bridge pallet.
|
/// Kusama parachains bridge pallet.
|
||||||
#[codec(index = 52)]
|
#[codec(index = 52)]
|
||||||
BridgeKusamaParachain(BridgeParachainCall),
|
BridgeKusamaParachain(BridgeParachainCall),
|
||||||
/// Kusama messages bridge pallet.
|
/// Kusama messages bridge pallet.
|
||||||
#[codec(index = 53)]
|
#[codec(index = 53)]
|
||||||
BridgeKusamaMessages(BridgeKusamaMessagesCall),
|
BridgeKusamaMessages(BridgeKusamaMessagesCall),
|
||||||
|
|
||||||
|
/// Polkadot Bulletin grandpa bridge pallet.
|
||||||
|
#[codec(index = 55)]
|
||||||
|
BridgePolkadotBulletinGrandpa(BridgePolkadotBulletinGrandpaCall),
|
||||||
|
/// Polkadot Bulletin messages bridge pallet.
|
||||||
|
#[codec(index = 56)]
|
||||||
|
BridgePolkadotBulletinMessages(BridgePolkadotBulletinMessagesCall),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<UtilityCall<Call>> for Call {
|
impl From<UtilityCall<Call>> for Call {
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
[package]
|
||||||
|
name = "relay-polkadot-bulletin-client"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
edition = "2021"
|
||||||
|
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] }
|
||||||
|
scale-info = { version = "2.9.0", default-features = false, features = ["derive"] }
|
||||||
|
subxt = { version = "0.31.0", default-features = false, features = ["native"] }
|
||||||
|
|
||||||
|
# Bridge dependencies
|
||||||
|
|
||||||
|
bp-header-chain = { path = "../../primitives/header-chain" }
|
||||||
|
bp-messages = { path = "../../primitives/messages" }
|
||||||
|
bp-polkadot-core = { path = "../../primitives/polkadot-core" }
|
||||||
|
bp-polkadot-bulletin = { path = "../../primitives/chain-polkadot-bulletin" }
|
||||||
|
bp-runtime = { path = "../../primitives/runtime" }
|
||||||
|
bridge-runtime-common = { path = "../../bin/runtime-common" }
|
||||||
|
relay-substrate-client = { path = "../client-substrate" }
|
||||||
|
relay-utils = { path = "../utils" }
|
||||||
|
|
||||||
|
# Substrate Dependencies
|
||||||
|
|
||||||
|
sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" }
|
||||||
|
sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" }
|
||||||
|
sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" }
|
||||||
|
sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" }
|
||||||
|
sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" }
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,158 @@
|
|||||||
|
// Copyright 2019-2021 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Bridges Common.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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.
|
||||||
|
|
||||||
|
// Parity Bridges Common 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 Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Types used to connect to the Polkadot Bulletin chain.
|
||||||
|
|
||||||
|
mod codegen_runtime;
|
||||||
|
|
||||||
|
use bp_messages::MessageNonce;
|
||||||
|
use bp_polkadot_bulletin::POLKADOT_BULLETIN_SYNCED_HEADERS_GRANDPA_INFO_METHOD;
|
||||||
|
use bp_runtime::ChainId;
|
||||||
|
use codec::Encode;
|
||||||
|
use relay_substrate_client::{
|
||||||
|
Chain, ChainWithBalances, ChainWithGrandpa, ChainWithMessages, ChainWithTransactions,
|
||||||
|
Error as SubstrateError, SignParam, UnderlyingChainProvider, UnsignedTransaction,
|
||||||
|
};
|
||||||
|
use sp_core::{storage::StorageKey, Pair};
|
||||||
|
use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount, MultiAddress};
|
||||||
|
use sp_session::MembershipProof;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
pub use codegen_runtime::api::runtime_types;
|
||||||
|
|
||||||
|
/// Call of the Polkadot Bulletin Chain runtime.
|
||||||
|
pub type RuntimeCall = runtime_types::polkadot_bulletin_chain_runtime::RuntimeCall;
|
||||||
|
/// Call of the `Sudo` pallet.
|
||||||
|
pub type SudoCall = runtime_types::pallet_sudo::pallet::Call;
|
||||||
|
/// Call of the GRANDPA pallet.
|
||||||
|
pub type GrandpaCall = runtime_types::pallet_grandpa::pallet::Call;
|
||||||
|
/// Call of the with-PolkadotBridgeHub bridge GRANDPA pallet.
|
||||||
|
pub type BridgePolkadotGrandpaCall = runtime_types::pallet_bridge_grandpa::pallet::Call;
|
||||||
|
/// Call of the with-PolkadotBridgeHub bridge parachains pallet.
|
||||||
|
pub type BridgePolkadotParachainsCall = runtime_types::pallet_bridge_parachains::pallet::Call;
|
||||||
|
/// Call of the with-PolkadotBridgeHub bridge messages pallet.
|
||||||
|
pub type BridgePolkadotBridgeHubMessagesCall = runtime_types::pallet_bridge_messages::pallet::Call;
|
||||||
|
|
||||||
|
/// Polkadot header id.
|
||||||
|
pub type HeaderId =
|
||||||
|
relay_utils::HeaderId<bp_polkadot_bulletin::Hash, bp_polkadot_bulletin::BlockNumber>;
|
||||||
|
|
||||||
|
/// Polkadot header type used in headers sync.
|
||||||
|
pub type SyncHeader = relay_substrate_client::SyncHeader<bp_polkadot_bulletin::Header>;
|
||||||
|
|
||||||
|
/// The address format for describing accounts.
|
||||||
|
pub type Address = MultiAddress<bp_polkadot_bulletin::AccountId, ()>;
|
||||||
|
|
||||||
|
/// Polkadot chain definition
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct PolkadotBulletin;
|
||||||
|
|
||||||
|
impl UnderlyingChainProvider for PolkadotBulletin {
|
||||||
|
type Chain = bp_polkadot_bulletin::PolkadotBulletin;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Chain for PolkadotBulletin {
|
||||||
|
const ID: ChainId = *b"pbch";
|
||||||
|
|
||||||
|
const NAME: &'static str = "PolkadotBulletin";
|
||||||
|
const BEST_FINALIZED_HEADER_ID_METHOD: &'static str =
|
||||||
|
bp_polkadot_bulletin::BEST_FINALIZED_POLKADOT_BULLETIN_HEADER_METHOD;
|
||||||
|
const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(6);
|
||||||
|
|
||||||
|
type SignedBlock = bp_polkadot_bulletin::SignedBlock;
|
||||||
|
type Call = RuntimeCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChainWithGrandpa for PolkadotBulletin {
|
||||||
|
const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str =
|
||||||
|
POLKADOT_BULLETIN_SYNCED_HEADERS_GRANDPA_INFO_METHOD;
|
||||||
|
|
||||||
|
type KeyOwnerProof = MembershipProof;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChainWithMessages for PolkadotBulletin {
|
||||||
|
const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str =
|
||||||
|
bp_polkadot_bulletin::WITH_POLKADOT_BULLETIN_MESSAGES_PALLET_NAME;
|
||||||
|
// this is not critical (some metrics will be missing from the storage), but probably it needs
|
||||||
|
// to be changed when we'll polish the bridge configuration
|
||||||
|
const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = None;
|
||||||
|
|
||||||
|
const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str =
|
||||||
|
bp_polkadot_bulletin::TO_POLKADOT_BULLETIN_MESSAGE_DETAILS_METHOD;
|
||||||
|
const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str =
|
||||||
|
bp_polkadot_bulletin::FROM_POLKADOT_BULLETIN_MESSAGE_DETAILS_METHOD;
|
||||||
|
|
||||||
|
const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce =
|
||||||
|
bp_polkadot_bulletin::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
|
||||||
|
const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce =
|
||||||
|
bp_polkadot_bulletin::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChainWithBalances for PolkadotBulletin {
|
||||||
|
fn account_info_storage_key(_account_id: &Self::AccountId) -> StorageKey {
|
||||||
|
// no balances at this chain
|
||||||
|
StorageKey(vec![])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChainWithTransactions for PolkadotBulletin {
|
||||||
|
type AccountKeyPair = sp_core::sr25519::Pair;
|
||||||
|
type SignedTransaction =
|
||||||
|
bp_polkadot_bulletin::UncheckedExtrinsic<Self::Call, bp_polkadot_bulletin::SignedExtension>;
|
||||||
|
|
||||||
|
fn sign_transaction(
|
||||||
|
param: SignParam<Self>,
|
||||||
|
unsigned: UnsignedTransaction<Self>,
|
||||||
|
) -> Result<Self::SignedTransaction, SubstrateError> {
|
||||||
|
let raw_payload = SignedPayload::new(
|
||||||
|
unsigned.call,
|
||||||
|
bp_polkadot_bulletin::SignedExtension::from_params(
|
||||||
|
param.spec_version,
|
||||||
|
param.transaction_version,
|
||||||
|
unsigned.era,
|
||||||
|
param.genesis_hash,
|
||||||
|
unsigned.nonce,
|
||||||
|
),
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload));
|
||||||
|
let signer: sp_runtime::MultiSigner = param.signer.public().into();
|
||||||
|
let (call, extra, _) = raw_payload.deconstruct();
|
||||||
|
|
||||||
|
Ok(Self::SignedTransaction::new_signed(
|
||||||
|
call,
|
||||||
|
signer.into_account().into(),
|
||||||
|
signature.into(),
|
||||||
|
extra,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_signed(tx: &Self::SignedTransaction) -> bool {
|
||||||
|
tx.signature.is_some()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool {
|
||||||
|
tx.signature
|
||||||
|
.as_ref()
|
||||||
|
.map(|(address, _, _)| *address == Address::Id(signer.public().into()))
|
||||||
|
.unwrap_or(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_transaction(tx: Self::SignedTransaction) -> Option<UnsignedTransaction<Self>> {
|
||||||
|
let extra = &tx.signature.as_ref()?.2;
|
||||||
|
Some(UnsignedTransaction::new(tx.function, extra.nonce()))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
//! Pallet provides a set of guard functions that are running in background threads
|
//! Pallet provides a set of guard functions that are running in background threads
|
||||||
//! and are aborting process if some condition fails.
|
//! and are aborting process if some condition fails.
|
||||||
|
|
||||||
use crate::{error::Error, Chain, ChainWithBalances, Client};
|
use crate::{error::Error, Chain, Client};
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use sp_version::RuntimeVersion;
|
use sp_version::RuntimeVersion;
|
||||||
@@ -28,7 +28,7 @@ use std::{
|
|||||||
|
|
||||||
/// Guards environment.
|
/// Guards environment.
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
pub trait Environment<C: ChainWithBalances>: Send + Sync + 'static {
|
pub trait Environment<C>: Send + Sync + 'static {
|
||||||
/// Error type.
|
/// Error type.
|
||||||
type Error: Display + Send + Sync + 'static;
|
type Error: Display + Send + Sync + 'static;
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ pub trait Environment<C: ChainWithBalances>: Send + Sync + 'static {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Abort when runtime spec version is different from specified.
|
/// Abort when runtime spec version is different from specified.
|
||||||
pub fn abort_on_spec_version_change<C: ChainWithBalances>(
|
pub fn abort_on_spec_version_change<C: Chain>(
|
||||||
mut env: impl Environment<C>,
|
mut env: impl Environment<C>,
|
||||||
expected_spec_version: u32,
|
expected_spec_version: u32,
|
||||||
) {
|
) {
|
||||||
@@ -98,7 +98,7 @@ fn conditions_check_delay<C: Chain>() -> Duration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl<C: ChainWithBalances> Environment<C> for Client<C> {
|
impl<C: Chain> Environment<C> for Client<C> {
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
|
|
||||||
async fn runtime_version(&mut self) -> Result<RuntimeVersion, Self::Error> {
|
async fn runtime_version(&mut self) -> Result<RuntimeVersion, Self::Error> {
|
||||||
|
|||||||
@@ -105,10 +105,21 @@ pub struct MessagesRelayParams<P: SubstrateMessageLane> {
|
|||||||
Option<Arc<dyn OnDemandRelay<P::TargetChain, P::SourceChain>>>,
|
Option<Arc<dyn OnDemandRelay<P::TargetChain, P::SourceChain>>>,
|
||||||
/// Identifier of lane that needs to be served.
|
/// Identifier of lane that needs to be served.
|
||||||
pub lane_id: LaneId,
|
pub lane_id: LaneId,
|
||||||
|
/// Messages relay limits. If not provided, the relay tries to determine it automatically,
|
||||||
|
/// using `TransactionPayment` pallet runtime API.
|
||||||
|
pub limits: Option<MessagesRelayLimits>,
|
||||||
/// Metrics parameters.
|
/// Metrics parameters.
|
||||||
pub metrics_params: MetricsParams,
|
pub metrics_params: MetricsParams,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delivery transaction limits.
|
||||||
|
pub struct MessagesRelayLimits {
|
||||||
|
/// Maximal number of messages in the delivery transaction.
|
||||||
|
pub max_messages_in_single_batch: MessageNonce,
|
||||||
|
/// Maximal cumulative weight of messages in the delivery transaction.
|
||||||
|
pub max_messages_weight_in_single_batch: Weight,
|
||||||
|
}
|
||||||
|
|
||||||
/// Batch transaction that brings headers + and messages delivery/receiving confirmations to the
|
/// Batch transaction that brings headers + and messages delivery/receiving confirmations to the
|
||||||
/// source node.
|
/// source node.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@@ -178,15 +189,18 @@ where
|
|||||||
let max_messages_size_in_single_batch = P::TargetChain::max_extrinsic_size() / 3;
|
let max_messages_size_in_single_batch = P::TargetChain::max_extrinsic_size() / 3;
|
||||||
// we don't know exact weights of the Polkadot runtime. So to guess weights we'll be using
|
// we don't know exact weights of the Polkadot runtime. So to guess weights we'll be using
|
||||||
// weights from Rialto and then simply dividing it by x2.
|
// weights from Rialto and then simply dividing it by x2.
|
||||||
|
let limits = match params.limits {
|
||||||
|
Some(limits) => limits,
|
||||||
|
None =>
|
||||||
|
select_delivery_transaction_limits_rpc::<P>(
|
||||||
|
¶ms,
|
||||||
|
P::TargetChain::max_extrinsic_weight(),
|
||||||
|
P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX,
|
||||||
|
)
|
||||||
|
.await?,
|
||||||
|
};
|
||||||
let (max_messages_in_single_batch, max_messages_weight_in_single_batch) =
|
let (max_messages_in_single_batch, max_messages_weight_in_single_batch) =
|
||||||
select_delivery_transaction_limits_rpc::<P>(
|
(limits.max_messages_in_single_batch / 2, limits.max_messages_weight_in_single_batch / 2);
|
||||||
¶ms,
|
|
||||||
P::TargetChain::max_extrinsic_weight(),
|
|
||||||
P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
let (max_messages_in_single_batch, max_messages_weight_in_single_batch) =
|
|
||||||
(max_messages_in_single_batch / 2, max_messages_weight_in_single_batch / 2);
|
|
||||||
|
|
||||||
let source_client = params.source_client;
|
let source_client = params.source_client;
|
||||||
let target_client = params.target_client;
|
let target_client = params.target_client;
|
||||||
@@ -457,7 +471,7 @@ async fn select_delivery_transaction_limits_rpc<P: SubstrateMessageLane>(
|
|||||||
params: &MessagesRelayParams<P>,
|
params: &MessagesRelayParams<P>,
|
||||||
max_extrinsic_weight: Weight,
|
max_extrinsic_weight: Weight,
|
||||||
max_unconfirmed_messages_at_inbound_lane: MessageNonce,
|
max_unconfirmed_messages_at_inbound_lane: MessageNonce,
|
||||||
) -> anyhow::Result<(MessageNonce, Weight)>
|
) -> anyhow::Result<MessagesRelayLimits>
|
||||||
where
|
where
|
||||||
AccountIdOf<P::SourceChain>: From<<AccountKeyPairOf<P::SourceChain> as Pair>::Public>,
|
AccountIdOf<P::SourceChain>: From<<AccountKeyPairOf<P::SourceChain> as Pair>::Public>,
|
||||||
{
|
{
|
||||||
@@ -515,7 +529,10 @@ where
|
|||||||
"Relay shall be able to deliver messages with dispatch weight = max_extrinsic_weight / 2",
|
"Relay shall be able to deliver messages with dispatch weight = max_extrinsic_weight / 2",
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok((max_number_of_messages, weight_for_messages_dispatch))
|
Ok(MessagesRelayLimits {
|
||||||
|
max_messages_in_single_batch: max_number_of_messages,
|
||||||
|
max_messages_weight_in_single_batch: weight_for_messages_dispatch,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns dummy message delivery transaction with zero messages and `1kb` proof.
|
/// Returns dummy message delivery transaction with zero messages and `1kb` proof.
|
||||||
|
|||||||
Reference in New Issue
Block a user