@@ -501,3 +501,99 @@ fn lsps1_service_handler_persistence_across_restarts() {
501501 }
502502 }
503503}
504+
505+ #[ test]
506+ fn lsps1_invalid_token_error ( ) {
507+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
508+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
509+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
510+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
511+
512+ let supported_options = LSPS1Options {
513+ min_required_channel_confirmations : 0 ,
514+ min_funding_confirms_within_blocks : 6 ,
515+ supports_zero_channel_reserve : true ,
516+ max_channel_expiry_blocks : 144 ,
517+ min_initial_client_balance_sat : 10_000_000 ,
518+ max_initial_client_balance_sat : 100_000_000 ,
519+ min_initial_lsp_balance_sat : 100_000 ,
520+ max_initial_lsp_balance_sat : 100_000_000 ,
521+ min_channel_balance_sat : 100_000 ,
522+ max_channel_balance_sat : 100_000_000 ,
523+ } ;
524+
525+ let LSPSNodes { service_node, client_node } =
526+ setup_test_lsps1_nodes ( nodes, supported_options. clone ( ) ) ;
527+ let service_node_id = service_node. inner . node . get_our_node_id ( ) ;
528+ let client_node_id = client_node. inner . node . get_our_node_id ( ) ;
529+ let client_handler = client_node. liquidity_manager . lsps1_client_handler ( ) . unwrap ( ) ;
530+ let service_handler = service_node. liquidity_manager . lsps1_service_handler ( ) . unwrap ( ) ;
531+
532+ // Create an order with an invalid token
533+ let order_params = LSPS1OrderParams {
534+ lsp_balance_sat : 100_000 ,
535+ client_balance_sat : 10_000_000 ,
536+ required_channel_confirmations : 0 ,
537+ funding_confirms_within_blocks : 6 ,
538+ channel_expiry_blocks : 144 ,
539+ token : Some ( "invalid_token" . to_string ( ) ) ,
540+ announce_channel : true ,
541+ } ;
542+
543+ let refund_onchain_address =
544+ Address :: from_str ( "bc1p5uvtaxzkjwvey2tfy49k5vtqfpjmrgm09cvs88ezyy8h2zv7jhas9tu4yr" )
545+ . unwrap ( )
546+ . assume_checked ( ) ;
547+ let create_order_id = client_handler. create_order (
548+ & service_node_id,
549+ order_params. clone ( ) ,
550+ Some ( refund_onchain_address) ,
551+ ) ;
552+ let create_order = get_lsps_message ! ( client_node, service_node_id) ;
553+
554+ // Service receives the create_order request
555+ service_node. liquidity_manager . handle_custom_message ( create_order, client_node_id) . unwrap ( ) ;
556+
557+ // Service emits RequestForPaymentDetails event
558+ let request_for_payment_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
559+ let request_id =
560+ if let LiquidityEvent :: LSPS1Service ( LSPS1ServiceEvent :: RequestForPaymentDetails {
561+ request_id,
562+ counterparty_node_id,
563+ order,
564+ } ) = request_for_payment_event
565+ {
566+ assert_eq ! ( counterparty_node_id, client_node_id) ;
567+ assert_eq ! ( order, order_params) ;
568+ request_id
569+ } else {
570+ panic ! ( "Unexpected event: expected RequestForPaymentDetails" ) ;
571+ } ;
572+
573+ // Service rejects the order due to invalid token
574+ service_handler. invalid_token_provided ( client_node_id, request_id) . unwrap ( ) ;
575+
576+ // Get the error response message
577+ let error_response = get_lsps_message ! ( service_node, client_node_id) ;
578+
579+ // Client receives the error response
580+ client_node
581+ . liquidity_manager
582+ . handle_custom_message ( error_response, service_node_id)
583+ . unwrap_err ( ) ;
584+
585+ // Client receives OrderRequestFailed event with error code 102
586+ let error_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
587+ if let LiquidityEvent :: LSPS1Client ( LSPS1ClientEvent :: OrderRequestFailed {
588+ request_id,
589+ counterparty_node_id,
590+ error,
591+ } ) = error_event
592+ {
593+ assert_eq ! ( request_id, create_order_id) ;
594+ assert_eq ! ( counterparty_node_id, service_node_id) ;
595+ assert_eq ! ( error. code, 102 ) ; // LSPS1_CREATE_ORDER_REQUEST_UNRECOGNIZED_OR_STALE_TOKEN_ERROR_CODE
596+ } else {
597+ panic ! ( "Unexpected event: expected OrderRequestFailed" ) ;
598+ }
599+ }
0 commit comments