From e99c9736d5ef99fe6e066b2a999036b50f7ed962 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 10 Sep 2024 01:16:18 +0200 Subject: [PATCH 1/4] chore: require destination for 7702 --- crates/consensus/src/header.rs | 1 - crates/consensus/src/transaction/eip7702.rs | 14 ++++++-------- crates/consensus/src/transaction/envelope.rs | 2 +- crates/rpc-types-eth/src/transaction/mod.rs | 2 +- crates/rpc-types-eth/src/transaction/request.rs | 9 +++++++-- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/crates/consensus/src/header.rs b/crates/consensus/src/header.rs index 3c086b8b045..c5b9f2da681 100644 --- a/crates/consensus/src/header.rs +++ b/crates/consensus/src/header.rs @@ -641,7 +641,6 @@ impl<'a> arbitrary::Arbitrary<'a> for Header { #[cfg(test)] mod tests { - use super::*; #[cfg(feature = "serde")] #[test] diff --git a/crates/consensus/src/transaction/eip7702.rs b/crates/consensus/src/transaction/eip7702.rs index c2e704a4df8..12307fcc073 100644 --- a/crates/consensus/src/transaction/eip7702.rs +++ b/crates/consensus/src/transaction/eip7702.rs @@ -1,6 +1,6 @@ use crate::{EncodableSignature, SignableTransaction, Signed, Transaction, TxType}; use alloy_eips::eip2930::AccessList; -use alloy_primitives::{keccak256, Bytes, ChainId, Signature, TxKind, B256, U256}; +use alloy_primitives::{keccak256, Address, Bytes, ChainId, Signature, TxKind, B256, U256}; use alloy_rlp::{BufMut, Decodable, Encodable, Header}; use core::mem; @@ -50,10 +50,8 @@ pub struct TxEip7702 { /// This is also known as `GasTipCap` #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))] pub max_priority_fee_per_gas: u128, - /// The 160-bit address of the message call’s recipient or, for a contract creation - /// transaction, ∅, used here to denote the only member of B0 ; formally Tt. - #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "TxKind::is_create"))] - pub to: TxKind, + /// The 160-bit address of the message call’s recipient. + pub to: Address, /// A scalar value equal to the number of Wei to /// be transferred to the message call’s recipient or, /// in the case of contract creation, as an endowment @@ -263,7 +261,7 @@ impl TxEip7702 { mem::size_of::() + // gas_limit mem::size_of::() + // max_fee_per_gas mem::size_of::() + // max_priority_fee_per_gas - self.to.size() + // to + mem::size_of::
() + // to mem::size_of::() + // value self.access_list.size() + // access_list self.input.len() + // input @@ -305,7 +303,7 @@ impl Transaction for TxEip7702 { } fn to(&self) -> TxKind { - self.to + self.to.into() } fn value(&self) -> U256 { @@ -430,7 +428,7 @@ mod tests { max_fee_per_gas: 0x4a817c800, max_priority_fee_per_gas: 0x3b9aca00, gas_limit: 2, - to: TxKind::Create, + to: Address::default(), value: U256::ZERO, input: vec![1, 2].into(), access_list: Default::default(), diff --git a/crates/consensus/src/transaction/envelope.rs b/crates/consensus/src/transaction/envelope.rs index fc5c324e983..339b37523f1 100644 --- a/crates/consensus/src/transaction/envelope.rs +++ b/crates/consensus/src/transaction/envelope.rs @@ -823,7 +823,7 @@ mod tests { gas_limit: 3, max_fee_per_gas: 4, max_priority_fee_per_gas: 5, - to: Address::left_padding_from(&[5]).into(), + to: Address::left_padding_from(&[5]), value: U256::from(6_u64), input: vec![7].into(), access_list: AccessList(vec![AccessListItem { diff --git a/crates/rpc-types-eth/src/transaction/mod.rs b/crates/rpc-types-eth/src/transaction/mod.rs index 6d6262cdd0f..1700bcf33bd 100644 --- a/crates/rpc-types-eth/src/transaction/mod.rs +++ b/crates/rpc-types-eth/src/transaction/mod.rs @@ -269,7 +269,7 @@ impl TryFrom for Signed { max_priority_fee_per_gas: tx .max_priority_fee_per_gas .ok_or(ConversionError::MissingMaxPriorityFeePerGas)?, - to: tx.to.into(), + to: tx.to.ok_or(ConversionError::MissingTo)?, value: tx.value, access_list: tx.access_list.ok_or(ConversionError::MissingAccessList)?, authorization_list: tx diff --git a/crates/rpc-types-eth/src/transaction/request.rs b/crates/rpc-types-eth/src/transaction/request.rs index aacd3f3af70..24a886fc2d9 100644 --- a/crates/rpc-types-eth/src/transaction/request.rs +++ b/crates/rpc-types-eth/src/transaction/request.rs @@ -314,6 +314,11 @@ impl TransactionRequest { fn build_7702(self) -> Result { let checked_to = self.to.ok_or("Missing 'to' field for Eip7702 transaction.")?; + let to_address = match checked_to { + TxKind::Create => return Err("The field `to` can only be of type TxKind::Call(Account). Please change it accordingly."), + TxKind::Call(to) => to, + }; + Ok(TxEip7702 { chain_id: self.chain_id.unwrap_or(1), nonce: self.nonce.ok_or("Missing 'nonce' field for Eip7702 transaction.")?, @@ -324,7 +329,7 @@ impl TransactionRequest { max_priority_fee_per_gas: self .max_priority_fee_per_gas .ok_or("Missing 'max_priority_fee_per_gas' field for Eip7702 transaction.")?, - to: checked_to, + to: to_address, value: self.value.unwrap_or_default(), input: self.input.into_input().unwrap_or_default(), access_list: self.access_list.unwrap_or_default(), @@ -808,7 +813,7 @@ impl From for TransactionRequest { impl From for TransactionRequest { fn from(tx: TxEip7702) -> Self { Self { - to: if let TxKind::Call(to) = tx.to { Some(to.into()) } else { None }, + to: Some(tx.to.into()), gas: Some(tx.gas_limit), max_fee_per_gas: Some(tx.max_fee_per_gas), max_priority_fee_per_gas: Some(tx.max_priority_fee_per_gas), From 675cc410eae97e1361139b1ec59b2702d425f2f7 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 10 Sep 2024 01:19:39 +0200 Subject: [PATCH 2/4] Update crates/consensus/src/transaction/eip7702.rs Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com> --- crates/consensus/src/transaction/eip7702.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/consensus/src/transaction/eip7702.rs b/crates/consensus/src/transaction/eip7702.rs index 12307fcc073..95bb9df230f 100644 --- a/crates/consensus/src/transaction/eip7702.rs +++ b/crates/consensus/src/transaction/eip7702.rs @@ -261,7 +261,7 @@ impl TxEip7702 { mem::size_of::() + // gas_limit mem::size_of::() + // max_fee_per_gas mem::size_of::() + // max_priority_fee_per_gas - mem::size_of::
() + // to + mem::size_of::
() + // to mem::size_of::() + // value self.access_list.size() + // access_list self.input.len() + // input From c8d199a4a98cf5c170026ac95072dc169a492fcb Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 10 Sep 2024 01:23:08 +0200 Subject: [PATCH 3/4] review --- crates/consensus/src/header.rs | 4 ++-- crates/rpc-types-eth/src/transaction/request.rs | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/consensus/src/header.rs b/crates/consensus/src/header.rs index c5b9f2da681..55045b03dc0 100644 --- a/crates/consensus/src/header.rs +++ b/crates/consensus/src/header.rs @@ -639,10 +639,10 @@ impl<'a> arbitrary::Arbitrary<'a> for Header { } } -#[cfg(test)] +#[cfg(all(test, feature = "serde"))] mod tests { + use super::*; - #[cfg(feature = "serde")] #[test] fn header_serde() { let raw = r#"{"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","ommersHash":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","beneficiary":"0x0000000000000000000000000000000000000000","stateRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","number":"0x0","gasLimit":"0x0","gasUsed":"0x0","timestamp":"0x0","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","baseFeePerGas":"0x1","extraData":"0x"}"#; diff --git a/crates/rpc-types-eth/src/transaction/request.rs b/crates/rpc-types-eth/src/transaction/request.rs index 24a886fc2d9..0a037d300d2 100644 --- a/crates/rpc-types-eth/src/transaction/request.rs +++ b/crates/rpc-types-eth/src/transaction/request.rs @@ -312,12 +312,7 @@ impl TransactionRequest { /// If required fields are missing. Use `complete_7702` to check if the /// request can be built. fn build_7702(self) -> Result { - let checked_to = self.to.ok_or("Missing 'to' field for Eip7702 transaction.")?; - - let to_address = match checked_to { - TxKind::Create => return Err("The field `to` can only be of type TxKind::Call(Account). Please change it accordingly."), - TxKind::Call(to) => to, - }; + let to_address = self.to.ok_or("Missing 'to' field for Eip7702 transaction.")?.to().copied().ok_or("The field `to` can only be of type TxKind::Call(Account). Please change it accordingly.")?; Ok(TxEip7702 { chain_id: self.chain_id.unwrap_or(1), From 05166db16a0fdefa3249e0cf15f09755c1b4a10a Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 10 Sep 2024 01:30:45 +0200 Subject: [PATCH 4/4] clippy --- crates/consensus/src/transaction/eip7702.rs | 6 +++--- crates/consensus/src/transaction/envelope.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/consensus/src/transaction/eip7702.rs b/crates/consensus/src/transaction/eip7702.rs index 95bb9df230f..a0dc1fde7e1 100644 --- a/crates/consensus/src/transaction/eip7702.rs +++ b/crates/consensus/src/transaction/eip7702.rs @@ -389,7 +389,7 @@ mod tests { use super::TxEip7702; use crate::SignableTransaction; use alloy_eips::eip2930::AccessList; - use alloy_primitives::{address, b256, hex, Address, Signature, TxKind, U256}; + use alloy_primitives::{address, b256, hex, Address, Signature, U256}; #[test] fn encode_decode_eip7702() { @@ -397,7 +397,7 @@ mod tests { chain_id: 1, nonce: 0x42, gas_limit: 44386, - to: address!("6069a6c32cf691f5982febae4faf8a6f3ab2f0f6").into(), + to: address!("6069a6c32cf691f5982febae4faf8a6f3ab2f0f6"), value: U256::from(0_u64), input: hex!("a22cb4650000000000000000000000005eee75727d804a2b13038928d36f8b188945a57a0000000000000000000000000000000000000000000000000000000000000000").into(), max_fee_per_gas: 0x4a817c800, @@ -454,7 +454,7 @@ mod tests { max_fee_per_gas: 0x4a817c800, max_priority_fee_per_gas: 0x3b9aca00, gas_limit: 2, - to: Address::default().into(), + to: Address::default(), value: U256::ZERO, input: vec![1, 2].into(), access_list: Default::default(), diff --git a/crates/consensus/src/transaction/envelope.rs b/crates/consensus/src/transaction/envelope.rs index 339b37523f1..232e88ca326 100644 --- a/crates/consensus/src/transaction/envelope.rs +++ b/crates/consensus/src/transaction/envelope.rs @@ -994,7 +994,7 @@ mod tests { gas_limit: u128::MAX, max_fee_per_gas: u128::MAX, max_priority_fee_per_gas: u128::MAX, - to: Address::random().into(), + to: Address::random(), value: U256::MAX, input: Bytes::new(), access_list: AccessList(vec![AccessListItem {