reth_rpc/eth/helpers/
state.rs1use crate::EthApi;
4use reth_rpc_convert::RpcConvert;
5use reth_rpc_eth_api::{
6 helpers::{EthState, LoadPendingBlock, LoadState},
7 RpcNodeCore,
8};
9use reth_rpc_eth_types::EthApiError;
10
11impl<N, Rpc> EthState for EthApi<N, Rpc>
12where
13 N: RpcNodeCore,
14 Rpc: RpcConvert<Primitives = N::Primitives, Error = EthApiError>,
15 Self: LoadPendingBlock,
16{
17 fn max_proof_window(&self) -> u64 {
18 self.inner.eth_proof_window()
19 }
20}
21
22impl<N, Rpc> LoadState for EthApi<N, Rpc>
23where
24 N: RpcNodeCore,
25 Rpc: RpcConvert<Primitives = N::Primitives>,
26 Self: LoadPendingBlock,
27{
28}
29
30#[cfg(test)]
31mod tests {
32 use crate::eth::helpers::types::EthRpcConverter;
33
34 use super::*;
35 use alloy_primitives::{Address, StorageKey, StorageValue, U256};
36 use reth_chainspec::ChainSpec;
37 use reth_evm_ethereum::EthEvmConfig;
38 use reth_network_api::noop::NoopNetwork;
39 use reth_provider::{
40 test_utils::{ExtendedAccount, MockEthProvider, NoopProvider},
41 ChainSpecProvider,
42 };
43 use reth_rpc_eth_api::{helpers::EthState, node::RpcNodeCoreAdapter};
44 use reth_transaction_pool::test_utils::{testing_pool, TestPool};
45 use std::collections::HashMap;
46
47 fn noop_eth_api() -> EthApi<
48 RpcNodeCoreAdapter<NoopProvider, TestPool, NoopNetwork, EthEvmConfig>,
49 EthRpcConverter<ChainSpec>,
50 > {
51 let provider = NoopProvider::default();
52 let pool = testing_pool();
53 let evm_config = EthEvmConfig::mainnet();
54
55 EthApi::builder(provider, pool, NoopNetwork::default(), evm_config).build()
56 }
57
58 fn mock_eth_api(
59 accounts: HashMap<Address, ExtendedAccount>,
60 ) -> EthApi<
61 RpcNodeCoreAdapter<MockEthProvider, TestPool, NoopNetwork, EthEvmConfig>,
62 EthRpcConverter<ChainSpec>,
63 > {
64 let pool = testing_pool();
65 let mock_provider = MockEthProvider::default();
66
67 let evm_config = EthEvmConfig::new(mock_provider.chain_spec());
68 mock_provider.extend_accounts(accounts);
69
70 EthApi::builder(mock_provider, pool, NoopNetwork::default(), evm_config).build()
71 }
72
73 #[tokio::test]
74 async fn test_storage() {
75 let eth_api = noop_eth_api();
77 let address = Address::random();
78 let storage = eth_api.storage_at(address, U256::ZERO.into(), None).await.unwrap();
79 assert_eq!(storage, U256::ZERO.to_be_bytes());
80
81 let storage_value = StorageValue::from(1337);
83 let storage_key = StorageKey::random();
84 let storage = HashMap::from([(storage_key, storage_value)]);
85
86 let accounts =
87 HashMap::from([(address, ExtendedAccount::new(0, U256::ZERO).extend_storage(storage))]);
88 let eth_api = mock_eth_api(accounts);
89
90 let storage_key: U256 = storage_key.into();
91 let storage = eth_api.storage_at(address, storage_key.into(), None).await.unwrap();
92 assert_eq!(storage, storage_value.to_be_bytes());
93 }
94
95 #[tokio::test]
96 async fn test_get_account_missing() {
97 let eth_api = noop_eth_api();
98 let address = Address::random();
99 let account = eth_api.get_account(address, Default::default()).await.unwrap();
100 assert!(account.is_none());
101 }
102}