substrate_relay_helper/cli/
relay_headers.rs1use async_trait::async_trait;
20use clap::Parser;
21
22use relay_utils::{
23 metrics::{GlobalMetrics, StandaloneMetric},
24 UniqueSaturatedInto,
25};
26
27use crate::{
28 cli::{bridge::*, chain_schema::*, PrometheusParams},
29 finality::SubstrateFinalitySyncPipeline,
30 HeadersToRelay,
31};
32use relay_substrate_client::Client;
33
34#[derive(Parser)]
36pub struct RelayHeadersParams {
37 #[arg(long)]
40 only_mandatory_headers: bool,
41 #[arg(long)]
44 only_free_headers: bool,
45 #[command(flatten)]
46 source: SourceConnectionParams,
47 #[command(flatten)]
48 target: TargetConnectionParams,
49 #[command(flatten)]
50 target_sign: TargetSigningParams,
51 #[command(flatten)]
52 prometheus_params: PrometheusParams,
53}
54
55#[derive(Parser)]
57pub struct RelayHeaderParams {
58 #[command(flatten)]
59 source: SourceConnectionParams,
60 #[command(flatten)]
61 target: TargetConnectionParams,
62 #[command(flatten)]
63 target_sign: TargetSigningParams,
64 #[arg(long)]
67 number: u128,
68}
69
70impl RelayHeadersParams {
71 fn headers_to_relay(&self) -> HeadersToRelay {
72 match (self.only_mandatory_headers, self.only_free_headers) {
73 (_, true) => HeadersToRelay::Free,
74 (true, false) => HeadersToRelay::Mandatory,
75 _ => HeadersToRelay::All,
76 }
77 }
78}
79
80#[async_trait]
82pub trait HeadersRelayer: RelayToRelayHeadersCliBridge {
83 async fn relay_headers(data: RelayHeadersParams) -> anyhow::Result<()> {
85 let headers_to_relay = data.headers_to_relay();
86 let source_client = data.source.into_client::<Self::Source>().await?;
87 let target_client = data.target.into_client::<Self::Target>().await?;
88 let target_transactions_mortality = data.target_sign.target_transactions_mortality;
89 let target_sign = data.target_sign.to_keypair::<Self::Target>()?;
90
91 let metrics_params: relay_utils::metrics::MetricsParams =
92 data.prometheus_params.into_metrics_params()?;
93 GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?;
94
95 let target_transactions_params = crate::TransactionParams {
96 signer: target_sign,
97 mortality: target_transactions_mortality,
98 };
99
100 Self::Finality::start_relay_guards(&target_client, target_client.can_start_version_guard())
101 .await?;
102
103 crate::finality::run::<Self::Finality>(
104 source_client,
105 target_client,
106 headers_to_relay,
107 target_transactions_params,
108 metrics_params,
109 )
110 .await
111 }
112
113 async fn relay_header(data: RelayHeaderParams) -> anyhow::Result<()> {
115 let source_client = data.source.into_client::<Self::Source>().await?;
116 let target_client = data.target.into_client::<Self::Target>().await?;
117 let target_transactions_mortality = data.target_sign.target_transactions_mortality;
118 let target_sign = data.target_sign.to_keypair::<Self::Target>()?;
119
120 crate::finality::relay_single_header::<Self::Finality>(
121 source_client,
122 target_client,
123 crate::TransactionParams {
124 signer: target_sign,
125 mortality: target_transactions_mortality,
126 },
127 data.number.unique_saturated_into(),
128 )
129 .await
130 }
131}