Skip to content

Commit 7d2d047

Browse files
authored
Merge pull request #3084 from jkczyz/2024-05-onion-fields
Include `RecipientOnionFields` in `Event::PaymentClaimed`
2 parents df01208 + 8499214 commit 7d2d047

10 files changed

+176
-69
lines changed

lightning-invoice/src/utils.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1397,7 +1397,9 @@ mod test {
13971397
let payment_preimage_opt = if user_generated_pmt_hash { None } else { Some(payment_preimage) };
13981398
assert_eq!(other_events.borrow().len(), 1);
13991399
check_payment_claimable(&other_events.borrow()[0], payment_hash, payment_secret, payment_amt, payment_preimage_opt, invoice.recover_payee_pub_key());
1400-
do_claim_payment_along_route(&nodes[0], &[&vec!(&nodes[fwd_idx])[..]], false, payment_preimage);
1400+
do_claim_payment_along_route(
1401+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[fwd_idx]]], payment_preimage)
1402+
);
14011403
expect_payment_sent(&nodes[0], payment_preimage, None, true, true);
14021404
}
14031405

lightning/src/events/mod.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,11 @@ pub enum Event {
653653
/// The sender-intended sum total of all the MPP parts. This will be `None` for events
654654
/// serialized prior to LDK version 0.0.117.
655655
sender_intended_total_msat: Option<u64>,
656+
/// The fields in the onion which were received with each HTLC. Only fields which were
657+
/// identical in each HTLC involved in the payment will be included here.
658+
///
659+
/// Payments received on LDK versions prior to 0.0.124 will have this field unset.
660+
onion_fields: Option<RecipientOnionFields>,
656661
},
657662
/// Indicates that a peer connection with a node is needed in order to send an [`OnionMessage`].
658663
///
@@ -1348,7 +1353,7 @@ impl Writeable for Event {
13481353
// We never write the OpenChannelRequest events as, upon disconnection, peers
13491354
// drop any channels which have not yet exchanged funding_signed.
13501355
},
1351-
&Event::PaymentClaimed { ref payment_hash, ref amount_msat, ref purpose, ref receiver_node_id, ref htlcs, ref sender_intended_total_msat } => {
1356+
&Event::PaymentClaimed { ref payment_hash, ref amount_msat, ref purpose, ref receiver_node_id, ref htlcs, ref sender_intended_total_msat, ref onion_fields } => {
13521357
19u8.write(writer)?;
13531358
write_tlv_fields!(writer, {
13541359
(0, payment_hash, required),
@@ -1357,6 +1362,7 @@ impl Writeable for Event {
13571362
(4, amount_msat, required),
13581363
(5, *htlcs, optional_vec),
13591364
(7, sender_intended_total_msat, option),
1365+
(9, onion_fields, option),
13601366
});
13611367
},
13621368
&Event::ProbeSuccessful { ref payment_id, ref payment_hash, ref path } => {
@@ -1719,13 +1725,15 @@ impl MaybeReadable for Event {
17191725
let mut receiver_node_id = None;
17201726
let mut htlcs: Option<Vec<ClaimedHTLC>> = Some(vec![]);
17211727
let mut sender_intended_total_msat: Option<u64> = None;
1728+
let mut onion_fields = None;
17221729
read_tlv_fields!(reader, {
17231730
(0, payment_hash, required),
17241731
(1, receiver_node_id, option),
17251732
(2, purpose, upgradable_required),
17261733
(4, amount_msat, required),
17271734
(5, htlcs, optional_vec),
17281735
(7, sender_intended_total_msat, option),
1736+
(9, onion_fields, option),
17291737
});
17301738
Ok(Some(Event::PaymentClaimed {
17311739
receiver_node_id,
@@ -1734,6 +1742,7 @@ impl MaybeReadable for Event {
17341742
amount_msat,
17351743
htlcs: htlcs.unwrap_or(vec![]),
17361744
sender_intended_total_msat,
1745+
onion_fields,
17371746
}))
17381747
};
17391748
f()

lightning/src/ln/blinded_payment_tests.rs

+19-6
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ fn mpp_to_one_hop_blinded_path() {
180180
let ev = remove_first_msg_event_to_node(&nodes[2].node.get_our_node_id(), &mut events);
181181
pass_along_path(&nodes[0], expected_route[1], amt_msat, payment_hash.clone(),
182182
Some(payment_secret), ev.clone(), true, None);
183-
claim_payment_along_route(&nodes[0], expected_route, false, payment_preimage);
183+
claim_payment_along_route(
184+
ClaimAlongRouteArgs::new(&nodes[0], expected_route, payment_preimage)
185+
);
184186
}
185187

186188
#[test]
@@ -244,7 +246,9 @@ fn mpp_to_three_hop_blinded_paths() {
244246
let ev = remove_first_msg_event_to_node(&nodes[2].node.get_our_node_id(), &mut events);
245247
pass_along_path(&nodes[0], expected_route[1], amt_msat, payment_hash.clone(),
246248
Some(payment_secret), ev.clone(), true, None);
247-
claim_payment_along_route(&nodes[0], expected_route, false, payment_preimage);
249+
claim_payment_along_route(
250+
ClaimAlongRouteArgs::new(&nodes[0], expected_route, payment_preimage)
251+
);
248252
}
249253

250254
enum ForwardCheckFail {
@@ -643,7 +647,9 @@ fn do_blinded_intercept_payment(intercept_node_fails: bool) {
643647
expect_pending_htlcs_forwardable!(nodes[2]);
644648

645649
expect_payment_claimable!(&nodes[2], payment_hash, payment_secret, amt_msat, None, nodes[2].node.get_our_node_id());
646-
do_claim_payment_along_route(&nodes[0], &vec!(&vec!(&nodes[1], &nodes[2])[..]), false, payment_preimage);
650+
do_claim_payment_along_route(
651+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[1], &nodes[2]]], payment_preimage)
652+
);
647653
expect_payment_sent(&nodes[0], payment_preimage, Some(Some(1000)), true, true);
648654
}
649655

@@ -1217,7 +1223,9 @@ fn blinded_keysend() {
12171223

12181224
let ev = remove_first_msg_event_to_node(&nodes[1].node.get_our_node_id(), &mut events);
12191225
pass_along_path(&nodes[0], expected_route[0], amt_msat, payment_hash, Some(payment_secret), ev.clone(), true, Some(keysend_preimage));
1220-
claim_payment_along_route(&nodes[0], expected_route, false, keysend_preimage);
1226+
claim_payment_along_route(
1227+
ClaimAlongRouteArgs::new(&nodes[0], expected_route, keysend_preimage)
1228+
);
12211229
}
12221230

12231231
#[test]
@@ -1268,7 +1276,9 @@ fn blinded_mpp_keysend() {
12681276
let ev = remove_first_msg_event_to_node(&nodes[2].node.get_our_node_id(), &mut events);
12691277
pass_along_path(&nodes[0], expected_route[1], amt_msat, payment_hash.clone(),
12701278
Some(payment_secret), ev.clone(), true, Some(keysend_preimage));
1271-
claim_payment_along_route(&nodes[0], expected_route, false, keysend_preimage);
1279+
claim_payment_along_route(
1280+
ClaimAlongRouteArgs::new(&nodes[0], expected_route, keysend_preimage)
1281+
);
12721282
}
12731283

12741284
#[test]
@@ -1316,5 +1326,8 @@ fn custom_tlvs_to_blinded_path() {
13161326
.with_payment_secret(payment_secret)
13171327
.with_custom_tlvs(recipient_onion_fields.custom_tlvs.clone());
13181328
do_pass_along_path(args);
1319-
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage);
1329+
claim_payment_along_route(
1330+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[1]]], payment_preimage)
1331+
.with_custom_tlvs(recipient_onion_fields.custom_tlvs.clone())
1332+
);
13201333
}

