@@ -15,7 +15,7 @@ use crate::chain::channelmonitor::{CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCK
1515use crate :: chain:: keysinterface:: { EntropySource , NodeSigner , Recipient } ;
1616use crate :: ln:: { PaymentHash , PaymentSecret } ;
1717use crate :: ln:: channel:: EXPIRE_PREV_CONFIG_TICKS ;
18- use crate :: ln:: channelmanager:: { HTLCForwardInfo , CLTV_FAR_FAR_AWAY , MIN_CLTV_EXPIRY_DELTA , PendingAddHTLCInfo , PendingHTLCInfo , PendingHTLCRouting , PaymentId } ;
18+ use crate :: ln:: channelmanager:: { HTLCForwardInfo , FailureCode , CLTV_FAR_FAR_AWAY , MIN_CLTV_EXPIRY_DELTA , PendingAddHTLCInfo , PendingHTLCInfo , PendingHTLCRouting , PaymentId } ;
1919use crate :: ln:: onion_utils;
2020use crate :: routing:: gossip:: { NetworkUpdate , RoutingFees } ;
2121use crate :: routing:: router:: { get_route, PaymentParameters , Route , RouteHint , RouteHintHop } ;
@@ -831,6 +831,73 @@ fn test_always_create_tlv_format_onion_payloads() {
831831 }
832832}
833833
834+ fn do_test_fail_htlc_backwards_with_reason ( failure_code : FailureCode ) {
835+
836+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
837+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
838+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
839+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
840+
841+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
842+
843+ let payment_amount = 100_000 ;
844+ let ( route, payment_hash, _, payment_secret) = get_route_and_payment_hash ! ( nodes[ 0 ] , nodes[ 1 ] , payment_amount) ;
845+ nodes[ 0 ] . node . send_payment ( & route, payment_hash, & Some ( payment_secret) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
846+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
847+
848+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
849+ let mut payment_event = SendEvent :: from_event ( events. pop ( ) . unwrap ( ) ) ;
850+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
851+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , payment_event. commitment_msg, false ) ;
852+
853+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
854+ expect_payment_claimable ! ( nodes[ 1 ] , payment_hash, payment_secret, payment_amount) ;
855+ nodes[ 1 ] . node . fail_htlc_backwards_with_reason ( & payment_hash, & failure_code) ;
856+
857+ expect_pending_htlcs_forwardable_and_htlc_handling_failed ! ( nodes[ 1 ] , vec![ HTLCDestination :: FailedPayment { payment_hash: payment_hash } ] ) ;
858+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
859+
860+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
861+ assert_eq ! ( events. len( ) , 1 ) ;
862+ let ( update_fail_htlc, commitment_signed) = match events[ 0 ] {
863+ MessageSendEvent :: UpdateHTLCs { node_id : _ , updates : msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
864+ assert ! ( update_add_htlcs. is_empty( ) ) ;
865+ assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
866+ assert_eq ! ( update_fail_htlcs. len( ) , 1 ) ;
867+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
868+ assert ! ( update_fee. is_none( ) ) ;
869+ ( update_fail_htlcs[ 0 ] . clone ( ) , commitment_signed)
870+ } ,
871+ _ => panic ! ( "Unexpected event" ) ,
872+ } ;
873+
874+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & update_fail_htlc) ;
875+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , commitment_signed, false , true ) ;
876+
877+ let failure_data = match failure_code {
878+ FailureCode :: TemporaryNodeFailure => vec ! [ ] ,
879+ FailureCode :: RequiredNodeFeatureMissing => vec ! [ ] ,
880+ FailureCode :: IncorrectOrUnknownPaymentDetails => {
881+ let mut htlc_msat_height_data = ( payment_amount as u64 ) . to_be_bytes ( ) . to_vec ( ) ;
882+ htlc_msat_height_data. extend_from_slice ( & CHAN_CONFIRM_DEPTH . to_be_bytes ( ) ) ;
883+ htlc_msat_height_data
884+ }
885+ } ;
886+
887+ let failure_code = failure_code as u16 ;
888+ let permanent_flag = 0x4000 ;
889+ let permanent_fail = ( failure_code & permanent_flag) != 0 ;
890+ expect_payment_failed ! ( nodes[ 0 ] , payment_hash, permanent_fail, failure_code, failure_data) ;
891+
892+ }
893+
894+ #[ test]
895+ fn test_fail_htlc_backwards_with_reason ( ) {
896+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: TemporaryNodeFailure ) ;
897+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: RequiredNodeFeatureMissing ) ;
898+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: IncorrectOrUnknownPaymentDetails ) ;
899+ }
900+
834901macro_rules! get_phantom_route {
835902 ( $nodes: expr, $amt: expr, $channel: expr) => { {
836903 let phantom_pubkey = $nodes[ 1 ] . keys_manager. get_node_id( Recipient :: PhantomNode ) . unwrap( ) ;
0 commit comments