2
2
3
3
mod common;
4
4
5
- use common:: { get_lsps_message , setup_test_lsps2 , Node } ;
5
+ use common:: { create_service_and_client_nodes , get_lsps_message , Node } ;
6
6
7
7
use lightning_liquidity:: events:: LiquidityEvent ;
8
8
use lightning_liquidity:: lsps0:: ser:: LSPSDateTime ;
9
+ use lightning_liquidity:: lsps2:: client:: LSPS2ClientConfig ;
9
10
use lightning_liquidity:: lsps2:: event:: { LSPS2ClientEvent , LSPS2ServiceEvent } ;
10
11
use lightning_liquidity:: lsps2:: msgs:: LSPS2RawOpeningFeeParams ;
12
+ use lightning_liquidity:: lsps2:: service:: LSPS2ServiceConfig ;
11
13
use lightning_liquidity:: lsps2:: utils:: is_valid_opening_fee_params;
12
14
13
15
use lightning:: ln:: channelmanager:: { InterceptId , MIN_FINAL_CLTV_EXPIRY_DELTA } ;
@@ -19,15 +21,44 @@ use lightning::util::logger::Logger;
19
21
20
22
use lightning_invoice:: { Bolt11Invoice , InvoiceBuilder , RoutingFees } ;
21
23
24
+ use lightning_liquidity:: { LiquidityClientConfig , LiquidityServiceConfig } ;
22
25
use lightning_types:: payment:: PaymentHash ;
23
26
24
27
use bitcoin:: hashes:: { sha256, Hash } ;
25
- use bitcoin:: secp256k1:: { PublicKey , Secp256k1 } ;
28
+ use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
26
29
use bitcoin:: Network ;
27
30
28
31
use std:: str:: FromStr ;
29
32
use std:: time:: Duration ;
30
33
34
+ fn setup_test_lsps2 (
35
+ ) -> ( bitcoin:: secp256k1:: PublicKey , bitcoin:: secp256k1:: PublicKey , Node , Node , [ u8 ; 32 ] ) {
36
+ let promise_secret = [ 42 ; 32 ] ;
37
+ let signing_key = SecretKey :: from_slice ( & promise_secret) . unwrap ( ) ;
38
+ let lsps2_service_config = LSPS2ServiceConfig { promise_secret } ;
39
+ let service_config = LiquidityServiceConfig {
40
+ #[ cfg( lsps1_service) ]
41
+ lsps1_service_config : None ,
42
+ lsps2_service_config : Some ( lsps2_service_config) ,
43
+ advertise_service : true ,
44
+ } ;
45
+
46
+ let lsps2_client_config = LSPS2ClientConfig :: default ( ) ;
47
+ let client_config = LiquidityClientConfig {
48
+ lsps1_client_config : None ,
49
+ lsps2_client_config : Some ( lsps2_client_config) ,
50
+ } ;
51
+
52
+ let ( service_node, client_node) =
53
+ create_service_and_client_nodes ( "webhook_registration_flow" , service_config, client_config) ;
54
+
55
+ let secp = bitcoin:: secp256k1:: Secp256k1 :: new ( ) ;
56
+ let service_node_id = bitcoin:: secp256k1:: PublicKey :: from_secret_key ( & secp, & signing_key) ;
57
+ let client_node_id = client_node. channel_manager . get_our_node_id ( ) ;
58
+
59
+ ( service_node_id, client_node_id, service_node, client_node, promise_secret)
60
+ }
61
+
31
62
fn create_jit_invoice (
32
63
node : & Node , service_node_id : PublicKey , intercept_scid : u64 , cltv_expiry_delta : u32 ,
33
64
payment_size_msat : Option < u64 > , description : & str , expiry_secs : u32 ,
@@ -82,15 +113,11 @@ fn create_jit_invoice(
82
113
83
114
#[ test]
84
115
fn invoice_generation_flow ( ) {
85
- let (
86
- client_handler,
87
- service_handler,
88
- service_node_id,
89
- client_node_id,
90
- service_node,
91
- client_node,
92
- promise_secret,
93
- ) = setup_test_lsps2 ( ) ;
116
+ let ( service_node_id, client_node_id, service_node, client_node, promise_secret) =
117
+ setup_test_lsps2 ( ) ;
118
+
119
+ let client_handler = client_node. liquidity_manager . lsps2_client_handler ( ) . unwrap ( ) ;
120
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
94
121
95
122
let get_info_request_id = client_handler. request_opening_params ( service_node_id, None ) ;
96
123
let get_info_request = get_lsps_message ! ( client_node, service_node_id) ;
@@ -228,8 +255,9 @@ fn invoice_generation_flow() {
228
255
229
256
#[ test]
230
257
fn channel_open_failed ( ) {
231
- let ( _, service_handler, service_node_id, client_node_id, service_node, client_node, _) =
232
- setup_test_lsps2 ( ) ;
258
+ let ( service_node_id, client_node_id, service_node, client_node, _) = setup_test_lsps2 ( ) ;
259
+
260
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
233
261
234
262
let get_info_request_id = client_node
235
263
. liquidity_manager
@@ -303,6 +331,16 @@ fn channel_open_failed() {
303
331
client_node. liquidity_manager . handle_custom_message ( buy_response, service_node_id) . unwrap ( ) ;
304
332
let _invoice_params_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
305
333
334
+ // Test calling channel_open_failed in invalid state (before HTLC interception)
335
+ let result = service_handler. channel_open_failed ( & client_node_id, user_channel_id) ;
336
+ assert ! ( result. is_err( ) ) ;
337
+ match result. unwrap_err ( ) {
338
+ APIError :: APIMisuseError { err } => {
339
+ assert ! ( err. contains( "Channel is not in the PendingChannelOpen state." ) ) ;
340
+ } ,
341
+ other => panic ! ( "Unexpected error type: {:?}" , other) ,
342
+ }
343
+
306
344
let htlc_amount_msat = 1_000_000 ;
307
345
let intercept_id = InterceptId ( [ 0 ; 32 ] ) ;
308
346
let payment_hash = PaymentHash ( [ 1 ; 32 ] ) ;
@@ -348,95 +386,11 @@ fn channel_open_failed() {
348
386
} ;
349
387
}
350
388
351
- #[ test]
352
- fn channel_open_failed_invalid_state ( ) {
353
- let ( _, service_handler, service_node_id, client_node_id, service_node, client_node, _) =
354
- setup_test_lsps2 ( ) ;
355
-
356
- let get_info_request_id = client_node
357
- . liquidity_manager
358
- . lsps2_client_handler ( )
359
- . unwrap ( )
360
- . request_opening_params ( service_node_id, None ) ;
361
- let get_info_request = get_lsps_message ! ( client_node, service_node_id) ;
362
- service_node. liquidity_manager . handle_custom_message ( get_info_request, client_node_id) . unwrap ( ) ;
363
- let _get_info_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
364
-
365
- let raw_opening_params = LSPS2RawOpeningFeeParams {
366
- min_fee_msat : 100 ,
367
- proportional : 21 ,
368
- valid_until : LSPSDateTime :: from_str ( "2035-05-20T08:30:45Z" ) . unwrap ( ) ,
369
- min_lifetime : 144 ,
370
- max_client_to_self_delay : 128 ,
371
- min_payment_size_msat : 1 ,
372
- max_payment_size_msat : 100_000_000 ,
373
- } ;
374
- service_handler
375
- . opening_fee_params_generated (
376
- & client_node_id,
377
- get_info_request_id. clone ( ) ,
378
- vec ! [ raw_opening_params] ,
379
- )
380
- . unwrap ( ) ;
381
-
382
- let get_info_response = get_lsps_message ! ( service_node, client_node_id) ;
383
- client_node
384
- . liquidity_manager
385
- . handle_custom_message ( get_info_response, service_node_id)
386
- . unwrap ( ) ;
387
-
388
- let opening_fee_params = match client_node. liquidity_manager . next_event ( ) . unwrap ( ) {
389
- LiquidityEvent :: LSPS2Client ( LSPS2ClientEvent :: OpeningParametersReady {
390
- opening_fee_params_menu,
391
- ..
392
- } ) => opening_fee_params_menu. first ( ) . unwrap ( ) . clone ( ) ,
393
- _ => panic ! ( "Unexpected event" ) ,
394
- } ;
395
-
396
- let payment_size_msat = Some ( 1_000_000 ) ;
397
- let buy_request_id = client_node
398
- . liquidity_manager
399
- . lsps2_client_handler ( )
400
- . unwrap ( )
401
- . select_opening_params ( service_node_id, payment_size_msat, opening_fee_params. clone ( ) )
402
- . unwrap ( ) ;
403
- let buy_request = get_lsps_message ! ( client_node, service_node_id) ;
404
- service_node. liquidity_manager . handle_custom_message ( buy_request, client_node_id) . unwrap ( ) ;
405
-
406
- let _buy_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
407
- let user_channel_id = 42 ;
408
- let cltv_expiry_delta = 144 ;
409
- let intercept_scid = service_node. channel_manager . get_intercept_scid ( ) ;
410
- let client_trusts_lsp = true ;
411
-
412
- service_handler
413
- . invoice_parameters_generated (
414
- & client_node_id,
415
- buy_request_id. clone ( ) ,
416
- intercept_scid,
417
- cltv_expiry_delta,
418
- client_trusts_lsp,
419
- user_channel_id,
420
- )
421
- . unwrap ( ) ;
422
-
423
- // We're purposely not intercepting an HTLC, so the state remains PendingInitialPayment
424
-
425
- // Try to call channel_open_failed, which should fail because the channel is not in PendingChannelOpen state
426
- let result = service_handler. channel_open_failed ( & client_node_id, user_channel_id) ;
427
-
428
- assert ! ( result. is_err( ) ) ;
429
- match result. unwrap_err ( ) {
430
- APIError :: APIMisuseError { err } => {
431
- assert ! ( err. contains( "Channel is not in the PendingChannelOpen state." ) ) ;
432
- } ,
433
- other => panic ! ( "Unexpected error type: {:?}" , other) ,
434
- }
435
- }
436
-
437
389
#[ test]
438
390
fn channel_open_failed_nonexistent_channel ( ) {
439
- let ( _, service_handler, _, client_node_id, _, _, _) = setup_test_lsps2 ( ) ;
391
+ let ( _, client_node_id, service_node, _, _) = setup_test_lsps2 ( ) ;
392
+
393
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
440
394
441
395
// Call channel_open_failed with a nonexistent user_channel_id
442
396
let nonexistent_user_channel_id = 999 ;
@@ -453,8 +407,9 @@ fn channel_open_failed_nonexistent_channel() {
453
407
454
408
#[ test]
455
409
fn channel_open_abandoned ( ) {
456
- let ( _, service_handler, service_node_id, client_node_id, service_node, client_node, _) =
457
- setup_test_lsps2 ( ) ;
410
+ let ( service_node_id, client_node_id, service_node, client_node, _) = setup_test_lsps2 ( ) ;
411
+
412
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
458
413
459
414
// Set up a JIT channel
460
415
let get_info_request_id = client_node
@@ -534,7 +489,8 @@ fn channel_open_abandoned() {
534
489
535
490
#[ test]
536
491
fn channel_open_abandoned_nonexistent_channel ( ) {
537
- let ( _, service_handler, _, client_node_id, _, _, _) = setup_test_lsps2 ( ) ;
492
+ let ( _, client_node_id, service_node, _, _) = setup_test_lsps2 ( ) ;
493
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
538
494
539
495
// Call channel_open_abandoned with a nonexistent user_channel_id
540
496
let nonexistent_user_channel_id = 999 ;
0 commit comments