reth_optimism_evm/
receipts.rs

1use alloy_consensus::{Eip658Value, Receipt};
2use alloy_evm::eth::receipt_builder::ReceiptBuilderCtx;
3use alloy_op_evm::block::receipt_builder::OpReceiptBuilder;
4use op_alloy_consensus::{OpDepositReceipt, OpTxType};
5use reth_evm::Evm;
6use reth_optimism_primitives::{OpReceipt, OpTransactionSigned};
7
8/// A builder that operates on op-reth primitive types, specifically [`OpTransactionSigned`] and
9/// [`OpReceipt`].
10#[derive(Debug, Default, Clone, Copy)]
11#[non_exhaustive]
12pub struct OpRethReceiptBuilder;
13
14impl OpReceiptBuilder for OpRethReceiptBuilder {
15    type Transaction = OpTransactionSigned;
16    type Receipt = OpReceipt;
17
18    fn build_receipt<'a, E: Evm>(
19        &self,
20        ctx: ReceiptBuilderCtx<'a, OpTransactionSigned, E>,
21    ) -> Result<Self::Receipt, ReceiptBuilderCtx<'a, OpTransactionSigned, E>> {
22        match ctx.tx.tx_type() {
23            OpTxType::Deposit => Err(ctx),
24            ty => {
25                let receipt = Receipt {
26                    // Success flag was added in `EIP-658: Embedding transaction status code in
27                    // receipts`.
28                    status: Eip658Value::Eip658(ctx.result.is_success()),
29                    cumulative_gas_used: ctx.cumulative_gas_used,
30                    logs: ctx.result.into_logs(),
31                };
32
33                Ok(match ty {
34                    OpTxType::Legacy => OpReceipt::Legacy(receipt),
35                    OpTxType::Eip1559 => OpReceipt::Eip1559(receipt),
36                    OpTxType::Eip2930 => OpReceipt::Eip2930(receipt),
37                    OpTxType::Eip7702 => OpReceipt::Eip7702(receipt),
38                    OpTxType::Deposit => unreachable!(),
39                })
40            }
41        }
42    }
43
44    fn build_deposit_receipt(&self, inner: OpDepositReceipt) -> Self::Receipt {
45        OpReceipt::Deposit(inner)
46    }
47}