@@ -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