From 855988994b809eb40672450357052633caa38da0 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Mon, 15 Apr 2024 20:51:57 +0200 Subject: [PATCH] feat(op): import bodies (#7659) Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com> --- crates/primitives/src/transaction/mod.rs | 38 ++++++++++++++----- .../primitives/src/transaction/signature.rs | 6 +++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/crates/primitives/src/transaction/mod.rs b/crates/primitives/src/transaction/mod.rs index abc810b9e2..9e7c5d8e9d 100644 --- a/crates/primitives/src/transaction/mod.rs +++ b/crates/primitives/src/transaction/mod.rs @@ -956,8 +956,8 @@ impl TransactionSignedNoHash { // Optimism's Deposit transaction does not have a signature. Directly return the // `from` address. #[cfg(feature = "optimism")] - if let Transaction::Deposit(TxDeposit { from, .. }) = self.transaction { - return Some(from) + if let Some(address) = get_deposit_or_null_address(&self.transaction, &self.signature) { + return Some(address) } let signature_hash = self.signature_hash(); @@ -976,11 +976,9 @@ impl TransactionSignedNoHash { buffer.clear(); self.transaction.encode_without_signature(buffer); - // Optimism's Deposit transaction does not have a signature. Directly return the - // `from` address. #[cfg(feature = "optimism")] - if let Transaction::Deposit(TxDeposit { from, .. }) = self.transaction { - return Some(from) + if let Some(address) = get_deposit_or_null_address(&self.transaction, &self.signature) { + return Some(address) } self.signature.recover_signer_unchecked(keccak256(buffer)) @@ -1189,8 +1187,8 @@ impl TransactionSigned { // Optimism's Deposit transaction does not have a signature. Directly return the // `from` address. #[cfg(feature = "optimism")] - if let Transaction::Deposit(TxDeposit { from, .. }) = self.transaction { - return Some(from) + if let Some(address) = get_deposit_or_null_address(&self.transaction, &self.signature) { + return Some(address) } let signature_hash = self.signature_hash(); self.signature.recover_signer(signature_hash) @@ -1205,8 +1203,8 @@ impl TransactionSigned { // Optimism's Deposit transaction does not have a signature. Directly return the // `from` address. #[cfg(feature = "optimism")] - if let Transaction::Deposit(TxDeposit { from, .. }) = self.transaction { - return Some(from) + if let Some(address) = get_deposit_or_null_address(&self.transaction, &self.signature) { + return Some(address) } let signature_hash = self.signature_hash(); self.signature.recover_signer_unchecked(signature_hash) @@ -1781,6 +1779,26 @@ impl IntoRecoveredTransaction for TransactionSignedEcRecovered { } } +#[cfg(feature = "optimism")] +fn get_deposit_or_null_address( + transaction: &Transaction, + signature: &Signature, +) -> Option
{ + // Optimism's Deposit transaction does not have a signature. Directly return the + // `from` address. + if let Transaction::Deposit(TxDeposit { from, .. }) = transaction { + return Some(*from) + } + // OP blocks below bedrock include transactions sent from the null address + if std::env::var_os(OP_RETH_MAINNET_BELOW_BEDROCK).as_deref() == Some("true".as_ref()) && + *signature == Signature::optimism_deposit_tx_signature() + { + return Some(Address::default()) + } + + None +} + #[cfg(test)] mod tests { use crate::{ diff --git a/crates/primitives/src/transaction/signature.rs b/crates/primitives/src/transaction/signature.rs index 1f2c71b4a3..a6bc8905ac 100644 --- a/crates/primitives/src/transaction/signature.rs +++ b/crates/primitives/src/transaction/signature.rs @@ -85,6 +85,12 @@ impl Signature { // EIP-155: v = {0, 1} + CHAIN_ID * 2 + 35 self.odd_y_parity as u64 + chain_id * 2 + 35 } else { + #[cfg(feature = "optimism")] + if std::env::var_os(OP_RETH_MAINNET_BELOW_BEDROCK).as_deref() == Some("true".as_ref()) && + *self == Self::optimism_deposit_tx_signature() + { + return 0 + } self.odd_y_parity as u64 + 27 } }