@@ -102,7 +102,16 @@ impl Params {
102102 return Err ( Error :: FeeRate ) ;
103103 }
104104 // since it's a minimum, we want to round up
105- FeeRate :: from_sat_per_kwu ( fee_rate_sat_per_kwu. ceil ( ) as u64 )
105+ let fee_rate_sat_per_kwu = fee_rate_sat_per_kwu. ceil ( ) as u64 ;
106+ // Reject absurd rates before they reach fee arithmetic:
107+ // a saturated u64::MAX sat/kwu would overflow the
108+ // Weight * FeeRate fee computation.
109+ if FeeRate :: from_sat_per_kwu ( fee_rate_sat_per_kwu)
110+ > bitcoin:: Psbt :: DEFAULT_MAX_FEE_RATE
111+ {
112+ return Err ( Error :: FeeRate ) ;
113+ }
114+ FeeRate :: from_sat_per_kwu ( fee_rate_sat_per_kwu)
106115 }
107116 Err ( _) => return Err ( Error :: FeeRate ) ,
108117 } ,
@@ -196,4 +205,23 @@ pub(crate) mod test {
196205 Error :: FeeRate
197206 ) ;
198207 }
208+
209+ #[ test]
210+ fn min_fee_rate_rejected_above_sanity_ceiling ( ) {
211+ // A rate whose sat/kwu saturates near u64::MAX must be rejected rather
212+ // than reaching fee arithmetic where Weight * FeeRate would overflow.
213+ assert_eq ! (
214+ Params :: from_query_str( "minfeerate=100000000000000000000" , & [ Version :: One ] )
215+ . unwrap_err( ) ,
216+ Error :: FeeRate
217+ ) ;
218+ }
219+
220+ #[ test]
221+ fn min_fee_rate_at_ceiling_is_accepted ( ) {
222+ // `DEFAULT_MAX_FEE_RATE` (25000 sat/vB) is the boundary and must pass.
223+ let params =
224+ Params :: from_query_str ( "minfeerate=25000" , & [ Version :: One ] ) . expect ( "valid feerate" ) ;
225+ assert_eq ! ( params. min_fee_rate, bitcoin:: Psbt :: DEFAULT_MAX_FEE_RATE ) ;
226+ }
199227}
0 commit comments