@@ -2698,18 +2698,18 @@ fn do_test_unblinded_trampoline_forward(failure_scenario: Option<TrampolineForwa
2698
2698
expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , payment_failed_conditions) ;
2699
2699
}
2700
2700
}
2701
- Some ( TrampolineForwardFailureScenario :: InvalidRecipientOnion ) => {
2702
- let route_alice_t0 : & [ & Node ] = & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes [ 4 ] ] ;
2703
- pass_along_path ( & nodes[ 0 ] , route_alice_t0 , amt_msat, payment_hash. clone ( ) ,
2701
+ Some ( TrampolineForwardFailureScenario :: InvalidInterTrampolineOnion ) => {
2702
+ let route_alice_carol : & [ & Node ] = & [ & nodes[ 1 ] , & nodes[ 2 ] ] ;
2703
+ pass_along_path ( & nodes[ 0 ] , route_alice_carol , amt_msat, payment_hash. clone ( ) ,
2704
2704
None , first_message_event. clone ( ) , false , Some ( payment_preimage) ) ;
2705
2705
2706
- check_added_monitors ! ( & nodes[ 4 ] , 1 ) ;
2707
- let mut events = nodes[ 4 ] . node . get_and_clear_pending_msg_events ( ) ;
2706
+ check_added_monitors ! ( & nodes[ 2 ] , 1 ) ;
2707
+ let mut events = nodes[ 2 ] . node . get_and_clear_pending_msg_events ( ) ;
2708
2708
assert_eq ! ( events. len( ) , 1 ) ;
2709
2709
2710
- let mut update_message_t0_dave = remove_first_msg_event_to_node ( & nodes[ 3 ] . node . get_our_node_id ( ) , & mut events) ;
2710
+ let mut update_message_carol_t0 = remove_first_msg_event_to_node ( & nodes[ 4 ] . node . get_our_node_id ( ) , & mut events) ;
2711
2711
{
2712
- let mut update_message = match update_message_t0_dave {
2712
+ let mut update_message = match update_message_carol_t0 {
2713
2713
MessageSendEvent :: UpdateHTLCs { ref mut updates, .. } => {
2714
2714
assert_eq ! ( updates. update_add_htlcs. len( ) , 1 ) ;
2715
2715
updates. update_add_htlcs . get_mut ( 0 )
@@ -2722,25 +2722,16 @@ fn do_test_unblinded_trampoline_forward(failure_scenario: Option<TrampolineForwa
2722
2722
} ) ;
2723
2723
}
2724
2724
2725
- let route_to_dave : & [ & Node ] = & [ & nodes[ 3 ] ] ;
2726
- let args = PassAlongPathArgs :: new ( & nodes[ 4 ] , route_to_dave , amt_msat, payment_hash, update_message_t0_dave . clone ( ) ) . expect_failure ( HTLCDestination :: InvalidOnion ) ;
2725
+ let route_carol_t0 : & [ & Node ] = & [ & nodes[ 4 ] ] ;
2726
+ let args = PassAlongPathArgs :: new ( & nodes[ 2 ] , route_carol_t0 , amt_msat, payment_hash, update_message_carol_t0 . clone ( ) ) . expect_failure ( HTLCDestination :: InvalidOnion ) ;
2727
2727
do_pass_along_path ( args) ;
2728
2728
2729
- {
2730
- let downstream_id = 3 ;
2731
- let upstream_id = 4 ;
2732
- let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
2733
- nodes[ upstream_id] . node . handle_update_fail_malformed_htlc (
2734
- nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_malformed_htlcs [ 0 ]
2735
- ) ;
2736
- do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
2737
- }
2738
2729
{
2739
2730
let downstream_id = 4 ;
2740
2731
let upstream_id = 2 ;
2741
2732
let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
2742
- nodes[ upstream_id] . node . handle_update_fail_htlc (
2743
- nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
2733
+ nodes[ upstream_id] . node . handle_update_fail_malformed_htlc (
2734
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_malformed_htlcs [ 0 ]
2744
2735
) ;
2745
2736
do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
2746
2737
}
@@ -2768,18 +2759,18 @@ fn do_test_unblinded_trampoline_forward(failure_scenario: Option<TrampolineForwa
2768
2759
expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , payment_failed_conditions) ;
2769
2760
}
2770
2761
}
2771
- Some ( TrampolineForwardFailureScenario :: InvalidInterTrampolineOnion ) => {
2772
- let route_alice_carol : & [ & Node ] = & [ & nodes[ 1 ] , & nodes[ 2 ] ] ;
2773
- pass_along_path ( & nodes[ 0 ] , route_alice_carol , amt_msat, payment_hash. clone ( ) ,
2762
+ Some ( TrampolineForwardFailureScenario :: InvalidRecipientOnion ) => {
2763
+ let route_alice_t0 : & [ & Node ] = & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes [ 4 ] ] ;
2764
+ pass_along_path ( & nodes[ 0 ] , route_alice_t0 , amt_msat, payment_hash. clone ( ) ,
2774
2765
None , first_message_event. clone ( ) , false , Some ( payment_preimage) ) ;
2775
2766
2776
- check_added_monitors ! ( & nodes[ 2 ] , 1 ) ;
2777
- let mut events = nodes[ 2 ] . node . get_and_clear_pending_msg_events ( ) ;
2767
+ check_added_monitors ! ( & nodes[ 4 ] , 1 ) ;
2768
+ let mut events = nodes[ 4 ] . node . get_and_clear_pending_msg_events ( ) ;
2778
2769
assert_eq ! ( events. len( ) , 1 ) ;
2779
2770
2780
- let mut update_message_carol_t0 = remove_first_msg_event_to_node ( & nodes[ 4 ] . node . get_our_node_id ( ) , & mut events) ;
2771
+ let mut update_message_t0_dave = remove_first_msg_event_to_node ( & nodes[ 3 ] . node . get_our_node_id ( ) , & mut events) ;
2781
2772
{
2782
- let mut update_message = match update_message_carol_t0 {
2773
+ let mut update_message = match update_message_t0_dave {
2783
2774
MessageSendEvent :: UpdateHTLCs { ref mut updates, .. } => {
2784
2775
assert_eq ! ( updates. update_add_htlcs. len( ) , 1 ) ;
2785
2776
updates. update_add_htlcs . get_mut ( 0 )
@@ -2792,19 +2783,28 @@ fn do_test_unblinded_trampoline_forward(failure_scenario: Option<TrampolineForwa
2792
2783
} ) ;
2793
2784
}
2794
2785
2795
- let route_carol_t0 : & [ & Node ] = & [ & nodes[ 4 ] ] ;
2796
- let args = PassAlongPathArgs :: new ( & nodes[ 2 ] , route_carol_t0 , amt_msat, payment_hash, update_message_carol_t0 . clone ( ) ) . expect_failure ( HTLCDestination :: InvalidOnion ) ;
2786
+ let route_to_dave : & [ & Node ] = & [ & nodes[ 3 ] ] ;
2787
+ let args = PassAlongPathArgs :: new ( & nodes[ 4 ] , route_to_dave , amt_msat, payment_hash, update_message_t0_dave . clone ( ) ) . expect_failure ( HTLCDestination :: InvalidOnion ) ;
2797
2788
do_pass_along_path ( args) ;
2798
2789
2799
2790
{
2800
- let downstream_id = 4 ;
2801
- let upstream_id = 2 ;
2791
+ let downstream_id = 3 ;
2792
+ let upstream_id = 4 ;
2802
2793
let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
2803
2794
nodes[ upstream_id] . node . handle_update_fail_malformed_htlc (
2804
2795
nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_malformed_htlcs [ 0 ]
2805
2796
) ;
2806
2797
do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
2807
2798
}
2799
+ {
2800
+ let downstream_id = 4 ;
2801
+ let upstream_id = 2 ;
2802
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
2803
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
2804
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
2805
+ ) ;
2806
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
2807
+ }
2808
2808
{
2809
2809
let downstream_id = 2 ;
2810
2810
let upstream_id = 1 ;
@@ -2840,8 +2840,7 @@ fn test_unblinded_trampoline_forward() {
2840
2840
do_test_unblinded_trampoline_forward ( Some ( TrampolineForwardFailureScenario :: InvalidRecipientOnion ) ) ;
2841
2841
}
2842
2842
2843
- #[ test]
2844
- fn test_blinded_trampoline_forward ( ) {
2843
+ fn do_test_blinded_trampoline_forward ( failure_scenario : Option < TrampolineForwardFailureScenario > ) {
2845
2844
// Simulate a payment of A (0) -> B (1) -> C(Trampoline (blinded forward)) (2) -> D(Trampoline(blinded receive)) (3)
2846
2845
// trampoline hops C -> T0 (4) -> D
2847
2846
// make it fail at B, then at C's outer onion, then at C's inner onion
@@ -2855,7 +2854,9 @@ fn test_blinded_trampoline_forward() {
2855
2854
2856
2855
let ( _, _, chan_id_alice_bob, _) = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
2857
2856
let ( _, _, chan_id_bob_carol, _) = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) ;
2858
- let ( _, _, _, _) = create_announced_chan_between_nodes_with_value ( & nodes, 2 , 4 , 1_000_000 , 0 ) ;
2857
+ if failure_scenario != Some ( TrampolineForwardFailureScenario :: NoRoute ) {
2858
+ let ( _, _, _, _) = create_announced_chan_between_nodes_with_value ( & nodes, 2 , 4 , 1_000_000 , 0 ) ;
2859
+ }
2859
2860
let ( _, _, _, _) = create_announced_chan_between_nodes_with_value ( & nodes, 4 , 3 , 1_000_000 , 0 ) ;
2860
2861
2861
2862
for i in 0 ..TOTAL_NODE_COUNT { // connect all nodes' blocks
@@ -2957,6 +2958,195 @@ fn test_blinded_trampoline_forward() {
2957
2958
nodes[ 0 ] . node . send_payment_with_route ( route. clone ( ) , payment_hash, RecipientOnionFields :: spontaneous_empty ( ) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
2958
2959
check_added_monitors ! ( & nodes[ 0 ] , 1 ) ;
2959
2960
2960
- pass_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 4 ] , & nodes[ 3 ] ] ] , amt_msat, payment_hash, payment_secret) ;
2961
- claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 4 ] , & nodes[ 3 ] ] , payment_preimage) ;
2961
+ match failure_scenario {
2962
+ None => {
2963
+ pass_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 4 ] , & nodes[ 3 ] ] ] , amt_msat, payment_hash, payment_secret) ;
2964
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 4 ] , & nodes[ 3 ] ] , payment_preimage) ;
2965
+ } ,
2966
+ Some ( TrampolineForwardFailureScenario :: NoRoute ) => {
2967
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
2968
+ assert_eq ! ( events. len( ) , 1 ) ;
2969
+ let first_message_event = remove_first_msg_event_to_node ( & nodes[ 1 ] . node . get_our_node_id ( ) , & mut events) ;
2970
+
2971
+ let route = & [ & nodes[ 1 ] , & nodes[ 2 ] ] ;
2972
+ let args = PassAlongPathArgs :: new ( & nodes[ 0 ] , route, amt_msat, payment_hash, first_message_event)
2973
+ . with_payment_preimage ( payment_preimage)
2974
+ . without_claimable_event ( )
2975
+ . expect_failure ( HTLCDestination :: FailedTrampolineForward { requested_next_node_id : dave_node_id, forward_scid : None } ) ;
2976
+ do_pass_along_path ( args) ;
2977
+
2978
+ {
2979
+ let downstream_id = 2 ;
2980
+ let upstream_id = 1 ;
2981
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
2982
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
2983
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
2984
+ ) ;
2985
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
2986
+ }
2987
+ {
2988
+ let downstream_id = 1 ;
2989
+ let upstream_id = 0 ;
2990
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
2991
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
2992
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
2993
+ ) ;
2994
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , false , false ) ;
2995
+ }
2996
+ {
2997
+ let payment_failed_conditions = PaymentFailedConditions :: new ( )
2998
+ . expected_htlc_error_data ( INVALID_ONION_BLINDING , & [ 0 ; 32 ] ) ;
2999
+ expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , payment_failed_conditions) ;
3000
+ }
3001
+ }
3002
+ Some ( TrampolineForwardFailureScenario :: InvalidInterTrampolineOnion ) => {
3003
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
3004
+ assert_eq ! ( events. len( ) , 1 ) ;
3005
+ let first_message_event = remove_first_msg_event_to_node ( & nodes[ 1 ] . node . get_our_node_id ( ) , & mut events) ;
3006
+
3007
+ let route_alice_carol: & [ & Node ] = & [ & nodes[ 1 ] , & nodes[ 2 ] ] ;
3008
+ pass_along_path ( & nodes[ 0 ] , route_alice_carol, amt_msat, payment_hash. clone ( ) ,
3009
+ None , first_message_event. clone ( ) , false , Some ( payment_preimage) ) ;
3010
+
3011
+ check_added_monitors ! ( & nodes[ 2 ] , 1 ) ;
3012
+ let mut events = nodes[ 2 ] . node . get_and_clear_pending_msg_events ( ) ;
3013
+ assert_eq ! ( events. len( ) , 1 ) ;
3014
+
3015
+ let mut update_message_carol_t0 = remove_first_msg_event_to_node ( & nodes[ 4 ] . node . get_our_node_id ( ) , & mut events) ;
3016
+ {
3017
+ let mut update_message = match update_message_carol_t0 {
3018
+ MessageSendEvent :: UpdateHTLCs { ref mut updates, .. } => {
3019
+ assert_eq ! ( updates. update_add_htlcs. len( ) , 1 ) ;
3020
+ updates. update_add_htlcs . get_mut ( 0 )
3021
+ }
3022
+ _ => panic ! ( )
3023
+ } ;
3024
+ update_message. map ( |msg| {
3025
+ // corrupt the onion packet
3026
+ msg. onion_routing_packet . hmac = [ 1 ; 32 ] ;
3027
+ } ) ;
3028
+ }
3029
+
3030
+ let route_carol_t0: & [ & Node ] = & [ & nodes[ 4 ] ] ;
3031
+ let args = PassAlongPathArgs :: new ( & nodes[ 2 ] , route_carol_t0, amt_msat, payment_hash, update_message_carol_t0. clone ( ) ) . expect_failure ( HTLCDestination :: InvalidOnion ) ;
3032
+ do_pass_along_path ( args) ;
3033
+
3034
+ {
3035
+ let downstream_id = 4 ;
3036
+ let upstream_id = 2 ;
3037
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3038
+ nodes[ upstream_id] . node . handle_update_fail_malformed_htlc (
3039
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_malformed_htlcs [ 0 ]
3040
+ ) ;
3041
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
3042
+ }
3043
+ {
3044
+ let downstream_id = 2 ;
3045
+ let upstream_id = 1 ;
3046
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3047
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
3048
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
3049
+ ) ;
3050
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
3051
+ }
3052
+ {
3053
+ let downstream_id = 1 ;
3054
+ let upstream_id = 0 ;
3055
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3056
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
3057
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
3058
+ ) ;
3059
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , false , false ) ;
3060
+ }
3061
+ {
3062
+ let payment_failed_conditions = PaymentFailedConditions :: new ( )
3063
+ . expected_htlc_error_data ( INVALID_ONION_BLINDING , & [ 0 ; 32 ] ) ;
3064
+ expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , payment_failed_conditions) ;
3065
+ }
3066
+ }
3067
+ Some ( TrampolineForwardFailureScenario :: InvalidRecipientOnion ) => {
3068
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
3069
+ assert_eq ! ( events. len( ) , 1 ) ;
3070
+ let first_message_event = remove_first_msg_event_to_node ( & nodes[ 1 ] . node . get_our_node_id ( ) , & mut events) ;
3071
+
3072
+ let route_alice_t0: & [ & Node ] = & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 4 ] ] ;
3073
+ pass_along_path ( & nodes[ 0 ] , route_alice_t0, amt_msat, payment_hash. clone ( ) ,
3074
+ None , first_message_event. clone ( ) , false , Some ( payment_preimage) ) ;
3075
+
3076
+ check_added_monitors ! ( & nodes[ 4 ] , 1 ) ;
3077
+ let mut events = nodes[ 4 ] . node . get_and_clear_pending_msg_events ( ) ;
3078
+ assert_eq ! ( events. len( ) , 1 ) ;
3079
+
3080
+ let mut update_message_t0_dave = remove_first_msg_event_to_node ( & nodes[ 3 ] . node . get_our_node_id ( ) , & mut events) ;
3081
+ {
3082
+ let mut update_message = match update_message_t0_dave {
3083
+ MessageSendEvent :: UpdateHTLCs { ref mut updates, .. } => {
3084
+ assert_eq ! ( updates. update_add_htlcs. len( ) , 1 ) ;
3085
+ updates. update_add_htlcs . get_mut ( 0 )
3086
+ }
3087
+ _ => panic ! ( )
3088
+ } ;
3089
+ update_message. map ( |msg| {
3090
+ // corrupt the onion packet
3091
+ msg. onion_routing_packet . hmac = [ 1 ; 32 ] ;
3092
+ } ) ;
3093
+ }
3094
+
3095
+ let route_to_dave: & [ & Node ] = & [ & nodes[ 3 ] ] ;
3096
+ let args = PassAlongPathArgs :: new ( & nodes[ 4 ] , route_to_dave, amt_msat, payment_hash, update_message_t0_dave. clone ( ) ) . expect_failure ( HTLCDestination :: InvalidOnion ) ;
3097
+ do_pass_along_path ( args) ;
3098
+
3099
+ {
3100
+ let downstream_id = 3 ;
3101
+ let upstream_id = 4 ;
3102
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3103
+ nodes[ upstream_id] . node . handle_update_fail_malformed_htlc (
3104
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_malformed_htlcs [ 0 ]
3105
+ ) ;
3106
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
3107
+ }
3108
+ {
3109
+ let downstream_id = 4 ;
3110
+ let upstream_id = 2 ;
3111
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3112
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
3113
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
3114
+ ) ;
3115
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
3116
+ }
3117
+ {
3118
+ let downstream_id = 2 ;
3119
+ let upstream_id = 1 ;
3120
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3121
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
3122
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
3123
+ ) ;
3124
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , true , false ) ;
3125
+ }
3126
+ {
3127
+ let downstream_id = 1 ;
3128
+ let upstream_id = 0 ;
3129
+ let unblinded_node_updates = get_htlc_update_msgs ! ( nodes[ downstream_id] , nodes[ upstream_id] . node. get_our_node_id( ) ) ;
3130
+ nodes[ upstream_id] . node . handle_update_fail_htlc (
3131
+ nodes[ downstream_id] . node . get_our_node_id ( ) , & unblinded_node_updates. update_fail_htlcs [ 0 ]
3132
+ ) ;
3133
+ do_commitment_signed_dance ( & nodes[ upstream_id] , & nodes[ downstream_id] , & unblinded_node_updates. commitment_signed , false , false ) ;
3134
+ }
3135
+ {
3136
+ let payment_failed_conditions = PaymentFailedConditions :: new ( )
3137
+ . expected_htlc_error_data ( INVALID_ONION_BLINDING , & [ 0 ; 32 ] ) ;
3138
+ expect_payment_failed_conditions ( & nodes[ 0 ] , payment_hash, false , payment_failed_conditions) ;
3139
+ }
3140
+ }
3141
+ }
3142
+
3143
+
3144
+ }
3145
+
3146
+ #[ test]
3147
+ fn test_blinded_trampoline_forward ( ) {
3148
+ do_test_blinded_trampoline_forward ( None ) ;
3149
+ do_test_blinded_trampoline_forward ( Some ( TrampolineForwardFailureScenario :: NoRoute ) ) ;
3150
+ do_test_blinded_trampoline_forward ( Some ( TrampolineForwardFailureScenario :: InvalidInterTrampolineOnion ) ) ;
3151
+ do_test_blinded_trampoline_forward ( Some ( TrampolineForwardFailureScenario :: InvalidRecipientOnion ) ) ;
2962
3152
}
0 commit comments