Skip to content

Commit bdf9225

Browse files
committed
Update AwaitingInvoice to include RouteParametersConfig
When `pay_for_offer` is called, it creates a new `PendingOutboundPayment` entry with relevant values that will be used when the corresponding invoice is received. This update modifies `AwaitingInvoice` to include the entire `RouteParametersConfig` struct instead of just `max_total_routing_fee_msat`. This change ensures all manual routing parameters are available when finding payment routes. Decisions & Reasoning: 1. **Retention of `max_total_routing_fee_msat` in `AwaitingInvoice` & `InvoiceReceived`** This field is retained to ensure downgrade support. 2. **Introduction of `route_params_config` in `InvoiceReceived`:** This was added for the same reason that `max_total_routing_fee_msat` was originally introduced in PR lightningdevkit#2417. The documentation has been updated to reflect this, based on [this comment](lightningdevkit@d7e2ff6#r1334619765).
1 parent 384282d commit bdf9225

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

lightning/src/ln/outbound_payment.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::ln::onion_utils::{DecodedOnionFailure, HTLCFailReason};
2424
use crate::offers::invoice::Bolt12Invoice;
2525
use crate::offers::invoice_request::InvoiceRequest;
2626
use crate::offers::nonce::Nonce;
27-
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, PaymentParameters, Route, RouteParameters, Router};
27+
use crate::routing::router::{BlindedTail, InFlightHtlcs, RouteParametersConfig, Path, PaymentParameters, Route, RouteParameters, Router};
2828
use crate::sign::{EntropySource, NodeSigner, Recipient};
2929
use crate::util::errors::APIError;
3030
use crate::util::logger::Logger;
@@ -70,7 +70,11 @@ pub(crate) enum PendingOutboundPayment {
7070
AwaitingInvoice {
7171
expiration: StaleExpiration,
7272
retry_strategy: Retry,
73+
// Deprecated: Retained for backward compatibility.
74+
// If set during read, this field overrides `RouteParameters::max_total_routing_fee_msat`
75+
// instead of `RouteParametersConfig::max_total_routing_fee_msat`.
7376
max_total_routing_fee_msat: Option<u64>,
77+
route_params_config: RouteParametersConfig,
7478
retryable_invoice_request: Option<RetryableInvoiceRequest>
7579
},
7680
// This state will never be persisted to disk because we transition from `AwaitingInvoice` to
@@ -79,9 +83,12 @@ pub(crate) enum PendingOutboundPayment {
7983
InvoiceReceived {
8084
payment_hash: PaymentHash,
8185
retry_strategy: Retry,
82-
// Note this field is currently just replicated from AwaitingInvoice but not actually
83-
// used anywhere.
86+
// Deprecated: Retained for backward compatibility.
8487
max_total_routing_fee_msat: Option<u64>,
88+
// Currently unused, but replicated from `AwaitingInvoice` to avoid potential
89+
// race conditions where this field might be missing upon reload. It may be required
90+
// for future retries.
91+
route_params_config: RouteParametersConfig,
8592
},
8693
// This state applies when we are paying an often-offline recipient and another node on the
8794
// network served us a static invoice on the recipient's behalf in response to our invoice
@@ -850,14 +857,21 @@ impl OutboundPayments {
850857
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
851858
hash_map::Entry::Occupied(entry) => match entry.get() {
852859
PendingOutboundPayment::AwaitingInvoice {
853-
retry_strategy: retry, max_total_routing_fee_msat: max_total_fee, ..
860+
retry_strategy: retry, max_total_routing_fee_msat: max_total_fee, route_params_config, ..
854861
} => {
855862
retry_strategy = *retry;
856-
max_total_routing_fee_msat = *max_total_fee;
863+
// If max_total_fee is present, update route_params_config with the specified fee.
864+
// This supports the standard behavior during downgrades.
865+
let route_params_config = max_total_fee.map_or(
866+
*route_params_config,
867+
|fee_msat| route_params_config.with_max_total_routing_fee_msat(fee_msat)
868+
);
869+
max_total_routing_fee_msat = route_params_config.max_total_routing_fee_msat;
857870
*entry.into_mut() = PendingOutboundPayment::InvoiceReceived {
858871
payment_hash,
859872
retry_strategy: *retry,
860-
max_total_routing_fee_msat,
873+
max_total_routing_fee_msat: *max_total_fee,
874+
route_params_config: route_params_config,
861875
};
862876
},
863877
_ => return Err(Bolt12PaymentError::DuplicateInvoice),
@@ -1751,6 +1765,11 @@ impl OutboundPayments {
17511765
max_total_routing_fee_msat: Option<u64>, retryable_invoice_request: Option<RetryableInvoiceRequest>
17521766
) -> Result<(), ()> {
17531767
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
1768+
let route_params_config = max_total_routing_fee_msat.map_or(
1769+
RouteParametersConfig::new(),
1770+
|fee_msats| RouteParametersConfig::new()
1771+
.with_max_total_routing_fee_msat(fee_msats)
1772+
);
17541773
match pending_outbounds.entry(payment_id) {
17551774
hash_map::Entry::Occupied(_) => Err(()),
17561775
hash_map::Entry::Vacant(entry) => {
@@ -1760,7 +1779,9 @@ impl OutboundPayments {
17601779
entry.insert(PendingOutboundPayment::AwaitingInvoice {
17611780
expiration,
17621781
retry_strategy,
1763-
max_total_routing_fee_msat,
1782+
route_params_config,
1783+
// Retained for downgrade support.
1784+
max_total_routing_fee_msat: None,
17641785
retryable_invoice_request,
17651786
});
17661787

@@ -2392,10 +2413,12 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
23922413
(2, retry_strategy, required),
23932414
(4, max_total_routing_fee_msat, option),
23942415
(5, retryable_invoice_request, option),
2416+
(7, route_params_config, (default_value, RouteParametersConfig::new())),
23952417
},
23962418
(7, InvoiceReceived) => {
23972419
(0, payment_hash, required),
23982420
(2, retry_strategy, required),
2421+
(3, route_params_config, (default_value, RouteParametersConfig::new())),
23992422
(4, max_total_routing_fee_msat, option),
24002423
},
24012424
// Added in 0.1. Prior versions will drop these outbounds on downgrade, which is safe because no

0 commit comments

Comments
 (0)