22
33mod common;
44
5- use common:: { get_lsps_message , setup_test_lsps2 , Node } ;
5+ use common:: { create_service_and_client_nodes , get_lsps_message , Node } ;
66
77use lightning_liquidity:: events:: LiquidityEvent ;
88use lightning_liquidity:: lsps0:: ser:: LSPSDateTime ;
9+ use lightning_liquidity:: lsps2:: client:: LSPS2ClientConfig ;
910use lightning_liquidity:: lsps2:: event:: { LSPS2ClientEvent , LSPS2ServiceEvent } ;
1011use lightning_liquidity:: lsps2:: msgs:: LSPS2RawOpeningFeeParams ;
12+ use lightning_liquidity:: lsps2:: service:: LSPS2ServiceConfig ;
1113use lightning_liquidity:: lsps2:: utils:: is_valid_opening_fee_params;
1214
1315use lightning:: ln:: channelmanager:: { InterceptId , MIN_FINAL_CLTV_EXPIRY_DELTA } ;
@@ -19,15 +21,44 @@ use lightning::util::logger::Logger;
1921
2022use lightning_invoice:: { Bolt11Invoice , InvoiceBuilder , RoutingFees } ;
2123
24+ use lightning_liquidity:: { LiquidityClientConfig , LiquidityServiceConfig } ;
2225use lightning_types:: payment:: PaymentHash ;
2326
2427use bitcoin:: hashes:: { sha256, Hash } ;
25- use bitcoin:: secp256k1:: { PublicKey , Secp256k1 } ;
28+ use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
2629use bitcoin:: Network ;
2730
2831use std:: str:: FromStr ;
2932use std:: time:: Duration ;
3033
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+
3162fn create_jit_invoice (
3263 node : & Node , service_node_id : PublicKey , intercept_scid : u64 , cltv_expiry_delta : u32 ,
3364 payment_size_msat : Option < u64 > , description : & str , expiry_secs : u32 ,
@@ -82,15 +113,11 @@ fn create_jit_invoice(
82113
83114#[ test]
84115fn 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 ( ) ;
94121
95122 let get_info_request_id = client_handler. request_opening_params ( service_node_id, None ) ;
96123 let get_info_request = get_lsps_message ! ( client_node, service_node_id) ;
@@ -228,8 +255,9 @@ fn invoice_generation_flow() {
228255
229256#[ test]
230257fn 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 ( ) ;
233261
234262 let get_info_request_id = client_node
235263 . liquidity_manager
@@ -303,6 +331,16 @@ fn channel_open_failed() {
303331 client_node. liquidity_manager . handle_custom_message ( buy_response, service_node_id) . unwrap ( ) ;
304332 let _invoice_params_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
305333
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+
306344 let htlc_amount_msat = 1_000_000 ;
307345 let intercept_id = InterceptId ( [ 0 ; 32 ] ) ;
308346 let payment_hash = PaymentHash ( [ 1 ; 32 ] ) ;
@@ -348,95 +386,11 @@ fn channel_open_failed() {
348386 } ;
349387}
350388
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-
437389#[ test]
438390fn 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 ( ) ;
440394
441395 // Call channel_open_failed with a nonexistent user_channel_id
442396 let nonexistent_user_channel_id = 999 ;
@@ -453,8 +407,9 @@ fn channel_open_failed_nonexistent_channel() {
453407
454408#[ test]
455409fn 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 ( ) ;
458413
459414 // Set up a JIT channel
460415 let get_info_request_id = client_node
@@ -534,7 +489,8 @@ fn channel_open_abandoned() {
534489
535490#[ test]
536491fn 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 ( ) ;
538494
539495 // Call channel_open_abandoned with a nonexistent user_channel_id
540496 let nonexistent_user_channel_id = 999 ;
0 commit comments