diff --git a/Cargo.toml b/Cargo.toml index 2fe5902233..05598c1b9c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -184,6 +184,7 @@ once_cell = "1.17" syn = "2.0" ahash = "0.8.6" + # proc-macros proc-macro2 = "1.0" quote = "1.0" @@ -231,4 +232,4 @@ serial_test = "2" [workspace.metadata.cargo-udeps.ignore] # ignored because this is mutually exclusive with the optimism payload builder via feature flags -normal = ["reth-ethereum-payload-builder"] \ No newline at end of file +normal = ["reth-ethereum-payload-builder"] diff --git a/crates/transaction-pool/src/lib.rs b/crates/transaction-pool/src/lib.rs index 1621c6ffe1..ab7b73debb 100644 --- a/crates/transaction-pool/src/lib.rs +++ b/crates/transaction-pool/src/lib.rs @@ -144,7 +144,7 @@ #![deny(unused_must_use, rust_2018_idioms)] #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] -use crate::pool::PoolInner; +use crate::{identifier::TransactionId, pool::PoolInner}; use aquamarine as _; use reth_primitives::{Address, BlobTransactionSidecar, PooledTransactionsElement, TxHash, U256}; use reth_provider::StateProviderFactory; @@ -473,6 +473,20 @@ where self.pool.get_transactions_by_sender(sender) } + fn get_transactions_by_sender_and_nonce( + &self, + sender: Address, + nonce: u64, + ) -> Option>> { + let transaction_id = TransactionId::new(self.pool.get_sender_id(sender), nonce); + + self.inner() + .get_pool_data() + .all() + .get(&transaction_id) + .map(|tx| Arc::clone(&tx.transaction)) + } + fn get_transactions_by_origin( &self, origin: TransactionOrigin, diff --git a/crates/transaction-pool/src/noop.rs b/crates/transaction-pool/src/noop.rs index a1cadb5f65..c1a322edd3 100644 --- a/crates/transaction-pool/src/noop.rs +++ b/crates/transaction-pool/src/noop.rs @@ -192,6 +192,14 @@ impl TransactionPool for NoopTransactionPool { vec![] } + fn get_transactions_by_sender_and_nonce( + &self, + _sender: Address, + _nonce: u64, + ) -> Option>> { + None + } + fn unique_senders(&self) -> HashSet
{ Default::default() } diff --git a/crates/transaction-pool/src/pool/mod.rs b/crates/transaction-pool/src/pool/mod.rs index 1b7717a8fc..778445334f 100644 --- a/crates/transaction-pool/src/pool/mod.rs +++ b/crates/transaction-pool/src/pool/mod.rs @@ -81,7 +81,7 @@ use crate::{ CanonicalStateUpdate, ChangedAccount, PoolConfig, TransactionOrdering, TransactionValidator, }; use best::BestTransactions; -use parking_lot::{Mutex, RwLock}; +use parking_lot::{Mutex, RwLock, RwLockReadGuard}; use reth_primitives::{ Address, BlobTransaction, BlobTransactionSidecar, IntoRecoveredTransaction, PooledTransactionsElement, TransactionSigned, TxHash, B256, @@ -279,6 +279,11 @@ where self.event_listener.write().subscribe_all() } + /// Returns a read lock to the pool's data. + pub(crate) fn get_pool_data(&self) -> RwLockReadGuard<'_, TxPool> { + self.pool.read() + } + /// Returns hashes of _all_ transactions in the pool. pub(crate) fn pooled_transactions_hashes(&self) -> Vec { let pool = self.pool.read(); diff --git a/crates/transaction-pool/src/pool/txpool.rs b/crates/transaction-pool/src/pool/txpool.rs index 5875987914..c58a9e7fb8 100644 --- a/crates/transaction-pool/src/pool/txpool.rs +++ b/crates/transaction-pool/src/pool/txpool.rs @@ -929,7 +929,6 @@ impl AllTransactions { } /// Returns the internal transaction with additional metadata - #[cfg(test)] pub(crate) fn get(&self, id: &TransactionId) -> Option<&PoolInternalTransaction> { self.txs.get(id) } diff --git a/crates/transaction-pool/src/traits.rs b/crates/transaction-pool/src/traits.rs index 3888b10786..70875cd0fd 100644 --- a/crates/transaction-pool/src/traits.rs +++ b/crates/transaction-pool/src/traits.rs @@ -306,6 +306,13 @@ pub trait TransactionPool: Send + Sync + Clone { sender: Address, ) -> Vec>>; + /// Returns a transaction sent by a given user with a given nonce + fn get_transactions_by_sender_and_nonce( + &self, + sender: Address, + nonce: u64, + ) -> Option>>; + /// Returns all transactions that where submitted with the given [TransactionOrigin] fn get_transactions_by_origin( &self,