mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
fix(txpool): actually compare with previous base fee on update (#5063)
This commit is contained in:
@ -147,6 +147,7 @@ impl<T: TransactionOrdering> TxPool<T> {
|
|||||||
|
|
||||||
/// Updates the tracked blob fee
|
/// Updates the tracked blob fee
|
||||||
fn update_blob_fee(&mut self, _pending_blob_fee: u128) {
|
fn update_blob_fee(&mut self, _pending_blob_fee: u128) {
|
||||||
|
// TODO: std::mem::swap pending_blob_fee
|
||||||
// TODO(mattsse): update blob txs
|
// TODO(mattsse): update blob txs
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,14 +155,16 @@ impl<T: TransactionOrdering> TxPool<T> {
|
|||||||
///
|
///
|
||||||
/// Depending on the change in direction of the basefee, this will promote or demote
|
/// Depending on the change in direction of the basefee, this will promote or demote
|
||||||
/// transactions from the basefee pool.
|
/// transactions from the basefee pool.
|
||||||
fn update_basefee(&mut self, pending_basefee: u64) {
|
fn update_basefee(&mut self, mut pending_basefee: u64) {
|
||||||
match pending_basefee.cmp(&self.all_transactions.pending_basefee) {
|
std::mem::swap(&mut self.all_transactions.pending_basefee, &mut pending_basefee);
|
||||||
|
match self.all_transactions.pending_basefee.cmp(&pending_basefee) {
|
||||||
Ordering::Equal => {
|
Ordering::Equal => {
|
||||||
// fee unchanged, nothing to update
|
// fee unchanged, nothing to update
|
||||||
}
|
}
|
||||||
Ordering::Greater => {
|
Ordering::Greater => {
|
||||||
// increased base fee: recheck pending pool and remove all that are no longer valid
|
// 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 {
|
for tx in removed {
|
||||||
let to = {
|
let to = {
|
||||||
let tx =
|
let tx =
|
||||||
@ -175,7 +178,8 @@ impl<T: TransactionOrdering> TxPool<T> {
|
|||||||
}
|
}
|
||||||
Ordering::Less => {
|
Ordering::Less => {
|
||||||
// decreased base fee: recheck basefee pool and promote all that are now valid
|
// 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 {
|
for tx in removed {
|
||||||
let to = {
|
let to = {
|
||||||
let tx =
|
let tx =
|
||||||
@ -202,11 +206,9 @@ impl<T: TransactionOrdering> TxPool<T> {
|
|||||||
} = info;
|
} = info;
|
||||||
self.all_transactions.last_seen_block_hash = last_seen_block_hash;
|
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.last_seen_block_number = last_seen_block_number;
|
||||||
self.all_transactions.pending_basefee = pending_basefee;
|
|
||||||
self.update_basefee(pending_basefee);
|
self.update_basefee(pending_basefee);
|
||||||
|
|
||||||
if let Some(blob_fee) = pending_blob_fee {
|
if let Some(blob_fee) = pending_blob_fee {
|
||||||
self.all_transactions.pending_blob_fee = blob_fee;
|
|
||||||
self.update_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)
|
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]
|
#[test]
|
||||||
fn discard_nonce_too_low() {
|
fn discard_nonce_too_low() {
|
||||||
let mut f = MockTransactionFactory::default();
|
let mut f = MockTransactionFactory::default();
|
||||||
|
|||||||
Reference in New Issue
Block a user