Skip to content

Commit 1395bd7

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 6173a10 commit 1395bd7

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

@@ -2749,7 +2753,7 @@ where
27492753
/// Note that `route` must have exactly one path.
27502754
///
27512755
/// [`send_payment`]: Self::send_payment
2752-
pub fn send_spontaneous_payment(&self, route: &Route, payment_preimage: Option<PaymentPreimage>, payment_id: PaymentId) -> Result<PaymentHash, PaymentSendFailure> {
2756+
pub fn send_spontaneous_payment(&self, route: &Route, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields, payment_id: PaymentId) -> Result<PaymentHash, PaymentSendFailure> {
27532757
let best_block_height = self.best_block.read().unwrap().height();
27542758
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27552759
self.pending_outbound_payments.send_spontaneous_payment_with_route(
@@ -2766,7 +2770,7 @@ where
27662770
/// payments.
27672771
///
27682772
/// [`PaymentParameters::for_keysend`]: crate::routing::router::PaymentParameters::for_keysend
2769-
pub fn send_spontaneous_payment_with_retry(&self, payment_preimage: Option<PaymentPreimage>, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry) -> Result<PaymentHash, RetryableSendFailure> {
2773+
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> {
27702774
let best_block_height = self.best_block.read().unwrap().height();
27712775
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27722776
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, payment_id,
@@ -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);
@@ -8184,7 +8189,8 @@ mod tests {
81848189
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
81858190
None, nodes[0].logger, &scorer, &random_seed_bytes
81868191
).unwrap();
8187-
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8192+
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8193+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
81888194
check_added_monitors!(nodes[0], 1);
81898195
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
81908196
assert_eq!(events.len(), 1);
@@ -8217,7 +8223,8 @@ mod tests {
82178223
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
82188224
None, nodes[0].logger, &scorer, &random_seed_bytes
82198225
).unwrap();
8220-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
8226+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage),
8227+
RecipientOnionFields::spontaneous_empty(), PaymentId(payment_preimage.0)).unwrap();
82218228
check_added_monitors!(nodes[0], 1);
82228229
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
82238230
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
@@ -9492,7 +9492,8 @@ fn test_keysend_payments_to_public_node() {
94929492
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
94939493

94949494
let test_preimage = PaymentPreimage([42; 32]);
9495-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
9495+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
9496+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
94969497
check_added_monitors!(nodes[0], 1);
94979498
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
94989499
assert_eq!(events.len(), 1);
@@ -9527,7 +9528,8 @@ fn test_keysend_payments_to_private_node() {
95279528
).unwrap();
95289529

95299530
let test_preimage = PaymentPreimage([42; 32]);
9530-
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
9531+
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
9532+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap();
95319533
check_added_monitors!(nodes[0], 1);
95329534
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
95339535
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)