@@ -2628,21 +2628,22 @@ where L::Target: Logger {
26282628 // Make sure we would never create a route with more paths than we allow.
26292629 debug_assert ! ( paths. len( ) <= payment_params. max_path_count. into( ) ) ;
26302630
2631- // Make sure we would never create a route whose total fees exceed max_total_routing_fee_msat.
2632- if let Some ( max_total_routing_fee_msat) = route_params. max_total_routing_fee_msat {
2633- if paths. iter ( ) . map ( |p| p. fee_msat ( ) ) . sum :: < u64 > ( ) > max_total_routing_fee_msat {
2634- return Err ( LightningError { err : format ! ( "Failed to find route that adheres to the maximum total fee limit of {}msat" ,
2635- max_total_routing_fee_msat) , action : ErrorAction :: IgnoreError } ) ;
2636- }
2637- }
2638-
26392631 if let Some ( node_features) = payment_params. payee . node_features ( ) {
26402632 for path in paths. iter_mut ( ) {
26412633 path. hops . last_mut ( ) . unwrap ( ) . node_features = node_features. clone ( ) ;
26422634 }
26432635 }
26442636
26452637 let route = Route { paths, route_params : Some ( route_params. clone ( ) ) } ;
2638+
2639+ // Make sure we would never create a route whose total fees exceed max_total_routing_fee_msat.
2640+ if let Some ( max_total_routing_fee_msat) = route_params. max_total_routing_fee_msat {
2641+ if route. get_total_fees ( ) > max_total_routing_fee_msat {
2642+ return Err ( LightningError { err : format ! ( "Failed to find route that adheres to the maximum total fee limit of {}msat" ,
2643+ max_total_routing_fee_msat) , action : ErrorAction :: IgnoreError } ) ;
2644+ }
2645+ }
2646+
26462647 log_info ! ( logger, "Got route: {}" , log_route!( route) ) ;
26472648 Ok ( route)
26482649}
@@ -3266,11 +3267,22 @@ mod tests {
32663267 excess_data : Vec :: new ( )
32673268 } ) ;
32683269
3269- // Now check that we'll find a path if the htlc_minimum is overrun substantially.
3270+ // Now check that we'll fail to find a path if we fail to find a path if the htlc_minimum
3271+ // is overrun. Note that the fees are actually calculated on 3*payment amount as that's
3272+ // what we try to find a route for, so this test only just happens to work out to exactly
3273+ // the fee limit.
32703274 let mut route_params = RouteParameters :: from_payment_params_and_value (
32713275 payment_params. clone ( ) , 5_000 ) ;
3272- // TODO: This can even overrun the fee limit set by the recipient!
32733276 route_params. max_total_routing_fee_msat = Some ( 9_999 ) ;
3277+ if let Err ( LightningError { err, action : ErrorAction :: IgnoreError } ) = get_route ( & our_id,
3278+ & route_params, & network_graph. read_only ( ) , None , Arc :: clone ( & logger) , & scorer,
3279+ & Default :: default ( ) , & random_seed_bytes) {
3280+ assert_eq ! ( err, "Failed to find route that adheres to the maximum total fee limit of 9999msat" ) ;
3281+ } else { panic ! ( ) ; }
3282+
3283+ let mut route_params = RouteParameters :: from_payment_params_and_value (
3284+ payment_params. clone ( ) , 5_000 ) ;
3285+ route_params. max_total_routing_fee_msat = Some ( 10_000 ) ;
32743286 let route = get_route ( & our_id, & route_params, & network_graph. read_only ( ) , None ,
32753287 Arc :: clone ( & logger) , & scorer, & Default :: default ( ) , & random_seed_bytes) . unwrap ( ) ;
32763288 assert_eq ! ( route. get_total_fees( ) , 10_000 ) ;
0 commit comments