Skip to content

Commit bb6bc0b

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 7ec4ab4 commit bb6bc0b

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

lightning/src/ln/channelmanager.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use crate::ln::channel_state::ChannelDetails;
5555
use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
5656
#[cfg(any(feature = "_test_utils", test))]
5757
use crate::types::features::Bolt11InvoiceFeatures;
58-
use crate::routing::router::{BlindedTail, FixedRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
58+
use crate::routing::router::{BlindedTail, FixedRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, RouteParametersConfig, Router};
5959
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};
6060
use crate::ln::msgs;
6161
use crate::ln::onion_utils;
@@ -2071,6 +2071,7 @@ where
20712071
/// # use lightning::events::{Event, EventsProvider, PaymentPurpose};
20722072
/// # use lightning::ln::channelmanager::AChannelManager;
20732073
/// # use lightning::offers::parse::Bolt12SemanticError;
2074+
/// # use lightning::routing::router::RouteParametersConfig;
20742075
/// #
20752076
/// # fn example<T: AChannelManager>(channel_manager: T) -> Result<(), Bolt12SemanticError> {
20762077
/// # let channel_manager = channel_manager.get_cm();
@@ -2118,15 +2119,16 @@ where
21182119
/// # use lightning::events::{Event, EventsProvider};
21192120
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
21202121
/// # use lightning::offers::offer::Offer;
2122+
/// # use lightning::routing::router::RouteParametersConfig;
21212123
/// #
21222124
/// # fn example<T: AChannelManager>(
21232125
/// # channel_manager: T, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
2124-
/// # payer_note: Option<String>, retry: Retry, max_total_routing_fee_msat: Option<u64>
2126+
/// # payer_note: Option<String>, retry: Retry, route_params_config: Option<RouteParametersConfig>
21252127
/// # ) {
21262128
/// # let channel_manager = channel_manager.get_cm();
21272129
/// let payment_id = PaymentId([42; 32]);
21282130
/// match channel_manager.pay_for_offer(
2129-
/// offer, quantity, amount_msats, payer_note, payment_id, retry, max_total_routing_fee_msat
2131+
/// offer, quantity, amount_msats, payer_note, payment_id, retry, route_params_config
21302132
/// ) {
21312133
/// Ok(()) => println!("Requesting invoice for offer"),
21322134
/// Err(e) => println!("Unable to request invoice for offer: {:?}", e),
@@ -2174,16 +2176,17 @@ where
21742176
/// # use lightning::events::{Event, EventsProvider};
21752177
/// # use lightning::ln::channelmanager::{AChannelManager, PaymentId, RecentPaymentDetails, Retry};
21762178
/// # use lightning::offers::parse::Bolt12SemanticError;
2179+
/// # use lightning::routing::router::RouteParametersConfig;
21772180
/// #
21782181
/// # fn example<T: AChannelManager>(
21792182
/// # channel_manager: T, amount_msats: u64, absolute_expiry: Duration, retry: Retry,
2180-
/// # max_total_routing_fee_msat: Option<u64>
2183+
/// # route_params_config: Option<RouteParametersConfig>
21812184
/// # ) -> Result<(), Bolt12SemanticError> {
21822185
/// # let channel_manager = channel_manager.get_cm();
21832186
/// let payment_id = PaymentId([42; 32]);
21842187
/// let refund = channel_manager
21852188
/// .create_refund_builder(
2186-
/// amount_msats, absolute_expiry, payment_id, retry, max_total_routing_fee_msat
2189+
/// amount_msats, absolute_expiry, payment_id, retry, route_params_config
21872190
/// )?
21882191
/// # ;
21892192
/// # // Needed for compiling for c_bindings
@@ -9881,7 +9884,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
98819884
/// [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
98829885
pub fn create_refund_builder(
98839886
&$self, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId,
9884-
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>
9887+
retry_strategy: Retry, route_params_config: Option<RouteParametersConfig>
98859888
) -> Result<$builder, Bolt12SemanticError> {
98869889
let node_id = $self.get_our_node_id();
98879890
let expanded_key = &$self.inbound_payment_key;
@@ -9906,7 +9909,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
99069909
let expiration = StaleExpiration::AbsoluteTimeout(absolute_expiry);
99079910
$self.pending_outbound_payments
99089911
.add_new_awaiting_invoice(
9909-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat, None,
9912+
payment_id, expiration, retry_strategy, route_params_config, None,
99109913
)
99119914
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)?;
99129915

