mempool: fix recommended fees

This commit is contained in:
nym21
2025-12-16 20:29:08 +01:00
parent 2ccf0ef856
commit 3ca83a2289
3 changed files with 22 additions and 8 deletions

View File

@@ -34,6 +34,12 @@ impl EntryPool {
idx idx
} }
/// Get an entry by its txid prefix.
pub fn get(&self, prefix: &TxidPrefix) -> Option<&Entry> {
let idx = self.prefix_to_idx.get(prefix)?;
self.entries.get(idx.as_usize())?.as_ref()
}
/// Remove an entry by its txid prefix. /// Remove an entry by its txid prefix.
pub fn remove(&mut self, prefix: &TxidPrefix) { pub fn remove(&mut self, prefix: &TxidPrefix) {
if let Some(idx) = self.prefix_to_idx.remove(prefix) { if let Some(idx) = self.prefix_to_idx.remove(prefix) {

View File

@@ -173,7 +173,9 @@ impl MempoolInner {
let tx = tx_with_hex.tx(); let tx = tx_with_hex.tx();
let prefix = TxidPrefix::from(txid); let prefix = TxidPrefix::from(txid);
info.remove(tx); // Get fee from entries (before removing) - this is the authoritative fee from Bitcoin Core
let fee = entries.get(&prefix).map(|e| e.fee).unwrap_or_default();
info.remove(tx, fee);
addresses.remove_tx(tx, txid); addresses.remove_tx(tx, txid);
entries.remove(&prefix); entries.remove(&prefix);
}, },
@@ -188,7 +190,7 @@ impl MempoolInner {
continue; continue;
}; };
info.add(tx); info.add(tx, entry_info.fee);
addresses.add_tx(tx, txid); addresses.add_tx(tx, txid);
entries.insert(prefix, Entry::from_info(entry_info)); entries.insert(prefix, Entry::from_info(entry_info));
} }

View File

@@ -15,19 +15,25 @@ pub struct MempoolInfo {
} }
impl MempoolInfo { impl MempoolInfo {
/// Increment stats for a newly added transaction /// Increment stats for a newly added transaction.
///
/// Fee must come from `MempoolEntryInfo` (Bitcoin Core) rather than `tx.fee`
/// because `tx.fee` may be 0 for chained mempool transactions where prevouts
/// cannot be looked up via `gettxout`.
#[inline] #[inline]
pub fn add(&mut self, tx: &Transaction) { pub fn add(&mut self, tx: &Transaction, fee: Sats) {
self.count += 1; self.count += 1;
self.vsize += tx.vsize(); self.vsize += tx.vsize();
self.total_fee += tx.fee; self.total_fee += fee;
} }
/// Decrement stats for a removed transaction /// Decrement stats for a removed transaction.
///
/// Fee must match the fee used when the transaction was added.
#[inline] #[inline]
pub fn remove(&mut self, tx: &Transaction) { pub fn remove(&mut self, tx: &Transaction, fee: Sats) {
self.count -= 1; self.count -= 1;
self.vsize -= tx.vsize(); self.vsize -= tx.vsize();
self.total_fee -= tx.fee; self.total_fee -= fee;
} }
} }