lightning/src/ln/chanmon_update_fail_tests.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -2025,7 +2025,9 @@ fn test_path_paused_mpp() {
20252025
assert_eq!(events.len(), 1);
20262026
pass_along_path(&nodes[0], &[&nodes[2], &nodes[3]], 200_000, payment_hash.clone(), Some(payment_secret), events.pop().unwrap(), true, None);
20272027

2028-
claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, payment_preimage);
2028+
claim_payment_along_route(
2029+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], payment_preimage)
2030+
);
20292031
}
20302032

20312033
#[test]

lightning/src/ln/channelmanager.rs

+25-12
Original file line numberDiff line numberDiff line change
@@ -681,13 +681,15 @@ struct ClaimingPayment {
681681
receiver_node_id: PublicKey,
682682
htlcs: Vec<events::ClaimedHTLC>,
683683
sender_intended_value: Option<u64>,
684+
onion_fields: Option<RecipientOnionFields>,
684685
}
685686
impl_writeable_tlv_based!(ClaimingPayment, {
686687
(0, amount_msat, required),
687688
(2, payment_purpose, required),
688689
(4, receiver_node_id, required),
689690
(5, htlcs, optional_vec),
690691
(7, sender_intended_value, option),
692+
(9, onion_fields, option),
691693
});
692694

