Skip to content
Merged
Show file tree
Hide file tree
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
20 changes: 10 additions & 10 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,16 @@ op-alloy-rpc-jsonrpsee = { version = "0.6.2", path = "crates/rpc-jsonrpsee", def
op-alloy-rpc-types-engine = { version = "0.6.2", path = "crates/rpc-types-engine", default-features = false }

# Alloy
alloy-eips = { version = "0.6.1", default-features = false }
alloy-serde = { version = "0.6.1", default-features = false }
alloy-signer = { version = "0.6.1", default-features = false }
alloy-network = { version = "0.6.1", default-features = false }
alloy-provider = { version = "0.6.1", default-features = false }
alloy-transport = { version = "0.6.1", default-features = false }
alloy-consensus = { version = "0.6.1", default-features = false }
alloy-rpc-types-eth = { version = "0.6.1", default-features = false }
alloy-rpc-types-engine = { version = "0.6.1", default-features = false }
alloy-network-primitives = { version = "0.6.1", default-features = false }
alloy-eips = { version = "0.6.2", default-features = false }
alloy-serde = { version = "0.6.2", default-features = false }
alloy-signer = { version = "0.6.2", default-features = false }
alloy-network = { version = "0.6.2", default-features = false }
alloy-provider = { version = "0.6.2", default-features = false }
alloy-transport = { version = "0.6.2", default-features = false }
alloy-consensus = { version = "0.6.2", default-features = false }
alloy-rpc-types-eth = { version = "0.6.2", default-features = false }
alloy-rpc-types-engine = { version = "0.6.2", default-features = false }
alloy-network-primitives = { version = "0.6.2", default-features = false }

# Alloy RLP
alloy-rlp = { version = "0.3", default-features = false }
Expand Down
42 changes: 25 additions & 17 deletions crates/rpc-types/src/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,35 +155,36 @@ mod tx_serde {
//!
//! This is needed because we might need to deserialize the `from` field into both
//! [`alloy_rpc_types_eth::Transaction::from`] and [`op_alloy_consensus::TxDeposit::from`].
//!
//! Additionaly, we need similar logic for the `gasPrice` field
use super::*;
use serde::de::Error;

/// Helper struct which will be flattened into the transaction and will only contain `from`
/// field if inner [`OpTxEnvelope`] did not consume it.
#[derive(Serialize, Deserialize)]
struct MaybeFrom {
struct OptionalFields {
#[serde(default, skip_serializing_if = "Option::is_none")]
from: Option<Address>,
#[serde(
default,
rename = "gasPrice",
skip_serializing_if = "Option::is_none",
with = "alloy_serde::quantity::opt"
)]
effective_gas_price: Option<u128>,
}

#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct TransactionSerdeHelper {
#[serde(flatten)]
inner: OpTxEnvelope,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[serde(default)]
block_hash: Option<BlockHash>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "alloy_serde::quantity::opt"
)]
#[serde(default, with = "alloy_serde::quantity::opt")]
block_number: Option<u64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "alloy_serde::quantity::opt"
)]
#[serde(default, with = "alloy_serde::quantity::opt")]
transaction_index: Option<u64>,
#[serde(
default,
Expand All @@ -193,7 +194,7 @@ mod tx_serde {
deposit_receipt_version: Option<u64>,

#[serde(flatten)]
from: MaybeFrom,
other: OptionalFields,
}

impl From<Transaction> for TransactionSerdeHelper {
Expand All @@ -205,21 +206,25 @@ mod tx_serde {
block_hash,
block_number,
transaction_index,
effective_gas_price,
from,
},
deposit_receipt_version,
} = value;

// if inner transaction is deposit, then don't serialize `from` directly
// if inner transaction is a deposit, then don't serialize `from` directly
let from = if matches!(inner, OpTxEnvelope::Deposit(_)) { None } else { Some(from) };

// if inner transaction has its own `gasPrice` don't serialize it in this struct.
let effective_gas_price = effective_gas_price.filter(|_| inner.gas_price().is_none());

Self {
inner,
block_hash,
block_number,
transaction_index,
deposit_receipt_version,
from: MaybeFrom { from },
other: OptionalFields { from, effective_gas_price },
}
}
}
Expand All @@ -234,26 +239,29 @@ mod tx_serde {
block_number,
transaction_index,
deposit_receipt_version,
from,
other,
} = value;

// Try to get `from` field from inner envelope or from `MaybeFrom`, otherwise return
// error
let from = if let Some(from) = from.from {
let from = if let Some(from) = other.from {
from
} else if let OpTxEnvelope::Deposit(tx) = &inner {
tx.from
} else {
return Err(serde_json::Error::custom("missing `from` field"));
};

let effective_gas_price = other.effective_gas_price.or(inner.gas_price());

Ok(Self {
inner: alloy_rpc_types_eth::Transaction {
inner,
block_hash,
block_number,
transaction_index,
from,
effective_gas_price,
},
deposit_receipt_version,
})
Expand Down