Skip to main content

reth_storage_api/
noop.rs

1//! Various noop implementations for traits.
2
3pub use crate::bal::NoopBalStore;
4
5use crate::{
6    AccountReader, BalProvider, BalStoreHandle, BlockBodyIndicesProvider, BlockHashReader,
7    BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, BlockSource, BytecodeReader,
8    ChangeSetReader, HashedPostStateProvider, HeaderProvider, NodePrimitivesProvider,
9    PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader,
10    StateProofProvider, StateProvider, StateProviderBox, StateProviderFactory,
11    StateRangeProviderFactory, StateRangeView, StateReader, StateRootProvider, StorageRootProvider,
12    TransactionVariant, TransactionsProvider,
13};
14
15#[cfg(feature = "db-api")]
16use crate::{
17    DBProvider, DatabaseProviderFactory, DbTxProvider, HistoryInfo, HistoryReader,
18    StorageChangeSetReader, StorageSettingsCache,
19};
20use alloc::{boxed::Box, string::String, sync::Arc, vec::Vec};
21use alloy_consensus::transaction::TransactionMeta;
22use alloy_eips::{BlockHashOrNumber, BlockId, BlockNumberOrTag};
23use alloy_primitives::{
24    Address, BlockHash, BlockNumber, Bytes, StorageKey, StorageValue, TxHash, TxNumber, B256,
25};
26use core::{
27    fmt::Debug,
28    marker::PhantomData,
29    ops::{RangeBounds, RangeInclusive},
30};
31use reth_chainspec::{ChainInfo, ChainSpecProvider, EthChainSpec, MAINNET};
32#[cfg(feature = "db-api")]
33use reth_db_api::mock::{DatabaseMock, TxMock};
34use reth_db_models::{AccountBeforeTx, StoredBlockBodyIndices};
35use reth_ethereum_primitives::EthPrimitives;
36use reth_execution_types::ExecutionOutcome;
37use reth_primitives_traits::{Account, Bytecode, NodePrimitives, RecoveredBlock, SealedHeader};
38#[cfg(feature = "db-api")]
39use reth_prune_types::PruneModes;
40use reth_prune_types::{PruneCheckpoint, PruneSegment};
41use reth_stages_types::{StageCheckpoint, StageId};
42use reth_storage_errors::provider::{ProviderError, ProviderResult};
43use reth_trie_common::{
44    updates::TrieUpdates, AccountProof, DecodedMultiProofV2, ExecutionWitnessMode, HashedPostState,
45    HashedStorage, MultiProof, MultiProofTargets, MultiProofTargetsV2, StorageMultiProof,
46    StorageProof, TrieInput,
47};
48
49/// Supports various api interfaces for testing purposes.
50#[derive(Debug)]
51#[non_exhaustive]
52pub struct NoopProvider<ChainSpec = reth_chainspec::ChainSpec, N = EthPrimitives> {
53    chain_spec: Arc<ChainSpec>,
54    bal_store: BalStoreHandle,
55    #[cfg(feature = "db-api")]
56    tx: TxMock,
57    #[cfg(feature = "db-api")]
58    prune_modes: PruneModes,
59    _phantom: PhantomData<N>,
60}
61
62impl<ChainSpec, N> NoopProvider<ChainSpec, N> {
63    /// Create a new instance for specific primitive types.
64    pub fn new(chain_spec: Arc<ChainSpec>) -> Self {
65        Self {
66            chain_spec,
67            bal_store: BalStoreHandle::default(),
68            #[cfg(feature = "db-api")]
69            tx: TxMock::default(),
70            #[cfg(feature = "db-api")]
71            prune_modes: PruneModes::default(),
72            _phantom: Default::default(),
73        }
74    }
75}
76
77impl<ChainSpec> NoopProvider<ChainSpec> {
78    /// Create a new instance of the `NoopBlockReader`.
79    pub fn eth(chain_spec: Arc<ChainSpec>) -> Self {
80        Self {
81            chain_spec,
82            bal_store: BalStoreHandle::default(),
83            #[cfg(feature = "db-api")]
84            tx: TxMock::default(),
85            #[cfg(feature = "db-api")]
86            prune_modes: PruneModes::default(),
87            _phantom: Default::default(),
88        }
89    }
90}
91
92impl NoopProvider {
93    /// Create a new instance of the [`NoopProvider`] with the mainnet chain spec.
94    pub fn mainnet() -> Self {
95        Self::eth(MAINNET.clone())
96    }
97}
98
99impl Default for NoopProvider {
100    fn default() -> Self {
101        Self::mainnet()
102    }
103}
104
105impl<ChainSpec, N> Clone for NoopProvider<ChainSpec, N> {
106    fn clone(&self) -> Self {
107        Self {
108            chain_spec: Arc::clone(&self.chain_spec),
109            bal_store: self.bal_store.clone(),
110            #[cfg(feature = "db-api")]
111            tx: self.tx.clone(),
112            #[cfg(feature = "db-api")]
113            prune_modes: self.prune_modes.clone(),
114            _phantom: Default::default(),
115        }
116    }
117}
118
119impl<ChainSpec, N> BalProvider for NoopProvider<ChainSpec, N> {
120    fn bal_store(&self) -> &BalStoreHandle {
121        &self.bal_store
122    }
123}
124
125impl<ChainSpec, N> StateRangeProviderFactory for NoopProvider<ChainSpec, N> {
126    fn state_range_provider(&self, _state_root: B256) -> ProviderResult<Option<StateRangeView>> {
127        Ok(None)
128    }
129}
130
131/// Noop implementation for testing purposes
132impl<ChainSpec: Send + Sync, N: Send + Sync> BlockHashReader for NoopProvider<ChainSpec, N> {
133    fn block_hash(&self, _number: u64) -> ProviderResult<Option<B256>> {
134        Ok(None)
135    }
136
137    fn canonical_hashes_range(
138        &self,
139        _start: BlockNumber,
140        _end: BlockNumber,
141    ) -> ProviderResult<Vec<B256>> {
142        Ok(Vec::new())
143    }
144}
145
146impl<ChainSpec: Send + Sync, N: Send + Sync> BlockNumReader for NoopProvider<ChainSpec, N> {
147    fn chain_info(&self) -> ProviderResult<ChainInfo> {
148        Ok(ChainInfo::default())
149    }
150
151    fn best_block_number(&self) -> ProviderResult<BlockNumber> {
152        Ok(0)
153    }
154
155    fn last_block_number(&self) -> ProviderResult<BlockNumber> {
156        Ok(0)
157    }
158
159    fn block_number(&self, _hash: B256) -> ProviderResult<Option<BlockNumber>> {
160        Ok(None)
161    }
162}
163
164impl<ChainSpec: EthChainSpec + 'static, N: Debug + Send + Sync + 'static> ChainSpecProvider
165    for NoopProvider<ChainSpec, N>
166{
167    type ChainSpec = ChainSpec;
168
169    fn chain_spec(&self) -> Arc<Self::ChainSpec> {
170        self.chain_spec.clone()
171    }
172}
173
174impl<C: Send + Sync, N: NodePrimitives> BlockIdReader for NoopProvider<C, N> {
175    fn pending_block_num_hash(&self) -> ProviderResult<Option<alloy_eips::BlockNumHash>> {
176        Ok(None)
177    }
178
179    fn safe_block_num_hash(&self) -> ProviderResult<Option<alloy_eips::BlockNumHash>> {
180        Ok(None)
181    }
182
183    fn finalized_block_num_hash(&self) -> ProviderResult<Option<alloy_eips::BlockNumHash>> {
184        Ok(None)
185    }
186}
187
188impl<C: Send + Sync, N: NodePrimitives> BlockReaderIdExt for NoopProvider<C, N> {
189    fn block_by_id(&self, _id: BlockId) -> ProviderResult<Option<N::Block>> {
190        Ok(None)
191    }
192
193    fn sealed_header_by_id(
194        &self,
195        _id: BlockId,
196    ) -> ProviderResult<Option<SealedHeader<N::BlockHeader>>> {
197        Ok(None)
198    }
199
200    fn header_by_id(&self, _id: BlockId) -> ProviderResult<Option<N::BlockHeader>> {
201        Ok(None)
202    }
203}
204
205impl<C: Send + Sync, N: NodePrimitives> BlockReader for NoopProvider<C, N> {
206    type Block = N::Block;
207
208    fn find_block_by_hash(
209        &self,
210        _hash: B256,
211        _source: BlockSource,
212    ) -> ProviderResult<Option<Self::Block>> {
213        Ok(None)
214    }
215
216    fn block(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Self::Block>> {
217        Ok(None)
218    }
219
220    fn pending_block(&self) -> ProviderResult<Option<RecoveredBlock<Self::Block>>> {
221        Ok(None)
222    }
223
224    fn pending_block_and_receipts(
225        &self,
226    ) -> ProviderResult<Option<(RecoveredBlock<Self::Block>, Vec<Self::Receipt>)>> {
227        Ok(None)
228    }
229
230    fn recovered_block(
231        &self,
232        _id: BlockHashOrNumber,
233        _transaction_kind: TransactionVariant,
234    ) -> ProviderResult<Option<RecoveredBlock<Self::Block>>> {
235        Ok(None)
236    }
237
238    fn sealed_block_with_senders(
239        &self,
240        _id: BlockHashOrNumber,
241        _transaction_kind: TransactionVariant,
242    ) -> ProviderResult<Option<RecoveredBlock<Self::Block>>> {
243        Ok(None)
244    }
245
246    fn block_range(&self, _range: RangeInclusive<BlockNumber>) -> ProviderResult<Vec<Self::Block>> {
247        Ok(Vec::new())
248    }
249
250    fn block_with_senders_range(
251        &self,
252        _range: RangeInclusive<BlockNumber>,
253    ) -> ProviderResult<Vec<RecoveredBlock<Self::Block>>> {
254        Ok(Vec::new())
255    }
256
257    fn recovered_block_range(
258        &self,
259        _range: RangeInclusive<BlockNumber>,
260    ) -> ProviderResult<Vec<RecoveredBlock<Self::Block>>> {
261        Ok(Vec::new())
262    }
263
264    fn block_by_transaction_id(&self, _id: TxNumber) -> ProviderResult<Option<BlockNumber>> {
265        Ok(None)
266    }
267}
268
269impl<C: Send + Sync, N: NodePrimitives> TransactionsProvider for NoopProvider<C, N> {
270    type Transaction = N::SignedTx;
271
272    fn transaction_id(&self, _tx_hash: TxHash) -> ProviderResult<Option<TxNumber>> {
273        Ok(None)
274    }
275
276    fn transaction_by_id(&self, _id: TxNumber) -> ProviderResult<Option<Self::Transaction>> {
277        Ok(None)
278    }
279
280    fn transaction_by_id_unhashed(
281        &self,
282        _id: TxNumber,
283    ) -> ProviderResult<Option<Self::Transaction>> {
284        Ok(None)
285    }
286
287    fn transaction_by_hash(&self, _hash: TxHash) -> ProviderResult<Option<Self::Transaction>> {
288        Ok(None)
289    }
290
291    fn transaction_by_hash_with_meta(
292        &self,
293        _hash: TxHash,
294    ) -> ProviderResult<Option<(Self::Transaction, TransactionMeta)>> {
295        Ok(None)
296    }
297
298    fn transactions_by_block(
299        &self,
300        _block_id: BlockHashOrNumber,
301    ) -> ProviderResult<Option<Vec<Self::Transaction>>> {
302        Ok(None)
303    }
304
305    fn transactions_by_block_range(
306        &self,
307        _range: impl RangeBounds<BlockNumber>,
308    ) -> ProviderResult<Vec<Vec<Self::Transaction>>> {
309        Ok(Vec::default())
310    }
311
312    fn transactions_by_tx_range(
313        &self,
314        _range: impl RangeBounds<TxNumber>,
315    ) -> ProviderResult<Vec<Self::Transaction>> {
316        Ok(Vec::default())
317    }
318
319    fn senders_by_tx_range(
320        &self,
321        _range: impl RangeBounds<TxNumber>,
322    ) -> ProviderResult<Vec<Address>> {
323        Ok(Vec::default())
324    }
325
326    fn transaction_sender(&self, _id: TxNumber) -> ProviderResult<Option<Address>> {
327        Ok(None)
328    }
329}
330
331impl<C: Send + Sync, N: NodePrimitives> ReceiptProvider for NoopProvider<C, N> {
332    type Receipt = N::Receipt;
333
334    fn receipt(&self, _id: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
335        Ok(None)
336    }
337
338    fn receipt_by_hash(&self, _hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
339        Ok(None)
340    }
341
342    fn receipts_by_block(
343        &self,
344        _block: BlockHashOrNumber,
345    ) -> ProviderResult<Option<Vec<Self::Receipt>>> {
346        Ok(None)
347    }
348
349    fn receipts_by_tx_range(
350        &self,
351        _range: impl RangeBounds<TxNumber>,
352    ) -> ProviderResult<Vec<Self::Receipt>> {
353        Ok(Vec::new())
354    }
355
356    fn receipts_by_block_range(
357        &self,
358        _block_range: RangeInclusive<BlockNumber>,
359    ) -> ProviderResult<Vec<Vec<Self::Receipt>>> {
360        Ok(Vec::new())
361    }
362}
363
364impl<C: Send + Sync, N: NodePrimitives> ReceiptProviderIdExt for NoopProvider<C, N> {}
365
366impl<C: Send + Sync, N: NodePrimitives> HeaderProvider for NoopProvider<C, N> {
367    type Header = N::BlockHeader;
368
369    fn header(&self, _block_hash: BlockHash) -> ProviderResult<Option<Self::Header>> {
370        Ok(None)
371    }
372
373    fn header_by_number(&self, _num: u64) -> ProviderResult<Option<Self::Header>> {
374        Ok(None)
375    }
376
377    fn headers_range(
378        &self,
379        _range: impl RangeBounds<BlockNumber>,
380    ) -> ProviderResult<Vec<Self::Header>> {
381        Ok(Vec::new())
382    }
383
384    fn sealed_header(
385        &self,
386        _number: BlockNumber,
387    ) -> ProviderResult<Option<SealedHeader<Self::Header>>> {
388        Ok(None)
389    }
390
391    fn sealed_headers_while(
392        &self,
393        _range: impl RangeBounds<BlockNumber>,
394        _predicate: impl FnMut(&SealedHeader<Self::Header>) -> bool,
395    ) -> ProviderResult<Vec<SealedHeader<Self::Header>>> {
396        Ok(Vec::new())
397    }
398}
399
400impl<C: Send + Sync, N: NodePrimitives> AccountReader for NoopProvider<C, N> {
401    fn basic_account(&self, _address: &Address) -> ProviderResult<Option<Account>> {
402        Ok(None)
403    }
404}
405
406impl<C: Send + Sync, N: NodePrimitives> ChangeSetReader for NoopProvider<C, N> {
407    fn account_block_changeset(
408        &self,
409        _block_number: BlockNumber,
410    ) -> ProviderResult<Vec<AccountBeforeTx>> {
411        Ok(Vec::default())
412    }
413
414    fn get_account_before_block(
415        &self,
416        _block_number: BlockNumber,
417        _address: Address,
418    ) -> ProviderResult<Option<AccountBeforeTx>> {
419        Ok(None)
420    }
421
422    fn account_changesets_range(
423        &self,
424        _range: impl core::ops::RangeBounds<BlockNumber>,
425    ) -> ProviderResult<Vec<(BlockNumber, AccountBeforeTx)>> {
426        Ok(Vec::default())
427    }
428}
429
430#[cfg(feature = "db-api")]
431impl<C: Send + Sync, N: NodePrimitives> HistoryReader for NoopProvider<C, N> {
432    fn account_history_info(
433        &self,
434        _address: Address,
435        _block_number: BlockNumber,
436        _lowest_available_block_number: Option<BlockNumber>,
437    ) -> ProviderResult<HistoryInfo> {
438        Ok(HistoryInfo::NotYetWritten)
439    }
440
441    fn storage_history_info(
442        &self,
443        _address: Address,
444        _storage_key: B256,
445        _block_number: BlockNumber,
446        _lowest_available_block_number: Option<BlockNumber>,
447    ) -> ProviderResult<HistoryInfo> {
448        Ok(HistoryInfo::NotYetWritten)
449    }
450}
451
452#[cfg(feature = "db-api")]
453impl<C: Send + Sync, N: NodePrimitives> StorageChangeSetReader for NoopProvider<C, N> {
454    fn storage_changeset(
455        &self,
456        _block_number: BlockNumber,
457    ) -> ProviderResult<
458        Vec<(reth_db_api::models::BlockNumberAddress, reth_primitives_traits::StorageEntry)>,
459    > {
460        Ok(Vec::default())
461    }
462
463    fn get_storage_before_block(
464        &self,
465        _block_number: BlockNumber,
466        _address: Address,
467        _storage_key: B256,
468    ) -> ProviderResult<Option<reth_primitives_traits::StorageEntry>> {
469        Ok(None)
470    }
471
472    fn storage_changesets_range(
473        &self,
474        _range: impl core::ops::RangeBounds<BlockNumber>,
475    ) -> ProviderResult<
476        Vec<(reth_db_api::models::BlockNumberAddress, reth_primitives_traits::StorageEntry)>,
477    > {
478        Ok(Vec::default())
479    }
480}
481
482impl<C: Send + Sync, N: NodePrimitives> StateRootProvider for NoopProvider<C, N> {
483    fn state_root(&self, _state: HashedPostState) -> ProviderResult<B256> {
484        Ok(B256::default())
485    }
486
487    fn state_root_from_nodes(&self, _input: TrieInput) -> ProviderResult<B256> {
488        Ok(B256::default())
489    }
490
491    fn state_root_with_updates(
492        &self,
493        _state: HashedPostState,
494    ) -> ProviderResult<(B256, TrieUpdates)> {
495        Ok((B256::default(), TrieUpdates::default()))
496    }
497
498    fn state_root_from_nodes_with_updates(
499        &self,
500        _input: TrieInput,
501    ) -> ProviderResult<(B256, TrieUpdates)> {
502        Ok((B256::default(), TrieUpdates::default()))
503    }
504}
505
506impl<C: Send + Sync, N: NodePrimitives> StorageRootProvider for NoopProvider<C, N> {
507    fn storage_root(
508        &self,
509        _address: Address,
510        _hashed_storage: HashedStorage,
511    ) -> ProviderResult<B256> {
512        Ok(B256::default())
513    }
514
515    fn storage_proof(
516        &self,
517        _address: Address,
518        slot: B256,
519        _hashed_storage: HashedStorage,
520    ) -> ProviderResult<StorageProof> {
521        Ok(StorageProof::new(slot))
522    }
523
524    fn storage_multiproof(
525        &self,
526        _address: Address,
527        _slots: &[B256],
528        _hashed_storage: HashedStorage,
529    ) -> ProviderResult<StorageMultiProof> {
530        Ok(StorageMultiProof::empty())
531    }
532}
533
534impl<C: Send + Sync, N: NodePrimitives> StateProofProvider for NoopProvider<C, N> {
535    fn proof(
536        &self,
537        _input: TrieInput,
538        address: Address,
539        _slots: &[B256],
540    ) -> ProviderResult<AccountProof> {
541        Ok(AccountProof::new(address))
542    }
543
544    fn multiproof(
545        &self,
546        _input: TrieInput,
547        _targets: MultiProofTargets,
548    ) -> ProviderResult<MultiProof> {
549        Ok(MultiProof::default())
550    }
551
552    fn multiproof_v2(
553        &self,
554        _input: TrieInput,
555        _targets: MultiProofTargetsV2,
556    ) -> ProviderResult<DecodedMultiProofV2> {
557        Ok(DecodedMultiProofV2::default())
558    }
559
560    fn witness(
561        &self,
562        _input: TrieInput,
563        _target: HashedPostState,
564        _mode: ExecutionWitnessMode,
565    ) -> ProviderResult<Vec<Bytes>> {
566        Ok(Vec::default())
567    }
568}
569
570impl<C: Send + Sync, N: NodePrimitives> HashedPostStateProvider for NoopProvider<C, N> {
571    fn hashed_post_state(
572        &self,
573        _bundle_state: &revm::database::BundleState,
574    ) -> ProviderResult<HashedPostState> {
575        Ok(HashedPostState::default())
576    }
577}
578
579impl<C: Send + Sync, N: NodePrimitives> StateReader for NoopProvider<C, N> {
580    type Receipt = N::Receipt;
581
582    fn get_state(
583        &self,
584        _block: BlockNumber,
585    ) -> ProviderResult<Option<ExecutionOutcome<Self::Receipt>>> {
586        Ok(None)
587    }
588}
589
590impl<C: Send + Sync, N: NodePrimitives> StateProvider for NoopProvider<C, N> {
591    fn storage(
592        &self,
593        _account: Address,
594        _storage_key: StorageKey,
595    ) -> ProviderResult<Option<StorageValue>> {
596        Ok(None)
597    }
598}
599
600impl<C: Send + Sync, N: NodePrimitives> BytecodeReader for NoopProvider<C, N> {
601    fn bytecode_by_hash(&self, _code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
602        Ok(None)
603    }
604}
605
606impl<C: Send + Sync + 'static, N: NodePrimitives> StateProviderFactory for NoopProvider<C, N> {
607    fn latest(&self) -> ProviderResult<StateProviderBox> {
608        Ok(Box::new(self.clone()))
609    }
610
611    fn state_by_block_number_or_tag(
612        &self,
613        number_or_tag: BlockNumberOrTag,
614    ) -> ProviderResult<StateProviderBox> {
615        match number_or_tag {
616            BlockNumberOrTag::Latest => self.latest(),
617            BlockNumberOrTag::Finalized => {
618                // we can only get the finalized state by hash, not by num
619                let hash =
620                    self.finalized_block_hash()?.ok_or(ProviderError::FinalizedBlockNotFound)?;
621
622                // only look at historical state
623                self.history_by_block_hash(hash)
624            }
625            BlockNumberOrTag::Safe => {
626                // we can only get the safe state by hash, not by num
627                let hash = self.safe_block_hash()?.ok_or(ProviderError::SafeBlockNotFound)?;
628
629                self.history_by_block_hash(hash)
630            }
631            BlockNumberOrTag::Earliest => {
632                self.history_by_block_number(self.earliest_block_number()?)
633            }
634            BlockNumberOrTag::Pending => self.pending(),
635            BlockNumberOrTag::Number(num) => self.history_by_block_number(num),
636        }
637    }
638
639    fn history_by_block_number(&self, _block: BlockNumber) -> ProviderResult<StateProviderBox> {
640        Ok(Box::new(self.clone()))
641    }
642
643    fn history_by_block_hash(&self, _block: BlockHash) -> ProviderResult<StateProviderBox> {
644        Ok(Box::new(self.clone()))
645    }
646
647    fn state_by_block_hash(&self, _block: BlockHash) -> ProviderResult<StateProviderBox> {
648        Ok(Box::new(self.clone()))
649    }
650
651    fn pending(&self) -> ProviderResult<StateProviderBox> {
652        Ok(Box::new(self.clone()))
653    }
654
655    fn pending_state_by_hash(&self, _block_hash: B256) -> ProviderResult<Option<StateProviderBox>> {
656        Ok(Some(Box::new(self.clone())))
657    }
658
659    fn maybe_pending(&self) -> ProviderResult<Option<StateProviderBox>> {
660        Ok(Some(Box::new(self.clone())))
661    }
662}
663
664impl<C: Send + Sync, N: NodePrimitives> StageCheckpointReader for NoopProvider<C, N> {
665    fn get_stage_checkpoint(&self, _id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
666        Ok(None)
667    }
668
669    fn get_stage_checkpoint_progress(&self, _id: StageId) -> ProviderResult<Option<Vec<u8>>> {
670        Ok(None)
671    }
672
673    fn get_all_checkpoints(&self) -> ProviderResult<Vec<(String, StageCheckpoint)>> {
674        Ok(Vec::new())
675    }
676}
677
678impl<C: Send + Sync, N: NodePrimitives> PruneCheckpointReader for NoopProvider<C, N> {
679    fn get_prune_checkpoint(
680        &self,
681        _segment: PruneSegment,
682    ) -> ProviderResult<Option<PruneCheckpoint>> {
683        Ok(None)
684    }
685
686    fn get_prune_checkpoints(&self) -> ProviderResult<Vec<(PruneSegment, PruneCheckpoint)>> {
687        Ok(Vec::new())
688    }
689}
690
691impl<C: Send + Sync, N: NodePrimitives> NodePrimitivesProvider for NoopProvider<C, N> {
692    type Primitives = N;
693}
694
695impl<C: Send + Sync, N: Send + Sync> BlockBodyIndicesProvider for NoopProvider<C, N> {
696    fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
697        Ok(None)
698    }
699
700    fn block_body_indices_range(
701        &self,
702        _range: RangeInclusive<BlockNumber>,
703    ) -> ProviderResult<Vec<StoredBlockBodyIndices>> {
704        Ok(Vec::new())
705    }
706}
707
708#[cfg(feature = "db-api")]
709impl<ChainSpec: Send + Sync, N: NodePrimitives> DbTxProvider for NoopProvider<ChainSpec, N> {
710    type Tx = TxMock;
711
712    fn tx(&self) -> &Self::Tx {
713        &self.tx
714    }
715}
716
717#[cfg(feature = "db-api")]
718impl<ChainSpec: Send + Sync, N: NodePrimitives> DBProvider for NoopProvider<ChainSpec, N> {
719    fn tx_mut(&mut self) -> &mut Self::Tx {
720        &mut self.tx
721    }
722
723    fn into_tx(self) -> Self::Tx {
724        self.tx
725    }
726
727    fn prune_modes_ref(&self) -> &PruneModes {
728        &self.prune_modes
729    }
730
731    fn commit(self) -> ProviderResult<()> {
732        use reth_db_api::transaction::DbTx;
733
734        Ok(self.tx.commit()?)
735    }
736}
737
738#[cfg(feature = "db-api")]
739impl<ChainSpec: Send + Sync, N: NodePrimitives> DatabaseProviderFactory
740    for NoopProvider<ChainSpec, N>
741{
742    type DB = DatabaseMock;
743    type Provider = Self;
744    type ProviderRW = Self;
745
746    fn database_provider_ro(&self) -> ProviderResult<Self::Provider> {
747        Ok(self.clone())
748    }
749
750    fn database_provider_rw(&self) -> ProviderResult<Self::ProviderRW> {
751        Ok(self.clone())
752    }
753}
754
755#[cfg(feature = "db-api")]
756impl<ChainSpec: Send + Sync, N: Send + Sync> StorageSettingsCache for NoopProvider<ChainSpec, N> {
757    fn cached_storage_settings(&self) -> reth_db_api::models::StorageSettings {
758        reth_db_api::models::StorageSettings::default()
759    }
760
761    fn set_storage_settings_cache(&self, _settings: reth_db_api::models::StorageSettings) {}
762}