@@ -2063,3 +2063,328 @@ fn fails_paying_after_rejected_by_payee() {
2063
2063
expect_pending_htlcs_forwardable_and_htlc_handling_failed ! ( nodes[ 1 ] , [ HTLCDestination :: FailedPayment { payment_hash } ] ) ;
2064
2064
pass_failed_payment_back ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] ] ] , false , payment_hash) ;
2065
2065
}
2066
+
2067
+ #[ test]
2068
+ fn retry_multi_path_single_failed_payment ( ) {
2069
+ // Tests that we can/will retry after a single path of an MPP payment failed immediately
2070
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
2071
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
2072
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None , None ] ) ;
2073
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2074
+
2075
+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
2076
+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
2077
+ let chans = nodes[ 0 ] . node . list_usable_channels ( ) ;
2078
+ let mut route = Route {
2079
+ paths : vec ! [
2080
+ vec![ RouteHop {
2081
+ pubkey: nodes[ 1 ] . node. get_our_node_id( ) ,
2082
+ node_features: nodes[ 1 ] . node. node_features( ) ,
2083
+ short_channel_id: chans[ 0 ] . short_channel_id. unwrap( ) ,
2084
+ channel_features: nodes[ 1 ] . node. channel_features( ) ,
2085
+ fee_msat: 10_000 ,
2086
+ cltv_expiry_delta: 100 ,
2087
+ } ] ,
2088
+ vec![ RouteHop {
2089
+ pubkey: nodes[ 1 ] . node. get_our_node_id( ) ,
2090
+ node_features: nodes[ 1 ] . node. node_features( ) ,
2091
+ short_channel_id: chans[ 1 ] . short_channel_id. unwrap( ) ,
2092
+ channel_features: nodes[ 1 ] . node. channel_features( ) ,
2093
+ fee_msat: 100_000_001 , // Our default max-HTLC-value is 10% of the channel value, which this is one more than
2094
+ cltv_expiry_delta: 100 ,
2095
+ } ] ,
2096
+ ] ,
2097
+ payment_params : Some ( PaymentParameters :: from_node_id ( nodes[ 1 ] . node . get_our_node_id ( ) ) ) ,
2098
+ } ;
2099
+ nodes[ 0 ] . router . expect_find_route ( Ok ( route. clone ( ) ) ) ;
2100
+ // On retry, split the payment across both channels.
2101
+ route. paths [ 0 ] [ 0 ] . fee_msat = 50_000_001 ;
2102
+ route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_000 ;
2103
+ nodes[ 0 ] . router . expect_find_route ( Ok ( route. clone ( ) ) ) ;
2104
+
2105
+ let amt_msat = 100_010_000 ;
2106
+ let ( _, payment_hash, _, payment_secret) = get_route_and_payment_hash ! ( & nodes[ 0 ] , nodes[ 1 ] , amt_msat) ;
2107
+ #[ cfg( feature = "std" ) ]
2108
+ let payment_expiry_secs = SystemTime :: UNIX_EPOCH . elapsed ( ) . unwrap ( ) . as_secs ( ) + 60 * 60 ;
2109
+ #[ cfg( not( feature = "std" ) ) ]
2110
+ let payment_expiry_secs = 60 * 60 ;
2111
+ let mut invoice_features = InvoiceFeatures :: empty ( ) ;
2112
+ invoice_features. set_variable_length_onion_required ( ) ;
2113
+ invoice_features. set_payment_secret_required ( ) ;
2114
+ invoice_features. set_basic_mpp_optional ( ) ;
2115
+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 1 ] . node . get_our_node_id ( ) )
2116
+ . with_expiry_time ( payment_expiry_secs as u64 )
2117
+ . with_features ( invoice_features) ;
2118
+ let route_params = RouteParameters {
2119
+ payment_params,
2120
+ final_value_msat : amt_msat,
2121
+ final_cltv_expiry_delta : TEST_FINAL_CLTV ,
2122
+ } ;
2123
+
2124
+ nodes[ 0 ] . node . send_payment_with_retry ( payment_hash, & Some ( payment_secret) , PaymentId ( payment_hash. 0 ) , route_params, Retry :: Attempts ( 1 ) ) . unwrap ( ) ;
2125
+ let htlc_msgs = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
2126
+ assert_eq ! ( htlc_msgs. len( ) , 2 ) ;
2127
+ check_added_monitors ! ( nodes[ 0 ] , 2 ) ;
2128
+ }
2129
+
2130
+ #[ test]
2131
+ fn immediate_retry_on_failure ( ) {
2132
+ // Tests that we can/will retry immediately after a failure
2133
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
2134
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
2135
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None , None ] ) ;
2136
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2137
+
2138
+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
2139
+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
2140
+ let chans = nodes[ 0 ] . node . list_usable_channels ( ) ;
2141
+ let mut route = Route {
2142
+ paths : vec ! [
2143
+ vec![ RouteHop {
2144
+ pubkey: nodes[ 1 ] . node. get_our_node_id( ) ,
2145
+ node_features: nodes[ 1 ] . node. node_features( ) ,
2146
+ short_channel_id: chans[ 0 ] . short_channel_id. unwrap( ) ,
2147
+ channel_features: nodes[ 1 ] . node. channel_features( ) ,
2148
+ fee_msat: 100_000_001 , // Our default max-HTLC-value is 10% of the channel value, which this is one more than
2149
+ cltv_expiry_delta: 100 ,
2150
+ } ] ,
2151
+ ] ,
2152
+ payment_params : Some ( PaymentParameters :: from_node_id ( nodes[ 1 ] . node . get_our_node_id ( ) ) ) ,
2153
+ } ;
2154
+ nodes[ 0 ] . router . expect_find_route ( Ok ( route. clone ( ) ) ) ;
2155
+ // On retry, split the payment across both channels.
2156
+ route. paths . push ( route. paths [ 0 ] . clone ( ) ) ;
2157
+ route. paths [ 0 ] [ 0 ] . short_channel_id = chans[ 1 ] . short_channel_id . unwrap ( ) ;
2158
+ route. paths [ 0 ] [ 0 ] . fee_msat = 50_000_000 ;
2159
+ route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_001 ;
2160
+ nodes[ 0 ] . router . expect_find_route ( Ok ( route. clone ( ) ) ) ;
2161
+
2162
+ let amt_msat = 100_010_000 ;
2163
+ let ( _, payment_hash, _, payment_secret) = get_route_and_payment_hash ! ( & nodes[ 0 ] , nodes[ 1 ] , amt_msat) ;
2164
+ #[ cfg( feature = "std" ) ]
2165
+ let payment_expiry_secs = SystemTime :: UNIX_EPOCH . elapsed ( ) . unwrap ( ) . as_secs ( ) + 60 * 60 ;
2166
+ #[ cfg( not( feature = "std" ) ) ]
2167
+ let payment_expiry_secs = 60 * 60 ;
2168
+ let mut invoice_features = InvoiceFeatures :: empty ( ) ;
2169
+ invoice_features. set_variable_length_onion_required ( ) ;
2170
+ invoice_features. set_payment_secret_required ( ) ;
2171
+ invoice_features. set_basic_mpp_optional ( ) ;
2172
+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 1 ] . node . get_our_node_id ( ) )
2173
+ . with_expiry_time ( payment_expiry_secs as u64 )
2174
+ . with_features ( invoice_features) ;
2175
+ let route_params = RouteParameters {
2176
+ payment_params,
2177
+ final_value_msat : amt_msat,
2178
+ final_cltv_expiry_delta : TEST_FINAL_CLTV ,
2179
+ } ;
2180
+
2181
+ nodes[ 0 ] . node . send_payment_with_retry ( payment_hash, & Some ( payment_secret) , PaymentId ( payment_hash. 0 ) , route_params, Retry :: Attempts ( 1 ) ) . unwrap ( ) ;
2182
+ let htlc_msgs = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
2183
+ assert_eq ! ( htlc_msgs. len( ) , 2 ) ;
2184
+ check_added_monitors ! ( nodes[ 0 ] , 2 ) ;
2185
+ }
2186
+
2187
+ #[ test]
2188
+ fn no_extra_retries_on_back_to_back_fail ( ) {
2189
+ // In a previous release, we had a race where we may exceed the payment retry count if we
2190
+ // get two failures in a row with the second having `all_paths_failed` set.
2191
+ // Generally, when we give up trying to retry a payment, we don't know for sure what the
2192
+ // current state of the ChannelManager event queue is. Specifically, we cannot be sure that
2193
+ // there are not multiple additional `PaymentPathFailed` or even `PaymentSent` events
2194
+ // pending which we will see later. Thus, when we previously removed the retry tracking map
2195
+ // entry after a `all_paths_failed` `PaymentPathFailed` event, we may have dropped the
2196
+ // retry entry even though more events for the same payment were still pending. This led to
2197
+ // us retrying a payment again even though we'd already given up on it.
2198
+ //
2199
+ // We now have a separate event - `PaymentFailed` which indicates no HTLCs remain and which
2200
+ // is used to remove the payment retry counter entries instead. This tests for the specific
2201
+ // excess-retry case while also testing `PaymentFailed` generation.
2202
+
2203
+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
2204
+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
2205
+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
2206
+ let nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
2207
+
2208
+ let chan_1_scid = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 10_000_000 , 0 ) . 0 . contents . short_channel_id ;
2209
+ let chan_2_scid = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 10_000_000 , 0 ) . 0 . contents . short_channel_id ;
2210
+
2211
+ let mut route = Route {
2212
+ paths : vec ! [
2213
+ vec![ RouteHop {
2214
+ pubkey: nodes[ 1 ] . node. get_our_node_id( ) ,
2215
+ node_features: nodes[ 1 ] . node. node_features( ) ,
2216
+ short_channel_id: chan_1_scid,
2217
+ channel_features: nodes[ 1 ] . node. channel_features( ) ,
2218
+ fee_msat: 0 ,
2219
+ cltv_expiry_delta: 100 ,
2220
+ } , RouteHop {
2221
+ pubkey: nodes[ 2 ] . node. get_our_node_id( ) ,
2222
+ node_features: nodes[ 2 ] . node. node_features( ) ,
2223
+ short_channel_id: chan_2_scid,
2224
+ channel_features: nodes[ 2 ] . node. channel_features( ) ,
2225
+ fee_msat: 100_000_000 ,
2226
+ cltv_expiry_delta: 100 ,
2227
+ } ] ,
2228
+ vec![ RouteHop {
2229
+ pubkey: nodes[ 1 ] . node. get_our_node_id( ) ,
2230
+ node_features: nodes[ 1 ] . node. node_features( ) ,
2231
+ short_channel_id: chan_1_scid,
2232
+ channel_features: nodes[ 1 ] . node. channel_features( ) ,
2233
+ fee_msat: 0 ,
2234
+ cltv_expiry_delta: 100 ,
2235
+ } , RouteHop {
2236
+ pubkey: nodes[ 2 ] . node. get_our_node_id( ) ,
2237
+ node_features: nodes[ 2 ] . node. node_features( ) ,
2238
+ short_channel_id: chan_2_scid,
2239
+ channel_features: nodes[ 2 ] . node. channel_features( ) ,
2240
+ fee_msat: 100_000_000 ,
2241
+ cltv_expiry_delta: 100 ,
2242
+ } ]
2243
+ ] ,
2244
+ payment_params : Some ( PaymentParameters :: from_node_id ( nodes[ 2 ] . node . get_our_node_id ( ) ) ) ,
2245
+ } ;
2246
+ nodes[ 0 ] . router . expect_find_route ( Ok ( route. clone ( ) ) ) ;
2247
+ // On retry, we'll only be asked for one path
2248
+ route. paths . remove ( 1 ) ;
2249
+ nodes[ 0 ] . router . expect_find_route ( Ok ( route. clone ( ) ) ) ;
2250
+
2251
+ let amt_msat = 100_010_000 ;
2252
+ let ( _, payment_hash, _, payment_secret) = get_route_and_payment_hash ! ( & nodes[ 0 ] , nodes[ 1 ] , amt_msat) ;
2253
+ #[ cfg( feature = "std" ) ]
2254
+ let payment_expiry_secs = SystemTime :: UNIX_EPOCH . elapsed ( ) . unwrap ( ) . as_secs ( ) + 60 * 60 ;
2255
+ #[ cfg( not( feature = "std" ) ) ]
2256
+ let payment_expiry_secs = 60 * 60 ;
2257
+ let mut invoice_features = InvoiceFeatures :: empty ( ) ;
2258
+ invoice_features. set_variable_length_onion_required ( ) ;
2259
+ invoice_features. set_payment_secret_required ( ) ;
2260
+ invoice_features. set_basic_mpp_optional ( ) ;
2261
+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 1 ] . node . get_our_node_id ( ) )
2262
+ . with_expiry_time ( payment_expiry_secs as u64 )
2263
+ . with_features ( invoice_features) ;
2264
+ let route_params = RouteParameters {
2265
+ payment_params,
2266
+ final_value_msat : amt_msat,
2267
+ final_cltv_expiry_delta : TEST_FINAL_CLTV ,
2268
+ } ;
2269
+
2270
+ nodes[ 0 ] . node . send_payment_with_retry ( payment_hash, & Some ( payment_secret) , PaymentId ( payment_hash. 0 ) , route_params, Retry :: Attempts ( 1 ) ) . unwrap ( ) ;
2271
+ let htlc_updates = SendEvent :: from_node ( & nodes[ 0 ] ) ;
2272
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2273
+ assert_eq ! ( htlc_updates. msgs. len( ) , 1 ) ;
2274
+
2275
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & htlc_updates. msgs [ 0 ] ) ;
2276
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & htlc_updates. commitment_msg ) ;
2277
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2278
+ let ( bs_first_raa, bs_first_cs) = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2279
+
2280
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
2281
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2282
+ let second_htlc_updates = SendEvent :: from_node ( & nodes[ 0 ] ) ;
2283
+
2284
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_cs) ;
2285
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2286
+ let as_first_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2287
+
2288
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & second_htlc_updates. msgs [ 0 ] ) ;
2289
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & second_htlc_updates. commitment_msg ) ;
2290
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2291
+ let bs_second_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2292
+
2293
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_raa) ;
2294
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2295
+ let bs_fail_update = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2296
+
2297
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_raa) ;
2298
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2299
+
2300
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_fail_update. update_fail_htlcs [ 0 ] ) ;
2301
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_fail_update. commitment_signed ) ;
2302
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2303
+ let ( as_second_raa, as_third_cs) = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2304
+
2305
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) ;
2306
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2307
+ let bs_second_fail_update = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2308
+
2309
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_third_cs) ;
2310
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2311
+ let bs_third_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2312
+
2313
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_fail_update. update_fail_htlcs [ 0 ] ) ;
2314
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_fail_update. commitment_signed ) ;
2315
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2316
+
2317
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_third_raa) ;
2318
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2319
+ let ( as_third_raa, as_fourth_cs) = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2320
+
2321
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_third_raa) ;
2322
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2323
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_fourth_cs) ;
2324
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2325
+ let bs_fourth_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2326
+
2327
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_fourth_raa) ;
2328
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2329
+
2330
+ // At this point A has sent two HTLCs which both failed due to lack of fee. It now has two
2331
+ // pending `PaymentPathFailed` events, one with `all_paths_failed` unset, and the second
2332
+ // with it set. The first event will use up the only retry we are allowed, with the second
2333
+ // `PaymentPathFailed` being passed up to the user (us, in this case). Previously, we'd
2334
+ // treated this as "HTLC complete" and dropped the retry counter, causing us to retry again
2335
+ // if the final HTLC failed.
2336
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
2337
+ assert_eq ! ( events. len( ) , 4 ) ;
2338
+ match events[ 0 ] {
2339
+ Event :: PaymentPathFailed { payment_hash : ev_payment_hash, payment_failed_permanently, .. } => {
2340
+ assert_eq ! ( payment_hash, ev_payment_hash) ;
2341
+ assert_eq ! ( payment_failed_permanently, false ) ;
2342
+ } ,
2343
+ _ => panic ! ( "Unexpected event" ) ,
2344
+ }
2345
+ match events[ 1 ] {
2346
+ Event :: PendingHTLCsForwardable { .. } => { } ,
2347
+ _ => panic ! ( "Unexpected event" ) ,
2348
+ }
2349
+ match events[ 2 ] {
2350
+ Event :: PaymentPathFailed { payment_hash : ev_payment_hash, payment_failed_permanently, .. } => {
2351
+ assert_eq ! ( payment_hash, ev_payment_hash) ;
2352
+ assert_eq ! ( payment_failed_permanently, false ) ;
2353
+ } ,
2354
+ _ => panic ! ( "Unexpected event" ) ,
2355
+ }
2356
+ match events[ 3 ] {
2357
+ Event :: PendingHTLCsForwardable { .. } => { } ,
2358
+ _ => panic ! ( "Unexpected event" ) ,
2359
+ }
2360
+
2361
+ nodes[ 0 ] . node . process_pending_htlc_forwards ( ) ;
2362
+ let retry_htlc_updates = SendEvent :: from_node ( & nodes[ 0 ] ) ;
2363
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2364
+
2365
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & retry_htlc_updates. msgs [ 0 ] ) ;
2366
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , & retry_htlc_updates. commitment_msg, false , true ) ;
2367
+ let bs_fail_update = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2368
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_fail_update. update_fail_htlcs [ 0 ] ) ;
2369
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , & bs_fail_update. commitment_signed, false , true ) ;
2370
+
2371
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
2372
+ assert_eq ! ( events. len( ) , 1 ) ;
2373
+ match events[ 0 ] {
2374
+ Event :: PaymentPathFailed { payment_hash : ev_payment_hash, payment_failed_permanently, .. } => {
2375
+ assert_eq ! ( payment_hash, ev_payment_hash) ;
2376
+ assert_eq ! ( payment_failed_permanently, false ) ;
2377
+ } ,
2378
+ _ => panic ! ( "Unexpected event" ) ,
2379
+ }
2380
+ nodes[ 0 ] . node . abandon_payment ( PaymentId ( payment_hash. 0 ) ) ;
2381
+ events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
2382
+ assert_eq ! ( events. len( ) , 1 ) ;
2383
+ match events[ 0 ] {
2384
+ Event :: PaymentFailed { payment_hash : ref ev_payment_hash, payment_id : ref ev_payment_id } => {
2385
+ assert_eq ! ( payment_hash, * ev_payment_hash) ;
2386
+ assert_eq ! ( PaymentId ( payment_hash. 0 ) , * ev_payment_id) ;
2387
+ } ,
2388
+ _ => panic ! ( "Unexpected event" ) ,
2389
+ }
2390
+ }
0 commit comments