@@ -166,6 +166,142 @@ fn mpp_retry() {
166
166
claim_payment_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , false , payment_preimage) ;
167
167
}
168
168
169
+ #[ test]
170
+ fn mpp_retry_overpay ( ) {
171
+ // We create an MPP scenario with two paths in which we need to overpay to reach
172
+ // htlc_minimum_msat. We then fail the overpaid path and check that on retry our
173
+ // max_total_routing_fee_msat only accounts for the path's fees, but not for the fees overpaid
174
+ // in the first attempt.
175
+ let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
176
+ let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
177
+ let mut user_config = test_default_channel_config ( ) ;
178
+ user_config. channel_handshake_config . max_inbound_htlc_value_in_flight_percent_of_channel = 100 ;
179
+ let mut limited_config_1 = user_config. clone ( ) ;
180
+ limited_config_1. channel_handshake_config . our_htlc_minimum_msat = 35_000_000 ;
181
+ let mut limited_config_2 = user_config. clone ( ) ;
182
+ limited_config_2. channel_handshake_config . our_htlc_minimum_msat = 34_500_000 ;
183
+ let node_chanmgrs = create_node_chanmgrs ( 4 , & node_cfgs,
184
+ & [ Some ( user_config) , Some ( limited_config_1) , Some ( limited_config_2) , Some ( user_config) ] ) ;
185
+ let nodes = create_network ( 4 , & node_cfgs, & node_chanmgrs) ;
186
+
187
+ let ( chan_1_update, _, _, _) = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 40_000 , 0 ) ;
188
+ let ( chan_2_update, _, _, _) = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 2 , 40_000 , 0 ) ;
189
+ let ( _chan_3_update, _, _, _) = create_announced_chan_between_nodes_with_value ( & nodes, 1 , 3 , 40_000 , 0 ) ;
190
+ let ( chan_4_update, _, chan_4_id, _) = create_announced_chan_between_nodes_with_value ( & nodes, 3 , 2 , 40_000 , 0 ) ;
191
+
192
+ let amt_msat = 70_000_000 ;
193
+ let max_total_routing_fee_msat = Some ( 1_000_000 ) ;
194
+
195
+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 3 ] . node . get_our_node_id ( ) , TEST_FINAL_CLTV )
196
+ . with_bolt11_features ( nodes[ 3 ] . node . invoice_features ( ) ) . unwrap ( ) ;
197
+ let ( mut route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash ! (
198
+ nodes[ 0 ] , nodes[ 3 ] , payment_params, amt_msat, max_total_routing_fee_msat) ;
199
+
200
+ // Check we overpay on the second path which we're about to fail.
201
+ assert_eq ! ( chan_1_update. contents. fee_proportional_millionths, 0 ) ;
202
+ let overpaid_amount_1 = route. paths [ 0 ] . fee_msat ( ) as u32 - chan_1_update. contents . fee_base_msat ;
203
+ assert_eq ! ( overpaid_amount_1, 0 ) ;
204
+
205
+ assert_eq ! ( chan_2_update. contents. fee_proportional_millionths, 0 ) ;
206
+ let overpaid_amount_2 = route. paths [ 1 ] . fee_msat ( ) as u32 - chan_2_update. contents . fee_base_msat ;
207
+
208
+ let total_overpaid_amount = overpaid_amount_1 + overpaid_amount_2;
209
+
210
+ // Initiate the payment.
211
+ let payment_id = PaymentId ( payment_hash. 0 ) ;
212
+ let mut route_params = route. route_params . clone ( ) . unwrap ( ) ;
213
+
214
+ nodes[ 0 ] . router . expect_find_route ( route_params. clone ( ) , Ok ( route. clone ( ) ) ) ;
215
+ nodes[ 0 ] . node . send_payment ( payment_hash, RecipientOnionFields :: secret_only ( payment_secret) ,
216
+ payment_id, route_params. clone ( ) , Retry :: Attempts ( 1 ) ) . unwrap ( ) ;
217
+ check_added_monitors ! ( nodes[ 0 ] , 2 ) ; // one monitor per path
218
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
219
+ assert_eq ! ( events. len( ) , 2 ) ;
220
+
221
+ // Pass half of the payment along the success path.
222
+ let success_path_msgs = remove_first_msg_event_to_node ( & nodes[ 1 ] . node . get_our_node_id ( ) , & mut events) ;
223
+ pass_along_path ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 3 ] ] , amt_msat, payment_hash,
224
+ Some ( payment_secret) , success_path_msgs, false , None ) ;
225
+
226
+ // Add the HTLC along the first hop.
227
+ let fail_path_msgs_1 = remove_first_msg_event_to_node ( & nodes[ 2 ] . node . get_our_node_id ( ) , & mut events) ;
228
+ let ( update_add, commitment_signed) = match fail_path_msgs_1 {
229
+ MessageSendEvent :: UpdateHTLCs {
230
+ node_id : _,
231
+ updates : msgs:: CommitmentUpdate {
232
+ ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs,
233
+ ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed
234
+ }
235
+ } => {
236
+ assert_eq ! ( update_add_htlcs. len( ) , 1 ) ;
237
+ assert ! ( update_fail_htlcs. is_empty( ) ) ;
238
+ assert ! ( update_fulfill_htlcs. is_empty( ) ) ;
239
+ assert ! ( update_fail_malformed_htlcs. is_empty( ) ) ;
240
+ assert ! ( update_fee. is_none( ) ) ;
241
+ ( update_add_htlcs[ 0 ] . clone ( ) , commitment_signed. clone ( ) )
242
+ } ,
243
+ _ => panic ! ( "Unexpected event" ) ,
244
+ } ;
245
+ nodes[ 2 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & update_add) ;
246
+ commitment_signed_dance ! ( nodes[ 2 ] , nodes[ 0 ] , commitment_signed, false ) ;
247
+
248
+ // Attempt to forward the payment and complete the 2nd path's failure.
249
+ expect_pending_htlcs_forwardable ! ( & nodes[ 2 ] ) ;
250
+ expect_pending_htlcs_forwardable_and_htlc_handling_failed ! ( & nodes[ 2 ] ,
251
+ vec![ HTLCDestination :: NextHopChannel {
252
+ node_id: Some ( nodes[ 3 ] . node. get_our_node_id( ) ) , channel_id: chan_4_id
253
+ } ]
254
+ ) ;
255
+ let htlc_updates = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
256
+ assert ! ( htlc_updates. update_add_htlcs. is_empty( ) ) ;
257
+ assert_eq ! ( htlc_updates. update_fail_htlcs. len( ) , 1 ) ;
258
+ assert ! ( htlc_updates. update_fulfill_htlcs. is_empty( ) ) ;
259
+ assert ! ( htlc_updates. update_fail_malformed_htlcs. is_empty( ) ) ;
260
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
261
+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) ,
262
+ & htlc_updates. update_fail_htlcs [ 0 ] ) ;
263
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 2 ] , htlc_updates. commitment_signed, false ) ;
264
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_events ( ) ;
265
+ match events[ 1 ] {
266
+ Event :: PendingHTLCsForwardable { .. } => { } ,
267
+ _ => panic ! ( "Unexpected event" )
268
+ }
269
+ events. remove ( 1 ) ;
270
+ expect_payment_failed_conditions_event ( events, payment_hash, false ,
271
+ PaymentFailedConditions :: new ( ) . mpp_parts_remain ( ) ) ;
272
+
273
+ // Rebalance the channel so the second half of the payment can succeed.
274
+ send_payment ( & nodes[ 3 ] , & vec ! ( & nodes[ 2 ] ) [ ..] , 38_000_000 ) ;
275
+
276
+ // Retry the second half of the payment and make sure it succeeds.
277
+ let first_path_value = route. paths [ 0 ] . final_value_msat ( ) ;
278
+ assert_eq ! ( first_path_value, 36_000_000 ) ;
279
+
280
+ route. paths . remove ( 0 ) ;
281
+ route_params. final_value_msat -= first_path_value;
282
+ route_params. payment_params . previously_failed_channels . push ( chan_4_update. contents . short_channel_id ) ;
283
+
284
+ // Check the remaining max total routing fee for the second attempt accounts only for 1_000 msat
285
+ // base fee, but not for overpaid value of the first try.
286
+ route_params. max_total_routing_fee_msat . as_mut ( ) . map ( |m| * m -= 1000 ) ;
287
+ nodes[ 0 ] . router . expect_find_route ( route_params, Ok ( route) ) ;
288
+ nodes[ 0 ] . node . process_pending_htlc_forwards ( ) ;
289
+
290
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
291
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
292
+ assert_eq ! ( events. len( ) , 1 ) ;
293
+ pass_along_path ( & nodes[ 0 ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] , amt_msat, payment_hash,
294
+ Some ( payment_secret) , events. pop ( ) . unwrap ( ) , true , None ) ;
295
+
296
+ // Can't use claim_payment_along_route as it doesn't support overpayment, so we break out the
297
+ // individual steps here.
298
+ let extra_fees = vec ! [ 0 , total_overpaid_amount] ;
299
+ let expected_total_fee_msat = do_claim_payment_along_route_with_extra_penultimate_hop_fees (
300
+ & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , & extra_fees[ ..] , false ,
301
+ payment_preimage) ;
302
+ expect_payment_sent ! ( & nodes[ 0 ] , payment_preimage, Some ( expected_total_fee_msat) ) ;
303
+ }
304
+
169
305
fn do_mpp_receive_timeout ( send_partial_mpp : bool ) {
170
306
let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
171
307
let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
0 commit comments