reth_provider/traits/
header_sync_gap.rs1use alloy_consensus::{BlockHeader, Header};
2use alloy_eips::BlockHashOrNumber;
3use alloy_primitives::{BlockNumber, B256};
4use reth_network_p2p::headers::downloader::SyncTarget;
5use reth_primitives::SealedHeader;
6use reth_storage_errors::provider::ProviderResult;
7use tokio::sync::watch;
8
9#[derive(Clone, Debug)]
11pub struct HeaderSyncGap<H = Header> {
12 pub local_head: SealedHeader<H>,
14
15 pub target: SyncTarget,
17}
18
19impl<H: BlockHeader> HeaderSyncGap<H> {
20 #[inline]
22 pub fn is_closed(&self) -> bool {
23 match self.target.tip() {
24 BlockHashOrNumber::Hash(hash) => self.local_head.hash() == hash,
25 BlockHashOrNumber::Number(num) => self.local_head.number() == num,
26 }
27 }
28}
29
30#[auto_impl::auto_impl(&, Arc)]
32pub trait HeaderSyncGapProvider: Send + Sync {
33 type Header: Send + Sync;
35
36 fn sync_gap(
41 &self,
42 tip: watch::Receiver<B256>,
43 highest_uninterrupted_block: BlockNumber,
44 ) -> ProviderResult<HeaderSyncGap<Self::Header>>;
45}