@@ -10082,7 +10085,7 @@ where
1008210085
pub fn pay_for_offer(
1008310086
&self, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
1008410087
payer_note: Option<String>, payment_id: PaymentId, retry_strategy: Retry,
10085-
max_total_routing_fee_msat: Option<u64>
10088+
route_params_config: Option<RouteParametersConfig>
1008610089
) -> Result<(), Bolt12SemanticError> {
1008710090
self.pay_for_offer_intern(offer, quantity, amount_msats, payer_note, payment_id, None, |invoice_request, nonce| {
1008810091
let expiration = StaleExpiration::TimerTicks(1);
@@ -10093,7 +10096,7 @@ where
1009310096
};
1009410097
self.pending_outbound_payments
1009510098
.add_new_awaiting_invoice(
10096-
payment_id, expiration, retry_strategy, max_total_routing_fee_msat,
10099+
payment_id, expiration, retry_strategy, route_params_config,
1009710100
Some(retryable_invoice_request)
1009810101
)
1009910102
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
@@ -10326,14 +10329,14 @@ where
1032610329
#[cfg(feature = "dnssec")]
1032710330
pub fn pay_for_offer_from_human_readable_name(
1032810331
&self, name: HumanReadableName, amount_msats: u64, payment_id: PaymentId,
10329-
retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>,
10332+
retry_strategy: Retry, route_params_config: Option<RouteParametersConfig>,
1033010333
dns_resolvers: Vec<Destination>,
1033110334
) -> Result<(), ()> {
1033210335
let (onion_message, context) =
1033310336
self.hrn_resolver.resolve_name(payment_id, name, &*self.entropy_source)?;
1033410337
let reply_paths = self.create_blinded_paths(MessageContext::DNSResolver(context))?;
1033510338
let expiration = StaleExpiration::TimerTicks(1);
10336-
self.pending_outbound_payments.add_new_awaiting_offer(payment_id, expiration, retry_strategy, max_total_routing_fee_msat, amount_msats)?;
10339+
self.pending_outbound_payments.add_new_awaiting_offer(payment_id, expiration, retry_strategy, route_params_config, amount_msats)?;
1033710340
let message_params = dns_resolvers
1033810341
.iter()
1033910342
.flat_map(|destination| reply_paths.iter().map(move |path| (path, destination)))

lightning/src/ln/outbound_payment.rs

+11-14
Original file line numberDiff line numberDiff line change
@@ -1694,13 +1694,10 @@ impl OutboundPayments {
16941694
#[cfg(feature = "dnssec")]
16951695
pub(super) fn add_new_awaiting_offer(
16961696
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1697-
max_total_routing_fee_msat: Option<u64>, amount_msats: u64,
1697+
route_params_config: Option<RouteParametersConfig>, amount_msats: u64,
16981698
) -> Result<(), ()> {
16991699
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-
);
1700+
let route_params_config = route_params_config.unwrap_or(RouteParametersConfig::new());
17041701
match pending_outbounds.entry(payment_id) {
17051702
hash_map::Entry::Occupied(_) => Err(()),
17061703
hash_map::Entry::Vacant(entry) => {
@@ -1753,14 +1750,10 @@ impl OutboundPayments {
17531750

17541751
pub(super) fn add_new_awaiting_invoice(
17551752
&self, payment_id: PaymentId, expiration: StaleExpiration, retry_strategy: Retry,
1756-
max_total_routing_fee_msat: Option<u64>, retryable_invoice_request: Option<RetryableInvoiceRequest>
1753+
route_params_config: Option<RouteParametersConfig>, retryable_invoice_request: Option<RetryableInvoiceRequest>
17571754
) -> Result<(), ()> {
17581755
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-
);
1756+
let route_params_config = route_params_config.unwrap_or(RouteParametersConfig::new());
17641757
match pending_outbounds.entry(payment_id) {
17651758
hash_map::Entry::Occupied(_) => Err(()),
17661759
hash_map::Entry::Vacant(entry) => {
@@ -2482,7 +2475,7 @@ mod tests {
24822475
use crate::offers::offer::OfferBuilder;
24832476
use crate::offers::test_utils::*;
24842477
use crate::routing::gossip::NetworkGraph;
2485-
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters};
2478+
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters, RouteParametersConfig};
24862479
use crate::sync::{Arc, Mutex, RwLock};
24872480
use crate::util::errors::APIError;
24882481
use crate::util::hash_tables::new_hash_map;
@@ -2898,10 +2891,12 @@ mod tests {
28982891
.build().unwrap()
28992892
.sign(recipient_sign).unwrap();
29002893

2894+
let route_params_config = RouteParametersConfig::new().with_max_total_routing_fee_msat(invoice.amount_msats() / 100 + 50_000);
2895+
29012896
assert!(
29022897
outbound_payments.add_new_awaiting_invoice(
29032898
payment_id, expiration, Retry::Attempts(0),
2904-
Some(invoice.amount_msats() / 100 + 50_000), None,
2899+
Some(route_params_config), None,
29052900
).is_ok()
29062901
);
29072902
assert!(outbound_payments.has_pending_payments());
@@ -3000,9 +2995,11 @@ mod tests {
30002995
assert!(!outbound_payments.has_pending_payments());
30012996
assert!(pending_events.lock().unwrap().is_empty());
30022997

2998+
let route_params_config = RouteParametersConfig::new().with_max_total_routing_fee_msat(1234);
2999+
30033000
assert!(
30043001
outbound_payments.add_new_awaiting_invoice(
3005-
payment_id, expiration, Retry::Attempts(0), Some(1234), None,
3002+
payment_id, expiration, Retry::Attempts(0), Some(route_params_config), None,
30063003
).is_ok()
30073004
);
30083005
assert!(outbound_payments.has_pending_payments());

0 commit comments

Comments
 (0)