reth_rpc/eth/helpers/
receipt.rs

1//! Builds an RPC receipt response w.r.t. data layout of network.
2
3use alloy_consensus::transaction::TransactionMeta;
4use reth_chainspec::{ChainSpecProvider, EthChainSpec};
5use reth_ethereum_primitives::{Receipt, TransactionSigned};
6use reth_rpc_eth_api::{helpers::LoadReceipt, FromEthApiError, RpcNodeCoreExt, RpcReceipt};
7use reth_rpc_eth_types::{EthApiError, EthReceiptBuilder};
8use reth_storage_api::{BlockReader, ReceiptProvider, TransactionsProvider};
9
10use crate::EthApi;
11
12impl<Provider, Pool, Network, EvmConfig> LoadReceipt for EthApi<Provider, Pool, Network, EvmConfig>
13where
14    Self: RpcNodeCoreExt<
15        Provider: TransactionsProvider<Transaction = TransactionSigned>
16                      + ReceiptProvider<Receipt = reth_ethereum_primitives::Receipt>,
17    >,
18    Provider: BlockReader + ChainSpecProvider,
19{
20    async fn build_transaction_receipt(
21        &self,
22        tx: TransactionSigned,
23        meta: TransactionMeta,
24        receipt: Receipt,
25    ) -> Result<RpcReceipt<Self::NetworkTypes>, Self::Error> {
26        let hash = meta.block_hash;
27        // get all receipts for the block
28        let all_receipts = self
29            .cache()
30            .get_receipts(hash)
31            .await
32            .map_err(Self::Error::from_eth_err)?
33            .ok_or(EthApiError::HeaderNotFound(hash.into()))?;
34        let blob_params = self.provider().chain_spec().blob_params_at_timestamp(meta.timestamp);
35
36        Ok(EthReceiptBuilder::new(&tx, meta, &receipt, &all_receipts, blob_params)?.build())
37    }
38}