Skip to content

Commit 0edb0e2

Browse files
committed
Expose the channel via which we received a payment
We expose the `channel_id` and `user_channel_id` via which we received a payment in the `PaymentReceived` event.
1 parent 64b9e83 commit 0edb0e2

File tree

6 files changed

+74
-31
lines changed

6 files changed

+74
-31
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,11 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
200200
let events_3 = nodes[1].node.get_and_clear_pending_events();
201201
assert_eq!(events_3.len(), 1);
202202
match events_3[0] {
203-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
203+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
204204
assert_eq!(payment_hash_1, *payment_hash);
205205
assert_eq!(amount_msat, 1_000_000);
206206
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
207+
assert_eq!(via_channel_id, Some(channel_id));
207208
match &purpose {
208209
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
209210
assert!(payment_preimage.is_none());
@@ -568,10 +569,11 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
568569
let events_5 = nodes[1].node.get_and_clear_pending_events();
569570
assert_eq!(events_5.len(), 1);
570571
match events_5[0] {
571-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
572+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
572573
assert_eq!(payment_hash_2, *payment_hash);
573574
assert_eq!(amount_msat, 1_000_000);
574575
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
576+
assert_eq!(via_channel_id, Some(channel_id));
575577
match &purpose {
576578
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
577579
assert!(payment_preimage.is_none());
@@ -684,10 +686,11 @@ fn test_monitor_update_fail_cs() {
684686
let events = nodes[1].node.get_and_clear_pending_events();
685687
assert_eq!(events.len(), 1);
686688
match events[0] {
687-
Event::PaymentReceived { payment_hash, ref purpose, amount_msat, receiver_node_id } => {
689+
Event::PaymentReceived { payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
688690
assert_eq!(payment_hash, our_payment_hash);
689691
assert_eq!(amount_msat, 1_000_000);
690692
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
693+
assert_eq!(via_channel_id, Some(channel_id));
691694
match &purpose {
692695
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
693696
assert!(payment_preimage.is_none());
@@ -1627,7 +1630,8 @@ fn test_monitor_update_fail_claim() {
16271630
commitment_signed_dance!(nodes[1], nodes[2], payment_event.commitment_msg, false, true);
16281631

16291632
// Now restore monitor updating on the 0<->1 channel and claim the funds on B.
1630-
let (outpoint, latest_update, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&chan_1.2).unwrap().clone();
1633+
let channel_id = chan_1.2;
1634+
let (outpoint, latest_update, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
16311635
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(outpoint, latest_update);
16321636
check_added_monitors!(nodes[1], 0);
16331637

@@ -1648,10 +1652,12 @@ fn test_monitor_update_fail_claim() {
16481652
let events = nodes[0].node.get_and_clear_pending_events();
16491653
assert_eq!(events.len(), 2);
16501654
match events[0] {
1651-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1655+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id } => {
16521656
assert_eq!(payment_hash_2, *payment_hash);
16531657
assert_eq!(1_000_000, amount_msat);
16541658
assert_eq!(receiver_node_id.unwrap(), nodes[0].node.get_our_node_id());
1659+
assert_eq!(via_channel_id, Some(channel_id));
1660+
assert_eq!(via_user_channel_id, Some(42));
16551661
match &purpose {
16561662
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
16571663
assert!(payment_preimage.is_none());
@@ -1663,10 +1669,11 @@ fn test_monitor_update_fail_claim() {
16631669
_ => panic!("Unexpected event"),
16641670
}
16651671
match events[1] {
1666-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1672+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
16671673
assert_eq!(payment_hash_3, *payment_hash);
16681674
assert_eq!(1_000_000, amount_msat);
16691675
assert_eq!(receiver_node_id.unwrap(), nodes[0].node.get_our_node_id());
1676+
assert_eq!(via_channel_id, Some(channel_id));
16701677
match &purpose {
16711678
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
16721679
assert!(payment_preimage.is_none());

lightning/src/ln/channelmanager.rs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ pub(super) struct PendingAddHTLCInfo {
142142
prev_short_channel_id: u64,
143143
prev_htlc_id: u64,
144144
prev_funding_outpoint: OutPoint,
145+
prev_user_channel_id: u128,
145146
}
146147

147148
pub(super) enum HTLCForwardInfo {
@@ -3025,7 +3026,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
30253026

30263027
let mut new_events = Vec::new();
30273028
let mut failed_forwards = Vec::new();
3028-
let mut phantom_receives: Vec<(u64, OutPoint, Vec<(PendingHTLCInfo, u64)>)> = Vec::new();
3029+
let mut phantom_receives: Vec<(u64, OutPoint, u128, Vec<(PendingHTLCInfo, u64)>)> = Vec::new();
30293030
let mut handle_errors = Vec::new();
30303031
{
30313032
let mut forward_htlcs = HashMap::new();
@@ -3038,7 +3039,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
30383039
for forward_info in pending_forwards.drain(..) {
30393040
match forward_info {
30403041
HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
3041-
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint,
3042+
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id,
30423043
forward_info: PendingHTLCInfo {
30433044
routing, incoming_shared_secret, payment_hash, outgoing_amt_msat,
30443045
outgoing_cltv_value, incoming_amt_msat: _
@@ -3104,7 +3105,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
31043105
match next_hop {
31053106
onion_utils::Hop::Receive(hop_data) => {
31063107
match self.construct_recv_pending_htlc_info(hop_data, incoming_shared_secret, payment_hash, outgoing_amt_msat, outgoing_cltv_value, Some(phantom_shared_secret)) {
3107-
Ok(info) => phantom_receives.push((prev_short_channel_id, prev_funding_outpoint, vec![(info, prev_htlc_id)])),
3108+
Ok(info) => phantom_receives.push((prev_short_channel_id, prev_funding_outpoint, prev_user_channel_id, vec![(info, prev_htlc_id)])),
31083109
Err(ReceiveError { err_code, err_data, msg }) => failed_payment!(msg, err_code, err_data, Some(phantom_shared_secret))
31093110
}
31103111
},
@@ -3147,7 +3148,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
31473148
for forward_info in pending_forwards.drain(..) {
31483149
match forward_info {
31493150
HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
3150-
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint ,
3151+
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id: _,
31513152
forward_info: PendingHTLCInfo {
31523153
incoming_shared_secret, payment_hash, outgoing_amt_msat, outgoing_cltv_value,
31533154
routing: PendingHTLCRouting::Forward { onion_packet, .. }, incoming_amt_msat: _,
@@ -3274,7 +3275,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
32743275
for forward_info in pending_forwards.drain(..) {
32753276
match forward_info {
32763277
HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
3277-
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint,
3278+
prev_short_channel_id, prev_htlc_id, prev_funding_outpoint, prev_user_channel_id,
32783279
forward_info: PendingHTLCInfo {
32793280
routing, incoming_shared_secret, payment_hash, outgoing_amt_msat, ..
32803281
}
@@ -3369,12 +3370,15 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
33693370
log_bytes!(payment_hash.0), total_value, $payment_data.total_msat);
33703371
fail_htlc!(claimable_htlc, payment_hash);
33713372
} else if total_value == $payment_data.total_msat {
3373+
let prev_channel_id = prev_funding_outpoint.to_channel_id();
33723374
htlcs.push(claimable_htlc);
33733375
new_events.push(events::Event::PaymentReceived {
33743376
receiver_node_id: Some(receiver_node_id),
33753377
payment_hash,
33763378
purpose: purpose(),
33773379
amount_msat: total_value,
3380+
via_channel_id: Some(prev_channel_id),
3381+
via_user_channel_id: Some(prev_user_channel_id),
33783382
});
33793383
payment_received_generated = true;
33803384
} else {
@@ -3413,11 +3417,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
34133417
hash_map::Entry::Vacant(e) => {
34143418
let purpose = events::PaymentPurpose::SpontaneousPayment(preimage);
34153419
e.insert((purpose.clone(), vec![claimable_htlc]));
3420+
let prev_channel_id = prev_funding_outpoint.to_channel_id();
34163421
new_events.push(events::Event::PaymentReceived {
34173422
receiver_node_id: Some(receiver_node_id),
34183423
payment_hash,
34193424
amount_msat: outgoing_amt_msat,
34203425
purpose,
3426+
via_channel_id: Some(prev_channel_id),
3427+
via_user_channel_id: Some(prev_user_channel_id),
34213428
});
34223429
},
34233430
hash_map::Entry::Occupied(_) => {
@@ -4389,13 +4396,13 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
43894396
commitment_update: Option<msgs::CommitmentUpdate>, order: RAACommitmentOrder,
43904397
pending_forwards: Vec<(PendingHTLCInfo, u64)>, funding_broadcastable: Option<Transaction>,
43914398
channel_ready: Option<msgs::ChannelReady>, announcement_sigs: Option<msgs::AnnouncementSignatures>)
4392-
-> Option<(u64, OutPoint, Vec<(PendingHTLCInfo, u64)>)> {
4399+
-> Option<(u64, OutPoint, u128, Vec<(PendingHTLCInfo, u64)>)> {
43934400
let mut htlc_forwards = None;
43944401

43954402
let counterparty_node_id = channel.get_counterparty_node_id();
43964403
if !pending_forwards.is_empty() {
43974404
htlc_forwards = Some((channel.get_short_channel_id().unwrap_or(channel.outbound_scid_alias()),
4398-
channel.get_funding_txo().unwrap(), pending_forwards));
4405+
channel.get_funding_txo().unwrap(), channel.get_user_id(), pending_forwards));
43994406
}
44004407

44014408
if let Some(msg) = channel_ready {
@@ -5056,8 +5063,8 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
50565063
}
50575064

50585065
#[inline]
5059-
fn forward_htlcs(&self, per_source_pending_forwards: &mut [(u64, OutPoint, Vec<(PendingHTLCInfo, u64)>)]) {
5060-
for &mut (prev_short_channel_id, prev_funding_outpoint, ref mut pending_forwards) in per_source_pending_forwards {
5066+
fn forward_htlcs(&self, per_source_pending_forwards: &mut [(u64, OutPoint, u128, Vec<(PendingHTLCInfo, u64)>)]) {
5067+
for &mut (prev_short_channel_id, prev_funding_outpoint, prev_user_channel_id, ref mut pending_forwards) in per_source_pending_forwards {
50615068
let mut forward_event = None;
50625069
if !pending_forwards.is_empty() {
50635070
let mut forward_htlcs = self.forward_htlcs.lock().unwrap();
@@ -5072,11 +5079,11 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
50725079
}) {
50735080
hash_map::Entry::Occupied(mut entry) => {
50745081
entry.get_mut().push(HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
5075-
prev_short_channel_id, prev_funding_outpoint, prev_htlc_id, forward_info }));
5082+
prev_short_channel_id, prev_funding_outpoint, prev_htlc_id, prev_user_channel_id, forward_info }));
50765083
},
50775084
hash_map::Entry::Vacant(entry) => {
50785085
entry.insert(vec!(HTLCForwardInfo::AddHTLC(PendingAddHTLCInfo {
5079-
prev_short_channel_id, prev_funding_outpoint, prev_htlc_id, forward_info })));
5086+
prev_short_channel_id, prev_funding_outpoint, prev_htlc_id, prev_user_channel_id, forward_info })));
50805087
}
50815088
}
50825089
}
@@ -5135,21 +5142,22 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
51355142
raa_updates.finalized_claimed_htlcs,
51365143
chan.get().get_short_channel_id()
51375144
.unwrap_or(chan.get().outbound_scid_alias()),
5138-
chan.get().get_funding_txo().unwrap()))
5145+
chan.get().get_funding_txo().unwrap(),
5146+
chan.get().get_user_id()))
51395147
},
51405148
hash_map::Entry::Vacant(_) => break Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel".to_owned(), msg.channel_id))
51415149
}
51425150
};
51435151
self.fail_holding_cell_htlcs(htlcs_to_fail, msg.channel_id, counterparty_node_id);
51445152
match res {
51455153
Ok((pending_forwards, mut pending_failures, finalized_claim_htlcs,
5146-
short_channel_id, channel_outpoint)) =>
5154+
short_channel_id, channel_outpoint, user_channel_id)) =>
51475155
{
51485156
for failure in pending_failures.drain(..) {
51495157
let receiver = HTLCDestination::NextHopChannel { node_id: Some(*counterparty_node_id), channel_id: channel_outpoint.to_channel_id() };
51505158
self.fail_htlc_backwards_internal(failure.0, &failure.1, failure.2, receiver);
51515159
}
5152-
self.forward_htlcs(&mut [(short_channel_id, channel_outpoint, pending_forwards)]);
5160+
self.forward_htlcs(&mut [(short_channel_id, channel_outpoint, user_channel_id, pending_forwards)]);
51535161
self.finalize_claims(finalized_claim_htlcs);
51545162
Ok(())
51555163
},
@@ -6127,7 +6135,7 @@ where
61276135
}
61286136
}
61296137

6130-
impl<M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
6138+
impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref >
61316139
ChannelMessageHandler for ChannelManager<M, T, K, F, L>
61326140
where M::Target: chain::Watch<<K::Target as KeysInterface>::Signer>,
61336141
T::Target: BroadcasterInterface,
@@ -6799,6 +6807,7 @@ impl_writeable_tlv_based_enum!(HTLCFailReason,
67996807

68006808
impl_writeable_tlv_based!(PendingAddHTLCInfo, {
68016809
(0, forward_info, required),
6810+
(1, prev_user_channel_id, (default_value, 0)),
68026811
(2, prev_short_channel_id, required),
68036812
(4, prev_htlc_id, required),
68046813
(6, prev_funding_outpoint, required),

lightning/src/ln/functional_test_utils.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,7 +1479,7 @@ macro_rules! expect_payment_received {
14791479
let events = $node.node.get_and_clear_pending_events();
14801480
assert_eq!(events.len(), 1);
14811481
match events[0] {
1482-
$crate::util::events::Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1482+
$crate::util::events::Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id: _, via_user_channel_id: _ } => {
14831483
assert_eq!($expected_payment_hash, *payment_hash);
14841484
assert_eq!($expected_recv_value, amount_msat);
14851485
assert_eq!($expected_receiver_node_id, receiver_node_id.unwrap());
@@ -1774,7 +1774,7 @@ pub fn do_pass_along_path<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_p
17741774
if payment_received_expected {
17751775
assert_eq!(events_2.len(), 1);
17761776
match events_2[0] {
1777-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1777+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, ref via_channel_id, ref via_user_channel_id } => {
17781778
assert_eq!(our_payment_hash, *payment_hash);
17791779
assert_eq!(node.node.get_our_node_id(), receiver_node_id.unwrap());
17801780
match &purpose {
@@ -1788,6 +1788,8 @@ pub fn do_pass_along_path<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_p
17881788
},
17891789
}
17901790
assert_eq!(amount_msat, recv_value);
1791+
assert!(node.node.list_channels().iter().any(|details| details.channel_id == via_channel_id.unwrap()));
1792+
assert!(node.node.list_channels().iter().any(|details| details.user_channel_id == via_user_channel_id.unwrap()));
17911793
},
17921794
_ => panic!("Unexpected event"),
17931795
}

lightning/src/ln/functional_tests.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1956,10 +1956,11 @@ fn test_channel_reserve_holding_cell_htlcs() {
19561956
let events = nodes[2].node.get_and_clear_pending_events();
19571957
assert_eq!(events.len(), 2);
19581958
match events[0] {
1959-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1959+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
19601960
assert_eq!(our_payment_hash_21, *payment_hash);
19611961
assert_eq!(recv_value_21, amount_msat);
19621962
assert_eq!(nodes[2].node.get_our_node_id(), receiver_node_id.unwrap());
1963+
assert_eq!(via_channel_id, Some(chan_2.2));
19631964
match &purpose {
19641965
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
19651966
assert!(payment_preimage.is_none());
@@ -1971,10 +1972,11 @@ fn test_channel_reserve_holding_cell_htlcs() {
19711972
_ => panic!("Unexpected event"),
19721973
}
19731974
match events[1] {
1974-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1975+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
19751976
assert_eq!(our_payment_hash_22, *payment_hash);
19761977
assert_eq!(recv_value_22, amount_msat);
19771978
assert_eq!(nodes[2].node.get_our_node_id(), receiver_node_id.unwrap());
1979+
assert_eq!(via_channel_id, Some(chan_2.2));
19781980
match &purpose {
19791981
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
19801982
assert!(payment_preimage.is_none());
@@ -3625,15 +3627,16 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
36253627
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
36263628

36273629
let mut as_channel_ready = None;
3628-
if messages_delivered == 0 {
3629-
let (channel_ready, _, _) = create_chan_between_nodes_with_value_a(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
3630+
let channel_id = if messages_delivered == 0 {
3631+
let (channel_ready, chan_id, _) = create_chan_between_nodes_with_value_a(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
36303632
as_channel_ready = Some(channel_ready);
36313633
// nodes[1] doesn't receive the channel_ready message (it'll be re-sent on reconnect)
36323634
// Note that we store it so that if we're running with `simulate_broken_lnd` we can deliver
36333635
// it before the channel_reestablish message.
3636+
chan_id
36343637
} else {
3635-
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
3636-
}
3638+
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2
3639+
};
36373640

36383641
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1_000_000);
36393642

@@ -3736,10 +3739,11 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
37363739
let events_2 = nodes[1].node.get_and_clear_pending_events();
37373740
assert_eq!(events_2.len(), 1);
37383741
match events_2[0] {
3739-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
3742+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
37403743
assert_eq!(payment_hash_1, *payment_hash);
37413744
assert_eq!(amount_msat, 1_000_000);
37423745
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
3746+
assert_eq!(via_channel_id, Some(channel_id));
37433747
match &purpose {
37443748
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
37453749
assert!(payment_preimage.is_none());

0 commit comments

Comments
 (0)