alloy_evm/eth/
receipt_builder.rs1use crate::Evm;
5use alloy_consensus::{Eip658Value, ReceiptEnvelope, TxEnvelope, TxType};
6use revm::{context::result::ExecutionResult, state::EvmState};
7
8#[derive(Debug)]
10pub struct ReceiptBuilderCtx<'a, T, E: Evm> {
11 pub tx: &'a T,
13 pub evm: &'a E,
16 pub result: ExecutionResult<E::HaltReason>,
18 pub state: &'a EvmState,
20 pub cumulative_gas_used: u64,
22}
23
24#[auto_impl::auto_impl(&, Arc)]
26pub trait ReceiptBuilder {
27 type Transaction;
29 type Receipt;
31
32 fn build_receipt<E: Evm>(
34 &self,
35 ctx: ReceiptBuilderCtx<'_, Self::Transaction, E>,
36 ) -> Self::Receipt;
37}
38
39#[derive(Debug, Default, Clone, Copy)]
41#[non_exhaustive]
42pub struct AlloyReceiptBuilder;
43
44impl ReceiptBuilder for AlloyReceiptBuilder {
45 type Transaction = TxEnvelope;
46 type Receipt = ReceiptEnvelope;
47
48 fn build_receipt<E: Evm>(&self, ctx: ReceiptBuilderCtx<'_, TxEnvelope, E>) -> Self::Receipt {
49 let receipt = alloy_consensus::Receipt {
50 status: Eip658Value::Eip658(ctx.result.is_success()),
51 cumulative_gas_used: ctx.cumulative_gas_used,
52 logs: ctx.result.into_logs(),
53 }
54 .with_bloom();
55
56 match ctx.tx.tx_type() {
57 TxType::Legacy => ReceiptEnvelope::Legacy(receipt),
58 TxType::Eip2930 => ReceiptEnvelope::Eip2930(receipt),
59 TxType::Eip1559 => ReceiptEnvelope::Eip1559(receipt),
60 TxType::Eip4844 => ReceiptEnvelope::Eip4844(receipt),
61 TxType::Eip7702 => ReceiptEnvelope::Eip7702(receipt),
62 }
63 }
64}