diff --git a/crates/optimism/rpc/src/eth/mod.rs b/crates/optimism/rpc/src/eth/mod.rs index fcb2fb2d5c..d36f9a3b8c 100644 --- a/crates/optimism/rpc/src/eth/mod.rs +++ b/crates/optimism/rpc/src/eth/mod.rs @@ -16,7 +16,7 @@ use reth_network_api::NetworkInfo; use reth_node_api::{BuilderProvider, FullNodeComponents, FullNodeTypes}; use reth_provider::{ BlockIdReader, BlockNumReader, BlockReaderIdExt, ChainSpecProvider, HeaderProvider, - StateProviderFactory, + StageCheckpointReader, StateProviderFactory, }; use reth_rpc::eth::{core::EthApiInner, DevSigner}; use reth_rpc_eth_api::{ @@ -108,7 +108,7 @@ where N: FullNodeComponents, { #[inline] - fn provider(&self) -> impl ChainSpecProvider + BlockNumReader { + fn provider(&self) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader { self.inner.provider() } diff --git a/crates/rpc/rpc-eth-api/src/helpers/spec.rs b/crates/rpc/rpc-eth-api/src/helpers/spec.rs index 6e9edae8b2..bf1e822048 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/spec.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/spec.rs @@ -7,8 +7,8 @@ use reth_chainspec::{ChainInfo, ChainSpec}; use reth_errors::{RethError, RethResult}; use reth_network_api::NetworkInfo; use reth_primitives::{Address, U256, U64}; -use reth_provider::{BlockNumReader, ChainSpecProvider}; -use reth_rpc_types::{SyncInfo, SyncStatus}; +use reth_provider::{BlockNumReader, ChainSpecProvider, StageCheckpointReader}; +use reth_rpc_types::{Stage, SyncInfo, SyncStatus}; use super::EthSigner; @@ -18,7 +18,7 @@ use super::EthSigner; #[auto_impl::auto_impl(&, Arc)] pub trait EthApiSpec: Send + Sync { /// Returns a handle for reading data from disk. - fn provider(&self) -> impl ChainSpecProvider + BlockNumReader; + fn provider(&self) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader; /// Returns a handle for reading network data summary. fn network(&self) -> impl NetworkInfo; @@ -63,13 +63,22 @@ pub trait EthApiSpec: Send + Sync { let current_block = U256::from( self.provider().chain_info().map(|info| info.best_number).unwrap_or_default(), ); + + let stages = self + .provider() + .get_all_checkpoints() + .unwrap_or_default() + .into_iter() + .map(|(name, checkpoint)| Stage { name, block: checkpoint.block_number }) + .collect(); + SyncStatus::Info(Box::new(SyncInfo { starting_block: self.starting_block(), current_block, highest_block: current_block, warp_chunks_amount: None, warp_chunks_processed: None, - stages: None, + stages: Some(stages), })) } else { SyncStatus::None diff --git a/crates/rpc/rpc/src/eth/helpers/spec.rs b/crates/rpc/rpc/src/eth/helpers/spec.rs index 34616b7351..3bb3d804bc 100644 --- a/crates/rpc/rpc/src/eth/helpers/spec.rs +++ b/crates/rpc/rpc/src/eth/helpers/spec.rs @@ -1,6 +1,6 @@ use reth_network_api::NetworkInfo; use reth_primitives::U256; -use reth_provider::{BlockNumReader, ChainSpecProvider}; +use reth_provider::{BlockNumReader, ChainSpecProvider, StageCheckpointReader}; use reth_rpc_eth_api::helpers::EthApiSpec; use reth_transaction_pool::TransactionPool; @@ -9,11 +9,11 @@ use crate::EthApi; impl EthApiSpec for EthApi where Pool: TransactionPool + 'static, - Provider: BlockNumReader + ChainSpecProvider + 'static, + Provider: ChainSpecProvider + BlockNumReader + StageCheckpointReader + 'static, Network: NetworkInfo + 'static, EvmConfig: Send + Sync, { - fn provider(&self) -> impl ChainSpecProvider + BlockNumReader { + fn provider(&self) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader { self.inner.provider() } diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index ea0ea92bcd..39dcfcf14f 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -15,7 +15,8 @@ use reth_primitives::{ SealedHeader, StorageKey, StorageValue, TransactionMeta, TransactionSigned, TransactionSignedNoHash, TxHash, TxNumber, Withdrawal, Withdrawals, B256, U256, }; -use reth_storage_api::StateProofProvider; +use reth_stages_types::{StageCheckpoint, StageId}; +use reth_storage_api::{StageCheckpointReader, StateProofProvider}; use reth_storage_errors::provider::{ProviderError, ProviderResult}; use reth_trie::{updates::TrieUpdates, AccountProof, HashedPostState, HashedStorage}; use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg}; @@ -546,6 +547,20 @@ impl AccountReader for MockEthProvider { } } +impl StageCheckpointReader for MockEthProvider { + fn get_stage_checkpoint(&self, _id: StageId) -> ProviderResult> { + Ok(None) + } + + fn get_stage_checkpoint_progress(&self, _id: StageId) -> ProviderResult>> { + Ok(None) + } + + fn get_all_checkpoints(&self) -> ProviderResult> { + Ok(vec![]) + } +} + impl StateRootProvider for MockEthProvider { fn hashed_state_root(&self, _state: HashedPostState) -> ProviderResult { let state_root = self.state_roots.lock().pop().unwrap_or_default(); diff --git a/crates/storage/provider/src/traits/full.rs b/crates/storage/provider/src/traits/full.rs index f47bd3efd2..b17a20f451 100644 --- a/crates/storage/provider/src/traits/full.rs +++ b/crates/storage/provider/src/traits/full.rs @@ -52,6 +52,7 @@ pub trait FullRpcProvider: + BlockReaderIdExt + HeaderProvider + TransactionsProvider + + StageCheckpointReader + Clone + Unpin + 'static @@ -65,6 +66,7 @@ impl FullRpcProvider for T where + BlockReaderIdExt + HeaderProvider + TransactionsProvider + + StageCheckpointReader + Clone + Unpin + 'static