Skip to content

Commit cb8848e

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 abbed3e commit cb8848e

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
},
@@ -1163,7 +1157,7 @@ where
11631157
}
11641158

11651159
let event = Event::PaymentReceived {
1166-
payment_id: Some(payment_id),
1160+
payment_id,
11671161
payment_hash,
11681162
amount_msat,
11691163
custom_records: onion_fields
@@ -1228,7 +1222,7 @@ where
12281222
);
12291223
});
12301224
let event = Event::PaymentSuccessful {
1231-
payment_id: Some(payment_id),
1225+
payment_id,
12321226
payment_hash,
12331227
payment_preimage: Some(payment_preimage),
12341228
fee_paid_msat,
@@ -1264,8 +1258,7 @@ where
12641258
},
12651259
};
12661260

1267-
let event =
1268-
Event::PaymentFailed { payment_id: Some(payment_id), payment_hash, reason };
1261+
let event = Event::PaymentFailed { payment_id, payment_hash, reason };
12691262
match self.event_queue.add_event(event).await {
12701263
Ok(_) => return Ok(()),
12711264
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();
@@ -1403,7 +1403,7 @@ pub(crate) async fn do_channel_full_cycle<E: ElectrumApi>(
14031403
.claim_for_hash(manual_payment_hash, claimable_amount_msat, manual_preimage)
14041404
.unwrap();
14051405
expect_payment_received_event!(node_b, claimable_amount_msat);
1406-
expect_payment_successful_event!(node_a, Some(manual_payment_id), None);
1406+
expect_payment_successful_event!(node_a, manual_payment_id, None);
14071407
assert_eq!(node_a.payment(&manual_payment_id).unwrap().status, PaymentStatus::Succeeded);
14081408
assert_eq!(node_a.payment(&manual_payment_id).unwrap().direction, PaymentDirection::Outbound);
14091409
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
@@ -585,13 +585,12 @@ async fn split_underpaid_bolt11_payment() {
585585
.unwrap();
586586

587587
let receiver_payment_id = expect_payment_received_event!(node_c, amount_msat);
588-
assert_eq!(receiver_payment_id, Some(PaymentId(invoice.payment_hash().0)));
589-
expect_payment_successful_event!(node_a, Some(payment_id_a), None);
590-
expect_payment_successful_event!(node_b, Some(payment_id_b), None);
588+
assert_eq!(receiver_payment_id, PaymentId(invoice.payment_hash().0));
589+
expect_payment_successful_event!(node_a, payment_id_a, None);
590+
expect_payment_successful_event!(node_b, payment_id_b, None);
591591

592592
// The receiver records the full invoice amount; each payer records only its own half.
593-
let receiver_payments =
594-
node_c.list_payments_with_filter(|p| p.id == receiver_payment_id.unwrap());
593+
let receiver_payments = node_c.list_payments_with_filter(|p| p.id == receiver_payment_id);
595594
assert_eq!(receiver_payments.len(), 1);
596595
assert_eq!(receiver_payments.first().unwrap().amount_msat, Some(amount_msat));
597596

@@ -1793,7 +1792,7 @@ async fn splice_channel() {
17931792
let payment_id =
17941793
node_b.spontaneous_payment().send(amount_msat, node_a.node_id(), None).unwrap();
17951794

1796-
expect_payment_successful_event!(node_b, Some(payment_id), None);
1795+
expect_payment_successful_event!(node_b, payment_id, None);
17971796
expect_payment_received_event!(node_a, amount_msat);
17981797

17991798
// Mine a block to give time for the HTLC to resolve
@@ -2315,7 +2314,7 @@ async fn simple_bolt12_send_receive() {
23152314
match event {
23162315
ref e @ Event::PaymentSuccessful { payment_id: ref evt_id, ref bolt12_invoice, .. } => {
23172316
println!("{} got event {:?}", node_a.node_id(), e);
2318-
assert_eq!(*evt_id, Some(payment_id));
2317+
assert_eq!(*evt_id, payment_id);
23192318
assert!(
23202319
bolt12_invoice.is_some(),
23212320
"bolt12_invoice should be present for BOLT12 payments"
@@ -2389,7 +2388,7 @@ async fn simple_bolt12_send_receive() {
23892388
)
23902389
.unwrap();
23912390

2392-
expect_payment_successful_event!(node_a, Some(payment_id), None);
2391+
expect_payment_successful_event!(node_a, payment_id, None);
23932392
let node_a_payments = node_a.list_payments_with_filter(|p| {
23942393
matches!(p.kind, PaymentKind::Bolt12Offer { .. }) && p.id == payment_id
23952394
});
@@ -2462,7 +2461,7 @@ async fn simple_bolt12_send_receive() {
24622461
.first()
24632462
.unwrap()
24642463
.id;
2465-
expect_payment_successful_event!(node_b, Some(node_b_payment_id), None);
2464+
expect_payment_successful_event!(node_b, node_b_payment_id, None);
24662465

24672466
let node_b_payments = node_b.list_payments_with_filter(|p| {
24682467
matches!(p.kind, PaymentKind::Bolt12Refund { .. }) && p.id == node_b_payment_id
@@ -2636,7 +2635,7 @@ async fn async_payment() {
26362635

26372636
node_receiver.start().unwrap();
26382637

2639-
expect_payment_successful_event!(node_sender, Some(payment_id), None);
2638+
expect_payment_successful_event!(node_sender, payment_id, None);
26402639
}
26412640

26422641
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
@@ -2862,7 +2861,7 @@ async fn unified_send_receive_bip21_uri() {
28622861
},
28632862
};
28642863

2865-
expect_payment_successful_event!(node_a, Some(offer_payment_id), None);
2864+
expect_payment_successful_event!(node_a, offer_payment_id, None);
28662865

28672866
// Cut off the BOLT12 part to fallback to BOLT11.
28682867
let uri_str_without_offer = uri_str.split("&lno=").next().unwrap();
@@ -2882,7 +2881,7 @@ async fn unified_send_receive_bip21_uri() {
28822881
panic!("Expected Bolt11 payment but got error: {:?}", e);
28832882
},
28842883
};
2885-
expect_payment_successful_event!(node_a, Some(invoice_payment_id), None);
2884+
expect_payment_successful_event!(node_a, invoice_payment_id, None);
28862885

28872886
let expect_onchain_amount_sats = 800_000;
28882887
let onchain_uni_payment =
@@ -3017,9 +3016,9 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
30173016

30183017
let service_fee_msat = (jit_amount_msat * channel_opening_fee_ppm as u64) / 1_000_000;
30193018
let expected_received_amount_msat = jit_amount_msat - service_fee_msat;
3020-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
3019+
expect_payment_successful_event!(payer_node, payment_id, None);
30213020
let client_payment_id =
3022-
expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
3021+
expect_payment_received_event!(client_node, expected_received_amount_msat);
30233022
let client_payment = client_node.payment(&client_payment_id).unwrap();
30243023
match client_payment.kind {
30253024
PaymentKind::Bolt11 { counterparty_skimmed_fee_msat, .. } => {
@@ -3046,7 +3045,7 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
30463045
// are working as expected.
30473046
println!("Paying regular invoice!");
30483047
let payment_id = payer_node.bolt11_payment().send(&invoice, None).unwrap();
3049-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
3048+
expect_payment_successful_event!(payer_node, payment_id, None);
30503049
expect_event!(service_node, PaymentForwarded);
30513050
expect_payment_received_event!(client_node, amount_msat);
30523051

@@ -3092,9 +3091,9 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
30923091
.unwrap();
30933092

30943093
expect_event!(service_node, PaymentForwarded);
3095-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
3094+
expect_payment_successful_event!(payer_node, payment_id, None);
30963095
let client_payment_id =
3097-
expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
3096+
expect_payment_received_event!(client_node, expected_received_amount_msat);
30983097
let client_payment = client_node.payment(&client_payment_id).unwrap();
30993098
match client_payment.kind {
31003099
PaymentKind::Bolt11 { counterparty_skimmed_fee_msat, .. } => {
@@ -3199,7 +3198,7 @@ async fn spontaneous_send_with_custom_preimage() {
31993198
.unwrap();
32003199

32013200
// check payment status and verify stored preimage
3202-
expect_payment_successful_event!(node_a, Some(payment_id), None);
3201+
expect_payment_successful_event!(node_a, payment_id, None);
32033202
let details: PaymentDetails =
32043203
node_a.list_payments_with_filter(|p| p.id == payment_id).first().unwrap().clone();
32053204
assert_eq!(details.status, PaymentStatus::Succeeded);
@@ -3385,9 +3384,9 @@ async fn lsps2_client_trusts_lsp() {
33853384
.claim_for_hash(manual_payment_hash, jit_amount_msat, manual_preimage)
33863385
.unwrap();
33873386

3388-
expect_payment_successful_event!(payer_node, Some(payment_id), None);
3387+
expect_payment_successful_event!(payer_node, payment_id, None);
33893388

3390-
let _ = expect_payment_received_event!(client_node, expected_received_amount_msat).unwrap();
3389+
let _ = expect_payment_received_event!(client_node, expected_received_amount_msat);
33913390

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