// 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 . //! Primitives for exposing the bridge initialization functionality in the CLI. use async_trait::async_trait; use codec::Encode; use crate::{ cli::{bridge::CliBridgeBase, chain_schema::*}, finality_base::engine::Engine, }; use bp_runtime::Chain as ChainBase; use relay_substrate_client::{AccountKeyPairOf, Chain, UnsignedTransaction}; use sp_core::Pair; use structopt::StructOpt; /// Bridge initialization params. #[derive(StructOpt)] pub struct InitBridgeParams { #[structopt(flatten)] source: SourceConnectionParams, #[structopt(flatten)] target: TargetConnectionParams, #[structopt(flatten)] target_sign: TargetSigningParams, /// Generates all required data, but does not submit extrinsic #[structopt(long)] dry_run: bool, } /// Trait used for bridge initializing. #[async_trait] pub trait BridgeInitializer: CliBridgeBase where ::AccountId: From< as Pair>::Public>, { /// The finality engine used by the source chain. type Engine: Engine; /// Get the encoded call to init the bridge. fn encode_init_bridge( init_data: >::InitializationData, ) -> ::Call; /// Initialize the bridge. async fn init_bridge(data: InitBridgeParams) -> anyhow::Result<()> { let source_client = data.source.into_client::().await?; let target_client = data.target.into_client::().await?; let target_sign = data.target_sign.to_keypair::()?; let dry_run = data.dry_run; crate::finality::initialize::initialize::( source_client, target_client.clone(), target_sign, move |transaction_nonce, initialization_data| { let call = Self::encode_init_bridge(initialization_data); log::info!( target: "bridge", "Initialize bridge call encoded as hex string: {:?}", format!("0x{}", hex::encode(call.encode())) ); Ok(UnsignedTransaction::new(call.into(), transaction_nonce)) }, dry_run, ) .await; Ok(()) } }