reth_rpc/eth/helpers/
pending_block.rs
1use alloy_consensus::BlockHeader;
4use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks};
5use reth_evm::{ConfigureEvm, NextBlockEnvAttributes};
6use reth_node_api::NodePrimitives;
7use reth_primitives_traits::SealedHeader;
8use reth_rpc_eth_api::{
9 helpers::{LoadPendingBlock, SpawnBlocking},
10 types::RpcTypes,
11 FromEvmError, RpcNodeCore,
12};
13use reth_rpc_eth_types::PendingBlock;
14use reth_storage_api::{
15 BlockReader, BlockReaderIdExt, ProviderBlock, ProviderHeader, ProviderReceipt, ProviderTx,
16 StateProviderFactory,
17};
18use reth_transaction_pool::{PoolTransaction, TransactionPool};
19use revm_primitives::B256;
20
21use crate::EthApi;
22
23impl<Provider, Pool, Network, EvmConfig> LoadPendingBlock
24 for EthApi<Provider, Pool, Network, EvmConfig>
25where
26 Self: SpawnBlocking<
27 NetworkTypes: RpcTypes<Header = alloy_rpc_types_eth::Header>,
28 Error: FromEvmError<Self::Evm>,
29 > + RpcNodeCore<
30 Provider: BlockReaderIdExt<
31 Transaction = reth_ethereum_primitives::TransactionSigned,
32 Block = reth_ethereum_primitives::Block,
33 Receipt = reth_ethereum_primitives::Receipt,
34 Header = alloy_consensus::Header,
35 > + ChainSpecProvider<ChainSpec: EthChainSpec + EthereumHardforks>
36 + StateProviderFactory,
37 Pool: TransactionPool<
38 Transaction: PoolTransaction<Consensus = ProviderTx<Self::Provider>>,
39 >,
40 Evm: ConfigureEvm<
41 Primitives: NodePrimitives<
42 BlockHeader = ProviderHeader<Self::Provider>,
43 SignedTx = ProviderTx<Self::Provider>,
44 Receipt = ProviderReceipt<Self::Provider>,
45 Block = ProviderBlock<Self::Provider>,
46 >,
47 NextBlockEnvCtx = NextBlockEnvAttributes,
48 >,
49 >,
50 Provider: BlockReader<
51 Block = reth_ethereum_primitives::Block,
52 Receipt = reth_ethereum_primitives::Receipt,
53 >,
54{
55 #[inline]
56 fn pending_block(
57 &self,
58 ) -> &tokio::sync::Mutex<
59 Option<PendingBlock<ProviderBlock<Self::Provider>, ProviderReceipt<Self::Provider>>>,
60 > {
61 self.inner.pending_block()
62 }
63
64 fn next_env_attributes(
65 &self,
66 parent: &SealedHeader<ProviderHeader<Self::Provider>>,
67 ) -> Result<<Self::Evm as reth_evm::ConfigureEvm>::NextBlockEnvCtx, Self::Error> {
68 Ok(NextBlockEnvAttributes {
69 timestamp: parent.timestamp().saturating_add(12),
70 suggested_fee_recipient: parent.beneficiary(),
71 prev_randao: B256::random(),
72 gas_limit: parent.gas_limit(),
73 parent_beacon_block_root: parent.parent_beacon_block_root(),
74 withdrawals: None,
75 })
76 }
77}