Skip to content

Commit 7b0eed4

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 2f952b3 commit 7b0eed4

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, recipient_onion,
@@ -8064,7 +8068,8 @@ mod tests {
80648068
pass_along_path(&nodes[0], &[&nodes[1]], 200_000, our_payment_hash, Some(payment_secret), events.drain(..).next().unwrap(), false, None);
80658069

80668070
// Next, send a keysend payment with the same payment_hash and make sure it fails.
8067-
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8071+
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8072+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
80688073
check_added_monitors!(nodes[0], 1);
80698074
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80708075
assert_eq!(events.len(), 1);
@@ -8185,7 +8190,8 @@ mod tests {
81858190
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
81868191
None, nodes[0].logger, &scorer, &random_seed_bytes
81878192
).unwrap();
8188-
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8193+
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8194+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
81898195
check_added_monitors!(nodes[0], 1);
81908196
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
81918197
assert_eq!(events.len(), 1);
@@ -8218,7 +8224,8 @@ mod tests {
82188224
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
82198225
None, nodes[0].logger, &scorer, &random_seed_bytes
82208226
).unwrap();
8221-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8227+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8228+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
82228229
check_added_monitors!(nodes[0], 1);
82238230
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
82248231
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
@@ -9500,7 +9500,8 @@ fn test_keysend_payments_to_public_node() {
95009500
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
95019501

95029502
let test_preimage = PaymentPreimage([42; 32]);
9503-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
9503+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
9504+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
95049505
check_added_monitors!(nodes[0], 1);
95059506
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
95069507
assert_eq!(events.len(), 1);
@@ -9535,7 +9536,8 @@ fn test_keysend_payments_to_private_node() {
95359536
).unwrap();
95369537

95379538
let test_preimage = PaymentPreimage([42; 32]);
9538-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
9539+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
9540+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
95399541
check_added_monitors!(nodes[0], 1);
95409542
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
95419543
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)