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