Skip to content

Commit 583d686

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 #2417. The documentation has been updated to reflect this, based on [this comment](d7e2ff6#r1334619765).
1 parent 69c3499 commit 583d686

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;
@@ -61,7 +61,11 @@ pub(crate) enum PendingOutboundPayment {
6161
AwaitingInvoice {
6262
expiration: StaleExpiration,
6363
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 `RouteParametersConfig::max_total_routing_fee_msat`.
6467
max_total_routing_fee_msat: Option<u64>,
68+
route_params_config: RouteParametersConfig,
6569
retryable_invoice_request: Option<RetryableInvoiceRequest>
6670
},
6771
// This state will never be persisted to disk because we transition from `AwaitingInvoice` to
@@ -70,9 +74,12 @@ pub(crate) enum PendingOutboundPayment {
7074
InvoiceReceived {
7175
payment_hash: PaymentHash,
7276
retry_strategy: Retry,
73-
// Note this field is currently just replicated from AwaitingInvoice but not actually
74-
// used anywhere.
77+
// Deprecated: Retained for backward compatibility.
7578
max_total_routing_fee_msat: Option<u64>,
79+
// Currently unused, but replicated from `AwaitingInvoice` to avoid potential
80+
// race conditions where this field might be missing upon reload. It may be required
81+
// for future retries.
82+
route_params_config: RouteParametersConfig,
7683
},
7784
// This state applies when we are paying an often-offline recipient and another node on the
7885
// network served us a static invoice on the recipient's behalf in response to our invoice
@@ -849,14 +856,21 @@ impl OutboundPayments {
849856
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
850857
hash_map::Entry::Occupied(entry) => match entry.get() {
851858
PendingOutboundPayment::AwaitingInvoice {
852-
retry_strategy: retry, max_total_routing_fee_msat: max_total_fee, ..
859+
retry_strategy: retry, max_total_routing_fee_msat: max_total_fee, route_params_config, ..
853860
} => {
854861
retry_strategy = *retry;
855-
max_total_routing_fee_msat = *max_total_fee;
862+
// If max_total_fee is present, update route_params_config with the specified fee.
863+
// This supports the standard behavior during downgrades.
864+
let route_params_config = max_total_fee.map_or(
865+
*route_params_config,
866+
|fee_msat| route_params_config.with_max_total_routing_fee_msat(fee_msat)
867+
);
868+
max_total_routing_fee_msat = route_params_config.max_total_routing_fee_msat;
856869
*entry.into_mut() = PendingOutboundPayment::InvoiceReceived {
857870
payment_hash,
858871
retry_strategy: *retry,
859-
max_total_routing_fee_msat,
872+
max_total_routing_fee_msat: *max_total_fee,
873+
route_params_config: route_params_config,
860874
};
861875
},
862876
_ => return Err(Bolt12PaymentError::DuplicateInvoice),
@@ -1599,6 +1613,11 @@ impl OutboundPayments {
15991613
max_total_routing_fee_msat: Option<u64>, retryable_invoice_request: Option<RetryableInvoiceRequest>
16001614
) -> Result<(), ()> {
16011615
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
1616+
let route_params_config = max_total_routing_fee_msat.map_or(
1617+
RouteParametersConfig::new(),
1618+
|fee_msats| RouteParametersConfig::new()
1619+
.with_max_total_routing_fee_msat(fee_msats)
1620+
);
16021621
match pending_outbounds.entry(payment_id) {
16031622
hash_map::Entry::Occupied(_) => Err(()),
16041623
hash_map::Entry::Vacant(entry) => {
@@ -1608,7 +1627,9 @@ impl OutboundPayments {
16081627
entry.insert(PendingOutboundPayment::AwaitingInvoice {
16091628
expiration,
16101629
retry_strategy,
1611-
max_total_routing_fee_msat,
1630+
route_params_config,
1631+
// Retained for downgrade support.
1632+
max_total_routing_fee_msat: None,
16121633
retryable_invoice_request,
16131634
});
16141635

@@ -2240,10 +2261,12 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
22402261
(2, retry_strategy, required),
22412262
(4, max_total_routing_fee_msat, option),
22422263
(5, retryable_invoice_request, option),
2264+
(7, route_params_config, (default_value, RouteParametersConfig::new())),
22432265
},
22442266
(7, InvoiceReceived) => {
22452267
(0, payment_hash, required),
22462268
(2, retry_strategy, required),
2269+
(3, route_params_config, (default_value, RouteParametersConfig::new())),
22472270
(4, max_total_routing_fee_msat, option),
22482271
},
22492272
// Added in 0.0.125. Prior versions will drop these outbounds on downgrade, which is safe because

0 commit comments

Comments
 (0)