86 lines
2.7 KiB
Rust
86 lines
2.7 KiB
Rust
// 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/>.
|
|
|
|
//! 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 clap::Parser;
|
|
use pezbp_runtime::Chain as ChainBase;
|
|
use pezsp_core::Pair;
|
|
use relay_bizinikiwi_client::{AccountKeyPairOf, Chain, UnsignedTransaction};
|
|
|
|
/// Bridge initialization params.
|
|
#[derive(Parser)]
|
|
pub struct InitBridgeParams {
|
|
#[command(flatten)]
|
|
source: SourceConnectionParams,
|
|
#[command(flatten)]
|
|
target: TargetConnectionParams,
|
|
#[command(flatten)]
|
|
target_sign: TargetSigningParams,
|
|
/// Generates all required data, but does not submit extrinsic
|
|
#[arg(long)]
|
|
dry_run: bool,
|
|
}
|
|
|
|
/// Trait used for bridge initializing.
|
|
#[async_trait]
|
|
pub trait BridgeInitializer: CliBridgeBase
|
|
where
|
|
<Self::Target as ChainBase>::AccountId: From<<AccountKeyPairOf<Self::Target> as Pair>::Public>,
|
|
{
|
|
/// The finality engine used by the source chain.
|
|
type Engine: Engine<Self::Source>;
|
|
|
|
/// Get the encoded call to init the bridge.
|
|
fn encode_init_bridge(
|
|
init_data: <Self::Engine as Engine<Self::Source>>::InitializationData,
|
|
) -> <Self::Target as Chain>::Call;
|
|
|
|
/// Initialize the bridge.
|
|
async fn init_bridge(data: InitBridgeParams) -> anyhow::Result<()> {
|
|
let source_client = data.source.into_client::<Self::Source>().await?;
|
|
let target_client = data.target.into_client::<Self::Target>().await?;
|
|
let target_sign = data.target_sign.to_keypair::<Self::Target>()?;
|
|
let dry_run = data.dry_run;
|
|
|
|
crate::finality::initialize::initialize::<Self::Engine, _, _, _>(
|
|
source_client,
|
|
target_client.clone(),
|
|
target_sign,
|
|
move |transaction_nonce, initialization_data| {
|
|
let call = Self::encode_init_bridge(initialization_data);
|
|
tracing::info!(
|
|
target: "bridge",
|
|
hex_string=?format!("0x{}", hex::encode(call.encode())),
|
|
"Initialize bridge call encoded"
|
|
);
|
|
Ok(UnsignedTransaction::new(call.into(), transaction_nonce))
|
|
},
|
|
dry_run,
|
|
)
|
|
.await;
|
|
|
|
Ok(())
|
|
}
|
|
}
|