693695
struct ClaimablePayment {
@@ -6325,19 +6327,27 @@ where
63256327
}
63266328
}
63276329

6328-
let htlcs = payment.htlcs.iter().map(events::ClaimedHTLC::from).collect();
6329-
let sender_intended_value = payment.htlcs.first().map(|htlc| htlc.total_msat);
6330-
let dup_purpose = claimable_payments.pending_claiming_payments.insert(payment_hash,
6331-
ClaimingPayment { amount_msat: payment.htlcs.iter().map(|source| source.value).sum(),
6332-
payment_purpose: payment.purpose, receiver_node_id, htlcs, sender_intended_value
6333-
});
6334-
if dup_purpose.is_some() {
6335-
debug_assert!(false, "Shouldn't get a duplicate pending claim event ever");
6336-
log_error!(self.logger, "Got a duplicate pending claimable event on payment hash {}! Please report this bug",
6337-
&payment_hash);
6338-
}
6330+
let claiming_payment = claimable_payments.pending_claiming_payments
6331+
.entry(payment_hash)
6332+
.and_modify(|_| {
6333+
debug_assert!(false, "Shouldn't get a duplicate pending claim event ever");
6334+
log_error!(self.logger, "Got a duplicate pending claimable event on payment hash {}! Please report this bug",
6335+
&payment_hash);
6336+
})
6337+
.or_insert_with(|| {
6338+
let htlcs = payment.htlcs.iter().map(events::ClaimedHTLC::from).collect();
6339+
let sender_intended_value = payment.htlcs.first().map(|htlc| htlc.total_msat);
6340+
ClaimingPayment {
6341+
amount_msat: payment.htlcs.iter().map(|source| source.value).sum(),
6342+
payment_purpose: payment.purpose,
6343+
receiver_node_id,
6344+
htlcs,
6345+
sender_intended_value,
6346+
onion_fields: payment.onion_fields,
6347+
}
6348+
});
63396349

