@@ -15,7 +15,7 @@ use crate::chain::channelmonitor::{CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCK
15
15
use crate :: chain:: keysinterface:: { EntropySource , NodeSigner , Recipient } ;
16
16
use crate :: ln:: { PaymentHash , PaymentSecret } ;
17
17
use 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 } ;
19
19
use crate :: ln:: onion_utils;
20
20
use crate :: routing:: gossip:: { NetworkUpdate , RoutingFees } ;
21
21
use crate :: routing:: router:: { get_route, PaymentParameters , Route , RouteHint , RouteHintHop } ;
@@ -831,6 +831,81 @@ fn test_always_create_tlv_format_onion_payloads() {
831
831
}
832
832
}
833
833
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
+ let ( _, node_1_chan_update, _, _) = 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 :: ExpiryTooSoon => {
881
+ let mut channel_update_data = Vec :: new ( ) ;
882
+ ( node_1_chan_update. serialized_length ( ) as u16 + 2 ) . write ( & mut channel_update_data) . unwrap ( ) ;
883
+ msgs:: ChannelUpdate :: TYPE . write ( & mut channel_update_data) . unwrap ( ) ;
884
+ node_1_chan_update. write ( & mut channel_update_data) . unwrap ( ) ;
885
+ channel_update_data
886
+ } ,
887
+ FailureCode :: IncorrectOrUnknownPaymentDetails => {
888
+ let mut htlc_msat_height_data = ( payment_amount as u64 ) . to_be_bytes ( ) . to_vec ( ) ;
889
+ htlc_msat_height_data. extend_from_slice ( & CHAN_CONFIRM_DEPTH . to_be_bytes ( ) ) ;
890
+ htlc_msat_height_data
891
+ }
892
+ } ;
893
+
894
+ let failure_code = failure_code as u16 ;
895
+ let permanent_flag = 0x4000 ;
896
+ let permanent_fail = ( failure_code & permanent_flag) != 0 ;
897
+ expect_payment_failed ! ( nodes[ 0 ] , payment_hash, permanent_fail, failure_code, failure_data) ;
898
+
899
+ }
900
+
901
+ #[ test]
902
+ fn test_fail_htlc_backwards_with_reason ( ) {
903
+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: TemporaryNodeFailure ) ;
904
+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: RequiredNodeFeatureMissing ) ;
905
+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: ExpiryTooSoon ) ;
906
+ do_test_fail_htlc_backwards_with_reason ( FailureCode :: IncorrectOrUnknownPaymentDetails ) ;
907
+ }
908
+
834
909
macro_rules! get_phantom_route {
835
910
( $nodes: expr, $amt: expr, $channel: expr) => { {
836
911
let phantom_pubkey = $nodes[ 1 ] . keys_manager. get_node_id( Recipient :: PhantomNode ) . unwrap( ) ;
0 commit comments