Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 49 additions & 52 deletions crates/anvil/core/src/eth/transaction/mod.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
//! Transaction related types
use alloy_consensus::{
Receipt, ReceiptEnvelope, ReceiptWithBloom, Signed, Transaction, TxEip1559, TxEip2930,
TxEnvelope, TxLegacy, TxReceipt, Typed2718,
transaction::{
Recovered, TxEip7702,
eip4844::{TxEip4844, TxEip4844Variant, TxEip4844WithSidecar},
Recovered, TxEip7702,
},
Receipt, ReceiptEnvelope, ReceiptWithBloom, Signed, Transaction, TxEip1559, TxEip2930,
TxEnvelope, TxLegacy, TxReceipt, Typed2718,
};
use alloy_eips::eip2718::{Decodable2718, Eip2718Error, Encodable2718};
use alloy_network::{AnyReceiptEnvelope, AnyRpcTransaction, AnyTransactionReceipt, AnyTxEnvelope};
use alloy_primitives::{Address, B256, Bloom, Bytes, Log, Signature, TxHash, TxKind, U64, U256};
use alloy_rlp::{Decodable, Encodable, Header, length_of_length};
use alloy_primitives::{Address, Bloom, Bytes, Log, Signature, TxHash, TxKind, B256, U256, U64};
use alloy_rlp::{length_of_length, Decodable, Encodable, Header};
use alloy_rpc_types::{
AccessList, ConversionError, Transaction as RpcTransaction, TransactionReceipt,
request::TransactionRequest, trace::otterscan::OtsReceipt,
request::TransactionRequest, trace::otterscan::OtsReceipt, AccessList, ConversionError,
Transaction as RpcTransaction, TransactionReceipt,
};
use alloy_serde::{OtherFields, WithOtherFields};
use bytes::BufMut;
use foundry_evm::traces::CallTraceNode;
use op_alloy_consensus::{DEPOSIT_TX_TYPE_ID, TxDeposit};
use op_revm::{OpTransaction, transaction::deposit::DepositTransactionParts};
use op_alloy_consensus::{
OpDepositReceipt, OpDepositReceiptWithBloom, TxDeposit, DEPOSIT_TX_TYPE_ID,
};
use op_revm::{transaction::deposit::DepositTransactionParts, OpTransaction};
use revm::{context::TxEnv, interpreter::InstructionResult};
use serde::{Deserialize, Serialize};
use std::ops::{Deref, Mul};
Expand Down Expand Up @@ -1094,25 +1096,17 @@ pub struct TransactionInfo {
pub gas_used: u64,
}

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DepositReceipt<T = Receipt<alloy_primitives::Log>> {
#[serde(flatten)]
pub inner: ReceiptWithBloom<T>,
#[serde(default, with = "alloy_serde::quantity::opt")]
pub deposit_nonce: Option<u64>,
#[serde(default, with = "alloy_serde::quantity::opt")]
pub deposit_receipt_version: Option<u64>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct DepositReceipt(pub OpDepositReceipt);

impl DepositReceipt {
fn payload_len(&self) -> usize {
self.inner.receipt.status.length()
+ self.inner.receipt.cumulative_gas_used.length()
+ self.inner.logs_bloom.length()
+ self.inner.receipt.logs.length()
+ self.deposit_nonce.map_or(0, |n| n.length())
+ self.deposit_receipt_version.map_or(0, |n| n.length())
self.0.inner.status.length()
+ self.0.inner.cumulative_gas_used.length()
+ self.0.inner.logs.length()
+ self.0.deposit_nonce.map_or(0, |n| n.length())
+ self.0.deposit_receipt_version.map_or(0, |n| n.length())
}

/// Returns the rlp header for the receipt payload.
Expand All @@ -1123,14 +1117,14 @@ impl DepositReceipt {
/// Encodes the receipt data.
fn encode_fields(&self, out: &mut dyn BufMut) {
self.receipt_rlp_header().encode(out);
self.inner.status().encode(out);
self.inner.receipt.cumulative_gas_used.encode(out);
self.inner.logs_bloom.encode(out);
self.inner.receipt.logs.encode(out);
if let Some(n) = self.deposit_nonce {
self.0.inner.status().encode(out);
self.0.inner.cumulative_gas_used.encode(out);
self.0.inner.logs.encode(out);

if let Some(n) = self.0.deposit_nonce {
n.encode(out);
}
if let Some(n) = self.deposit_receipt_version {
if let Some(n) = self.0.deposit_receipt_version {
n.encode(out);
}
}
Expand All @@ -1147,21 +1141,19 @@ impl DepositReceipt {

let status = Decodable::decode(b)?;
let cumulative_gas_used = Decodable::decode(b)?;
let logs_bloom = Decodable::decode(b)?;
// let logs_bloom = Decodable::decode(b)?;
let logs: Vec<Log> = Decodable::decode(b)?;
let deposit_nonce = remaining(b).then(|| alloy_rlp::Decodable::decode(b)).transpose()?;
let deposit_nonce_version =
remaining(b).then(|| alloy_rlp::Decodable::decode(b)).transpose()?;

let this = Self {
inner: ReceiptWithBloom {
receipt: Receipt { status, cumulative_gas_used, logs },
logs_bloom,
},
let op_receipt = OpDepositReceipt {
inner: Receipt { status, cumulative_gas_used, logs },
deposit_nonce,
deposit_receipt_version: deposit_nonce_version,
};

let this = DepositReceipt(op_receipt);
let consumed = started_len - b.len();
if consumed != rlp_head.payload_length {
return Err(alloy_rlp::Error::ListLengthMismatch {
Expand Down Expand Up @@ -1206,7 +1198,7 @@ pub enum TypedReceipt<T = Receipt<alloy_primitives::Log>> {
#[serde(rename = "0x4", alias = "0x04")]
EIP7702(ReceiptWithBloom<T>),
#[serde(rename = "0x7E", alias = "0x7e")]
Deposit(DepositReceipt<T>),
Deposit(DepositReceipt),
}

impl<T> TypedReceipt<T> {
Expand Down Expand Up @@ -1478,19 +1470,24 @@ pub fn convert_to_anvil_receipt(receipt: AnyTransactionReceipt) -> Option<Receip
0x02 => TypedReceipt::EIP1559(receipt_with_bloom),
0x03 => TypedReceipt::EIP4844(receipt_with_bloom),
0x04 => TypedReceipt::EIP7702(receipt_with_bloom),
0x7E => TypedReceipt::Deposit(DepositReceipt {
inner: receipt_with_bloom,
deposit_nonce: other
.get_deserialized::<U64>("depositNonce")
.transpose()
.ok()?
.map(|v| v.to()),
deposit_receipt_version: other
.get_deserialized::<U64>("depositReceiptVersion")
.transpose()
.ok()?
.map(|v| v.to()),
}),
0x7E => {
let op_receipt = OpDepositReceipt::<alloy_rpc_types::Log> {
inner: receipt_with_bloom.receipt,
deposit_nonce: other
.get_deserialized::<U64>("depositNonce")
.transpose()
.ok()?
.map(|v| v.to()),
deposit_receipt_version: other
.get_deserialized::<U64>("depositReceiptVersion")
.transpose()
.ok()?
.map(|v| v.to()),
};

TypedReceipt::Deposit(DepositReceipt(op_receipt))
}

_ => return None,
},
})
Expand All @@ -1499,7 +1496,7 @@ pub fn convert_to_anvil_receipt(receipt: AnyTransactionReceipt) -> Option<Receip
#[cfg(test)]
mod tests {
use super::*;
use alloy_primitives::{LogData, b256, hex};
use alloy_primitives::{b256, hex, LogData};
use std::str::FromStr;

// <https://github.com/foundry-rs/foundry/issues/10852>
Expand Down
Loading