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#[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 ArbReceipt::new(kind)
53 }
54}