reth_rpc/eth/helpers/
block.rs

1//! Contains RPC handler implementations specific to blocks.
2
3use alloy_consensus::{transaction::TransactionMeta, BlockHeader};
4use alloy_rpc_types_eth::{BlockId, TransactionReceipt};
5use reth_chainspec::{ChainSpecProvider, EthChainSpec};
6use reth_primitives_traits::BlockBody;
7use reth_rpc_eth_api::{
8    helpers::{EthBlocks, LoadBlock, LoadPendingBlock, LoadReceipt, SpawnBlocking},
9    types::RpcTypes,
10    RpcNodeCoreExt, RpcReceipt,
11};
12use reth_rpc_eth_types::{EthApiError, EthReceiptBuilder};
13use reth_storage_api::{BlockReader, ProviderTx};
14use reth_transaction_pool::{PoolTransaction, TransactionPool};
15
16use crate::EthApi;
17
18impl<Provider, Pool, Network, EvmConfig> EthBlocks for EthApi<Provider, Pool, Network, EvmConfig>
19where
20    Self: LoadBlock<
21        Error = EthApiError,
22        NetworkTypes: RpcTypes<Receipt = TransactionReceipt>,
23        Provider: BlockReader<
24            Transaction = reth_ethereum_primitives::TransactionSigned,
25            Receipt = reth_ethereum_primitives::Receipt,
26        >,
27    >,
28    Provider: BlockReader + ChainSpecProvider,
29{
30    async fn block_receipts(
31        &self,
32        block_id: BlockId,
33    ) -> Result<Option<Vec<RpcReceipt<Self::NetworkTypes>>>, Self::Error>
34    where
35        Self: LoadReceipt,
36    {
37        if let Some((block, receipts)) = self.load_block_and_receipts(block_id).await? {
38            let block_number = block.number();
39            let base_fee = block.base_fee_per_gas();
40            let block_hash = block.hash();
41            let excess_blob_gas = block.excess_blob_gas();
42            let timestamp = block.timestamp();
43            let blob_params = self.provider().chain_spec().blob_params_at_timestamp(timestamp);
44
45            return block
46                .body()
47                .transactions()
48                .iter()
49                .zip(receipts.iter())
50                .enumerate()
51                .map(|(idx, (tx, receipt))| {
52                    let meta = TransactionMeta {
53                        tx_hash: *tx.tx_hash(),
54                        index: idx as u64,
55                        block_hash,
56                        block_number,
57                        base_fee,
58                        excess_blob_gas,
59                        timestamp,
60                    };
61                    EthReceiptBuilder::new(tx, meta, receipt, &receipts, blob_params)
62                        .map(|builder| builder.build())
63                })
64                .collect::<Result<Vec<_>, Self::Error>>()
65                .map(Some)
66        }
67
68        Ok(None)
69    }
70}
71
72impl<Provider, Pool, Network, EvmConfig> LoadBlock for EthApi<Provider, Pool, Network, EvmConfig>
73where
74    Self: LoadPendingBlock
75        + SpawnBlocking
76        + RpcNodeCoreExt<
77            Pool: TransactionPool<
78                Transaction: PoolTransaction<Consensus = ProviderTx<Self::Provider>>,
79            >,
80        >,
81    Provider: BlockReader,
82{
83}