cometbft_light_client_detector/
provider.rs

1use cometbft::block::Height;
2use cometbft::evidence::Evidence;
3use cometbft::hash::Hash;
4use cometbft_light_client::errors::Error;
5use cometbft_light_client::instance::Instance;
6use cometbft_light_client::light_client::TargetOrLatest;
7use cometbft_light_client::state::State;
8use cometbft_light_client::store::memory::MemoryStore;
9use cometbft_light_client::verifier::types::LightBlock;
10use cometbft_rpc::{Client, Error as RpcError, HttpClient};
11
12/// A interface over a light client instance and its RPC client.
13#[derive(Debug)]
14pub struct Provider {
15    chain_id: String,
16    instance: Instance,
17    rpc_client: HttpClient,
18}
19
20impl Provider {
21    pub fn new(chain_id: String, instance: Instance, rpc_client: HttpClient) -> Self {
22        Self {
23            chain_id,
24            instance,
25            rpc_client,
26        }
27    }
28
29    pub fn chain_id(&self) -> &str {
30        &self.chain_id
31    }
32
33    pub fn peer_id(&self) -> &cometbft::node::Id {
34        self.instance.peer_id()
35    }
36
37    pub async fn report_evidence(&self, evidence: Evidence) -> Result<Hash, RpcError> {
38        self.rpc_client
39            .broadcast_evidence(evidence)
40            .await
41            .map(|response| response.hash)
42    }
43
44    pub fn fetch_light_block(&self, height: Height) -> Result<LightBlock, Error> {
45        let mut state = State::new(MemoryStore::new());
46
47        self.instance
48            .light_client
49            .get_or_fetch_block(height, &mut state)
50            .map(|(lb, _)| lb)
51    }
52
53    pub fn verify_to_highest(&mut self) -> Result<LightBlock, Error> {
54        self.instance
55            .light_client
56            .verify_to_highest(&mut self.instance.state)
57    }
58
59    pub fn verify_to_height(&mut self, height: Height) -> Result<LightBlock, Error> {
60        self.instance
61            .light_client
62            .verify_to_target(height, &mut self.instance.state)
63    }
64
65    pub fn verify_to_height_with_state(
66        &self,
67        height: Height,
68        state: &mut State,
69    ) -> Result<LightBlock, Error> {
70        self.instance.light_client.verify_to_target(height, state)
71    }
72
73    pub fn get_target_block_or_latest(&mut self, height: Height) -> Result<TargetOrLatest, Error> {
74        self.instance
75            .light_client
76            .get_target_block_or_latest(height, &mut self.instance.state)
77    }
78
79    pub fn get_trace(&self, height: Height) -> Vec<LightBlock> {
80        self.instance.state.get_trace(height)
81    }
82
83    pub fn latest_trusted(&self) -> Option<LightBlock> {
84        self.instance.latest_trusted()
85    }
86}