reth_storage_api/
storage.rs1use alloc::{
2 collections::{BTreeMap, BTreeSet},
3 vec::Vec,
4};
5use alloy_primitives::{Address, BlockNumber, B256};
6use core::ops::RangeInclusive;
7use reth_primitives_traits::StorageEntry;
8use reth_storage_errors::provider::ProviderResult;
9
10#[auto_impl::auto_impl(&, Arc, Box)]
12pub trait StorageReader: Send {
13 fn plain_state_storages(
15 &self,
16 addresses_with_keys: impl IntoIterator<Item = (Address, impl IntoIterator<Item = B256>)>,
17 ) -> ProviderResult<Vec<(Address, Vec<StorageEntry>)>>;
18
19 fn changed_storages_with_range(
21 &self,
22 range: RangeInclusive<BlockNumber>,
23 ) -> ProviderResult<BTreeMap<Address, BTreeSet<B256>>>;
24
25 fn changed_storages_and_blocks_with_range(
30 &self,
31 range: RangeInclusive<BlockNumber>,
32 ) -> ProviderResult<BTreeMap<(Address, B256), Vec<u64>>>;
33}
34
35#[cfg(feature = "db-api")]
37#[auto_impl::auto_impl(&, Arc, Box)]
38pub trait StorageChangeSetReader: Send {
39 fn storage_changeset(
41 &self,
42 block_number: BlockNumber,
43 ) -> ProviderResult<Vec<(reth_db_api::models::BlockNumberAddress, StorageEntry)>>;
44
45 fn get_storage_before_block(
49 &self,
50 block_number: BlockNumber,
51 address: Address,
52 storage_key: B256,
53 ) -> ProviderResult<Option<StorageEntry>>;
54
55 fn storage_changesets_range(
57 &self,
58 range: impl core::ops::RangeBounds<BlockNumber>,
59 ) -> ProviderResult<Vec<(reth_db_api::models::BlockNumberAddress, StorageEntry)>>;
60
61 fn storage_changeset_count(&self) -> ProviderResult<usize>;
63
64 fn storage_block_changeset(
68 &self,
69 block_number: BlockNumber,
70 ) -> ProviderResult<Vec<reth_db_models::StorageBeforeTx>> {
71 self.storage_changeset(block_number).map(|changesets| {
72 changesets
73 .into_iter()
74 .map(|(block_address, entry)| reth_db_models::StorageBeforeTx {
75 address: block_address.address(),
76 key: entry.key,
77 value: entry.value,
78 })
79 .collect()
80 })
81 }
82}