Skip to content

Commit 65b3172

Browse files
committed
Update AwaitingInvoice & AwaitingOffer to include RouteParametersConfig
When Bolt12 payers & builders are called, they creates a new `PendingOutboundPayment` entry with relevant values that will be used when the corresponding invoice is received. This update modifies `AwaitingInvoice` & `AwaitingOffer` 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: **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 0ef3727 commit 65b3172

File tree

1 file changed

+30
-18
lines changed

1 file changed

+30
-18
lines changed

lightning/src/ln/outbound_payment.rs

Lines changed: 30 additions & 18 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;
@@ -62,15 +62,15 @@ pub(crate) enum PendingOutboundPayment {
6262
AwaitingOffer {
6363
expiration: StaleExpiration,
6464
retry_strategy: Retry,
65-
max_total_routing_fee_msat: Option<u64>,
65+
route_params_config: RouteParametersConfig,
6666
/// Human Readable Names-originated payments should always specify an explicit amount to
6767
/// send up-front, which we track here and enforce once we receive the offer.
6868
amount_msats: u64,
6969
},
7070
AwaitingInvoice {
7171
expiration: StaleExpiration,
7272
retry_strategy: Retry,
73-
max_total_routing_fee_msat: Option<u64>,
73+
route_params_config: RouteParametersConfig,
7474
retryable_invoice_request: Option<RetryableInvoiceRequest>
7575
},
7676
// This state will never be persisted to disk because we transition from `AwaitingInvoice` to
@@ -79,9 +79,10 @@ pub(crate) enum PendingOutboundPayment {
7979
InvoiceReceived {
8080
payment_hash: PaymentHash,
8181
retry_strategy: Retry,
82-
// Note this field is currently just replicated from AwaitingInvoice but not actually
83-
// used anywhere.
84-
max_total_routing_fee_msat: Option<u64>,
82+
// Currently unused, but replicated from `AwaitingInvoice` to avoid potential
83+
// race conditions where this field might be missing upon reload. It may be required
84+
// for future retries.
85+
route_params_config: RouteParametersConfig,
8586
},
8687
// This state applies when we are paying an often-offline recipient and another node on the
8788
// network served us a static invoice on the recipient's behalf in response to our invoice
@@ -850,14 +851,14 @@ impl OutboundPayments {
850851
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
851852
hash_map::Entry::Occupied(entry) => match entry.get() {
852853
PendingOutboundPayment::AwaitingInvoice {
853-
retry_strategy: retry, max_total_routing_fee_msat: max_total_fee, ..
854+
retry_strategy: retry, route_params_config, ..
854855
} => {
855856
retry_strategy = *retry;
856-
max_total_routing_fee_msat = *max_total_fee;
857+
max_total_routing_fee_msat = route_params_config.max_total_routing_fee_msat;
857858
*entry.into_mut() = PendingOutboundPayment::InvoiceReceived {
858859
payment_hash,
859860
retry_strategy: *retry,
860-
max_total_routing_fee_msat,
861+
route_params_config: *route_params_config,
861862
};
862863
},
863864
_ => return Err(Bolt12PaymentError::DuplicateInvoice),
@@ -1018,7 +1019,7 @@ impl OutboundPayments {
10181019
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
10191020
hash_map::Entry::Occupied(mut entry) => match entry.get_mut() {
10201021
PendingOutboundPayment::AwaitingInvoice {
1021-
retry_strategy, retryable_invoice_request, max_total_routing_fee_msat, ..
1022+
retry_strategy, retryable_invoice_request, route_params_config, ..
10221023
} => {
10231024
let invreq = &retryable_invoice_request
10241025
.as_ref()
@@ -1050,7 +1051,7 @@ impl OutboundPayments {
10501051
let payment_hash = PaymentHash(Sha256::hash(&keysend_preimage.0).to_byte_array());
10511052
let pay_params = PaymentParameters::from_static_invoice(invoice);
10521053
let mut route_params = RouteParameters::from_payment_params_and_value(pay_params, amount_msat);
1053-
route_params.max_total_routing_fee_msat = *max_total_routing_fee_msat;
1054+
route_params.max_total_routing_fee_msat = route_params_config.max_total_routing_fee_msat;
10541055

10551056
if let Err(()) = onion_utils::set_max_path_length(
10561057
&mut route_params, &RecipientOnionFields::spontaneous_empty(), Some(keysend_preimage),
@@ -1696,13 +1697,17 @@ impl OutboundPayments {
16961697
max_total_routing_fee_msat: Option<u64>, amount_msats: u64,
16971698
) -> Result<(), ()> {
16981699
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
1700+
let route_params_config = max_total_routing_fee_msat.map_or(
1701+
RouteParametersConfig::new(),
1702+
|fee_msat| RouteParametersConfig::new().with_max_total_routing_fee_msat(fee_msat)
1703+
);
16991704
match pending_outbounds.entry(payment_id) {
17001705
hash_map::Entry::Occupied(_) => Err(()),
17011706
hash_map::Entry::Vacant(entry) => {
17021707
entry.insert(PendingOutboundPayment::AwaitingOffer {
17031708
expiration,
17041709
retry_strategy,
1705-
max_total_routing_fee_msat,
1710+
route_params_config,
17061711
amount_msats,
17071712
});
17081713

@@ -1729,12 +1734,12 @@ impl OutboundPayments {
17291734
match self.pending_outbound_payments.lock().unwrap().entry(payment_id) {
17301735
hash_map::Entry::Occupied(entry) => match entry.get() {
17311736
PendingOutboundPayment::AwaitingOffer {
1732-
expiration, retry_strategy, max_total_routing_fee_msat, ..
1737+
expiration, retry_strategy, route_params_config, ..
17331738
} => {
17341739
let mut new_val = PendingOutboundPayment::AwaitingInvoice {
17351740
expiration: *expiration,
17361741
retry_strategy: *retry_strategy,
1737-
max_total_routing_fee_msat: *max_total_routing_fee_msat,
1742+
route_params_config: *route_params_config,
17381743
retryable_invoice_request,
17391744
};
17401745
core::mem::swap(&mut new_val, entry.into_mut());
@@ -1751,6 +1756,11 @@ impl OutboundPayments {
17511756
max_total_routing_fee_msat: Option<u64>, retryable_invoice_request: Option<RetryableInvoiceRequest>
17521757
) -> Result<(), ()> {
17531758
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
1759+
let route_params_config = max_total_routing_fee_msat.map_or(
1760+
RouteParametersConfig::new(),
1761+
|fee_msats| RouteParametersConfig::new()
1762+
.with_max_total_routing_fee_msat(fee_msats)
1763+
);
17541764
match pending_outbounds.entry(payment_id) {
17551765
hash_map::Entry::Occupied(_) => Err(()),
17561766
hash_map::Entry::Vacant(entry) => {
@@ -1760,7 +1770,7 @@ impl OutboundPayments {
17601770
entry.insert(PendingOutboundPayment::AwaitingInvoice {
17611771
expiration,
17621772
retry_strategy,
1763-
max_total_routing_fee_msat,
1773+
route_params_config,
17641774
retryable_invoice_request,
17651775
});
17661776

@@ -2390,13 +2400,15 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
23902400
(5, AwaitingInvoice) => {
23912401
(0, expiration, required),
23922402
(2, retry_strategy, required),
2393-
(4, max_total_routing_fee_msat, option),
2403+
// TODO: Add support for legacy `max_total_routing_fee_msat`
23942404
(5, retryable_invoice_request, option),
2405+
(7, route_params_config, (default_value, RouteParametersConfig::new())),
23952406
},
23962407
(7, InvoiceReceived) => {
23972408
(0, payment_hash, required),
23982409
(2, retry_strategy, required),
2399-
(4, max_total_routing_fee_msat, option),
2410+
(3, route_params_config, (default_value, RouteParametersConfig::new())),
2411+
// TODO: Add support for legacy `max_total_routing_fee_msat`
24002412
},
24012413
// Added in 0.1. Prior versions will drop these outbounds on downgrade, which is safe because no
24022414
// HTLCs are in-flight.
@@ -2412,7 +2424,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
24122424
(11, AwaitingOffer) => {
24132425
(0, expiration, required),
24142426
(2, retry_strategy, required),
2415-
(4, max_total_routing_fee_msat, option),
2427+
(5, route_params_config, (default_value, RouteParametersConfig::new())),
24162428
(6, amount_msats, required),
24172429
},
24182430
);

0 commit comments

Comments
 (0)