6340-
if let Some(RecipientOnionFields { ref custom_tlvs, .. }) = payment.onion_fields {
6350+
if let Some(RecipientOnionFields { ref custom_tlvs, .. }) = claiming_payment.onion_fields {
63416351
if !custom_tlvs_known && custom_tlvs.iter().any(|(typ, _)| typ % 2 == 0) {
63426352
log_info!(self.logger, "Rejecting payment with payment hash {} as we cannot accept payment with unknown even TLVs: {}",
63436353
&payment_hash, log_iter!(custom_tlvs.iter().map(|(typ, _)| typ).filter(|typ| *typ % 2 == 0)));
@@ -6744,6 +6754,7 @@ where
67446754
receiver_node_id,
67456755
htlcs,
67466756
sender_intended_value: sender_intended_total_msat,
6757+
onion_fields,
67476758
}) = payment {
67486759
self.pending_events.lock().unwrap().push_back((events::Event::PaymentClaimed {
67496760
payment_hash,
@@ -6752,6 +6763,7 @@ where
67526763
receiver_node_id: Some(receiver_node_id),
67536764
htlcs,
67546765
sender_intended_total_msat,
6766+
onion_fields,
67556767
}, None));
67566768
}
67576769
},
@@ -12273,6 +12285,7 @@ where
1227312285
amount_msat: claimable_amt_msat,
1227412286
htlcs: payment.htlcs.iter().map(events::ClaimedHTLC::from).collect(),
1227512287
sender_intended_total_msat: payment.htlcs.first().map(|htlc| htlc.total_msat),
12288+
onion_fields: payment.onion_fields,
1227612289
}, None));
1227712290
}
1227812291
}

lightning/src/ln/functional_test_utils.rs

+26-18
Original file line numberDiff line numberDiff line change
@@ -2716,18 +2716,12 @@ pub fn send_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, route: Route
27162716
(our_payment_preimage, our_payment_hash, our_payment_secret, payment_id)
27172717
}
27182718

