substrate_relay_helper/cli/
init_bridge.rs1use async_trait::async_trait;
20use codec::Encode;
21
22use crate::{
23 cli::{bridge::CliBridgeBase, chain_schema::*},
24 finality_base::engine::Engine,
25};
26use bp_runtime::Chain as ChainBase;
27use clap::Parser;
28use relay_substrate_client::{AccountKeyPairOf, Chain, UnsignedTransaction};
29use sp_core::Pair;
30
31#[derive(Parser)]
33pub struct InitBridgeParams {
34 #[command(flatten)]
35 source: SourceConnectionParams,
36 #[command(flatten)]
37 target: TargetConnectionParams,
38 #[command(flatten)]
39 target_sign: TargetSigningParams,
40 #[arg(long)]
42 dry_run: bool,
43}
44
45#[async_trait]
47pub trait BridgeInitializer: CliBridgeBase
48where
49 <Self::Target as ChainBase>::AccountId: From<<AccountKeyPairOf<Self::Target> as Pair>::Public>,
50{
51 type Engine: Engine<Self::Source>;
53
54 fn encode_init_bridge(
56 init_data: <Self::Engine as Engine<Self::Source>>::InitializationData,
57 ) -> <Self::Target as Chain>::Call;
58
59 async fn init_bridge(data: InitBridgeParams) -> anyhow::Result<()> {
61 let source_client = data.source.into_client::<Self::Source>().await?;
62 let target_client = data.target.into_client::<Self::Target>().await?;
63 let target_sign = data.target_sign.to_keypair::<Self::Target>()?;
64 let dry_run = data.dry_run;
65
66 crate::finality::initialize::initialize::<Self::Engine, _, _, _>(
67 source_client,
68 target_client.clone(),
69 target_sign,
70 move |transaction_nonce, initialization_data| {
71 let call = Self::encode_init_bridge(initialization_data);
72 log::info!(
73 target: "bridge",
74 "Initialize bridge call encoded as hex string: {:?}",
75 format!("0x{}", hex::encode(call.encode()))
76 );
77 Ok(UnsignedTransaction::new(call.into(), transaction_nonce))
78 },
79 dry_run,
80 )
81 .await;
82
83 Ok(())
84 }
85}