diff --git a/bridges/relays/bin-substrate/src/cli/mod.rs b/bridges/relays/bin-substrate/src/cli/mod.rs index 6418848c29..5419f82637 100644 --- a/bridges/relays/bin-substrate/src/cli/mod.rs +++ b/bridges/relays/bin-substrate/src/cli/mod.rs @@ -27,6 +27,7 @@ use structopt::{clap::arg_enum, StructOpt}; mod init_bridge; mod relay_headers; +mod relay_messages; /// Parse relay CLI args. pub fn parse_args() -> Command { @@ -46,7 +47,7 @@ pub enum Command { /// /// Ties up to `Messages` pallets on both chains and starts relaying messages. /// Requires the header relay to be already running. - RelayMessages(RelayMessages), + RelayMessages(relay_messages::RelayMessages), /// Initialize on-chain bridge pallet with current header data. /// /// Sends initialization transaction to bootstrap the bridge with current finalized block data. @@ -90,23 +91,6 @@ impl Command { } } -/// Start message relayer process. -#[derive(StructOpt)] -pub enum RelayMessages { - #[structopt(flatten)] - RialtoMillau(rialto_millau::RelayMessages), -} - -impl RelayMessages { - /// Run the command. - pub async fn run(self) -> anyhow::Result<()> { - match self { - Self::RialtoMillau(arg) => arg.run().await?, - } - Ok(()) - } -} - /// Send bridge message. #[derive(StructOpt)] pub enum SendMessage { diff --git a/bridges/relays/bin-substrate/src/cli/relay_messages.rs b/bridges/relays/bin-substrate/src/cli/relay_messages.rs new file mode 100644 index 0000000000..80cb0654a3 --- /dev/null +++ b/bridges/relays/bin-substrate/src/cli/relay_messages.rs @@ -0,0 +1,97 @@ +// 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 . + +use crate::cli::{ + CliChain, HexLaneId, PrometheusParams, SourceConnectionParams, SourceSigningParams, TargetConnectionParams, + TargetSigningParams, +}; +use structopt::{clap::arg_enum, StructOpt}; + +/// Start messages relayer process. +#[derive(StructOpt)] +pub struct RelayMessages { + /// A bridge instance to relay messages for. + #[structopt(possible_values = &RelayMessagesBridge::variants(), case_insensitive = true)] + bridge: RelayMessagesBridge, + /// Hex-encoded lane id that should be served by the relay. Defaults to `00000000`. + #[structopt(long, default_value = "00000000")] + lane: HexLaneId, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + source_sign: SourceSigningParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +arg_enum! { + #[derive(Debug)] + /// Headers relay bridge. + pub enum RelayMessagesBridge { + MillauToRialto, + RialtoToMillau, + } +} + +macro_rules! select_bridge { + ($bridge: expr, $generic: tt) => { + match $bridge { + RelayMessagesBridge::MillauToRialto => { + type Source = relay_millau_client::Millau; + type Target = relay_rialto_client::Rialto; + use crate::rialto_millau::millau_messages_to_rialto::run; + + $generic + } + RelayMessagesBridge::RialtoToMillau => { + type Source = relay_rialto_client::Rialto; + type Target = relay_millau_client::Millau; + use crate::rialto_millau::rialto_messages_to_millau::run; + + $generic + } + } + }; +} + +impl RelayMessages { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + select_bridge!(self.bridge, { + let source_client = crate::rialto_millau::source_chain_client::(self.source).await?; + let source_sign = + Source::source_signing_params(self.source_sign).map_err(|e| anyhow::format_err!("{}", e))?; + let target_client = crate::rialto_millau::target_chain_client::(self.target).await?; + let target_sign = + Target::target_signing_params(self.target_sign).map_err(|e| anyhow::format_err!("{}", e))?; + + run( + source_client, + source_sign, + target_client, + target_sign, + self.lane.into(), + self.prometheus_params.into(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) + }) + } +} diff --git a/bridges/relays/bin-substrate/src/rialto_millau/cli.rs b/bridges/relays/bin-substrate/src/rialto_millau/cli.rs index 1005e85472..3d314cc71b 100644 --- a/bridges/relays/bin-substrate/src/rialto_millau/cli.rs +++ b/bridges/relays/bin-substrate/src/rialto_millau/cli.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// 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 @@ -20,57 +20,10 @@ use frame_support::weights::Weight; use structopt::StructOpt; use crate::cli::{ - AccountId, Balance, ExplicitOrMaximal, HexBytes, HexLaneId, Origins, PrometheusParams, SourceConnectionParams, - SourceSigningParams, TargetConnectionParams, TargetSigningParams, + AccountId, Balance, ExplicitOrMaximal, HexBytes, HexLaneId, Origins, SourceConnectionParams, SourceSigningParams, + TargetSigningParams, }; -/// Start message relayer process. -/// -/// TODO [#855] Move to separate module. -#[derive(StructOpt)] -pub enum RelayMessages { - /// Serve given lane of Millau -> Rialto messages. - MillauToRialto { - #[structopt(flatten)] - source: SourceConnectionParams, - #[structopt(flatten)] - source_sign: SourceSigningParams, - #[structopt(flatten)] - target: TargetConnectionParams, - #[structopt(flatten)] - target_sign: TargetSigningParams, - #[structopt(flatten)] - prometheus_params: PrometheusParams, - /// Hex-encoded lane id that should be served by the relay. Defaults to `00000000`. - #[structopt(long, default_value = "00000000")] - lane: HexLaneId, - }, - /// Serve given lane of Rialto -> Millau messages. - RialtoToMillau { - #[structopt(flatten)] - source: SourceConnectionParams, - #[structopt(flatten)] - source_sign: SourceSigningParams, - #[structopt(flatten)] - target: TargetConnectionParams, - #[structopt(flatten)] - target_sign: TargetSigningParams, - #[structopt(flatten)] - prometheus_params: PrometheusParams, - /// Hex-encoded lane id that should be served by the relay. Defaults to `00000000`. - #[structopt(long, default_value = "00000000")] - lane: HexLaneId, - }, -} - -impl RelayMessages { - /// Run the command. - pub async fn run(self) -> anyhow::Result<()> { - super::run_relay_messages(self).await.map_err(format_err)?; - Ok(()) - } -} - /// Send bridge message. /// /// TODO [#855] Move to separate module. diff --git a/bridges/relays/bin-substrate/src/rialto_millau/mod.rs b/bridges/relays/bin-substrate/src/rialto_millau/mod.rs index 7a48119be7..5446e382a7 100644 --- a/bridges/relays/bin-substrate/src/rialto_millau/mod.rs +++ b/bridges/relays/bin-substrate/src/rialto_millau/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// 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 @@ -44,63 +44,6 @@ use sp_runtime::{traits::IdentifyAccount, MultiSigner}; use sp_version::RuntimeVersion; use std::fmt::Debug; -async fn run_relay_messages(command: cli::RelayMessages) -> Result<(), String> { - match command { - cli::RelayMessages::MillauToRialto { - source, - source_sign, - target, - target_sign, - prometheus_params, - lane, - } => { - type Source = Millau; - type Target = Rialto; - - let source_client = source_chain_client::(source).await?; - let source_sign = Source::source_signing_params(source_sign)?; - let target_client = target_chain_client::(target).await?; - let target_sign = Target::target_signing_params(target_sign)?; - - millau_messages_to_rialto::run( - source_client, - source_sign, - target_client, - target_sign, - lane.into(), - prometheus_params.into(), - ) - .await - } - cli::RelayMessages::RialtoToMillau { - source, - source_sign, - target, - target_sign, - prometheus_params, - lane, - } => { - type Source = Rialto; - type Target = Millau; - - let source_client = source_chain_client::(source).await?; - let source_sign = Source::source_signing_params(source_sign)?; - let target_client = target_chain_client::(target).await?; - let target_sign = Target::target_signing_params(target_sign)?; - - rialto_messages_to_millau::run( - source_client, - source_sign, - target_client, - target_sign, - lane.into(), - prometheus_params.into(), - ) - .await - } - } -} - async fn run_send_message(command: cli::SendMessage) -> Result<(), String> { match command { cli::SendMessage::MillauToRialto {