arb_evm/
receipt.rs

1use alloy_evm::{
2    Evm,
3    eth::receipt_builder::{ReceiptBuilder, ReceiptBuilderCtx},
4};
5use alloy_primitives::Log;
6use arb_primitives::{ArbReceipt, ArbReceiptKind, ArbTransactionSigned, signed_tx::ArbTxTypeLocal};
7
8/// Builds `ArbReceipt` from execution results.
9#[derive(Debug, Clone, Copy, Default)]
10pub struct ArbReceiptBuilder;
11
12impl ReceiptBuilder for ArbReceiptBuilder {
13    type Transaction = ArbTransactionSigned;
14    type Receipt = ArbReceipt;
15
16    fn build_receipt<E: Evm>(
17        &self,
18        ctx: ReceiptBuilderCtx<'_, ArbTxTypeLocal, E>,
19    ) -> Self::Receipt {
20        let ReceiptBuilderCtx {
21            tx_type,
22            result,
23            cumulative_gas_used,
24            ..
25        } = ctx;
26        let success = result.is_success();
27        let logs: Vec<Log> = result.into_logs();
28
29        let inner = alloy_consensus::Receipt {
30            status: alloy_consensus::Eip658Value::Eip658(success),
31            cumulative_gas_used,
32            logs,
33        };
34
35        let kind = match tx_type {
36            ArbTxTypeLocal::Legacy => ArbReceiptKind::Legacy(inner),
37            ArbTxTypeLocal::Eip2930 => ArbReceiptKind::Eip2930(inner),
38            ArbTxTypeLocal::Eip1559 => ArbReceiptKind::Eip1559(inner),
39            ArbTxTypeLocal::Eip4844 => ArbReceiptKind::Eip1559(inner),
40            ArbTxTypeLocal::Eip7702 => ArbReceiptKind::Eip7702(inner),
41            ArbTxTypeLocal::Deposit => {
42                ArbReceiptKind::Deposit(arb_primitives::ArbDepositReceipt::new(success))
43            }
44            ArbTxTypeLocal::Unsigned => ArbReceiptKind::Unsigned(inner),
45            ArbTxTypeLocal::Contract => ArbReceiptKind::Contract(inner),
46            ArbTxTypeLocal::Retry => ArbReceiptKind::Retry(inner),
47            ArbTxTypeLocal::SubmitRetryable => ArbReceiptKind::SubmitRetryable(inner),
48            ArbTxTypeLocal::Internal => ArbReceiptKind::Internal(inner),
49        };
50
51        // gas_used_for_l1 is populated later by the block executor.
52        ArbReceipt::new(kind)
53    }
54}