reth_seismic_rpc/eth/
pending_block.rs

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