diff --git a/bridges/relays/bin-substrate/src/cli/init_bridge.rs b/bridges/relays/bin-substrate/src/cli/init_bridge.rs
index ac2b8c7a70..4a073cfa1d 100644
--- a/bridges/relays/bin-substrate/src/cli/init_bridge.rs
+++ b/bridges/relays/bin-substrate/src/cli/init_bridge.rs
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Parity Bridges Common. If not, see .
-use crate::cli::{CliChain, SourceConnectionParams, TargetConnectionParams, TargetSigningParams};
+use crate::cli::{SourceConnectionParams, TargetConnectionParams, TargetSigningParams};
use bp_runtime::Chain as ChainBase;
use codec::Encode;
use pallet_bridge_grandpa::InitializationData;
@@ -108,10 +108,9 @@ impl InitBridge {
/// 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 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))?;
+ let source_client = self.source.into_client::().await?;
+ let target_client = self.target.into_client::().await?;
+ let target_sign = self.target_sign.into_keypair::()?;
crate::headers_initialize::initialize(
source_client,
diff --git a/bridges/relays/bin-substrate/src/cli/mod.rs b/bridges/relays/bin-substrate/src/cli/mod.rs
index 3bcc1bf584..f3f7dfefd9 100644
--- a/bridges/relays/bin-substrate/src/cli/mod.rs
+++ b/bridges/relays/bin-substrate/src/cli/mod.rs
@@ -281,20 +281,6 @@ pub trait CliChain: relay_substrate_client::Chain {
/// Maximal extrinsic weight (from the runtime).
fn max_extrinsic_weight() -> Weight;
-
- /// Convert CLI signing parameters of `Source` chain into a `KeyPair` instance.
- fn source_signing_params(params: SourceSigningParams) -> Result {
- use sp_core::crypto::Pair;
- Self::KeyPair::from_string(¶ms.source_signer, params.source_signer_password.as_deref())
- .map_err(|e| format!("Failed to parse source-signer: {:?}", e))
- }
-
- /// Convert CLI signing parameters of `Target` chain into a `KeyPair` instance.
- fn target_signing_params(params: TargetSigningParams) -> Result {
- use sp_core::crypto::Pair;
- Self::KeyPair::from_string(¶ms.target_signer, params.target_signer_password.as_deref())
- .map_err(|e| format!("Failed to parse target-signer: {:?}", e))
- }
}
/// Lane id.
@@ -425,12 +411,36 @@ macro_rules! declare_chain_options {
#[structopt(long)]
pub [<$chain_prefix _signer_password>]: Option,
}
+
+ impl [<$chain SigningParams>] {
+ /// Parse signing params into chain-specific KeyPair.
+ pub fn into_keypair(self) -> anyhow::Result {
+ use sp_core::crypto::Pair;
+ Chain::KeyPair::from_string(
+ &self.[<$chain_prefix _signer>],
+ self.[<$chain_prefix _signer_password>].as_deref()
+ ).map_err(|e| anyhow::format_err!("{:?}", e))
+ }
+ }
+
+ impl [<$chain ConnectionParams>] {
+ /// Convert connection params into Substrate client.
+ pub async fn into_client(
+ self,
+ ) -> anyhow::Result> {
+ Ok(relay_substrate_client::Client::new(relay_substrate_client::ConnectionParams {
+ host: self.[<$chain_prefix _host>],
+ port: self.[<$chain_prefix _port>],
+ secure: self.[<$chain_prefix _secure>],
+ })
+ .await?
+ )
+ }
+ }
}
};
}
-// TODO [#852] Use structop renames instead of different fields.
-// TODO [#852] Add Into?
declare_chain_options!(Source, source);
declare_chain_options!(Target, target);
diff --git a/bridges/relays/bin-substrate/src/cli/relay_headers.rs b/bridges/relays/bin-substrate/src/cli/relay_headers.rs
index 6e90332576..6c2b2f1d66 100644
--- a/bridges/relays/bin-substrate/src/cli/relay_headers.rs
+++ b/bridges/relays/bin-substrate/src/cli/relay_headers.rs
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Parity Bridges Common. If not, see .
-use crate::cli::{CliChain, PrometheusParams, SourceConnectionParams, TargetConnectionParams, TargetSigningParams};
+use crate::cli::{PrometheusParams, SourceConnectionParams, TargetConnectionParams, TargetSigningParams};
use structopt::{clap::arg_enum, StructOpt};
/// Start headers relayer process.
@@ -74,10 +74,9 @@ impl RelayHeaders {
/// 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 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))?;
+ let source_client = self.source.into_client::().await?;
+ let target_client = self.target.into_client::().await?;
+ let target_sign = self.target_sign.into_keypair::()?;
crate::finality_pipeline::run(
Finality::new(target_client.clone(), target_sign),
diff --git a/bridges/relays/bin-substrate/src/cli/relay_messages.rs b/bridges/relays/bin-substrate/src/cli/relay_messages.rs
index 80cb0654a3..72a194ef90 100644
--- a/bridges/relays/bin-substrate/src/cli/relay_messages.rs
+++ b/bridges/relays/bin-substrate/src/cli/relay_messages.rs
@@ -15,7 +15,7 @@
// along with Parity Bridges Common. If not, see .
use crate::cli::{
- CliChain, HexLaneId, PrometheusParams, SourceConnectionParams, SourceSigningParams, TargetConnectionParams,
+ HexLaneId, PrometheusParams, SourceConnectionParams, SourceSigningParams, TargetConnectionParams,
TargetSigningParams,
};
use structopt::{clap::arg_enum, StructOpt};
@@ -75,12 +75,10 @@ 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))?;
+ let source_client = self.source.into_client::().await?;
+ let source_sign = self.source_sign.into_keypair::()?;
+ let target_client = self.target.into_client::().await?;
+ let target_sign = self.target_sign.into_keypair::()?;
run(
source_client,
diff --git a/bridges/relays/bin-substrate/src/rialto_millau/mod.rs b/bridges/relays/bin-substrate/src/rialto_millau/mod.rs
index bcc7821e20..f039aadef5 100644
--- a/bridges/relays/bin-substrate/src/rialto_millau/mod.rs
+++ b/bridges/relays/bin-substrate/src/rialto_millau/mod.rs
@@ -28,16 +28,13 @@ pub type MillauClient = relay_substrate_client::Client;
/// Rialto node client.
pub type RialtoClient = relay_substrate_client::Client;
-use crate::cli::{
- CliChain, ExplicitOrMaximal, HexBytes, Origins, SourceConnectionParams, SourceSigningParams,
- TargetConnectionParams, TargetSigningParams,
-};
+use crate::cli::{CliChain, ExplicitOrMaximal, HexBytes, Origins};
use codec::{Decode, Encode};
use frame_support::weights::{GetDispatchInfo, Weight};
use pallet_bridge_dispatch::{CallOrigin, MessagePayload};
use relay_millau_client::Millau;
use relay_rialto_client::Rialto;
-use relay_substrate_client::{Chain, ConnectionParams, TransactionSignScheme};
+use relay_substrate_client::{Chain, TransactionSignScheme};
use relay_westend_client::Westend;
use sp_core::{Bytes, Pair};
use sp_runtime::{traits::IdentifyAccount, MultiSigner};
@@ -75,9 +72,9 @@ async fn run_send_message(command: cli::SendMessage) -> Result<(), String> {
))
};
- let source_client = source_chain_client::(source).await?;
- let source_sign = Source::source_signing_params(source_sign)?;
- let target_sign = Target::target_signing_params(target_sign)?;
+ let source_client = source.into_client::().await.map_err(format_err)?;
+ let source_sign = source_sign.into_keypair::().map_err(format_err)?;
+ let target_sign = target_sign.into_keypair::().map_err(format_err)?;
let target_call = Target::encode_call(message)?;
let payload = {
@@ -181,9 +178,9 @@ async fn run_send_message(command: cli::SendMessage) -> Result<(), String> {
))
};
- let source_client = source_chain_client::(source).await?;
- let source_sign = Source::source_signing_params(source_sign)?;
- let target_sign = Target::target_signing_params(target_sign)?;
+ let source_client = source.into_client::().await.map_err(format_err)?;
+ let source_sign = source_sign.into_keypair::().map_err(format_err)?;
+ let target_sign = target_sign.into_keypair::().map_err(format_err)?;
let target_call = Target::encode_call(message)?;
let payload = {
@@ -306,7 +303,7 @@ async fn run_estimate_fee(cmd: cli::EstimateFee) -> Result<(), String> {
let estimate_message_fee_method = bp_millau::TO_MILLAU_ESTIMATE_MESSAGE_FEE_METHOD;
- let source_client = source_chain_client::(source).await?;
+ let source_client = source.into_client::().await.map_err(format_err)?;
let lane = lane.into();
let payload = Source::encode_message(payload)?;
@@ -322,7 +319,7 @@ async fn run_estimate_fee(cmd: cli::EstimateFee) -> Result<(), String> {
let estimate_message_fee_method = bp_rialto::TO_RIALTO_ESTIMATE_MESSAGE_FEE_METHOD;
- let source_client = source_chain_client::(source).await?;
+ let source_client = source.into_client::().await.map_err(format_err)?;
let lane = lane.into();
let payload = Source::encode_message(payload)?;
@@ -601,16 +598,6 @@ impl CliChain for Rialto {
}
}
}
-
- fn source_signing_params(params: SourceSigningParams) -> Result {
- Self::KeyPair::from_string(¶ms.source_signer, params.source_signer_password.as_deref())
- .map_err(|e| format!("Failed to parse source-signer: {:?}", e))
- }
-
- fn target_signing_params(params: TargetSigningParams) -> Result {
- Self::KeyPair::from_string(¶ms.target_signer, params.target_signer_password.as_deref())
- .map_err(|e| format!("Failed to parse target-signer: {:?}", e))
- }
}
impl CliChain for Westend {
@@ -636,26 +623,8 @@ impl CliChain for Westend {
}
}
-pub async fn source_chain_client(
- params: SourceConnectionParams,
-) -> relay_substrate_client::Result> {
- relay_substrate_client::Client::new(ConnectionParams {
- host: params.source_host,
- port: params.source_port,
- secure: params.source_secure,
- })
- .await
-}
-
-pub async fn target_chain_client(
- params: TargetConnectionParams,
-) -> relay_substrate_client::Result> {
- relay_substrate_client::Client::new(ConnectionParams {
- host: params.target_host,
- port: params.target_port,
- secure: params.target_secure,
- })
- .await
+fn format_err(e: anyhow::Error) -> String {
+ e.to_string()
}
#[cfg(test)]