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