reth_rpc/eth/helpers/
block.rs
1use 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}