1pub 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#[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 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 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 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
131impl<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 let hash =
620 self.finalized_block_hash()?.ok_or(ProviderError::FinalizedBlockNotFound)?;
621
622 self.history_by_block_hash(hash)
624 }
625 BlockNumberOrTag::Safe => {
626 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}