@@ -2203,14 +2203,19 @@ macro_rules! expect_payment_path_successful {
22032203
22042204pub fn expect_payment_forwarded < CM : AChannelManager , H : NodeHolder < CM =CM > > (
22052205 event : Event , node : & H , prev_node : & H , next_node : & H , expected_fee : Option < u64 > ,
2206- upstream_force_closed : bool , downstream_force_closed : bool
2206+ expected_extra_fees_msat : Option < u64 > , upstream_force_closed : bool ,
2207+ downstream_force_closed : bool
22072208) {
22082209 match event {
22092210 Event :: PaymentForwarded {
2210- fee_earned_msat , prev_channel_id, claim_from_onchain_tx, next_channel_id,
2211- outbound_amount_forwarded_msat : _
2211+ total_fee_earned_msat , prev_channel_id, claim_from_onchain_tx, next_channel_id,
2212+ outbound_amount_forwarded_msat : _, skimmed_fee_msat
22122213 } => {
2213- assert_eq ! ( fee_earned_msat, expected_fee) ;
2214+ assert_eq ! ( total_fee_earned_msat, expected_fee) ;
2215+
2216+ // Check that the (knowingly) withheld amount is always less or equal to the expected
2217+ // overpaid amount.
2218+ assert ! ( skimmed_fee_msat == expected_extra_fees_msat) ;
22142219 if !upstream_force_closed {
22152220 // Is the event prev_channel_id in one of the channels between the two nodes?
22162221 assert ! ( node. node( ) . list_channels( ) . iter( ) . any( |x| x. counterparty. node_id == prev_node. node( ) . get_our_node_id( ) && x. channel_id == prev_channel_id. unwrap( ) ) ) ;
@@ -2226,13 +2231,15 @@ pub fn expect_payment_forwarded<CM: AChannelManager, H: NodeHolder<CM=CM>>(
22262231 }
22272232}
22282233
2234+ #[ macro_export]
22292235macro_rules! expect_payment_forwarded {
22302236 ( $node: expr, $prev_node: expr, $next_node: expr, $expected_fee: expr, $upstream_force_closed: expr, $downstream_force_closed: expr) => {
22312237 let mut events = $node. node. get_and_clear_pending_events( ) ;
22322238 assert_eq!( events. len( ) , 1 ) ;
22332239 $crate:: ln:: functional_test_utils:: expect_payment_forwarded(
2234- events. pop( ) . unwrap( ) , & $node, & $prev_node, & $next_node, $expected_fee,
2235- $upstream_force_closed, $downstream_force_closed) ;
2240+ events. pop( ) . unwrap( ) , & $node, & $prev_node, & $next_node, $expected_fee, None ,
2241+ $upstream_force_closed, $downstream_force_closed
2242+ ) ;
22362243 }
22372244}
22382245
@@ -2552,24 +2559,54 @@ pub fn do_claim_payment_along_route<'a, 'b, 'c>(
25522559 origin_node : & Node < ' a , ' b , ' c > , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , skip_last : bool ,
25532560 our_payment_preimage : PaymentPreimage
25542561) -> u64 {
2555- let extra_fees = vec ! [ 0 ; expected_paths. len( ) ] ;
2556- do_claim_payment_along_route_with_extra_penultimate_hop_fees ( origin_node, expected_paths,
2557- & extra_fees[ ..] , skip_last, our_payment_preimage)
2558- }
2559-
2560- pub fn do_claim_payment_along_route_with_extra_penultimate_hop_fees < ' a , ' b , ' c > (
2561- origin_node : & Node < ' a , ' b , ' c > , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , expected_extra_fees :
2562- & [ u32 ] , skip_last : bool , our_payment_preimage : PaymentPreimage
2563- ) -> u64 {
2564- assert_eq ! ( expected_paths. len( ) , expected_extra_fees. len( ) ) ;
25652562 for path in expected_paths. iter ( ) {
25662563 assert_eq ! ( path. last( ) . unwrap( ) . node. get_our_node_id( ) , expected_paths[ 0 ] . last( ) . unwrap( ) . node. get_our_node_id( ) ) ;
25672564 }
25682565 expected_paths[ 0 ] . last ( ) . unwrap ( ) . node . claim_funds ( our_payment_preimage) ;
2569- pass_claimed_payment_along_route ( origin_node, expected_paths, expected_extra_fees, skip_last, our_payment_preimage)
2566+ pass_claimed_payment_along_route (
2567+ ClaimAlongRouteArgs :: new ( origin_node, expected_paths, our_payment_preimage)
2568+ . skip_last ( skip_last)
2569+ )
2570+ }
2571+
2572+ pub struct ClaimAlongRouteArgs < ' a , ' b , ' c , ' d > {
2573+ pub origin_node : & ' a Node < ' b , ' c , ' d > ,
2574+ pub expected_paths : & ' a [ & ' a [ & ' a Node < ' b , ' c , ' d > ] ] ,
2575+ pub expected_extra_fees : Vec < u32 > ,
2576+ pub expected_min_htlc_overpay : Vec < u32 > ,
2577+ pub skip_last : bool ,
2578+ pub payment_preimage : PaymentPreimage ,
25702579}
25712580
2572- pub fn pass_claimed_payment_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , expected_extra_fees : & [ u32 ] , skip_last : bool , our_payment_preimage : PaymentPreimage ) -> u64 {
2581+ impl < ' a , ' b , ' c , ' d > ClaimAlongRouteArgs < ' a , ' b , ' c , ' d > {
2582+ pub fn new (
2583+ origin_node : & ' a Node < ' b , ' c , ' d > , expected_paths : & ' a [ & ' a [ & ' a Node < ' b , ' c , ' d > ] ] ,
2584+ payment_preimage : PaymentPreimage ,
2585+ ) -> Self {
2586+ Self {
2587+ origin_node, expected_paths, expected_extra_fees : vec ! [ 0 ; expected_paths. len( ) ] ,
2588+ expected_min_htlc_overpay : vec ! [ 0 ; expected_paths. len( ) ] , skip_last : false , payment_preimage,
2589+ }
2590+ }
2591+ pub fn skip_last ( mut self , skip_last : bool ) -> Self {
2592+ self . skip_last = skip_last;
2593+ self
2594+ }
2595+ pub fn with_expected_extra_fees ( mut self , extra_fees : Vec < u32 > ) -> Self {
2596+ self . expected_extra_fees = extra_fees;
2597+ self
2598+ }
2599+ pub fn with_expected_min_htlc_overpay ( mut self , extra_fees : Vec < u32 > ) -> Self {
2600+ self . expected_min_htlc_overpay = extra_fees;
2601+ self
2602+ }
2603+ }
2604+
2605+ pub fn pass_claimed_payment_along_route < ' a , ' b , ' c , ' d > ( args : ClaimAlongRouteArgs ) -> u64 {
2606+ let ClaimAlongRouteArgs {
2607+ origin_node, expected_paths, expected_extra_fees, expected_min_htlc_overpay, skip_last,
2608+ payment_preimage : our_payment_preimage
2609+ } = args;
25732610 let claim_event = expected_paths[ 0 ] . last ( ) . unwrap ( ) . node . get_and_clear_pending_events ( ) ;
25742611 assert_eq ! ( claim_event. len( ) , 1 ) ;
25752612 match claim_event[ 0 ] {
@@ -2666,8 +2703,17 @@ pub fn pass_claimed_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, '
26662703 channel. context( ) . config( ) . forwarding_fee_base_msat
26672704 }
26682705 } ;
2669- if $idx == 1 { fee += expected_extra_fees[ i] ; }
2670- expect_payment_forwarded!( * $node, $next_node, $prev_node, Some ( fee as u64 ) , false , false ) ;
2706+
2707+ let mut expected_extra_fee = None ;
2708+ if $idx == 1 {
2709+ fee += expected_extra_fees[ i] ;
2710+ fee += expected_min_htlc_overpay[ i] ;
2711+ expected_extra_fee = if expected_extra_fees[ i] > 0 { Some ( expected_extra_fees[ i] as u64 ) } else { None } ;
2712+ }
2713+ let mut events = $node. node. get_and_clear_pending_events( ) ;
2714+ assert_eq!( events. len( ) , 1 ) ;
2715+ expect_payment_forwarded( events. pop( ) . unwrap( ) , * $node, $next_node, $prev_node,
2716+ Some ( fee as u64 ) , expected_extra_fee, false , false ) ;
26712717 expected_total_fee_msat += fee as u64 ;
26722718 check_added_monitors!( $node, 1 ) ;
26732719 let new_next_msgs = if $new_msgs {
0 commit comments