Skip to content

Commit 4431b84

Browse files
committed
Make payment_id a required field in Events
The switch to tracking payments by ID happened with LDK Node v0.3.0, which is >1.5 years old by now. We can be pretty certain that nobody is upgrading from an older version to the upcoming v0.8. Here we hence make the `payment_id` fields in `Event` required which is a nice API simplification that will also be utilized in the next commit. Co-Authored-By: HAL 9000
1 parent 150f370 commit 4431b84

8 files changed

Lines changed: 43 additions & 51 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
a persisted `ChannelClosed` event.
88
- Users of the VSS storage backend must upgrade their VSS server to at least version
99
`v0.1.0-alpha.0` before upgrading LDK Node.
10+
- The `payment_id` field on the `PaymentSuccessful`, `PaymentFailed`, and
11+
`PaymentReceived` events is now a required (non-optional) `PaymentId`. Events
12+
persisted by LDK Node v0.2.1 or earlier (which stored `payment_id` as
13+
optional) will fail to deserialize on read; users upgrading from those
14+
versions need to drain pending events before the upgrade.
1015

1116
## Feature and API updates
1217
- The Bitcoin Core RPC and REST chain-source builder methods now accept an optional

benches/payments.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,8 @@ async fn send_payments(node_a: Arc<Node>, node_b: Arc<Node>) -> std::time::Durat
7575
while success_count < total_payments {
7676
match node_a.next_event_async().await {
7777
Event::PaymentSuccessful { payment_id, payment_hash, .. } => {
78-
if let Some(id) = payment_id {
79-
success_count += 1;
80-
println!("{}: Payment with id {:?} completed", payment_hash.0.as_hex(), id);
81-
} else {
82-
println!("Payment completed (no payment_id)");
83-
}
78+
success_count += 1;
79+
println!("{}: Payment with id {:?} completed", payment_hash.0.as_hex(), payment_id);
8480
},
8581
Event::PaymentFailed { payment_id, payment_hash, .. } => {
8682
println!("{}: Payment {:?} failed", payment_hash.unwrap().0.as_hex(), payment_id);

src/event.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,7 @@ pub enum Event {
105105
/// A sent payment was successful.
106106
PaymentSuccessful {
107107
/// A local identifier used to track the payment.
108-
///
109-
/// Will only be `None` for events serialized with LDK Node v0.2.1 or prior.
110-
payment_id: Option<PaymentId>,
108+
payment_id: PaymentId,
111109
/// The hash of the payment.
112110
payment_hash: PaymentHash,
113111
/// The preimage to the `payment_hash`.
@@ -133,9 +131,7 @@ pub enum Event {
133131
/// A sent payment has failed.
134132
PaymentFailed {
135133
/// A local identifier used to track the payment.
136-
///
137-
/// Will only be `None` for events serialized with LDK Node v0.2.1 or prior.
138-
payment_id: Option<PaymentId>,
134+
payment_id: PaymentId,
139135
/// The hash of the payment.
140136
///
141137
/// This will be `None` if the payment failed before receiving an invoice when paying a
@@ -151,9 +147,7 @@ pub enum Event {
151147
/// A payment has been received.
152148
PaymentReceived {
153149
/// A local identifier used to track the payment.
154-
///
155-
/// Will only be `None` for events serialized with LDK Node v0.2.1 or prior.
156-
payment_id: Option<PaymentId>,
150+
payment_id: PaymentId,
157151
/// The hash of the payment.
158152
payment_hash: PaymentHash,
159153
/// The value, in thousandths of a satoshi, that has been received.
@@ -298,18 +292,18 @@ impl_writeable_tlv_based_enum!(Event,
298292
(0, PaymentSuccessful) => {
299293
(0, payment_hash, required),
300294
(1, fee_paid_msat, option),
301-
(3, payment_id, option),
295+
(3, payment_id, required),
302296
(5, payment_preimage, option),
303297
(7, bolt12_invoice, option),
304298
},
305299
(1, PaymentFailed) => {
306300
(0, payment_hash, option),
307301
(1, reason, upgradable_option),
308-
(3, payment_id, option),
302+
(3, payment_id, required),
309303
},
310304
(2, PaymentReceived) => {
311305
(0, payment_hash, required),
312-
(1, payment_id, option),
306+
(1, payment_id, required),
313307
(2, amount_msat, required),
314308
(3, custom_records, optional_vec),
315309
},
@@ -1097,7 +1091,7 @@ where
10971091
}
10981092

10991093
let event = Event::PaymentReceived {
1100-
payment_id: Some(payment_id),
1094+
payment_id,
11011095
payment_hash,
11021096
amount_msat,
11031097
custom_records: onion_fields
@@ -1162,7 +1156,7 @@ where
11621156
);
11631157
});
11641158
let event = Event::PaymentSuccessful {
1165-
payment_id: Some(payment_id),
1159+
payment_id,
11661160
payment_hash,
11671161
payment_preimage: Some(payment_preimage),
11681162
fee_paid_msat,
@@ -1198,8 +1192,7 @@ where
11981192
},
11991193
};
12001194

1201-
let event =
1202-
Event::PaymentFailed { payment_id: Some(payment_id), payment_hash, reason };
1195+
let event = Event::PaymentFailed { payment_id, payment_hash, reason };
12031196
match self.event_queue.add_event(event).await {
12041197
Ok(_) => return Ok(()),
12051198
Err(e) => {

tests/common/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ macro_rules! expect_payment_received_event {
224224
ref e @ Event::PaymentReceived { payment_id, amount_msat, .. } => {
225225
println!("{} got event {:?}", $node.node_id(), e);
226226
assert_eq!(amount_msat, $amount_msat);
227-
let payment = $node.payment(&payment_id.unwrap()).unwrap();
227+
let payment = $node.payment(&payment_id).unwrap();
228228
if !matches!(payment.kind, ldk_node::payment::PaymentKind::Onchain { .. }) {
229229
assert_eq!(payment.fee_paid_msat, None);
230230
}
@@ -292,7 +292,7 @@ macro_rules! expect_payment_successful_event {
292292
if let Some(fee_msat) = $fee_paid_msat {
293293
assert_eq!(fee_paid_msat, fee_msat);
294294
}
295-
let payment = $node.payment(&$payment_id.unwrap()).unwrap();
295+
let payment = $node.payment(&$payment_id).unwrap();
296296
assert_eq!(payment.fee_paid_msat, fee_paid_msat);
297297
assert_eq!(payment_id, $payment_id);
298298
$node.event_handled().unwrap();
@@ -1412,7 +1412,7 @@ pub(crate) async fn do_channel_full_cycle<E: ElectrumApi>(
14121412
.claim_for_hash(manual_payment_hash, claimable_amount_msat, manual_preimage)
14131413
.unwrap();
14141414
expect_payment_received_event!(node_b, claimable_amount_msat);
1415-
expect_payment_successful_event!(node_a, Some(manual_payment_id), None);
1415+
expect_payment_successful_event!(node_a, manual_payment_id, None);
14161416
assert_eq!(node_a.payment(&manual_payment_id).unwrap().status, PaymentStatus::Succeeded);
14171417
assert_eq!(node_a.payment(&manual_payment_id).unwrap().direction, PaymentDirection::Outbound);
14181418
assert_eq!(

tests/integration_tests_hrn.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ async fn unified_send_to_hrn() {
7979
},
8080
};
8181

82-
expect_payment_successful_event!(node_a, Some(offer_payment_id), None);
82+
expect_payment_successful_event!(node_a, offer_payment_id, None);
8383
}

tests/integration_tests_migration.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,15 +203,15 @@ async fn migrate_node_across_all_backends() {
203203
Bolt11InvoiceDescription::Direct(Description::new("ln send".to_string()).unwrap());
204204
let invoice = node_b.bolt11_payment().receive(10_000, &description.into(), 3600).unwrap();
205205
let ln_send_id = node.bolt11_payment().send(&invoice, None).unwrap();
206-
expect_payment_successful_event!(node, Some(ln_send_id), None);
206+
expect_payment_successful_event!(node, ln_send_id, None);
207207
expect_payment_received_event!(node_b, 10_000);
208208

209209
// Lightning receive: node B -> node.
210210
let description =
211211
Bolt11InvoiceDescription::Direct(Description::new("ln receive".to_string()).unwrap());
212212
let invoice = node.bolt11_payment().receive(5_000, &description.into(), 3600).unwrap();
213213
let ln_receive_id = node_b.bolt11_payment().send(&invoice, None).unwrap();
214-
expect_payment_successful_event!(node_b, Some(ln_receive_id), None);
214+
expect_payment_successful_event!(node_b, ln_receive_id, None);
215215
expect_payment_received_event!(node, 5_000);
216216

217217
// On-chain send: node -> a foreign address.

tests/integration_tests_rust.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -460,13 +460,12 @@ async fn split_underpaid_bolt11_payment() {
460460
.unwrap();
461461

462462
let receiver_payment_id = expect_payment_received_event!(node_c, amount_msat);
463-
assert_eq!(receiver_payment_id, Some(PaymentId(invoice.payment_hash().0)));
464-
expect_payment_successful_event!(node_a, Some(payment_id_a), None);
465-
expect_payment_successful_event!(node_b, Some(payment_id_b), None);
463+
assert_eq!(receiver_payment_id, PaymentId(invoice.payment_hash().0));
464+
expect_payment_successful_event!(node_a, payment_id_a, None);
465+
expect_payment_successful_event!(node_b, payment_id_b, None);
466466

467467
// The receiver records the full invoice amount; each payer records only its own half.
468-
let receiver_payments =
469-
node_c.list_payments_with_filter(|p| p.id == receiver_payment_id.unwrap());
468+
let receiver_payments = node_c.list_payments_with_filter(|p| p.id == receiver_payment_id);
470469
assert_eq!(receiver_payments.len(), 1);
471470
assert_eq!(receiver_payments.first().unwrap().amount_msat, Some(amount_msat));
472471

@@ -1648,7 +1647,7 @@ async fn splice_channel() {
16481647
let payment_id =
16491648
node_b.spontaneous_payment().send(amount_msat, node_a.node_id(), None).unwrap();
16501649

1651-
expect_payment_successful_event!(node_b, Some(payment_id), None);
1650+
expect_payment_successful_event!(node_b, payment_id, None);
16521651
expect_payment_received_event!(node_a, amount_msat);
16531652

16541653
// Mine a block to give time for the HTLC to resolve
@@ -2170,7 +2169,7 @@ async fn simple_bolt12_send_receive() {
21702169
match event {
21712170
ref e @ Event::PaymentSuccessful { payment_id: ref evt_id, ref bolt12_invoice, .. } => {
21722171
println!("{} got event {:?}", node_a.node_id(), e);
2173-
assert_eq!(*evt_id, Some(payment_id));
2172+
assert_eq!(*evt_id, payment_id);
21742173
assert!(
21752174
bolt12_invoice.is_some(),
21762175
"bolt12_invoice should be present for BOLT12 payments"
@@ -2244,7 +2243,7 @@ async fn simple_bolt12_send_receive() {
22442243
)
22452244
.unwrap();
22462245

2247-
expect_payment_successful_event!(node_a, Some(payment_id), None);
2246+
expect_payment_successful_event!(node_a, payment_id, None);
22482247
let node_a_payments = node_a.list_payments_with_filter(|p| {
22492248
matches!(p.kind, PaymentKind::Bolt12Offer { .. }) && p.id == payment_id
22502249
});
@@ -2317,7 +2316,7 @@ async fn simple_bolt12_send_receive() {
23172316
.first()
23182317
.unwrap()
23192318
.id;
2320-
expect_payment_successful_event!(node_b, Some(node_b_payment_id), None);
2319+
expect_payment_successful_event!(node_b, node_b_payment_id, None);
23212320

23222321
let node_b_payments = node_b.list_payments_with_filter(|p| {
23232322
matches!(p.kind, PaymentKind::Bolt12Refund { .. }) && p.id == node_b_payment_id
@@ -2491,7 +2490,7 @@ async fn async_payment() {
24912490

24922491
node_receiver.start().unwrap();
24932492

2494-
expect_payment_successful_event!(node_sender, Some(payment_id), None);
2493+
expect_payment_successful_event!(node_sender, payment_id, None);
24952494
}
24962495

24972496
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
@@ -2717,7 +2716,7 @@ async fn unified_send_receive_bip21_uri() {
27172716
},
27182717
};
27192718

2720-
expect_payment_successful_event!(node_a, Some(offer_payment_id), None);
2719+
expect_payment_successful_event!(node_a, offer_payment_id, None);
27212720

27222721
// Cut off the BOLT12 part to fallback to BOLT11.
27232722
let uri_str_without_offer = uri_str.split("&lno=").next().unwrap();
@@ -2737,7 +2736,7 @@ async fn unified_send_receive_bip21_uri() {
27372736
panic!("Expected Bolt11 payment but got error: {:?}", e);
27382737
},
27392738
};
2740-
expect_payment_successful_event!(node_a, Some(invoice_payment_id), None);
2739+
expect_payment_successful_event!(node_a, invoice_payment_id, None);
27412740

27422741
let expect_onchain_amount_sats = 800_000;
27432742
let onchain_uni_payment =
@@ -2872,9 +2871,9 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
28722871

28732872
let service_fee_msat = (jit_amount_msat * channel_opening_fee_ppm as u64) / 1_000_000;
28742873
let expected_received_amount_msat = jit_amount_msat - service_fee_msat;
2875-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2874+
expect_payment_successful_event!(payer_node, payment_id, None);
28762875
let client_payment_id =
2877-
expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
2876+
expect_payment_received_event!(client_node, expected_received_amount_msat);
28782877
let client_payment = client_node.payment(&client_payment_id).unwrap();
28792878
match client_payment.kind {
28802879
PaymentKind::Bolt11 { counterparty_skimmed_fee_msat, .. } => {
@@ -2901,7 +2900,7 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
29012900
// are working as expected.
29022901
println!("Paying regular invoice!");
29032902
let payment_id = payer_node.bolt11_payment().send(&invoice, None).unwrap();
2904-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2903+
expect_payment_successful_event!(payer_node, payment_id, None);
29052904
expect_event!(service_node, PaymentForwarded);
29062905
expect_payment_received_event!(client_node, amount_msat);
29072906

@@ -2947,9 +2946,9 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
29472946
.unwrap();
29482947

29492948
expect_event!(service_node, PaymentForwarded);
2950-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2949+
expect_payment_successful_event!(payer_node, payment_id, None);
29512950
let client_payment_id =
2952-
expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
2951+
expect_payment_received_event!(client_node, expected_received_amount_msat);
29532952
let client_payment = client_node.payment(&client_payment_id).unwrap();
29542953
match client_payment.kind {
29552954
PaymentKind::Bolt11 { counterparty_skimmed_fee_msat, .. } => {
@@ -3054,7 +3053,7 @@ async fn spontaneous_send_with_custom_preimage() {
30543053
.unwrap();
30553054

30563055
// check payment status and verify stored preimage
3057-
expect_payment_successful_event!(node_a, Some(payment_id), None);
3056+
expect_payment_successful_event!(node_a, payment_id, None);
30583057
let details: PaymentDetails =
30593058
node_a.list_payments_with_filter(|p| p.id == payment_id).first().unwrap().clone();
30603059
assert_eq!(details.status, PaymentStatus::Succeeded);
@@ -3240,9 +3239,9 @@ async fn lsps2_client_trusts_lsp() {
32403239
.claim_for_hash(manual_payment_hash, jit_amount_msat, manual_preimage)
32413240
.unwrap();
32423241

3243-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
3242+
expect_payment_successful_event!(payer_node, payment_id, None);
32443243

3245-
let _ = expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
3244+
let _ = expect_payment_received_event!(client_node, expected_received_amount_msat);
32463245

32473246
// Check the nodes pick up on the confirmed funding tx now.
32483247
wait_for_tx(&electrsd.client, funding_txo.txid).await;

tests/upgrade_downgrade_tests.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@
304304
// ) {
305305
// match next_current_event(node).await {
306306
// ldk_node::Event::PaymentSuccessful { payment_id, .. } => {
307-
// assert_eq!(payment_id.as_ref(), Some(expected_payment_id));
307+
// assert_eq!(&payment_id, expected_payment_id);
308308
// node.event_handled().unwrap();
309309
// },
310310
// event => panic!("{} got unexpected event: {:?}", node.node_id(), event),
@@ -313,9 +313,8 @@
313313
//
314314
// async fn expect_current_payment_received(node: &CurrentNode, expected_amount_msat: u64) {
315315
// match next_current_event(node).await {
316-
// ldk_node::Event::PaymentReceived { amount_msat, payment_id, .. } => {
316+
// ldk_node::Event::PaymentReceived { amount_msat, .. } => {
317317
// assert_eq!(amount_msat, expected_amount_msat);
318-
// assert!(payment_id.is_some());
319318
// node.event_handled().unwrap();
320319
// },
321320
// event => panic!("{} got unexpected event: {:?}", node.node_id(), event),

0 commit comments

Comments
 (0)