@@ -1388,9 +1388,15 @@ fn abandoned_send_payment_idempotent() {
13881388}
13891389
13901390#[ test]
1391- fn forward_intercepted_payment ( ) {
1391+ fn intercepted_payment ( ) {
13921392 // Test that detecting an intercept scid on payment forward will signal LDK to generate an
1393- // intercept event, which the LSP can then use to open a JIT channel to forward the payment.
1393+ // intercept event, which the LSP can then use to either (a) open a JIT channel to forward the
1394+ // payment or (b) fail the payment.
1395+ do_test_intercepted_payment ( false ) ;
1396+ do_test_intercepted_payment ( true ) ;
1397+ }
1398+
1399+ fn do_test_intercepted_payment ( fail_intercept : bool ) {
13941400 let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
13951401 let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
13961402 let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
@@ -1461,49 +1467,69 @@ fn forward_intercepted_payment() {
14611467 let unknown_scid_err = nodes[ 1 ] . node . forward_intercepted_htlc ( intercept_id, 4242 , nodes[ 2 ] . node . get_our_node_id ( ) , expected_outbound_amount_msat) . unwrap_err ( ) ;
14621468 assert_eq ! ( unknown_scid_err, APIError :: APIMisuseError { err: "Channel with short channel id 4242 not found" . to_string( ) } ) ;
14631469
1464- // Open the just-in-time channel so the payment can then be forwarded.
1465- let scid = create_announced_chan_between_nodes ( & nodes, 1 , 2 , channelmanager:: provided_init_features ( ) , channelmanager:: provided_init_features ( ) ) . 0 . contents . short_channel_id ;
1466-
1467- // Check for unknown intercept id error.
1468- let unknown_intercept_id = InterceptId ( [ 42 ; 32 ] ) ;
1469- let unknown_intercept_id_err = nodes[ 1 ] . node . forward_intercepted_htlc ( unknown_intercept_id, scid, nodes[ 2 ] . node . get_our_node_id ( ) , expected_outbound_amount_msat) . unwrap_err ( ) ;
1470- assert_eq ! ( unknown_intercept_id_err , APIError :: APIMisuseError { err: format!( "Payment with intercept id {:?} not found" , unknown_intercept_id. 0 ) } ) ;
1471-
1472- // Finally, forward the intercepted payment through and claim it.
1473- nodes[ 1 ] . node . forward_intercepted_htlc ( intercept_id, scid, nodes[ 2 ] . node . get_our_node_id ( ) , expected_outbound_amount_msat) . unwrap ( ) ;
1474- expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
1475-
1476- let payment_event = {
1477- {
1478- let mut added_monitors = nodes[ 1 ] . chain_monitor . added_monitors . lock ( ) . unwrap ( ) ;
1479- assert_eq ! ( added_monitors. len( ) , 1 ) ;
1480- added_monitors. clear ( ) ;
1470+ if fail_intercept {
1471+ // Ensure we can fail the intercepted payment back.
1472+ nodes[ 1 ] . node . fail_intercepted_htlc ( intercept_id) . unwrap ( ) ;
1473+ expect_pending_htlcs_forwardable_and_htlc_handling_failed_ignore ! ( nodes[ 1 ] , vec![ HTLCDestination :: UnknownNextHop { requested_forward_scid: intercept_scid } ] ) ;
1474+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
1475+ let update_fail = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1476+ check_added_monitors ! ( & nodes[ 1 ] , 1 ) ;
1477+ assert ! ( update_fail. update_fail_htlcs. len( ) == 1 ) ;
1478+ let fail_msg = update_fail. update_fail_htlcs [ 0 ] . clone ( ) ;
1479+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & fail_msg) ;
1480+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , update_fail. commitment_signed, false ) ;
1481+
1482+ // Ensure the payment fails with the expected error.
1483+ let mut fail_conditions = PaymentFailedConditions :: new ( )
1484+ . blamed_scid ( intercept_scid)
1485+ . blamed_chan_closed ( true )
1486+ . expected_htlc_error_data ( 0x4000 | 10 , & [ ] ) ;
1487+ expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , fail_conditions) ;
1488+ } else {
1489+ // Open the just-in-time channel so the payment can then be forwarded.
1490+ let scid = create_announced_chan_between_nodes ( & nodes, 1 , 2 , channelmanager:: provided_init_features ( ) , channelmanager:: provided_init_features ( ) ) . 0 . contents . short_channel_id ;
1491+
1492+ // Check for unknown intercept id error.
1493+ let unknown_intercept_id = InterceptId ( [ 42 ; 32 ] ) ;
1494+ let unknown_intercept_id_err = nodes[ 1 ] . node . forward_intercepted_htlc ( unknown_intercept_id, scid, nodes[ 2 ] . node . get_our_node_id ( ) , expected_outbound_amount_msat) . unwrap_err ( ) ;
1495+ assert_eq ! ( unknown_intercept_id_err , APIError :: APIMisuseError { err: format!( "Payment with intercept id {:?} not found" , unknown_intercept_id. 0 ) } ) ;
1496+
1497+ // Finally, forward the intercepted payment through and claim it.
1498+ nodes[ 1 ] . node . forward_intercepted_htlc ( intercept_id, scid, nodes[ 2 ] . node . get_our_node_id ( ) , expected_outbound_amount_msat) . unwrap ( ) ;
1499+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
1500+
1501+ let payment_event = {
1502+ {
1503+ let mut added_monitors = nodes[ 1 ] . chain_monitor . added_monitors . lock ( ) . unwrap ( ) ;
1504+ assert_eq ! ( added_monitors. len( ) , 1 ) ;
1505+ added_monitors. clear ( ) ;
1506+ }
1507+ let mut events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
1508+ assert_eq ! ( events. len( ) , 1 ) ;
1509+ SendEvent :: from_event ( events. remove ( 0 ) )
1510+ } ;
1511+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
1512+ commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , & payment_event. commitment_msg, false , true ) ;
1513+ expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
1514+
1515+ let payment_preimage = nodes[ 2 ] . node . get_payment_preimage ( payment_hash, payment_secret) . unwrap ( ) ;
1516+ expect_payment_received ! ( & nodes[ 2 ] , payment_hash, payment_secret, amt_msat, Some ( payment_preimage) ) ;
1517+ do_claim_payment_along_route ( & nodes[ 0 ] , & vec ! ( & vec!( & nodes[ 1 ] , & nodes[ 2 ] ) [ ..] ) , false , payment_preimage) ;
1518+ let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
1519+ assert_eq ! ( events. len( ) , 2 ) ;
1520+ match events[ 0 ] {
1521+ Event :: PaymentSent { payment_preimage : ref ev_preimage, payment_hash : ref ev_hash, ref fee_paid_msat, .. } => {
1522+ assert_eq ! ( payment_preimage, * ev_preimage) ;
1523+ assert_eq ! ( payment_hash, * ev_hash) ;
1524+ assert_eq ! ( fee_paid_msat, & Some ( 1000 ) ) ;
1525+ } ,
1526+ _ => panic ! ( "Unexpected event" )
1527+ }
1528+ match events[ 1 ] {
1529+ Event :: PaymentPathSuccessful { payment_hash : hash, .. } => {
1530+ assert_eq ! ( hash, Some ( payment_hash) ) ;
1531+ } ,
1532+ _ => panic ! ( "Unexpected event" )
14811533 }
1482- let mut events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
1483- assert_eq ! ( events. len( ) , 1 ) ;
1484- SendEvent :: from_event ( events. remove ( 0 ) )
1485- } ;
1486- nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
1487- commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 1 ] , & payment_event. commitment_msg, false , true ) ;
1488- expect_pending_htlcs_forwardable ! ( nodes[ 2 ] ) ;
1489-
1490- let payment_preimage = nodes[ 2 ] . node . get_payment_preimage ( payment_hash, payment_secret) . unwrap ( ) ;
1491- expect_payment_received ! ( & nodes[ 2 ] , payment_hash, payment_secret, amt_msat, Some ( payment_preimage) ) ;
1492- do_claim_payment_along_route ( & nodes[ 0 ] , & vec ! ( & vec!( & nodes[ 1 ] , & nodes[ 2 ] ) [ ..] ) , false , payment_preimage) ;
1493- let events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
1494- assert_eq ! ( events. len( ) , 2 ) ;
1495- match events[ 0 ] {
1496- Event :: PaymentSent { payment_preimage : ref ev_preimage, payment_hash : ref ev_hash, ref fee_paid_msat, .. } => {
1497- assert_eq ! ( payment_preimage, * ev_preimage) ;
1498- assert_eq ! ( payment_hash, * ev_hash) ;
1499- assert_eq ! ( fee_paid_msat, & Some ( 1000 ) ) ;
1500- } ,
1501- _ => panic ! ( "Unexpected event" )
1502- }
1503- match events[ 1 ] {
1504- Event :: PaymentPathSuccessful { payment_hash : hash, .. } => {
1505- assert_eq ! ( hash, Some ( payment_hash) ) ;
1506- } ,
1507- _ => panic ! ( "Unexpected event" )
15081534 }
15091535}
0 commit comments