cometbft_light_client_detector/
provider.rs1use 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#[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}