@@ -290,8 +290,10 @@ fn do_forward_checks_failure(check: ForwardCheckFail, intro_fails: bool) {
290290 // We need the session priv to construct a bogus onion packet later.
291291 * nodes[ 0 ] . keys_manager . override_random_bytes . lock ( ) . unwrap ( ) = Some ( [ 3 ; 32 ] ) ;
292292 create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
293- let chan_upd_1_2 = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) . 0 . contents ;
294- let chan_upd_2_3 = create_announced_chan_between_nodes_with_value ( & nodes, 2 , 3 , 1_000_000 , 0 ) . 0 . contents ;
293+ let chan_1_2 = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) ;
294+ let chan_upd_1_2 = chan_1_2. 0 . contents ;
295+ let chan_2_3 = create_announced_chan_between_nodes_with_value ( & nodes, 2 , 3 , 1_000_000 , 0 ) ;
296+ let chan_upd_2_3 = chan_2_3. 0 . contents ;
295297
296298 let amt_msat = 5000 ;
297299 let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 3 ] , Some ( amt_msat) , None ) ;
@@ -345,18 +347,27 @@ fn do_forward_checks_failure(check: ForwardCheckFail, intro_fails: bool) {
345347 check_added_monitors ! ( nodes[ 1 ] , 0 ) ;
346348 do_commitment_signed_dance ( & nodes[ 1 ] , & nodes[ 0 ] , & updates_0_1. commitment_signed , true , true ) ;
347349
350+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
351+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
352+
348353 if intro_fails {
349354 let mut updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
350355 nodes[ 0 ] . node . handle_update_fail_htlc ( nodes[ 1 ] . node . get_our_node_id ( ) , & updates. update_fail_htlcs [ 0 ] ) ;
351356 do_commitment_signed_dance ( & nodes[ 0 ] , & nodes[ 1 ] , & updates. commitment_signed , false , false ) ;
357+ let failed_destination = match check {
358+ ForwardCheckFail :: InboundOnionCheck => HTLCDestination :: InvalidOnion ,
359+ ForwardCheckFail :: ForwardPayloadEncodedAsReceive => HTLCDestination :: FailedPayment { payment_hash } ,
360+ ForwardCheckFail :: OutboundChannelCheck =>
361+ HTLCDestination :: NextHopChannel { node_id : Some ( nodes[ 2 ] . node . get_our_node_id ( ) ) , channel_id : chan_1_2. 2 } ,
362+ } ;
363+ expect_htlc_handling_failed_destinations ! (
364+ nodes[ 1 ] . node. get_and_clear_pending_events( ) , & [ failed_destination. clone( ) ]
365+ ) ;
352366 expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false ,
353367 PaymentFailedConditions :: new ( ) . expected_htlc_error_data ( INVALID_ONION_BLINDING , & [ 0 ; 32 ] ) ) ;
354368 return
355369 }
356370
357- expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
358- check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
359-
360371 let mut updates_1_2 = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 2 ] . node. get_our_node_id( ) ) ;
361372 let mut update_add = & mut updates_1_2. update_add_htlcs [ 0 ] ;
362373
@@ -366,6 +377,17 @@ fn do_forward_checks_failure(check: ForwardCheckFail, intro_fails: bool) {
366377 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
367378 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & updates_1_2. commitment_signed , true , true ) ;
368379
380+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
381+ let failed_destination = match check {
382+ ForwardCheckFail :: InboundOnionCheck |ForwardCheckFail :: ForwardPayloadEncodedAsReceive => HTLCDestination :: InvalidOnion ,
383+ ForwardCheckFail :: OutboundChannelCheck =>
384+ HTLCDestination :: NextHopChannel { node_id : Some ( nodes[ 3 ] . node . get_our_node_id ( ) ) , channel_id : chan_2_3. 2 } ,
385+ } ;
386+ expect_htlc_handling_failed_destinations ! (
387+ nodes[ 2 ] . node. get_and_clear_pending_events( ) , & [ failed_destination. clone( ) ]
388+ ) ;
389+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
390+
369391 let mut updates = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
370392 let update_malformed = & mut updates. update_fail_malformed_htlcs [ 0 ] ;
371393 assert_eq ! ( update_malformed. failure_code, INVALID_ONION_BLINDING ) ;
@@ -425,7 +447,10 @@ fn failed_backwards_to_intro_node() {
425447 nodes[ 2 ] . node . handle_update_add_htlc ( nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
426448 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
427449 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event. commitment_msg , true , true ) ;
428- nodes[ 2 ] . node . process_pending_htlc_forwards ( ) ;
450+
451+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
452+ expect_htlc_handling_failed_destinations ! ( nodes[ 2 ] . node. get_and_clear_pending_events( ) , & [ HTLCDestination :: InvalidOnion ] ) ;
453+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
429454
430455 let mut updates = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
431456 let mut update_malformed = & mut updates. update_fail_malformed_htlcs [ 0 ] ;
@@ -502,7 +527,7 @@ fn do_forward_fail_in_process_pending_htlc_fwds(check: ProcessPendingHTLCsCheck,
502527 // intro node will error backwards.
503528 $curr_node. node. peer_disconnected( $next_node. node. get_our_node_id( ) ) ;
504529 expect_pending_htlcs_forwardable!( $curr_node) ;
505- expect_pending_htlcs_forwardable_and_htlc_handling_failed_ignore !( $curr_node,
530+ expect_htlc_handling_failed_destinations !( $curr_node. node . get_and_clear_pending_events ( ) ,
506531 vec![ HTLCDestination :: NextHopChannel { node_id: Some ( $next_node. node. get_our_node_id( ) ) , channel_id: $failed_chan_id } ] ) ;
507532 } ,
508533 ProcessPendingHTLCsCheck :: FwdChannelClosed => {
@@ -518,12 +543,12 @@ fn do_forward_fail_in_process_pending_htlc_fwds(check: ProcessPendingHTLCsCheck,
518543 crate :: events:: Event :: ChannelClosed { .. } => { } ,
519544 _ => panic!( "Unexpected event {:?}" , events) ,
520545 }
546+ check_closed_broadcast( & $curr_node, 1 , true ) ;
547+ check_added_monitors!( $curr_node, 1 ) ;
521548
522549 $curr_node. node. process_pending_htlc_forwards( ) ;
523- expect_pending_htlcs_forwardable_and_htlc_handling_failed_ignore !( $curr_node,
550+ expect_htlc_handling_failed_destinations !( $curr_node. node . get_and_clear_pending_events ( ) ,
524551 vec![ HTLCDestination :: UnknownNextHop { requested_forward_scid: $failed_scid } ] ) ;
525- check_closed_broadcast( & $curr_node, 1 , true ) ;
526- check_added_monitors!( $curr_node, 1 ) ;
527552 $curr_node. node. process_pending_htlc_forwards( ) ;
528553 } ,
529554 }
@@ -609,6 +634,7 @@ fn do_blinded_intercept_payment(intercept_node_fails: bool) {
609634 } ;
610635 nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
611636 commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , & payment_event. commitment_msg, false , true ) ;
637+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
612638
613639 let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
614640 assert_eq ! ( events. len( ) , 1 ) ;
@@ -914,13 +940,19 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
914940 nodes[ 2 ] . node . handle_update_add_htlc ( nodes[ 1 ] . node . get_our_node_id ( ) , update_add) ;
915941 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
916942 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
943+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
944+ expect_htlc_handling_failed_destinations ! ( nodes[ 2 ] . node. get_and_clear_pending_events( ) , & [ HTLCDestination :: InvalidOnion ] ) ;
945+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
917946 } ,
918947 ReceiveCheckFail :: ReceiveRequirements => {
919948 let update_add = & mut payment_event_1_2. msgs [ 0 ] ;
920949 update_add. amount_msat -= 1 ;
921950 nodes[ 2 ] . node . handle_update_add_htlc ( nodes[ 1 ] . node . get_our_node_id ( ) , update_add) ;
922951 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
923952 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
953+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
954+ expect_htlc_handling_failed_destinations ! ( nodes[ 2 ] . node. get_and_clear_pending_events( ) , & [ HTLCDestination :: FailedPayment { payment_hash } ] ) ;
955+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
924956 } ,
925957 ReceiveCheckFail :: ChannelCheck => {
926958 nodes[ 2 ] . node . close_channel ( & chan_id_1_2, & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
@@ -934,6 +966,9 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
934966
935967 nodes[ 2 ] . node . handle_shutdown ( nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_shutdown) ;
936968 commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , ( ) , false , true , false , false ) ;
969+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
970+ expect_htlc_handling_failed_destinations ! ( nodes[ 2 ] . node. get_and_clear_pending_events( ) , & [ HTLCDestination :: FailedPayment { payment_hash } ] ) ;
971+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
937972 } ,
938973 ReceiveCheckFail :: ProcessPendingHTLCsCheck => {
939974 assert_eq ! ( payment_event_1_2. msgs[ 0 ] . cltv_expiry, nodes[ 0 ] . best_block_info( ) . 1 + 1 + excess_final_cltv_delta_opt. unwrap( ) as u32 + TEST_FINAL_CLTV ) ;
@@ -949,6 +984,9 @@ fn do_multi_hop_receiver_fail(check: ReceiveCheckFail) {
949984 nodes[ 2 ] . node . handle_update_add_htlc ( nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event_1_2. msgs [ 0 ] ) ;
950985 check_added_monitors ! ( nodes[ 2 ] , 0 ) ;
951986 do_commitment_signed_dance ( & nodes[ 2 ] , & nodes[ 1 ] , & payment_event_1_2. commitment_msg , true , true ) ;
987+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
988+ expect_htlc_handling_failed_destinations ! ( nodes[ 2 ] . node. get_and_clear_pending_events( ) , & [ HTLCDestination :: FailedPayment { payment_hash } ] ) ;
989+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
952990 }
953991 }
954992
@@ -1149,6 +1187,12 @@ fn min_htlc() {
11491187 nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event_0_1. msgs [ 0 ] ) ;
11501188 check_added_monitors ! ( nodes[ 1 ] , 0 ) ;
11511189 do_commitment_signed_dance ( & nodes[ 1 ] , & nodes[ 0 ] , & payment_event_0_1. commitment_msg , true , true ) ;
1190+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
1191+ expect_htlc_handling_failed_destinations ! (
1192+ nodes[ 1 ] . node. get_and_clear_pending_events( ) ,
1193+ & [ HTLCDestination :: NextHopChannel { node_id: Some ( nodes[ 2 ] . node. get_our_node_id( ) ) , channel_id: chan_1_2. 2 } ]
1194+ ) ;
1195+ check_added_monitors ( & nodes[ 1 ] , 1 ) ;
11521196 let mut updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
11531197 nodes[ 0 ] . node . handle_update_fail_htlc ( nodes[ 1 ] . node . get_our_node_id ( ) , & updates. update_fail_htlcs [ 0 ] ) ;
11541198 do_commitment_signed_dance ( & nodes[ 0 ] , & nodes[ 1 ] , & updates. commitment_signed , false , false ) ;
0 commit comments