diff --git a/crates/primitives/src/account.rs b/crates/primitives/src/account.rs index 881578a68b64..712e5e341c26 100644 --- a/crates/primitives/src/account.rs +++ b/crates/primitives/src/account.rs @@ -8,6 +8,7 @@ use bytes::Buf; use reth_codecs::{main_codec, Compact}; use serde::{Deserialize, Serialize}; use std::ops::Deref; + /// An Ethereum account. #[main_codec] #[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] @@ -27,7 +28,7 @@ impl Account { } /// After SpuriousDragon empty account is defined as account with nonce == 0 && balance == 0 && - /// bytecode = None. + /// bytecode = None (or hash is [`KECCAK_EMPTY`]). pub fn is_empty(&self) -> bool { self.nonce == 0 && self.balance.is_zero() && @@ -145,6 +146,31 @@ mod tests { assert_eq!(len, 4); } + #[test] + fn test_empty_account() { + let mut acc = Account { nonce: 0, balance: U256::ZERO, bytecode_hash: None }; + // Nonce 0, balance 0, and bytecode hash set to None is considered empty. + assert!(acc.is_empty()); + + acc.bytecode_hash = Some(KECCAK_EMPTY); + // Nonce 0, balance 0, and bytecode hash set to KECCAK_EMPTY is considered empty. + assert!(acc.is_empty()); + + acc.balance = U256::from(2); + // Non-zero balance makes it non-empty. + assert!(!acc.is_empty()); + + acc.balance = U256::ZERO; + acc.nonce = 10; + // Non-zero nonce makes it non-empty. + assert!(!acc.is_empty()); + + acc.nonce = 0; + acc.bytecode_hash = Some(B256::from(U256::ZERO)); + // Non-empty bytecode hash makes it non-empty. + assert!(!acc.is_empty()); + } + #[test] fn test_bytecode() { let mut buf = vec![]; diff --git a/crates/transaction-pool/src/ordering.rs b/crates/transaction-pool/src/ordering.rs index ffa185f1f0e9..8187520ee089 100644 --- a/crates/transaction-pool/src/ordering.rs +++ b/crates/transaction-pool/src/ordering.rs @@ -15,10 +15,7 @@ pub enum Priority { impl From> for Priority { fn from(value: Option) -> Self { - match value { - Some(val) => Priority::Value(val), - None => Priority::None, - } + value.map_or(Priority::None, Priority::Value) } } diff --git a/crates/transaction-pool/src/traits.rs b/crates/transaction-pool/src/traits.rs index 1eef5ac858f9..c3ecac476eb0 100644 --- a/crates/transaction-pool/src/traits.rs +++ b/crates/transaction-pool/src/traits.rs @@ -1,4 +1,5 @@ use crate::{ + blobstore::BlobStoreError, error::PoolResult, pool::{state::SubPool, TransactionEvents}, validate::ValidPoolTransaction, @@ -6,12 +7,14 @@ use crate::{ }; use futures_util::{ready, Stream}; use reth_primitives::{ - AccessList, Address, BlobTransactionSidecar, BlobTransactionValidationError, + kzg::KzgSettings, AccessList, Address, BlobTransactionSidecar, BlobTransactionValidationError, FromRecoveredPooledTransaction, FromRecoveredTransaction, IntoRecoveredTransaction, PeerId, PooledTransactionsElement, PooledTransactionsElementEcRecovered, SealedBlock, Transaction, TransactionKind, TransactionSignedEcRecovered, TxEip4844, TxHash, B256, EIP1559_TX_TYPE_ID, EIP4844_TX_TYPE_ID, U256, }; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet}, fmt, @@ -21,11 +24,6 @@ use std::{ }; use tokio::sync::mpsc::Receiver; -use crate::blobstore::BlobStoreError; -use reth_primitives::kzg::KzgSettings; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; - /// General purpose abstraction of a transaction-pool. /// /// This is intended to be used by API-consumers such as RPC that need inject new incoming, @@ -967,8 +965,7 @@ impl PoolTransaction for EthPooledTransaction { /// This will return `None` for non-EIP1559 transactions fn max_priority_fee_per_gas(&self) -> Option { match &self.transaction.transaction { - Transaction::Legacy(_) => None, - Transaction::Eip2930(_) => None, + Transaction::Legacy(_) | Transaction::Eip2930(_) => None, Transaction::Eip1559(tx) => Some(tx.max_priority_fee_per_gas), Transaction::Eip4844(tx) => Some(tx.max_priority_fee_per_gas), #[cfg(feature = "optimism")]