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;
14
15use crate::EthApi;
16
17impl<Provider, Pool, Network, EvmConfig> EthBlocks for EthApi<Provider, Pool, Network, EvmConfig>
18where
19    Self: LoadBlock<
20        Error = EthApiError,
21        NetworkTypes: RpcTypes<Receipt = TransactionReceipt>,
22        Provider: BlockReader<
23            Transaction = reth_ethereum_primitives::TransactionSigned,
24            Receipt = reth_ethereum_primitives::Receipt,
25        >,
26    >,
27    Provider: BlockReader + ChainSpecProvider,
28{
29    async fn block_receipts(
30        &self,
31        block_id: BlockId,
32    ) -> Result<Option<Vec<RpcReceipt<Self::NetworkTypes>>>, Self::Error>
33    where
34        Self: LoadReceipt,
35    {
36        if let Some((block, receipts)) = self.load_block_and_receipts(block_id).await? {
37            let block_number = block.number();
38            let base_fee = block.base_fee_per_gas();
39            let block_hash = block.hash();
40            let excess_blob_gas = block.excess_blob_gas();
41            let timestamp = block.timestamp();
42            let blob_params = self.provider().chain_spec().blob_params_at_timestamp(timestamp);
43
44            return block
45                .body()
46                .transactions()
47                .iter()
48                .zip(receipts.iter())
49                .enumerate()
50                .map(|(idx, (tx, receipt))| {
51                    let meta = TransactionMeta {
52                        tx_hash: *tx.tx_hash(),
53                        index: idx as u64,
54                        block_hash,
55                        block_number,
56                        base_fee,
57                        excess_blob_gas,
58                        timestamp,
59                    };
60                    EthReceiptBuilder::new(tx, meta, receipt, &receipts, blob_params)
61                        .map(|builder| builder.build())
62                })
63                .collect::<Result<Vec<_>, Self::Error>>()
64                .map(Some)
65        }
66
67        Ok(None)
68    }
69}
70
71impl<Provider, Pool, Network, EvmConfig> LoadBlock for EthApi<Provider, Pool, Network, EvmConfig>
72where
73    Self: LoadPendingBlock + SpawnBlocking + RpcNodeCoreExt,
74    Provider: BlockReader,
75{
76}