Skip to content

Commit 89518cd

Browse files
committed
Extend bolt12 payers and builder to accept RouteParametersConfig
This update allows users to call `pay_for_offer`, `pay_for_offer_from_human_readable` and `create_refund_builder` with a set of parameters they wish to manually set for routing the corresponding invoice. By accepting `RouteParametersConfig`, users gain greater control over the routing process.
1 parent acb0c6a commit 89518cd

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelType
5757
use crate::types::features::Bolt11InvoiceFeatures;
5858
#[cfg(trampoline)]
5959
use crate::routing::gossip::NodeId;
60-
use crate::routing::router::{BlindedTail, FixedRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
60+
use crate::routing::router::{BlindedTail, FixedRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, RouteParametersConfig, Router};
6161
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};
6262
use crate::ln::msgs;
6363
use crate::ln::onion_utils;
@@ -2096,6 +2096,7 @@ where
20962096
/// # use lightning::events::{Event, EventsProvider, PaymentPurpose};
20972097
/// # use lightning::ln::channelmanager::AChannelManager;
20982098
/// # use lightning::offers::parse::Bolt12SemanticError;
2099+
/// # use lightning::routing::router::RouteParametersConfig;
20992100
/// #
21002101
/// # fn example<T: AChannelManager>(channel_manager: T) -> Result<(), Bolt12SemanticError> {
21012102
/// # let channel_manager = channel_manager.get_cm();
@@ -2143,15 +2144,16 @@ where
21432144
/// # use lightning::events::{Event, EventsProvider};
21442145
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
21452146
/// # use lightning::offers::offer::Offer;
2147+
/// # use lightning::routing::router::RouteParametersConfig;
21462148
/// #
21472149
/// # fn example<T: AChannelManager>(
21482150
/// # channel_manager: T, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
2149-
/// # payer_note: Option<String>, retry: Retry, max_total_routing_fee_msat: Option<u64>
2151+
/// # payer_note: Option<String>, retry: Retry, route_params_config: Option<RouteParametersConfig>
21502152
/// # ) {
21512153
/// # let channel_manager = channel_manager.get_cm();
21522154
/// let payment_id = PaymentId([42; 32]);
21532155
/// match channel_manager.pay_for_offer(
2154-
/// offer, quantity, amount_msats, payer_note, payment_id, retry, max_total_routing_fee_msat
2156+
/// offer, quantity, amount_msats, payer_note, payment_id, retry, route_params_config
21552157
/// ) {
21562158
/// Ok(()) => println!("Requesting invoice for offer"),
21572159
/// Err(e) => println!("Unable to request invoice for offer: {:?}", e),
@@ -2199,16 +2201,17 @@ where
21992201
/// # use lightning::events::{Event, EventsProvider};
22002202
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
22012203
/// # use lightning::offers::parse::Bolt12SemanticError;
2204+
/// # use lightning::routing::router::RouteParametersConfig;
22022205
/// #
22032206
/// # fn example<T: AChannelManager>(
22042207
/// # channel_manager: T, amount_msats: u64, absolute_expiry: Duration, retry: Retry,
2205-
/// # max_total_routing_fee_msat: Option<u64>
2208+
/// # route_params_config: Option<RouteParametersConfig>
22062209
/// # ) -> Result<(), Bolt12SemanticError> {
22072210
/// # let channel_manager = channel_manager.get_cm();
22082211
/// let payment_id = PaymentId([42; 32]);
22092212
/// let refund = channel_manager
22102213
/// .create_refund_builder(
2211-
/// amount_msats, absolute_expiry, payment_id, retry, max_total_routing_fee_msat
2214+
/// amount_msats, absolute_expiry, payment_id, retry, route_params_config
22122215
/// )?
22132216
/// # ;
22142217
/// # // Needed for compiling for c_bindings
@@ -9983,7 +9986,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
99839986
/// [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
99849987
pub fn create_refund_builder(
99859988
&$self, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId,
9986-
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>
9989+
retry_strategy: Retry, route_params_config: Option<RouteParametersConfig>
99879990
) -> Result<$builder, Bolt12SemanticError> {
99889991
let node_id = $self.get_our_node_id();
99899992
let expanded_key = &$self.inbound_payment_key;
@@ -10008,7 +10011,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
1000810011
let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
1000910012
$self.pending_outbound_payments
1001010013
.add_new_awaiting_invoice(
10011-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, None,
10014+
payment_id, expiration, retry_strategy, route_params_config, None,
1001210015
)
1001310016
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
1001410017

@@ -10184,7 +10187,7 @@ where
1018410187
pub fn pay_for_offer(
1018510188
&self, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
1018610189
payer_note: Option<String>, payment_id: PaymentId, retry_strategy: Retry,
10187-
max_total_routing_fee_msat: Option<u64>
10190+
route_params_config: Option<RouteParametersConfig>
1018810191
) -> Result<(), Bolt12SemanticError> {
1018910192
self.pay_for_offer_intern(offer, quantity, amount_msats, payer_note, payment_id, None, |invoice_request, nonce| {
1019010193
let expiration = StaleExpiration::TimerTicks(1);
@@ -10195,7 +10198,7 @@ where
1019510198
};
1019610199
self.pending_outbound_payments
1019710200
.add_new_awaiting_invoice(
10198-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat,
10201+
payment_id, expiration, retry_strategy, route_params_config,
1019910202
Some(retryable_invoice_request)
1020010203
)
1020110204
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
@@ -10428,14 +10431,14 @@ where
1042810431
#[cfg(feature = "dnssec")]
1042910432
pub fn pay_for_offer_from_human_readable_name(
1043010433
&self, name: HumanReadableName, amount_msats: u64, payment_id: PaymentId,
10431-
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>,
10434+
retry_strategy: Retry, route_params_config: Option<RouteParametersConfig>,
1043210435
dns_resolvers: Vec<Destination>,
1043310436
) -> Result<(), ()> {
1043410437
let (onion_message, context) =
1043510438
self.hrn_resolver.resolve_name(payment_id, name, &*self.entropy_source)?;
1043610439
let reply_paths = self.create_blinded_paths(MessageContext::DNSResolver(context))?;
1043710440
let expiration = StaleExpiration::TimerTicks(1);
10438-
self.pending_outbound_payments.add_new_awaiting_offer(payment_id, expiration, retry_strategy, max_total_routing_fee_msat, amount_msats)?;
10441+
self.pending_outbound_payments.add_new_awaiting_offer(payment_id, expiration, retry_strategy, route_params_config, amount_msats)?;
1043910442
let message_params = dns_resolvers
1044010443
.iter()
1044110444
.flat_map(|destination| reply_paths.iter().map(move |path| (path, destination)))

lightning/src/ln/outbound_payment.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,13 +1711,10 @@ impl OutboundPayments {
17111711
#[cfg(feature = "dnssec")]
17121712
pub(super) fn add_new_awaiting_offer(
17131713
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1714-
max_total_routing_fee_msat: Option<u64>, amount_msats: u64,
1714+
route_params_config: Option<RouteParametersConfig>, amount_msats: u64,
17151715
) -> Result<(), ()> {
17161716
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
1717-
let route_params_config = max_total_routing_fee_msat.map_or(
1718-
RouteParametersConfig::default(),
1719-
|fee_msat| RouteParametersConfig::default().with_max_total_routing_fee_msat(fee_msat)
1720-
);
1717+
let route_params_config = route_params_config.unwrap_or(RouteParametersConfig::default());
17211718
match pending_outbounds.entry(payment_id) {
17221719
hash_map::Entry::Occupied(_) => Err(()),
17231720
hash_map::Entry::Vacant(entry) => {
@@ -1770,14 +1767,10 @@ impl OutboundPayments {
17701767

17711768
pub(super) fn add_new_awaiting_invoice(
17721769
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1773-
max_total_routing_fee_msat: Option<u64>, retryable_invoice_request: Option<RetryableInvoiceRequest>
1770+
route_params_config: Option<RouteParametersConfig>, retryable_invoice_request: Option<RetryableInvoiceRequest>
17741771
) -> Result<(), ()> {
17751772
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
1776-
let route_params_config = max_total_routing_fee_msat.map_or(
1777-
RouteParametersConfig::default(),
1778-
|fee_msats| RouteParametersConfig::default()
1779-
.with_max_total_routing_fee_msat(fee_msats)
1780-
);
1773+
let route_params_config = route_params_config.unwrap_or(RouteParametersConfig::default());
17811774
match pending_outbounds.entry(payment_id) {
17821775
hash_map::Entry::Occupied(_) => Err(()),
17831776
hash_map::Entry::Vacant(entry) => {
@@ -2502,7 +2495,7 @@ mod tests {
25022495
use crate::offers::offer::OfferBuilder;
25032496
use crate::offers::test_utils::*;
25042497
use crate::routing::gossip::NetworkGraph;
2505-
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters};
2498+
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters, RouteParametersConfig};
25062499
use crate::sync::{Arc, Mutex, RwLock};
25072500
use crate::util::errors::APIError;
25082501
use crate::util::hash_tables::new_hash_map;
@@ -2917,10 +2910,12 @@ mod tests {
29172910
.build().unwrap()
29182911
.sign(recipient_sign).unwrap();
29192912

2913+
let route_params_config = RouteParametersConfig::default().with_max_total_routing_fee_msat(invoice.amount_msats() / 100 + 50_000);
2914+
29202915
assert!(
29212916
outbound_payments.add_new_awaiting_invoice(
29222917
payment_id, expiration, Retry::Attempts(0),
2923-
Some(invoice.amount_msats() / 100 + 50_000), None,
2918+
Some(route_params_config), None,
29242919
).is_ok()
29252920
);
29262921
assert!(outbound_payments.has_pending_payments());
@@ -3017,9 +3012,11 @@ mod tests {
30173012
assert!(!outbound_payments.has_pending_payments());
30183013
assert!(pending_events.lock().unwrap().is_empty());
30193014

3015+
let route_params_config = RouteParametersConfig::default().with_max_total_routing_fee_msat(1234);
3016+
30203017
assert!(
30213018
outbound_payments.add_new_awaiting_invoice(
3022-
payment_id, expiration, Retry::Attempts(0), Some(1234), None,
3019+
payment_id, expiration, Retry::Attempts(0), Some(route_params_config), None,
30233020
).is_ok()
30243021
);
30253022
assert!(outbound_payments.has_pending_payments());

0 commit comments

Comments
 (0)