Skip to content

Commit 8d2b39a

Browse files
committed
Add a RecipientOnionFields argument to spontaneous payment sends
While most lightning nodes don't (currently) support providing a payment secret or payment metadata for spontaneous payments, there's no specific technical reason why we shouldn't support sending those fields to a recipient. Further, when we eventually move to allowing custom TLV entries in the recipient's onion TLV stream, we'll want to support it for spontaneous payments as well. Here we simply add the new `RecipientOnionFields` struct as an argument to the spontaneous payment send methods. We don't yet plumb it through the payment sending logic, which will come when we plumb the new struct through the sending logic to replace the existing payment secret arguments.
1 parent 3c1a7f5 commit 8d2b39a

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ pub struct RecipientOnionFields {
239239
///
240240
/// If you do not have one, the [`Route`] you pay over must not contain multiple paths as
241241
/// multi-path payments require a recipient-provided secret.
242+
///
243+
/// Note that for spontaneous payments most lightning nodes do not currently support MPP
244+
/// receives, thus you should generally never be providing a secret here for spontaneous
245+
/// payments.
242246
pub payment_secret: Option<PaymentSecret>,
243247
}
244248

@@ -2736,7 +2740,7 @@ where
27362740
/// Note that `route` must have exactly one path.
27372741
///
27382742
/// [`send_payment`]: Self::send_payment
2739-
pub fn send_spontaneous_payment(&self, route: &Route, payment_preimage: Option<PaymentPreimage>, payment_id: PaymentId) -> Result<PaymentHash, PaymentSendFailure> {
2743+
pub fn send_spontaneous_payment(&self, route: &Route, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields, payment_id: PaymentId) -> Result<PaymentHash, PaymentSendFailure> {
27402744
let best_block_height = self.best_block.read().unwrap().height();
27412745
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27422746
self.pending_outbound_payments.send_spontaneous_payment_with_route(
@@ -2753,7 +2757,7 @@ where
27532757
/// payments.
27542758
///
27552759
/// [`PaymentParameters::for_keysend`]: crate::routing::router::PaymentParameters::for_keysend
2756-
pub fn send_spontaneous_payment_with_retry(&self, payment_preimage: Option<PaymentPreimage>, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry) -> Result<PaymentHash, RetryableSendFailure> {
2760+
pub fn send_spontaneous_payment_with_retry(&self, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry) -> Result<PaymentHash, RetryableSendFailure> {
27572761
let best_block_height = self.best_block.read().unwrap().height();
27582762
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27592763
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, payment_id,
@@ -8062,7 +8066,8 @@ mod tests {
80628066
pass_along_path(&nodes[0], &[&nodes[1]], 200_000, our_payment_hash, Some(payment_secret), events.drain(..).next().unwrap(), false, None);
80638067

80648068
// Next, send a keysend payment with the same payment_hash and make sure it fails.
8065-
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8069+
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8070+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
80668071
check_added_monitors!(nodes[0], 1);
80678072
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80688073
assert_eq!(events.len(), 1);
@@ -8182,7 +8187,8 @@ mod tests {
81828187
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
81838188
None, nodes[0].logger, &scorer, &random_seed_bytes
81848189
).unwrap();
8185-
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8190+
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8191+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
81868192
check_added_monitors!(nodes[0], 1);
81878193
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
81888194
assert_eq!(events.len(), 1);
@@ -8215,7 +8221,8 @@ mod tests {
82158221
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
82168222
None, nodes[0].logger, &scorer, &random_seed_bytes
82178223
).unwrap();
8218-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8224+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8225+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
82198226
check_added_monitors!(nodes[0], 1);
82208227
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
82218228
assert_eq!(events.len(), 1);

lightning/src/ln/functional_tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9481,7 +9481,8 @@ fn test_keysend_payments_to_public_node() {
94819481
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
94829482

94839483
let test_preimage = PaymentPreimage([42; 32]);
9484-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
9484+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
9485+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
94859486
check_added_monitors!(nodes[0], 1);
94869487
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
94879488
assert_eq!(events.len(), 1);
@@ -9516,7 +9517,8 @@ fn test_keysend_payments_to_private_node() {
95169517
).unwrap();
95179518

95189519
let test_preimage = PaymentPreimage([42; 32]);
9519-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
9520+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
9521+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
95209522
check_added_monitors!(nodes[0], 1);
95219523
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
95229524
assert_eq!(events.len(), 1);

lightning/src/ln/payment_tests.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,8 @@ fn claimed_send_payment_idempotent() {
10871087

10881088
// Further, if we try to send a spontaneous payment with the same payment_id it should
10891089
// also be rejected.
1090-
let send_result = nodes[0].node.send_spontaneous_payment(&route, None, payment_id);
1090+
let send_result = nodes[0].node.send_spontaneous_payment(
1091+
&route, None, RecipientOnionFields::spontaneous_empty(), payment_id);
10911092
match send_result {
10921093
Err(PaymentSendFailure::DuplicatePayment) => {},
10931094
_ => panic!("Unexpected send result: {:?}", send_result),
@@ -1161,7 +1162,8 @@ fn abandoned_send_payment_idempotent() {
11611162

11621163
// Further, if we try to send a spontaneous payment with the same payment_id it should
11631164
// also be rejected.
1164-
let send_result = nodes[0].node.send_spontaneous_payment(&route, None, payment_id);
1165+
let send_result = nodes[0].node.send_spontaneous_payment(
1166+
&route, None, RecipientOnionFields::spontaneous_empty(), payment_id);
11651167
match send_result {
11661168
Err(PaymentSendFailure::DuplicatePayment) => {},
11671169
_ => panic!("Unexpected send result: {:?}", send_result),
@@ -1671,7 +1673,9 @@ fn do_automatic_retries(test: AutoRetry) {
16711673
pass_along_path(&nodes[0], &[&nodes[1], &nodes[2]], amt_msat, payment_hash, Some(payment_secret), msg_events.pop().unwrap(), true, None);
16721674
claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], false, payment_preimage);
16731675
} else if test == AutoRetry::Spontaneous {
1674-
nodes[0].node.send_spontaneous_payment_with_retry(Some(payment_preimage), PaymentId(payment_hash.0), route_params, Retry::Attempts(1)).unwrap();
1676+
nodes[0].node.send_spontaneous_payment_with_retry(Some(payment_preimage),
1677+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_hash.0), route_params,
1678+
Retry::Attempts(1)).unwrap();
16751679
pass_failed_attempt_with_retry_along_path!(channel_id_2, true);
16761680

16771681
// Open a new channel with liquidity on the second hop so we can find a route for the retry

0 commit comments

Comments
 (0)