Skip to content

Commit 50644df

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 cd7227c commit 50644df

File tree

6 files changed

+162
-84
lines changed

6 files changed

+162
-84
lines changed

lightning-dns-resolver/src/lib.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ mod test {
170170
use lightning::onion_message::messenger::{
171171
AOnionMessenger, Destination, MessageRouter, OnionMessagePath, OnionMessenger,
172172
};
173+
use lightning::routing::router::RouteParametersConfig;
173174
use lightning::sign::{KeysManager, NodeSigner, Recipient};
174175
use lightning::types::features::InitFeatures;
175176
use lightning::types::payment::PaymentHash;
@@ -405,7 +406,14 @@ mod test {
405406
let amt = 42_000;
406407
nodes[0]
407408
.node
408-
.pay_for_offer_from_human_readable_name(name, amt, payment_id, retry, None, resolvers)
409+
.pay_for_offer_from_human_readable_name(
410+
name,
411+
amt,
412+
payment_id,
413+
retry,
414+
RouteParametersConfig::default(),
415+
resolvers,
416+
)
409417
.unwrap();
410418

411419
let query = nodes[0].onion_messenger.next_onion_message_for_peer(resolver_id).unwrap();

lightning/src/ln/async_payments_tests.rs

+82-10
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use crate::onion_message::messenger::{Destination, MessageRouter, MessageSendIns
3333
use crate::onion_message::offers::OffersMessage;
3434
use crate::onion_message::packet::ParsedOnionMessageContents;
3535
use crate::prelude::*;
36-
use crate::routing::router::{Payee, PaymentParameters};
36+
use crate::routing::router::{Payee, PaymentParameters, RouteParametersConfig};
3737
use crate::sign::NodeSigner;
3838
use crate::sync::Mutex;
3939
use crate::types::features::Bolt12InvoiceFeatures;
@@ -238,7 +238,15 @@ fn static_invoice_unknown_required_features() {
238238
let payment_id = PaymentId([1; 32]);
239239
nodes[0]
240240
.node
241-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), None)
241+
.pay_for_offer(
242+
&offer,
243+
None,
244+
Some(amt_msat),
245+
None,
246+
payment_id,
247+
Retry::Attempts(0),
248+
RouteParametersConfig::default(),
249+
)
242250
.unwrap();
243251

244252
// Don't forward the invreq since we don't support retrieving the static invoice from the
@@ -298,7 +306,15 @@ fn ignore_unexpected_static_invoice() {
298306
let payment_id = PaymentId([1; 32]);
299307
nodes[0]
300308
.node
301-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), None)
309+
.pay_for_offer(
310+
&offer,
311+
None,
312+
Some(amt_msat),
313+
None,
314+
payment_id,
315+
Retry::Attempts(0),
316+
RouteParametersConfig::default(),
317+
)
302318
.unwrap();
303319

304320
// Don't forward the invreq since we don't support retrieving the static invoice from the
@@ -415,7 +431,15 @@ fn async_receive_flow_success() {
415431
let payment_id = PaymentId([1; 32]);
416432
nodes[0]
417433
.node
418-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), None)
434+
.pay_for_offer(
435+
&offer,
436+
None,
437+
Some(amt_msat),
438+
None,
439+
payment_id,
440+
Retry::Attempts(0),
441+
RouteParametersConfig::default(),
442+
)
419443
.unwrap();
420444
let release_held_htlc_om =
421445
pass_async_payments_oms(static_invoice, &nodes[0], &nodes[1], &nodes[2]).1;
@@ -463,7 +487,15 @@ fn expired_static_invoice_fail() {
463487
let payment_id = PaymentId([1; 32]);
464488
nodes[0]
465489
.node
466-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), None)
490+
.pay_for_offer(
491+
&offer,
492+
None,
493+
Some(amt_msat),
494+
None,
495+
payment_id,
496+
Retry::Attempts(0),
497+
RouteParametersConfig::default(),
498+
)
467499
.unwrap();
468500

