Skip to content

Commit 8d9e1c0

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 73be359 commit 8d9e1c0

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
@@ -5,6 +5,11 @@
55
prior LSPS2 fee-limit state stored in `PaymentKind::Bolt11Jit` is not migrated.
66
- Users of the VSS storage backend must upgrade their VSS server to at least version
77
`v0.1.0-alpha.0` before upgrading LDK Node.
8+
- The `payment_id` field on the `PaymentSuccessful`, `PaymentFailed`, and
9+
`PaymentReceived` events is now a required (non-optional) `PaymentId`. Events
10+
persisted by LDK Node v0.2.1 or earlier (which stored `payment_id` as
11+
optional) will fail to deserialize on read; users upgrading from those
12+
versions need to drain pending events before the upgrade.
813

914
## Feature and API updates
1015
- 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
@@ -103,9 +103,7 @@ pub enum Event {
103103
/// A sent payment was successful.
104104
PaymentSuccessful {
105105
/// A local identifier used to track the payment.
106-
///
107-
/// Will only be `None` for events serialized with LDK Node v0.2.1 or prior.
108-
payment_id: Option<PaymentId>,
106+
payment_id: PaymentId,
109107
/// The hash of the payment.
110108
payment_hash: PaymentHash,
111109
/// The preimage to the `payment_hash`.
@@ -131,9 +129,7 @@ pub enum Event {
131129
/// A sent payment has failed.
132130
PaymentFailed {
133131
/// A local identifier used to track the payment.
134-
///
135-
/// Will only be `None` for events serialized with LDK Node v0.2.1 or prior.
136-
payment_id: Option<PaymentId>,
132+
payment_id: PaymentId,
137133
/// The hash of the payment.
138134
///
139135
/// This will be `None` if the payment failed before receiving an invoice when paying a
@@ -149,9 +145,7 @@ pub enum Event {
149145
/// A payment has been received.
150146
PaymentReceived {
151147
/// A local identifier used to track the payment.
152-
///
153-
/// Will only be `None` for events serialized with LDK Node v0.2.1 or prior.
154-
payment_id: Option<PaymentId>,
148+
payment_id: PaymentId,
155149
/// The hash of the payment.
156150
payment_hash: PaymentHash,
157151
/// 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
},
@@ -1095,7 +1089,7 @@ where
10951089
}
10961090

10971091
let event = Event::PaymentReceived {
1098-
payment_id: Some(payment_id),
1092+
payment_id,
10991093
payment_hash,
11001094
amount_msat,
11011095
custom_records: onion_fields
@@ -1160,7 +1154,7 @@ where
11601154
);
11611155
});
11621156
let event = Event::PaymentSuccessful {
1163-
payment_id: Some(payment_id),
1157+
payment_id,
11641158
payment_hash,
11651159
payment_preimage: Some(payment_preimage),
11661160
fee_paid_msat,
@@ -1196,8 +1190,7 @@ where
11961190
},
11971191
};
11981192

1199-
let event =
1200-
Event::PaymentFailed { payment_id: Some(payment_id), payment_hash, reason };
1193+
let event = Event::PaymentFailed { payment_id, payment_hash, reason };
12011194
match self.event_queue.add_event(event).await {
12021195
Ok(_) => return Ok(()),
12031196
Err(e) => {

tests/common/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ macro_rules! expect_payment_received_event {
222222
ref e @ Event::PaymentReceived { payment_id, amount_msat, .. } => {
223223
println!("{} got event {:?}", $node.node_id(), e);
224224
assert_eq!(amount_msat, $amount_msat);
225-
let payment = $node.payment(&payment_id.unwrap()).unwrap();
225+
let payment = $node.payment(&payment_id).unwrap();
226226
if !matches!(payment.kind, ldk_node::payment::PaymentKind::Onchain { .. }) {
227227
assert_eq!(payment.fee_paid_msat, None);
228228
}
@@ -290,7 +290,7 @@ macro_rules! expect_payment_successful_event {
290290
if let Some(fee_msat) = $fee_paid_msat {
291291
assert_eq!(fee_paid_msat, fee_msat);
292292
}
293-
let payment = $node.payment(&$payment_id.unwrap()).unwrap();
293+
let payment = $node.payment(&$payment_id).unwrap();
294294
assert_eq!(payment.fee_paid_msat, fee_paid_msat);
295295
assert_eq!(payment_id, $payment_id);
296296
$node.event_handled().unwrap();
@@ -1248,7 +1248,7 @@ pub(crate) async fn do_channel_full_cycle<E: ElectrumApi>(
12481248
.claim_for_hash(manual_payment_hash, claimable_amount_msat, manual_preimage)
12491249
.unwrap();
12501250
expect_payment_received_event!(node_b, claimable_amount_msat);
1251-
expect_payment_successful_event!(node_a, Some(manual_payment_id), None);
1251+
expect_payment_successful_event!(node_a, manual_payment_id, None);
12521252
assert_eq!(node_a.payment(&manual_payment_id).unwrap().status, PaymentStatus::Succeeded);
12531253
assert_eq!(node_a.payment(&manual_payment_id).unwrap().direction, PaymentDirection::Outbound);
12541254
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
@@ -410,13 +410,12 @@ async fn split_underpaid_bolt11_payment() {
410410
.unwrap();
411411

412412
let receiver_payment_id = expect_payment_received_event!(node_c, amount_msat);
413-
assert_eq!(receiver_payment_id, Some(PaymentId(invoice.payment_hash().0)));
414-
expect_payment_successful_event!(node_a, Some(payment_id_a), None);
415-
expect_payment_successful_event!(node_b, Some(payment_id_b), None);
413+
assert_eq!(receiver_payment_id, PaymentId(invoice.payment_hash().0));
414+
expect_payment_successful_event!(node_a, payment_id_a, None);
415+
expect_payment_successful_event!(node_b, payment_id_b, None);
416416

417417
// The receiver records the full invoice amount; each payer records only its own half.
418-
let receiver_payments =
419-
node_c.list_payments_with_filter(|p| p.id == receiver_payment_id.unwrap());
418+
let receiver_payments = node_c.list_payments_with_filter(|p| p.id == receiver_payment_id);
420419
assert_eq!(receiver_payments.len(), 1);
421420
assert_eq!(receiver_payments.first().unwrap().amount_msat, Some(amount_msat));
422421

@@ -1594,7 +1593,7 @@ async fn splice_channel() {
15941593
let payment_id =
15951594
node_b.spontaneous_payment().send(amount_msat, node_a.node_id(), None).unwrap();
15961595

1597-
expect_payment_successful_event!(node_b, Some(payment_id), None);
1596+
expect_payment_successful_event!(node_b, payment_id, None);
15981597
expect_payment_received_event!(node_a, amount_msat);
15991598

16001599
// Mine a block to give time for the HTLC to resolve
@@ -2116,7 +2115,7 @@ async fn simple_bolt12_send_receive() {
21162115
match event {
21172116
ref e @ Event::PaymentSuccessful { payment_id: ref evt_id, ref bolt12_invoice, .. } => {
21182117
println!("{} got event {:?}", node_a.node_id(), e);
2119-
assert_eq!(*evt_id, Some(payment_id));
2118+
assert_eq!(*evt_id, payment_id);
21202119
assert!(
21212120
bolt12_invoice.is_some(),
21222121
"bolt12_invoice should be present for BOLT12 payments"
@@ -2190,7 +2189,7 @@ async fn simple_bolt12_send_receive() {
21902189
)
21912190
.unwrap();
21922191

2193-
expect_payment_successful_event!(node_a, Some(payment_id), None);
2192+
expect_payment_successful_event!(node_a, payment_id, None);
21942193
let node_a_payments = node_a.list_payments_with_filter(|p| {
21952194
matches!(p.kind, PaymentKind::Bolt12Offer { .. }) && p.id == payment_id
21962195
});
@@ -2263,7 +2262,7 @@ async fn simple_bolt12_send_receive() {
22632262
.first()
22642263
.unwrap()
22652264
.id;
2266-
expect_payment_successful_event!(node_b, Some(node_b_payment_id), None);
2265+
expect_payment_successful_event!(node_b, node_b_payment_id, None);
22672266

22682267
let node_b_payments = node_b.list_payments_with_filter(|p| {
22692268
matches!(p.kind, PaymentKind::Bolt12Refund { .. }) && p.id == node_b_payment_id
@@ -2437,7 +2436,7 @@ async fn async_payment() {
24372436

24382437
node_receiver.start().unwrap();
24392438

2440-
expect_payment_successful_event!(node_sender, Some(payment_id), None);
2439+
expect_payment_successful_event!(node_sender, payment_id, None);
24412440
}
24422441

24432442
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
@@ -2663,7 +2662,7 @@ async fn unified_send_receive_bip21_uri() {
26632662
},
26642663
};
26652664

2666-
expect_payment_successful_event!(node_a, Some(offer_payment_id), None);
2665+
expect_payment_successful_event!(node_a, offer_payment_id, None);
26672666

26682667
// Cut off the BOLT12 part to fallback to BOLT11.
26692668
let uri_str_without_offer = uri_str.split("&lno=").next().unwrap();
@@ -2683,7 +2682,7 @@ async fn unified_send_receive_bip21_uri() {
26832682
panic!("Expected Bolt11 payment but got error: {:?}", e);
26842683
},
26852684
};
2686-
expect_payment_successful_event!(node_a, Some(invoice_payment_id), None);
2685+
expect_payment_successful_event!(node_a, invoice_payment_id, None);
26872686

26882687
let expect_onchain_amount_sats = 800_000;
26892688
let onchain_uni_payment =
@@ -2818,9 +2817,9 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
28182817

28192818
let service_fee_msat = (jit_amount_msat * channel_opening_fee_ppm as u64) / 1_000_000;
28202819
let expected_received_amount_msat = jit_amount_msat - service_fee_msat;
2821-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2820+
expect_payment_successful_event!(payer_node, payment_id, None);
28222821
let client_payment_id =
2823-
expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
2822+
expect_payment_received_event!(client_node, expected_received_amount_msat);
28242823
let client_payment = client_node.payment(&client_payment_id).unwrap();
28252824
match client_payment.kind {
28262825
PaymentKind::Bolt11 { counterparty_skimmed_fee_msat, .. } => {
@@ -2847,7 +2846,7 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
28472846
// are working as expected.
28482847
println!("Paying regular invoice!");
28492848
let payment_id = payer_node.bolt11_payment().send(&invoice, None).unwrap();
2850-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2849+
expect_payment_successful_event!(payer_node, payment_id, None);
28512850
expect_event!(service_node, PaymentForwarded);
28522851
expect_payment_received_event!(client_node, amount_msat);
28532852

@@ -2893,9 +2892,9 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
28932892
.unwrap();
28942893

28952894
expect_event!(service_node, PaymentForwarded);
2896-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2895+
expect_payment_successful_event!(payer_node, payment_id, None);
28972896
let client_payment_id =
2898-
expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
2897+
expect_payment_received_event!(client_node, expected_received_amount_msat);
28992898
let client_payment = client_node.payment(&client_payment_id).unwrap();
29002899
match client_payment.kind {
29012900
PaymentKind::Bolt11 { counterparty_skimmed_fee_msat, .. } => {
@@ -3000,7 +2999,7 @@ async fn spontaneous_send_with_custom_preimage() {
30002999
.unwrap();
30013000

30023001
// check payment status and verify stored preimage
3003-
expect_payment_successful_event!(node_a, Some(payment_id), None);
3002+
expect_payment_successful_event!(node_a, payment_id, None);
30043003
let details: PaymentDetails =
30053004
node_a.list_payments_with_filter(|p| p.id == payment_id).first().unwrap().clone();
30063005
assert_eq!(details.status, PaymentStatus::Succeeded);
@@ -3186,9 +3185,9 @@ async fn lsps2_client_trusts_lsp() {
31863185
.claim_for_hash(manual_payment_hash, jit_amount_msat, manual_preimage)
31873186
.unwrap();
31883187

3189-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
3188+
expect_payment_successful_event!(payer_node, payment_id, None);
31903189

3191-
let _ = expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
3190+
let _ = expect_payment_received_event!(client_node, expected_received_amount_msat);
31923191

31933192
// Check the nodes pick up on the confirmed funding tx now.
31943193
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)