Skip to content

Commit 6ccb7b6

Browse files
committed
Extend pay_for_offer to accept RouteParametersOverride
This update allows users to call `pay_for_offer` with a set of parameters they wish to manually set for routing the corresponding invoice. By accepting `RouteParametersOverride`, users gain greater control over the routing process.
1 parent db71b52 commit 6ccb7b6

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ use crate::ln::channel_state::ChannelDetails;
5454
use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
5555
#[cfg(any(feature = "_test_utils", test))]
5656
use crate::types::features::Bolt11InvoiceFeatures;
57-
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
57+
use crate::routing::router::{BlindedTail, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, RouteParametersConfig, Router};
5858
use crate::ln::onion_payment::{check_incoming_htlc_cltv, create_recv_pending_htlc_info, create_fwd_pending_htlc_info, decode_incoming_update_add_htlc_onion, InboundHTLCErr, NextPacketDetails};
5959
use crate::ln::msgs;
6060
use crate::ln::onion_utils;
@@ -1847,6 +1847,7 @@ where
18471847
/// # use lightning::events::{Event, EventsProvider, PaymentPurpose};
18481848
/// # use lightning::ln::channelmanager::AChannelManager;
18491849
/// # use lightning::offers::parse::Bolt12SemanticError;
1850+
/// # use lightning::routing::router::RouteParametersConfig;
18501851
/// #
18511852
/// # fn example<T: AChannelManager>(channel_manager: T) -> Result<(), Bolt12SemanticError> {
18521853
/// # let channel_manager = channel_manager.get_cm();
@@ -1894,15 +1895,16 @@ where
18941895
/// # use lightning::events::{Event, EventsProvider};
18951896
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
18961897
/// # use lightning::offers::offer::Offer;
1898+
/// # use lightning::routing::router::RouteParametersConfig;
18971899
/// #
18981900
/// # fn example<T: AChannelManager>(
18991901
/// # channel_manager: T, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
1900-
/// # payer_note: Option<String>, retry: Retry, max_total_routing_fee_msat: Option<u64>
1902+
/// # payer_note: Option<String>, retry: Retry, route_params_config: Option<RouteParametersConfig>
19011903
/// # ) {
19021904
/// # let channel_manager = channel_manager.get_cm();
19031905
/// let payment_id = PaymentId([42; 32]);
19041906
/// match channel_manager.pay_for_offer(
1905-
/// offer, quantity, amount_msats, payer_note, payment_id, retry, max_total_routing_fee_msat
1907+
/// offer, quantity, amount_msats, payer_note, payment_id, retry, route_params_config
19061908
/// ) {
19071909
/// Ok(()) => println!("Requesting invoice for offer"),
19081910
/// Err(e) => println!("Unable to request invoice for offer: {:?}", e),
@@ -9209,10 +9211,15 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
92099211

92109212
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop($self);
92119213

9214+
let route_params_config = max_total_routing_fee_msat.map(
9215+
|fee_msat| RouteParametersConfig::new()
9216+
.with_max_total_routing_fee_msat(fee_msat)
9217+
);
9218+
92129219
let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
92139220
$self.pending_outbound_payments
92149221
.add_new_awaiting_invoice(
9215-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, None,
9222+
payment_id, expiration, retry_strategy, route_params_config, None,
92169223
)
92179224
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
92189225

@@ -9305,7 +9312,7 @@ where
93059312
pub fn pay_for_offer(
93069313
&self, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
93079314
payer_note: Option<String>, payment_id: PaymentId, retry_strategy: Retry,
9308-
max_total_routing_fee_msat: Option<u64>
9315+
route_params_config: Option<RouteParametersConfig>
93099316
) -> Result<(), Bolt12SemanticError> {
93109317
let expanded_key = &self.inbound_payment_key;
93119318
let entropy = &*self.entropy_source;
@@ -9347,7 +9354,7 @@ where
93479354
};
93489355
self.pending_outbound_payments
93499356
.add_new_awaiting_invoice(
9350-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat,
9357+
payment_id, expiration, retry_strategy, route_params_config,
93519358
Some(retryable_invoice_request)
93529359
)
93539360
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;

lightning/src/ln/outbound_payment.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,14 +1610,10 @@ impl OutboundPayments {
16101610

16111611
pub(super) fn add_new_awaiting_invoice(
16121612
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1613-
max_total_routing_fee_msat: Option<u64>, retryable_invoice_request: Option<RetryableInvoiceRequest>
1613+
route_params_config: Option<RouteParametersConfig>, retryable_invoice_request: Option<RetryableInvoiceRequest>
16141614
) -> Result<(), ()> {
16151615
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-
);
1616+
let route_params_config = route_params_config.unwrap_or(RouteParametersConfig::new());
16211617
match pending_outbounds.entry(payment_id) {
16221618
hash_map::Entry::Occupied(_) => Err(()),
16231619
hash_map::Entry::Vacant(entry) => {
@@ -1629,7 +1625,7 @@ impl OutboundPayments {
16291625
retry_strategy,
16301626
route_params_config,
16311627
// Retained for downgrade support.
1632-
max_total_routing_fee_msat,
1628+
max_total_routing_fee_msat: route_params_config.max_total_routing_fee_msat,
16331629
retryable_invoice_request,
16341630
});
16351631

@@ -2298,7 +2294,7 @@ mod tests {
22982294
use crate::offers::offer::OfferBuilder;
22992295
use crate::offers::test_utils::*;
23002296
use crate::routing::gossip::NetworkGraph;
2301-
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters};
2297+
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters, RouteParametersConfig};
23022298
use crate::sync::{Arc, Mutex, RwLock};
23032299
use crate::util::errors::APIError;
23042300
use crate::util::hash_tables::new_hash_map;
@@ -2712,10 +2708,12 @@ mod tests {
27122708
.build().unwrap()
27132709
.sign(recipient_sign).unwrap();
27142710

2711+
let route_params_config = RouteParametersConfig::new().with_max_total_routing_fee_msat(invoice.amount_msats() / 100 + 50_000);
2712+
27152713
assert!(
27162714
outbound_payments.add_new_awaiting_invoice(
27172715
payment_id, expiration, Retry::Attempts(0),
2718-
Some(invoice.amount_msats() / 100 + 50_000), None,
2716+
Some(route_params_config), None,
27192717
).is_ok()
27202718
);
27212719
assert!(outbound_payments.has_pending_payments());
@@ -2813,9 +2811,11 @@ mod tests {
28132811
assert!(!outbound_payments.has_pending_payments());
28142812
assert!(pending_events.lock().unwrap().is_empty());
28152813

2814+
let route_params_config = RouteParametersConfig::new().with_max_total_routing_fee_msat(1234);
2815+
28162816
assert!(
28172817
outbound_payments.add_new_awaiting_invoice(
2818-
payment_id, expiration, Retry::Attempts(0), Some(1234), None,
2818+
payment_id, expiration, Retry::Attempts(0), Some(route_params_config), None,
28192819
).is_ok()
28202820
);
28212821
assert!(outbound_payments.has_pending_payments());

0 commit comments

Comments
 (0)