469501
let invreq_om = nodes[0]
@@ -546,7 +578,15 @@ fn async_receive_mpp() {
546578
let payment_id = PaymentId([1; 32]);
547579
nodes[0]
548580
.node
549-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), None)
581+
.pay_for_offer(
582+
&offer,
583+
None,
584+
Some(amt_msat),
585+
None,
586+
payment_id,
587+
Retry::Attempts(1),
588+
RouteParametersConfig::default(),
589+
)
550590
.unwrap();
551591
let release_held_htlc_om_3_0 =
552592
pass_async_payments_oms(static_invoice, &nodes[0], &nodes[1], &nodes[3]).1;
@@ -630,7 +670,15 @@ fn amount_doesnt_match_invreq() {
630670
let payment_id = PaymentId([1; 32]);
631671
nodes[0]
632672
.node
633-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), None)
673+
.pay_for_offer(
674+
&offer,
675+
None,
676+
Some(amt_msat),
677+
None,
678+
payment_id,
679+
Retry::Attempts(1),
680+
RouteParametersConfig::default(),
681+
)
634682
.unwrap();
635683
let release_held_htlc_om_3_0 =
636684
pass_async_payments_oms(static_invoice, &nodes[0], &nodes[1], &nodes[3]).1;
@@ -859,7 +907,15 @@ fn invalid_async_receive_with_retry<F1, F2>(
859907

860908
nodes[0]
861909
.node
862-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(2), None)
910+
.pay_for_offer(
911+
&offer,
912+
None,
913+
Some(amt_msat),
914+
None,
915+
payment_id,
916+
Retry::Attempts(2),
917+
RouteParametersConfig::default(),
918+
)
863919
.unwrap();
864920
let release_held_htlc_om_2_0 =
865921
pass_async_payments_oms(static_invoice, &nodes[0], &nodes[1], &nodes[2]).1;
@@ -948,7 +1004,15 @@ fn expired_static_invoice_message_path() {
9481004
let payment_id = PaymentId([1; 32]);
9491005
nodes[0]
9501006
.node
951-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(1), None)
1007+
.pay_for_offer(
1008+
&offer,
1009+
None,
1010+
Some(amt_msat),
1011+
None,
1012+
payment_id,
1013+
Retry::Attempts(1),
1014+
RouteParametersConfig::default(),
1015+
)
9521016
.unwrap();
9531017

9541018
// While the invoice is unexpired, respond with release_held_htlc.
@@ -1052,7 +1116,15 @@ fn expired_static_invoice_payment_path() {
10521116
let payment_id = PaymentId([1; 32]);
10531117
nodes[0]
10541118
.node
1055-
.pay_for_offer(&offer, None, Some(amt_msat), None, payment_id, Retry::Attempts(0), None)
1119+
.pay_for_offer(
1120+
&offer,
1121+
None,
1122+
Some(amt_msat),
1123+
None,
1124+
payment_id,
1125+
Retry::Attempts(0),
1126+
RouteParametersConfig::default(),
1127+
)
10561128
.unwrap();
10571129
let release_held_htlc_om =
10581130
pass_async_payments_oms(static_invoice, &nodes[0], &nodes[1], &nodes[2]).1;

lightning/src/ln/channelmanager.rs

+14-11
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: 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: 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: 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: 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: 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/max_payment_path_len_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::ln::onion_utils::MIN_FINAL_VALUE_ESTIMATE_WITH_OVERPAY;
2626
use crate::ln::outbound_payment::{RecipientOnionFields, Retry, RetryableSendFailure};
2727
use crate::offers::nonce::Nonce;
2828
use crate::prelude::*;
29-
use crate::routing::router::{DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA, PaymentParameters, RouteParameters};
29+
use crate::routing::router::{PaymentParameters, RouteParameters, RouteParametersConfig, DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA};
3030
use crate::sign::NodeSigner;
3131
use crate::util::errors::APIError;
3232
use crate::util::ser::Writeable;
@@ -393,7 +393,7 @@ fn bolt12_invoice_too_large_blinded_paths() {
393393

394394
let offer = nodes[1].node.create_offer_builder(None).unwrap().build().unwrap();
395395
let payment_id = PaymentId([1; 32]);
396-
nodes[0].node.pay_for_offer(&offer, None, Some(5000), None, payment_id, Retry::Attempts(0), None).unwrap();
396+
nodes[0].node.pay_for_offer(&offer, None, Some(5000), None, payment_id, Retry::Attempts(0), RouteParametersConfig::default()).unwrap();
397397
let invreq_om = nodes[0].onion_messenger.next_onion_message_for_peer(nodes[1].node.get_our_node_id()).unwrap();
398398
nodes[1].onion_messenger.handle_onion_message(nodes[0].node.get_our_node_id(), &invreq_om);
399399

0 commit comments

Comments
 (0)