reth_rpc/eth/helpers/
receipt.rs

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