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};
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        // === Noop ===
75        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        // === Mock ===
81        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}