@@ -34,12 +34,13 @@ use core::time::Duration;
3434///
3535/// If you wish to use a different payment idempotency token, see [`pay_invoice_with_id`].
3636pub fn pay_invoice < C : Deref > (
37- invoice : & Bolt11Invoice , retry_strategy : Retry , channelmanager : C
37+ invoice : & Bolt11Invoice , retry_strategy : Retry , max_total_routing_fee_msat : Option < u64 > ,
38+ channelmanager : C
3839) -> Result < PaymentId , PaymentError >
3940where C :: Target : AChannelManager ,
4041{
4142 let payment_id = PaymentId ( invoice. payment_hash ( ) . into_inner ( ) ) ;
42- pay_invoice_with_id ( invoice, payment_id, retry_strategy, channelmanager. get_cm ( ) )
43+ pay_invoice_with_id ( invoice, payment_id, retry_strategy, max_total_routing_fee_msat , channelmanager. get_cm ( ) )
4344 . map ( |( ) | payment_id)
4445}
4546
@@ -54,12 +55,13 @@ where C::Target: AChannelManager,
5455///
5556/// See [`pay_invoice`] for a variant which uses the [`PaymentHash`] for the idempotency token.
5657pub fn pay_invoice_with_id < C : Deref > (
57- invoice : & Bolt11Invoice , payment_id : PaymentId , retry_strategy : Retry , channelmanager : C
58+ invoice : & Bolt11Invoice , payment_id : PaymentId , retry_strategy : Retry ,
59+ max_total_routing_fee_msat : Option < u64 > , channelmanager : C
5860) -> Result < ( ) , PaymentError >
5961where C :: Target : AChannelManager ,
6062{
6163 let amt_msat = invoice. amount_milli_satoshis ( ) . ok_or ( PaymentError :: Invoice ( "amount missing" ) ) ?;
62- pay_invoice_using_amount ( invoice, amt_msat, payment_id, retry_strategy, channelmanager. get_cm ( ) )
64+ pay_invoice_using_amount ( invoice, amt_msat, payment_id, retry_strategy, max_total_routing_fee_msat , channelmanager. get_cm ( ) )
6365}
6466
6567/// Pays the given zero-value [`Bolt11Invoice`] using the given amount, retrying if needed based on
@@ -72,13 +74,13 @@ where C::Target: AChannelManager,
7274/// If you wish to use a different payment idempotency token, see
7375/// [`pay_zero_value_invoice_with_id`].
7476pub fn pay_zero_value_invoice < C : Deref > (
75- invoice : & Bolt11Invoice , amount_msats : u64 , retry_strategy : Retry , channelmanager : C
77+ invoice : & Bolt11Invoice , amount_msats : u64 , retry_strategy : Retry ,
78+ max_total_routing_fee_msat : Option < u64 > , channelmanager : C
7679) -> Result < PaymentId , PaymentError >
7780where C :: Target : AChannelManager ,
7881{
7982 let payment_id = PaymentId ( invoice. payment_hash ( ) . into_inner ( ) ) ;
80- pay_zero_value_invoice_with_id ( invoice, amount_msats, payment_id, retry_strategy,
81- channelmanager)
83+ pay_zero_value_invoice_with_id ( invoice, amount_msats, payment_id, retry_strategy, max_total_routing_fee_msat, channelmanager)
8284 . map ( |( ) | payment_id)
8385}
8486
@@ -95,21 +97,20 @@ where C::Target: AChannelManager,
9597/// idempotency token.
9698pub fn pay_zero_value_invoice_with_id < C : Deref > (
9799 invoice : & Bolt11Invoice , amount_msats : u64 , payment_id : PaymentId , retry_strategy : Retry ,
98- channelmanager : C
100+ max_total_routing_fee_msat : Option < u64 > , channelmanager : C
99101) -> Result < ( ) , PaymentError >
100102where C :: Target : AChannelManager ,
101103{
102104 if invoice. amount_milli_satoshis ( ) . is_some ( ) {
103105 Err ( PaymentError :: Invoice ( "amount unexpected" ) )
104106 } else {
105- pay_invoice_using_amount ( invoice, amount_msats, payment_id, retry_strategy,
106- channelmanager. get_cm ( ) )
107+ pay_invoice_using_amount ( invoice, amount_msats, payment_id, retry_strategy, max_total_routing_fee_msat, channelmanager. get_cm ( ) )
107108 }
108109}
109110
110111fn pay_invoice_using_amount < P : Deref > (
111112 invoice : & Bolt11Invoice , amount_msats : u64 , payment_id : PaymentId , retry_strategy : Retry ,
112- payer : P
113+ max_total_routing_fee_msat : Option < u64 > , payer : P
113114) -> Result < ( ) , PaymentError > where P :: Target : Payer {
114115 let payment_hash = PaymentHash ( ( * invoice. payment_hash ( ) ) . into_inner ( ) ) ;
115116 let mut recipient_onion = RecipientOnionFields :: secret_only ( * invoice. payment_secret ( ) ) ;
@@ -121,7 +122,11 @@ fn pay_invoice_using_amount<P: Deref>(
121122 if let Some ( features) = invoice. features ( ) {
122123 payment_params = payment_params. with_bolt11_features ( features. clone ( ) ) . unwrap ( ) ;
123124 }
124- let route_params = RouteParameters :: from_payment_params_and_value ( payment_params, amount_msats) ;
125+ let route_params = RouteParameters {
126+ payment_params,
127+ final_value_msat : amount_msats,
128+ max_total_routing_fee_msat,
129+ } ;
125130
126131 payer. send_payment ( payment_hash, recipient_onion, payment_id, route_params, retry_strategy)
127132}
@@ -357,7 +362,7 @@ mod tests {
357362 let final_value_msat = invoice. amount_milli_satoshis ( ) . unwrap ( ) ;
358363
359364 let payer = TestPayer :: new ( ) . expect_send ( Amount ( final_value_msat) ) ;
360- pay_invoice_using_amount ( & invoice, final_value_msat, payment_id, Retry :: Attempts ( 0 ) , & payer) . unwrap ( ) ;
365+ pay_invoice_using_amount ( & invoice, final_value_msat, payment_id, Retry :: Attempts ( 0 ) , None , & payer) . unwrap ( ) ;
361366 }
362367
363368 #[ test]
@@ -368,7 +373,7 @@ mod tests {
368373 let amt_msat = 10_000 ;
369374
370375 let payer = TestPayer :: new ( ) . expect_send ( Amount ( amt_msat) ) ;
371- pay_invoice_using_amount ( & invoice, amt_msat, payment_id, Retry :: Attempts ( 0 ) , & payer) . unwrap ( ) ;
376+ pay_invoice_using_amount ( & invoice, amt_msat, payment_id, Retry :: Attempts ( 0 ) , None , & payer) . unwrap ( ) ;
372377 }
373378
374379 #[ test]
@@ -382,7 +387,7 @@ mod tests {
382387 let invoice = invoice ( payment_preimage) ;
383388 let amt_msat = 10_000 ;
384389
385- match pay_zero_value_invoice ( & invoice, amt_msat, Retry :: Attempts ( 0 ) , nodes[ 0 ] . node ) {
390+ match pay_zero_value_invoice ( & invoice, amt_msat, Retry :: Attempts ( 0 ) , None , nodes[ 0 ] . node ) {
386391 Err ( PaymentError :: Invoice ( "amount unexpected" ) ) => { } ,
387392 _ => panic ! ( )
388393 }
@@ -418,7 +423,7 @@ mod tests {
418423 } )
419424 . unwrap ( ) ;
420425
421- pay_invoice ( & invoice, Retry :: Attempts ( 0 ) , nodes[ 0 ] . node ) . unwrap ( ) ;
426+ pay_invoice ( & invoice, Retry :: Attempts ( 0 ) , None , nodes[ 0 ] . node ) . unwrap ( ) ;
422427 check_added_monitors ( & nodes[ 0 ] , 1 ) ;
423428 let send_event = SendEvent :: from_node ( & nodes[ 0 ] ) ;
424429 nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & send_event. msgs [ 0 ] ) ;
0 commit comments