@@ -166,6 +166,142 @@ fn mpp_retry() {
166166 claim_payment_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , false , payment_preimage) ;
167167}
168168
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+
169305fn do_mpp_receive_timeout ( send_partial_mpp : bool ) {
170306 let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
171307 let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
0 commit comments