reth_rpc/eth/helpers/
pending_block.rs

1//! Support for building a pending block with transactions from local view of mempool.
2
3use 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}