2719-
pub fn do_claim_payment_along_route<'a, 'b, 'c>(
2720-
origin_node: &Node<'a, 'b, 'c>, expected_paths: &[&[&Node<'a, 'b, 'c>]], skip_last: bool,
2721-
our_payment_preimage: PaymentPreimage
2722-
) -> u64 {
2723-
for path in expected_paths.iter() {
2724-
assert_eq!(path.last().unwrap().node.get_our_node_id(), expected_paths[0].last().unwrap().node.get_our_node_id());
2719+
pub fn do_claim_payment_along_route(args: ClaimAlongRouteArgs) -> u64 {
2720+
for path in args.expected_paths.iter() {
2721+
assert_eq!(path.last().unwrap().node.get_our_node_id(), args.expected_paths[0].last().unwrap().node.get_our_node_id());
27252722
}
2726-
expected_paths[0].last().unwrap().node.claim_funds(our_payment_preimage);
2727-
pass_claimed_payment_along_route(
2728-
ClaimAlongRouteArgs::new(origin_node, expected_paths, our_payment_preimage)
2729-
.skip_last(skip_last)
2730-
)
2723+
args.expected_paths[0].last().unwrap().node.claim_funds(args.payment_preimage);
2724+
pass_claimed_payment_along_route(args)
27312725
}
27322726

27332727
pub struct ClaimAlongRouteArgs<'a, 'b, 'c, 'd> {
@@ -2737,6 +2731,7 @@ pub struct ClaimAlongRouteArgs<'a, 'b, 'c, 'd> {
27372731
pub expected_min_htlc_overpay: Vec<u32>,
27382732
pub skip_last: bool,
27392733
pub payment_preimage: PaymentPreimage,
2734+
pub custom_tlvs: Vec<(u64, Vec<u8>)>,
27402735
// Allow forwarding nodes to have taken 1 msat more fee than expected based on the downstream
27412736
// fulfill amount.
27422737
//
@@ -2755,7 +2750,7 @@ impl<'a, 'b, 'c, 'd> ClaimAlongRouteArgs<'a, 'b, 'c, 'd> {
27552750
Self {
27562751
origin_node, expected_paths, expected_extra_fees: vec![0; expected_paths.len()],
27572752
expected_min_htlc_overpay: vec![0; expected_paths.len()], skip_last: false, payment_preimage,
2758-
allow_1_msat_fee_overpay: false,
2753+
allow_1_msat_fee_overpay: false, custom_tlvs: vec![],
27592754
}
27602755
}
27612756
pub fn skip_last(mut self, skip_last: bool) -> Self {
@@ -2774,12 +2769,16 @@ impl<'a, 'b, 'c, 'd> ClaimAlongRouteArgs<'a, 'b, 'c, 'd> {
27742769
self.allow_1_msat_fee_overpay = true;
27752770
self
27762771
}
2772+
pub fn with_custom_tlvs(mut self, custom_tlvs: Vec<(u64, Vec<u8>)>) -> Self {
2773+
self.custom_tlvs = custom_tlvs;
2774+
self
2775+
}
27772776
}
27782777

2779-
pub fn pass_claimed_payment_along_route<'a, 'b, 'c, 'd>(args: ClaimAlongRouteArgs) -> u64 {
2778+
pub fn pass_claimed_payment_along_route(args: ClaimAlongRouteArgs) -> u64 {
27802779
let ClaimAlongRouteArgs {
27812780
origin_node, expected_paths, expected_extra_fees, expected_min_htlc_overpay, skip_last,
2782-
payment_preimage: our_payment_preimage, allow_1_msat_fee_overpay,
2781+
payment_preimage: our_payment_preimage, allow_1_msat_fee_overpay, custom_tlvs,
27832782
} = args;
27842783
let claim_event = expected_paths[0].last().unwrap().node.get_and_clear_pending_events();
27852784
assert_eq!(claim_event.len(), 1);
@@ -2793,11 +2792,13 @@ pub fn pass_claimed_payment_along_route<'a, 'b, 'c, 'd>(args: ClaimAlongRouteArg
27932792
| PaymentPurpose::Bolt12RefundPayment { payment_preimage: Some(preimage), .. },
27942793
amount_msat,
27952794
ref htlcs,
2795+
ref onion_fields,
27962796
..
27972797
} => {
27982798
assert_eq!(preimage, our_payment_preimage);
27992799
assert_eq!(htlcs.len(), expected_paths.len()); // One per path.
28002800
assert_eq!(htlcs.iter().map(|h| h.value_msat).sum::<u64>(), amount_msat);
2801+
assert_eq!(onion_fields.as_ref().unwrap().custom_tlvs, custom_tlvs);
28012802
expected_paths.iter().zip(htlcs).for_each(|(path, htlc)| check_claimed_htlc_channel(origin_node, path, htlc));
28022803
fwd_amt_msat = amount_msat;
28032804
},
@@ -2808,11 +2809,13 @@ pub fn pass_claimed_payment_along_route<'a, 'b, 'c, 'd>(args: ClaimAlongRouteArg
28082809
payment_hash,
28092810
amount_msat,
28102811
ref htlcs,
2812+
ref onion_fields,
28112813
..
28122814
} => {
28132815
assert_eq!(&payment_hash.0, &Sha256::hash(&our_payment_preimage.0)[..]);
28142816
assert_eq!(htlcs.len(), expected_paths.len()); // One per path.
28152817
assert_eq!(htlcs.iter().map(|h| h.value_msat).sum::<u64>(), amount_msat);
2818+
assert_eq!(onion_fields.as_ref().unwrap().custom_tlvs, custom_tlvs);
28162819
expected_paths.iter().zip(htlcs).for_each(|(path, htlc)| check_claimed_htlc_channel(origin_node, path, htlc));
28172820
fwd_amt_msat = amount_msat;
28182821
}
@@ -2956,15 +2959,20 @@ pub fn pass_claimed_payment_along_route<'a, 'b, 'c, 'd>(args: ClaimAlongRouteArg
29562959

29572960
expected_total_fee_msat
29582961
}
2959-
pub fn claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_paths: &[&[&Node<'a, 'b, 'c>]], skip_last: bool, our_payment_preimage: PaymentPreimage) {
2960-
let expected_total_fee_msat = do_claim_payment_along_route(origin_node, expected_paths, skip_last, our_payment_preimage);
2962+
pub fn claim_payment_along_route(args: ClaimAlongRouteArgs) {
2963+
let origin_node = args.origin_node;
2964+
let payment_preimage = args.payment_preimage;
2965+
let skip_last = args.skip_last;
2966+
let expected_total_fee_msat = do_claim_payment_along_route(args);
29612967
if !skip_last {
2962-
expect_payment_sent!(origin_node, our_payment_preimage, Some(expected_total_fee_msat));
2968+
expect_payment_sent!(origin_node, payment_preimage, Some(expected_total_fee_msat));
29632969
}
29642970
}
29652971

29662972
pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], our_payment_preimage: PaymentPreimage) {
2967-
claim_payment_along_route(origin_node, &[expected_route], false, our_payment_preimage);
2973+
claim_payment_along_route(
2974+
ClaimAlongRouteArgs::new(origin_node, &[expected_route], our_payment_preimage)
2975+
);
29682976
}
29692977

29702978
pub const TEST_FINAL_CLTV: u32 = 70;

lightning/src/ln/functional_tests.rs

+16-5
Original file line numberDiff line numberDiff line change
@@ -3812,7 +3812,10 @@ fn test_simple_peer_disconnect() {
38123812
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
38133813
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
38143814

3815-
claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], true, payment_preimage_3);
3815+
claim_payment_along_route(
3816+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[1], &nodes[2]]], payment_preimage_3)
3817+
.skip_last(true)
3818+
);
38163819
fail_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], true, payment_hash_5);
38173820

