reth_rpc/eth/helpers/
state.rs

1//! Contains RPC handler implementations specific to state.
2
3use 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        // === Noop ===
76        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        // === Mock ===
82        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}