Skip to content

Commit f5e4717

Browse files
committed
Add MempoolStats::avg_fee_rate
Implement `avg_fee_rate` method to calculate the average fee rate in `MempoolStats` Signed-off-by: Yuki Kishimoto <yukikishimoto@protonmail.com>
1 parent e533b79 commit f5e4717

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

src/response.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,22 @@ impl MempoolStats {
227227
let vbyte: u64 = self.vsize.to_vbytes_ceil();
228228
vbyte as f64 / 1_000_000.0
229229
}
230+
231+
/// Calculate average fee rate
232+
pub fn avg_fee_rate(&self) -> FeeRate {
233+
if self.fee_histogram.is_empty() {
234+
return FeeRate::BROADCAST_MIN;
235+
}
236+
237+
let fee_rate_sum: u64 = self
238+
.fee_histogram
239+
.iter()
240+
.map(|e| e.fee_rate.to_sat_per_kwu())
241+
.sum();
242+
let total: u64 = self.fee_histogram.len() as u64;
243+
let fee_rate_avg: u64 = fee_rate_sum / total;
244+
FeeRate::from_sat_per_kwu(fee_rate_avg)
245+
}
230246
}
231247

232248
/// Mempool block fees
@@ -399,4 +415,36 @@ mod tests {
399415

400416
assert_eq!(stats.size_mb(), 2.345565);
401417
}
418+
419+
#[test]
420+
fn test_mempool_avg_fee_rate() {
421+
let stats = MempoolStats {
422+
count: 1,
423+
vsize: Weight::from_vb_unchecked(2345565),
424+
total_fee: Amount::from_sat(1000),
425+
fee_histogram: vec![],
426+
};
427+
assert_eq!(stats.avg_fee_rate(), FeeRate::from_sat_per_vb_unchecked(1));
428+
429+
let stats = MempoolStats {
430+
count: 1,
431+
vsize: Weight::from_vb_unchecked(2345565),
432+
total_fee: Amount::from_sat(1000),
433+
fee_histogram: vec![
434+
FeeHistogramEntry {
435+
fee_rate: FeeRate::from_sat_per_vb_unchecked(18),
436+
vsize: Weight::from_vb_unchecked(1000),
437+
},
438+
FeeHistogramEntry {
439+
fee_rate: FeeRate::from_sat_per_vb_unchecked(8),
440+
vsize: Weight::from_vb_unchecked(1000),
441+
},
442+
FeeHistogramEntry {
443+
fee_rate: FeeRate::from_sat_per_vb_unchecked(4),
444+
vsize: Weight::from_vb_unchecked(1000),
445+
},
446+
],
447+
};
448+
assert_eq!(stats.avg_fee_rate(), FeeRate::from_sat_per_vb_unchecked(10));
449+
}
402450
}

0 commit comments

Comments
 (0)