@@ -24,7 +24,7 @@ use crate::ln::onion_utils::{DecodedOnionFailure, HTLCFailReason};
24
24
use crate :: offers:: invoice:: Bolt12Invoice ;
25
25
use crate :: offers:: invoice_request:: InvoiceRequest ;
26
26
use crate :: offers:: nonce:: Nonce ;
27
- use crate :: routing:: router:: { BlindedTail , InFlightHtlcs , Path , PaymentParameters , Route , RouteParameters , Router } ;
27
+ use crate :: routing:: router:: { BlindedTail , InFlightHtlcs , Path , PaymentParameters , Route , RouteParameters , Router , UserParameters } ;
28
28
use crate :: sign:: { EntropySource , NodeSigner , Recipient } ;
29
29
use crate :: util:: errors:: APIError ;
30
30
use crate :: util:: logger:: Logger ;
@@ -61,7 +61,11 @@ pub(crate) enum PendingOutboundPayment {
61
61
AwaitingInvoice {
62
62
expiration : StaleExpiration ,
63
63
retry_strategy : Retry ,
64
+ // Deprecated: Retained for backward compatibility.
65
+ // If set during read, this field overrides `RouteParameters::max_total_routing_fee_msat`
66
+ // instead of `RouteParametersOverride::max_total_routing_fee_msat`.
64
67
max_total_routing_fee_msat : Option < u64 > ,
68
+ user_params : UserParameters ,
65
69
retryable_invoice_request : Option < RetryableInvoiceRequest >
66
70
} ,
67
71
// This state will never be persisted to disk because we transition from `AwaitingInvoice` to
@@ -70,9 +74,10 @@ pub(crate) enum PendingOutboundPayment {
70
74
InvoiceReceived {
71
75
payment_hash : PaymentHash ,
72
76
retry_strategy : Retry ,
73
- // Note this field is currently just replicated from AwaitingInvoice but not actually
74
- // used anywhere.
75
- max_total_routing_fee_msat : Option < u64 > ,
77
+ // Currently unused, but replicated from `AwaitingInvoice` to avoid potential
78
+ // race conditions where this field might be missing upon reload. It may be required
79
+ // for future retries.
80
+ user_params : UserParameters ,
76
81
} ,
77
82
// This state applies when we are paying an often-offline recipient and another node on the
78
83
// network served us a static invoice on the recipient's behalf in response to our invoice
@@ -849,14 +854,20 @@ impl OutboundPayments {
849
854
match self . pending_outbound_payments . lock ( ) . unwrap ( ) . entry ( payment_id) {
850
855
hash_map:: Entry :: Occupied ( entry) => match entry. get ( ) {
851
856
PendingOutboundPayment :: AwaitingInvoice {
852
- retry_strategy : retry, max_total_routing_fee_msat : max_total_fee, ..
857
+ retry_strategy : retry, max_total_routing_fee_msat : max_total_fee, user_params , ..
853
858
} => {
854
859
retry_strategy = * retry;
855
- max_total_routing_fee_msat = * max_total_fee;
860
+ // If max_total_fee is present, update route_params_override with the specified fee.
861
+ // This supports the standard behavior during downgrades.
862
+ let user_params = max_total_fee
863
+ . map_or ( * user_params, |fee| user_params. with_max_total_routing_fee_msat ( fee) ) ;
864
+
865
+ max_total_routing_fee_msat = user_params. max_total_routing_fee_msat ;
866
+
856
867
* entry. into_mut ( ) = PendingOutboundPayment :: InvoiceReceived {
857
868
payment_hash,
858
869
retry_strategy : * retry,
859
- max_total_routing_fee_msat ,
870
+ user_params ,
860
871
} ;
861
872
} ,
862
873
_ => return Err ( Bolt12PaymentError :: DuplicateInvoice ) ,
@@ -1004,7 +1015,7 @@ impl OutboundPayments {
1004
1015
match self . pending_outbound_payments . lock ( ) . unwrap ( ) . entry ( payment_id) {
1005
1016
hash_map:: Entry :: Occupied ( mut entry) => match entry. get ( ) {
1006
1017
PendingOutboundPayment :: AwaitingInvoice {
1007
- retry_strategy, retryable_invoice_request, max_total_routing_fee_msat , ..
1018
+ retry_strategy, retryable_invoice_request, route_params_override , ..
1008
1019
} => {
1009
1020
let invreq = & retryable_invoice_request
1010
1021
. as_ref ( )
@@ -1031,7 +1042,7 @@ impl OutboundPayments {
1031
1042
let payment_hash = PaymentHash ( Sha256 :: hash ( & keysend_preimage. 0 ) . to_byte_array ( ) ) ;
1032
1043
let pay_params = PaymentParameters :: from_static_invoice ( invoice) ;
1033
1044
let mut route_params = RouteParameters :: from_payment_params_and_value ( pay_params, amount_msat) ;
1034
- route_params. max_total_routing_fee_msat = * max_total_routing_fee_msat;
1045
+ route_params. max_total_routing_fee_msat = route_params_override . map ( |params| params . max_total_routing_fee_msat ) . flatten ( ) ;
1035
1046
1036
1047
if let Err ( ( ) ) = onion_utils:: set_max_path_length (
1037
1048
& mut route_params, & RecipientOnionFields :: spontaneous_empty ( ) , Some ( keysend_preimage) ,
@@ -1599,6 +1610,10 @@ impl OutboundPayments {
1599
1610
max_total_routing_fee_msat : Option < u64 > , retryable_invoice_request : Option < RetryableInvoiceRequest >
1600
1611
) -> Result < ( ) , ( ) > {
1601
1612
let mut pending_outbounds = self . pending_outbound_payments . lock ( ) . unwrap ( ) ;
1613
+ let user_params = max_total_routing_fee_msat. map_or ( UserParameters :: new ( ) ,
1614
+ |fee_msats| UserParameters :: new ( )
1615
+ . with_max_total_routing_fee_msat ( fee_msats)
1616
+ ) ;
1602
1617
match pending_outbounds. entry ( payment_id) {
1603
1618
hash_map:: Entry :: Occupied ( _) => Err ( ( ) ) ,
1604
1619
hash_map:: Entry :: Vacant ( entry) => {
@@ -1608,7 +1623,9 @@ impl OutboundPayments {
1608
1623
entry. insert ( PendingOutboundPayment :: AwaitingInvoice {
1609
1624
expiration,
1610
1625
retry_strategy,
1611
- max_total_routing_fee_msat,
1626
+ user_params,
1627
+ // Retained for downgrade support.
1628
+ max_total_routing_fee_msat : None ,
1612
1629
retryable_invoice_request,
1613
1630
} ) ;
1614
1631
@@ -2240,11 +2257,12 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
2240
2257
( 2 , retry_strategy, required) ,
2241
2258
( 4 , max_total_routing_fee_msat, option) ,
2242
2259
( 5 , retryable_invoice_request, option) ,
2260
+ ( 6 , user_params, ( default_value, UserParameters :: new( ) ) ) ,
2243
2261
} ,
2244
2262
( 7 , InvoiceReceived ) => {
2245
2263
( 0 , payment_hash, required) ,
2246
2264
( 2 , retry_strategy, required) ,
2247
- ( 4 , max_total_routing_fee_msat , option ) ,
2265
+ ( 4 , user_params , ( default_value , UserParameters :: new ( ) ) ) ,
2248
2266
} ,
2249
2267
// Added in 0.0.125. Prior versions will drop these outbounds on downgrade, which is safe because
2250
2268
// no HTLCs are in-flight.
0 commit comments