reth_rpc/eth/helpers/
block.rs1use 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}