@@ -746,3 +746,80 @@ fn invalid_token_flow() {
746
746
panic ! ( "Expected LSPS2ClientEvent::GetInfoFailed event" ) ;
747
747
}
748
748
}
749
+
750
+ #[ test]
751
+ fn opening_fee_params_menu_is_sorted_by_spec ( ) {
752
+ let ( service_node_id, client_node_id, service_node, client_node, _secret) =
753
+ setup_test_lsps2 ( "opening_fee_params_menu_is_sorted_by_spec" ) ;
754
+
755
+ let client_handler = client_node. liquidity_manager . lsps2_client_handler ( ) . unwrap ( ) ;
756
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
757
+
758
+ let _ = client_handler. request_opening_params ( service_node_id, None ) ;
759
+ let get_info_request = get_lsps_message ! ( client_node, service_node_id) ;
760
+ service_node. liquidity_manager . handle_custom_message ( get_info_request, client_node_id) . unwrap ( ) ;
761
+
762
+ let get_info_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
763
+ let request_id = match get_info_event {
764
+ LiquidityEvent :: LSPS2Service ( LSPS2ServiceEvent :: GetInfo { request_id, .. } ) => request_id,
765
+ _ => panic ! ( "Unexpected event" ) ,
766
+ } ;
767
+
768
+ let raw_params_generator = |min_fee_msat : u64 , proportional : u32 | LSPS2RawOpeningFeeParams {
769
+ min_fee_msat,
770
+ proportional,
771
+ valid_until : LSPSDateTime :: from_str ( "2035-05-20T08:30:45Z" ) . unwrap ( ) ,
772
+ min_lifetime : 144 ,
773
+ max_client_to_self_delay : 128 ,
774
+ min_payment_size_msat : 1 ,
775
+ max_payment_size_msat : 100_000_000 ,
776
+ } ;
777
+
778
+ let raw_params = vec ! [
779
+ raw_params_generator( 200 , 20 ) , // Will be sorted to position 2
780
+ raw_params_generator( 100 , 10 ) , // Will be sorted to position 0 (lowest min_fee, lowest proportional)
781
+ raw_params_generator( 300 , 30 ) , // Will be sorted to position 4 (highest min_fee, highest proportional)
782
+ raw_params_generator( 100 , 20 ) , // Will be sorted to position 1 (same min_fee as 0, higher proportional)
783
+ raw_params_generator( 200 , 30 ) , // Will be sorted to position 3 (higher min_fee than 2, higher proportional)
784
+ ] ;
785
+
786
+ service_handler
787
+ . opening_fee_params_generated ( & client_node_id, request_id. clone ( ) , raw_params)
788
+ . unwrap ( ) ;
789
+
790
+ let get_info_response = get_lsps_message ! ( service_node, client_node_id) ;
791
+ client_node
792
+ . liquidity_manager
793
+ . handle_custom_message ( get_info_response, service_node_id)
794
+ . unwrap ( ) ;
795
+
796
+ let event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
797
+ if let LiquidityEvent :: LSPS2Client ( LSPS2ClientEvent :: OpeningParametersReady {
798
+ opening_fee_params_menu,
799
+ ..
800
+ } ) = event
801
+ {
802
+ // The LSP, when ordering the opening_fee_params_menu array, MUST order by the following rules:
803
+ // The 0th item MAY have any parameters.
804
+ // Each succeeding item MUST, compared to the previous item, obey any one of the following:
805
+ // Have a larger min_fee_msat, and equal proportional.
806
+ // Have a larger proportional, and equal min_fee_msat.
807
+ // Have a larger min_fee_msat, AND larger proportional.
808
+ for i in 1 ..opening_fee_params_menu. len ( ) {
809
+ let prev = & opening_fee_params_menu[ i - 1 ] ;
810
+ let curr = & opening_fee_params_menu[ i] ;
811
+ let valid = ( curr. min_fee_msat > prev. min_fee_msat
812
+ && curr. proportional == prev. proportional )
813
+ || ( curr. proportional > prev. proportional
814
+ && curr. min_fee_msat == prev. min_fee_msat )
815
+ || ( curr. min_fee_msat > prev. min_fee_msat && curr. proportional > prev. proportional ) ;
816
+ assert ! (
817
+ valid,
818
+ "Params not sorted by spec at index {}: prev={:?}, curr={:?}" ,
819
+ i, prev, curr
820
+ ) ;
821
+ }
822
+ } else {
823
+ panic ! ( "Unexpected event" ) ;
824
+ }
825
+ }
0 commit comments