38183821
let mut reconnect_args = ReconnectArgs::new(&nodes[0], &nodes[1]);
@@ -8296,7 +8299,9 @@ fn test_onion_value_mpp_set_calculation() {
82968299
let ev = remove_first_msg_event_to_node(&expected_paths[1][0].node.get_our_node_id(), &mut events);
82978300
pass_along_path(&nodes[0], expected_paths[1], 101_000, our_payment_hash.clone(), Some(our_payment_secret), ev, true, None);
82988301

8299-
claim_payment_along_route(&nodes[0], expected_paths, false, our_payment_preimage);
8302+
claim_payment_along_route(
8303+
ClaimAlongRouteArgs::new(&nodes[0], expected_paths, our_payment_preimage)
8304+
);
83008305
}
83018306

83028307
fn do_test_overshoot_mpp(msat_amounts: &[u64], total_msat: u64) {
@@ -8362,7 +8367,9 @@ fn do_test_overshoot_mpp(msat_amounts: &[u64], total_msat: u64) {
83628367
pass_along_path(&nodes[src_idx], expected_path, amount_received, our_payment_hash.clone(), Some(our_payment_secret), ev, became_claimable_now, None);
83638368
}
83648369

8365-
claim_payment_along_route(&nodes[src_idx], &expected_paths, false, our_payment_preimage);
8370+
claim_payment_along_route(
8371+
ClaimAlongRouteArgs::new(&nodes[src_idx], &expected_paths, our_payment_preimage)
8372+
);
83668373
}
83678374

83688375
#[test]
@@ -8394,7 +8401,9 @@ fn test_simple_mpp() {
83948401
route.paths[1].hops[0].short_channel_id = chan_2_id;
83958402
route.paths[1].hops[1].short_channel_id = chan_4_id;
83968403
send_along_route_with_secret(&nodes[0], route, &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], 200_000, payment_hash, payment_secret);
8397-
claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, payment_preimage);
8404+
claim_payment_along_route(
8405+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], payment_preimage)
8406+
);
83988407
}
83998408

84008409
#[test]
@@ -9838,7 +9847,9 @@ fn test_inconsistent_mpp_params() {
98389847
assert_eq!(events.len(), 1);
98399848
pass_along_path(&nodes[0], &[&nodes[2], &nodes[3]], 15_000_000, our_payment_hash, Some(our_payment_secret), events.pop().unwrap(), true, None);
98409849

9841-
do_claim_payment_along_route(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, our_payment_preimage);
9850+
do_claim_payment_along_route(
9851+
ClaimAlongRouteArgs::new(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], our_payment_preimage)
9852+
);
98429853
expect_payment_sent(&nodes[0], our_payment_preimage, Some(None), true, true);
98439854
}
98449855

0 commit comments

Comments
 (0)