From d67730b8acb9a72c4d69a59ce8a16e0aa27e862d Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:40:13 -0400 Subject: [PATCH] fix(txpool): actually compare with previous base fee on update (#5063) --- crates/transaction-pool/src/pool/txpool.rs | 37 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/crates/transaction-pool/src/pool/txpool.rs b/crates/transaction-pool/src/pool/txpool.rs index f69aeec7f..8e5027bff 100644 --- a/crates/transaction-pool/src/pool/txpool.rs +++ b/crates/transaction-pool/src/pool/txpool.rs @@ -147,6 +147,7 @@ impl TxPool { /// Updates the tracked blob fee fn update_blob_fee(&mut self, _pending_blob_fee: u128) { + // TODO: std::mem::swap pending_blob_fee // TODO(mattsse): update blob txs } @@ -154,14 +155,16 @@ impl TxPool { /// /// Depending on the change in direction of the basefee, this will promote or demote /// transactions from the basefee pool. - fn update_basefee(&mut self, pending_basefee: u64) { - match pending_basefee.cmp(&self.all_transactions.pending_basefee) { + fn update_basefee(&mut self, mut pending_basefee: u64) { + std::mem::swap(&mut self.all_transactions.pending_basefee, &mut pending_basefee); + match self.all_transactions.pending_basefee.cmp(&pending_basefee) { Ordering::Equal => { // fee unchanged, nothing to update } Ordering::Greater => { // increased base fee: recheck pending pool and remove all that are no longer valid - let removed = self.pending_pool.update_base_fee(pending_basefee); + let removed = + self.pending_pool.update_base_fee(self.all_transactions.pending_basefee); for tx in removed { let to = { let tx = @@ -175,7 +178,8 @@ impl TxPool { } Ordering::Less => { // decreased base fee: recheck basefee pool and promote all that are now valid - let removed = self.basefee_pool.enforce_basefee(pending_basefee); + let removed = + self.basefee_pool.enforce_basefee(self.all_transactions.pending_basefee); for tx in removed { let to = { let tx = @@ -202,11 +206,9 @@ impl TxPool { } = info; self.all_transactions.last_seen_block_hash = last_seen_block_hash; self.all_transactions.last_seen_block_number = last_seen_block_number; - self.all_transactions.pending_basefee = pending_basefee; self.update_basefee(pending_basefee); if let Some(blob_fee) = pending_blob_fee { - self.all_transactions.pending_blob_fee = blob_fee; self.update_blob_fee(blob_fee) } } @@ -2113,6 +2115,29 @@ mod tests { assert_eq!(pool.all_transactions.txs.get(&id).unwrap().subpool, SubPool::BaseFee) } + #[test] + fn update_basefee_subpools_setting_block_info() { + let mut f = MockTransactionFactory::default(); + let mut pool = TxPool::new(MockOrdering::default(), Default::default()); + + let tx = MockTransaction::eip1559().inc_price_by(10); + let validated = f.validated(tx.clone()); + let id = *validated.id(); + pool.add_transaction(validated, U256::from(1_000), 0).unwrap(); + + assert_eq!(pool.pending_pool.len(), 1); + + // use set_block_info for the basefee update + let mut block_info = pool.block_info(); + block_info.pending_basefee = (tx.max_fee_per_gas() + 1) as u64; + pool.set_block_info(block_info); + + assert!(pool.pending_pool.is_empty()); + assert_eq!(pool.basefee_pool.len(), 1); + + assert_eq!(pool.all_transactions.txs.get(&id).unwrap().subpool, SubPool::BaseFee) + } + #[test] fn discard_nonce_too_low() { let mut f = MockTransactionFactory::default();