From 5cc3db9932d468856271c1c038be7cf30d56ad34 Mon Sep 17 00:00:00 2001 From: Roman Krasiuk Date: Mon, 7 Aug 2023 22:36:30 +0300 Subject: [PATCH] fix(txpool): pending worst transaction (#4100) --- crates/transaction-pool/src/pool/pending.rs | 22 +++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/crates/transaction-pool/src/pool/pending.rs b/crates/transaction-pool/src/pool/pending.rs index 3455332090..eaff315459 100644 --- a/crates/transaction-pool/src/pool/pending.rs +++ b/crates/transaction-pool/src/pool/pending.rs @@ -274,7 +274,7 @@ impl PendingPool { /// Removes the worst transaction from this pool. pub(crate) fn pop_worst(&mut self) -> Option>> { - let worst = self.all.iter().next_back().map(|tx| *tx.transaction.id())?; + let worst = self.all.iter().next().map(|tx| *tx.transaction.id())?; self.remove_transaction(&worst) } @@ -350,7 +350,10 @@ impl Ord for PendingTransaction { #[cfg(test)] mod tests { use super::*; - use crate::test_utils::{MockOrdering, MockTransaction, MockTransactionFactory}; + use crate::{ + test_utils::{MockOrdering, MockTransaction, MockTransactionFactory}, + PoolTransaction, + }; #[test] fn test_enforce_basefee() { @@ -407,4 +410,19 @@ mod tests { assert_eq!(removed.len(), 2); assert!(pool.is_empty()); } + + #[test] + fn evict_worst() { + let mut f = MockTransactionFactory::default(); + let mut pool = PendingPool::new(MockOrdering::default()); + + let t = MockTransaction::eip1559(); + pool.add_transaction(f.validated_arc(t.clone()), 0); + + let t2 = MockTransaction::eip1559().inc_price_by(10); + pool.add_transaction(f.validated_arc(t2), 0); + + // First transaction should be evicted. + assert_eq!(pool.pop_worst().map(|tx| *tx.hash()), Some(*t.hash())); + } }