substrate_relay_helper/equivocation/
target.rs1use crate::{
20 equivocation::{
21 EquivocationDetectionPipelineAdapter, FinalityProoffOf, FinalityVerificationContextfOf,
22 SubstrateEquivocationDetectionPipeline,
23 },
24 finality_base::{best_synced_header_id, engine::Engine},
25};
26
27use async_trait::async_trait;
28use bp_header_chain::HeaderFinalityInfo;
29use bp_runtime::{BlockNumberOf, HashOf};
30use equivocation_detector::TargetClient;
31use relay_substrate_client::{Client, Error};
32use relay_utils::relay_loop::Client as RelayClient;
33use sp_runtime::traits::Header;
34use std::marker::PhantomData;
35
36pub struct SubstrateEquivocationTarget<P: SubstrateEquivocationDetectionPipeline, TargetClnt> {
38 client: TargetClnt,
39
40 _phantom: PhantomData<P>,
41}
42
43impl<P: SubstrateEquivocationDetectionPipeline, TargetClnt: Client<P::TargetChain>>
44 SubstrateEquivocationTarget<P, TargetClnt>
45{
46 pub fn new(client: TargetClnt) -> Self {
48 Self { client, _phantom: Default::default() }
49 }
50}
51
52impl<P: SubstrateEquivocationDetectionPipeline, TargetClnt: Client<P::TargetChain>> Clone
53 for SubstrateEquivocationTarget<P, TargetClnt>
54{
55 fn clone(&self) -> Self {
56 Self { client: self.client.clone(), _phantom: Default::default() }
57 }
58}
59
60#[async_trait]
61impl<P: SubstrateEquivocationDetectionPipeline, TargetClnt: Client<P::TargetChain>> RelayClient
62 for SubstrateEquivocationTarget<P, TargetClnt>
63{
64 type Error = Error;
65
66 async fn reconnect(&mut self) -> Result<(), Error> {
67 self.client.reconnect().await
68 }
69}
70
71#[async_trait]
72impl<P: SubstrateEquivocationDetectionPipeline, TargetClnt: Client<P::TargetChain>>
73 TargetClient<EquivocationDetectionPipelineAdapter<P>>
74 for SubstrateEquivocationTarget<P, TargetClnt>
75{
76 async fn best_finalized_header_number(
77 &self,
78 ) -> Result<BlockNumberOf<P::TargetChain>, Self::Error> {
79 self.client.best_finalized_header_number().await
80 }
81
82 async fn best_synced_header_hash(
83 &self,
84 at: BlockNumberOf<P::TargetChain>,
85 ) -> Result<Option<HashOf<P::SourceChain>>, Self::Error> {
86 Ok(best_synced_header_id::<P::SourceChain, P::TargetChain>(
87 &self.client,
88 self.client.header_by_number(at).await?.hash(),
89 )
90 .await?
91 .map(|id| id.hash()))
92 }
93
94 async fn finality_verification_context(
95 &self,
96 at: BlockNumberOf<P::TargetChain>,
97 ) -> Result<FinalityVerificationContextfOf<P>, Self::Error> {
98 P::FinalityEngine::finality_verification_context(
99 &self.client,
100 self.client.header_by_number(at).await?.hash(),
101 )
102 .await
103 }
104
105 async fn synced_headers_finality_info(
106 &self,
107 at: BlockNumberOf<P::TargetChain>,
108 ) -> Result<
109 Vec<HeaderFinalityInfo<FinalityProoffOf<P>, FinalityVerificationContextfOf<P>>>,
110 Self::Error,
111 > {
112 P::FinalityEngine::synced_headers_finality_info(
113 &self.client,
114 self.client.header_by_number(at).await?.hash(),
115 )
116 .await
117 }
118}