@@ -927,6 +927,25 @@ fn opening_fee_params_menu_is_sorted_by_spec() {
927
927
928
928
#[ test]
929
929
fn client_trusts_lsp_end_to_end_test ( ) {
930
+ // There are 3 nodes. Payer, service and client.
931
+ // client_trusts_lsp=true, that means that funding transaction broadcast will need to happen manually
932
+ // after the client claims the HTLC.
933
+ //
934
+ // 1. Create a channel between payer and service
935
+ // 2. Do the LSPS2 ceremony between client and service, to prepare the service to intercept an htlc and eventually create a JIT channel
936
+ // 3. Make the client create a JIT invoice and make the payer pay it
937
+ // 4. Assert that the service intercepts the HTLC
938
+ // 5. Assert that the service emits a LiquidityEvent::OpenChannel. This means that the intercepted HTLC was enough
939
+ // and that it's ready to proceed with channel creation.
940
+ // 6. Proceed with the JIT channel creation (we create it with funding_transaction_generated_manual_broadcast because
941
+ // client_trusts_lsp=true).
942
+ // 7. Call the service's channel_ready function
943
+ // 8. The service will now forward the intercepted HTLC to the client on the new JIT channel
944
+ // 9. The client will see the PaymentClaimable event
945
+ // 10. Assert that the service has not broadcasted the funding transaction yet, because the client has not claimed the HTLC yet
946
+ // 11. Make the client claim the HTLC
947
+ // 12. Assert that the service has now received the BroadcastTransaction event, and we broadcast it
948
+ // 13. Assert that the payer received the PaymentSent event
930
949
let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
931
950
let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
932
951
let mut service_node_config = test_default_channel_config ( ) ;
@@ -943,148 +962,38 @@ fn client_trusts_lsp_end_to_end_test() {
943
962
) ;
944
963
let nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
945
964
let ( lsps_nodes, promise_secret) = setup_test_lsps2_nodes_with_payer ( nodes) ;
946
- let LSPSNodesWithPayer { service_node, client_node, payer_node } = lsps_nodes;
965
+ let LSPSNodesWithPayer { ref service_node, ref client_node, ref payer_node } = lsps_nodes;
947
966
948
967
let payer_node_id = payer_node. node . get_our_node_id ( ) ;
949
968
let service_node_id = service_node. inner . node . get_our_node_id ( ) ;
950
969
let client_node_id = client_node. inner . node . get_our_node_id ( ) ;
951
970
952
- let client_handler = client_node. liquidity_manager . lsps2_client_handler ( ) . unwrap ( ) ;
953
971
let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
954
972
955
973
create_chan_between_nodes_with_value ( & payer_node, & service_node. inner , 2000000 , 100000 ) ;
956
974
957
- let get_info_request_id = client_handler. request_opening_params ( service_node_id, None ) ;
958
- let get_info_request = get_lsps_message ! ( client_node, service_node_id) ;
959
-
960
- service_node. liquidity_manager . handle_custom_message ( get_info_request, client_node_id) . unwrap ( ) ;
961
-
962
- let get_info_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
963
- if let LiquidityEvent :: LSPS2Service ( LSPS2ServiceEvent :: GetInfo {
964
- request_id,
965
- counterparty_node_id,
966
- token,
967
- } ) = get_info_event
968
- {
969
- assert_eq ! ( request_id, get_info_request_id) ;
970
- assert_eq ! ( counterparty_node_id, client_node_id) ;
971
- assert_eq ! ( token, None ) ;
972
- } else {
973
- panic ! ( "Unexpected event" ) ;
974
- }
975
-
976
- let raw_opening_params = LSPS2RawOpeningFeeParams {
977
- min_fee_msat : 0 ,
978
- proportional : 0 ,
979
- valid_until : LSPSDateTime :: from_str ( "2035-05-20T08:30:45Z" ) . unwrap ( ) ,
980
- min_lifetime : 144 ,
981
- max_client_to_self_delay : 128 ,
982
- min_payment_size_msat : 1 ,
983
- max_payment_size_msat : 100_000_000 ,
984
- } ;
985
-
986
- service_handler
987
- . opening_fee_params_generated (
988
- & client_node_id,
989
- get_info_request_id. clone ( ) ,
990
- vec ! [ raw_opening_params] ,
991
- )
992
- . unwrap ( ) ;
993
- let get_info_response = get_lsps_message ! ( service_node, client_node_id) ;
994
-
995
- client_node
996
- . liquidity_manager
997
- . handle_custom_message ( get_info_response, service_node_id)
998
- . unwrap ( ) ;
999
-
1000
- let opening_params_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1001
- let opening_fee_params = match opening_params_event {
1002
- LiquidityEvent :: LSPS2Client ( LSPS2ClientEvent :: OpeningParametersReady {
1003
- request_id,
1004
- counterparty_node_id,
1005
- opening_fee_params_menu,
1006
- } ) => {
1007
- assert_eq ! ( request_id, get_info_request_id) ;
1008
- assert_eq ! ( counterparty_node_id, service_node_id) ;
1009
- let opening_fee_params = opening_fee_params_menu. first ( ) . unwrap ( ) . clone ( ) ;
1010
- assert ! ( is_valid_opening_fee_params( & opening_fee_params, & promise_secret) ) ;
1011
- opening_fee_params
1012
- } ,
1013
- _ => panic ! ( "Unexpected event" ) ,
1014
- } ;
1015
-
1016
- let payment_size_msat = Some ( 1_000_000 ) ;
1017
- let buy_request_id = client_handler
1018
- . select_opening_params ( service_node_id, payment_size_msat, opening_fee_params. clone ( ) )
1019
- . unwrap ( ) ;
1020
-
1021
- let buy_request = get_lsps_message ! ( client_node, service_node_id) ;
1022
- service_node. liquidity_manager . handle_custom_message ( buy_request, client_node_id) . unwrap ( ) ;
1023
-
1024
- let buy_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1025
- if let LiquidityEvent :: LSPS2Service ( LSPS2ServiceEvent :: BuyRequest {
1026
- request_id,
1027
- counterparty_node_id,
1028
- opening_fee_params : ofp,
1029
- payment_size_msat : psm,
1030
- } ) = buy_event
1031
- {
1032
- assert_eq ! ( request_id, buy_request_id) ;
1033
- assert_eq ! ( counterparty_node_id, client_node_id) ;
1034
- assert_eq ! ( opening_fee_params, ofp) ;
1035
- assert_eq ! ( payment_size_msat, psm) ;
1036
- } else {
1037
- panic ! ( "Unexpected event" ) ;
1038
- }
1039
-
1040
- let user_channel_id = 42 ;
1041
- let cltv_expiry_delta = 144 ;
1042
975
let intercept_scid = service_node. node . get_intercept_scid ( ) ;
1043
- let client_trusts_lsp = true ;
1044
-
1045
- service_handler
1046
- . invoice_parameters_generated (
1047
- & client_node_id,
1048
- buy_request_id. clone ( ) ,
1049
- intercept_scid,
1050
- cltv_expiry_delta,
1051
- client_trusts_lsp,
1052
- user_channel_id,
1053
- )
1054
- . unwrap ( ) ;
1055
-
1056
- let buy_response = get_lsps_message ! ( service_node, client_node_id) ;
1057
- client_node. liquidity_manager . handle_custom_message ( buy_response, service_node_id) . unwrap ( ) ;
1058
-
1059
- let invoice_params_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1060
- if let LiquidityEvent :: LSPS2Client ( LSPS2ClientEvent :: InvoiceParametersReady {
1061
- request_id,
1062
- counterparty_node_id,
1063
- intercept_scid : iscid,
1064
- cltv_expiry_delta : ced,
1065
- payment_size_msat : psm,
1066
- } ) = invoice_params_event
1067
- {
1068
- assert_eq ! ( request_id, buy_request_id) ;
1069
- assert_eq ! ( counterparty_node_id, service_node_id) ;
1070
- assert_eq ! ( intercept_scid, iscid) ;
1071
- assert_eq ! ( cltv_expiry_delta, ced) ;
1072
- assert_eq ! ( payment_size_msat, psm) ;
1073
- } else {
1074
- panic ! ( "Unexpected event" ) ;
1075
- }
976
+ let user_channel_id = 42 ;
977
+ let cltv_expiry_delta: u32 = 144 ;
978
+ let payment_size_msat = Some ( 1_000_000 ) ;
1076
979
1077
- let description = "asdf" ;
1078
- let expiry_secs = 3600 ;
980
+ execute_lsps2_dance (
981
+ & lsps_nodes,
982
+ intercept_scid,
983
+ user_channel_id,
984
+ cltv_expiry_delta,
985
+ promise_secret,
986
+ payment_size_msat,
987
+ ) ;
1079
988
1080
989
let invoice = create_jit_invoice (
1081
990
& client_node,
1082
991
service_node_id,
1083
992
intercept_scid,
1084
993
cltv_expiry_delta,
1085
994
payment_size_msat,
1086
- description ,
1087
- expiry_secs ,
995
+ "asdf" ,
996
+ 3600 ,
1088
997
)
1089
998
. unwrap ( ) ;
1090
999
@@ -1233,6 +1142,136 @@ fn client_trusts_lsp_end_to_end_test() {
1233
1142
expect_payment_sent ( & payer_node, preimage. unwrap ( ) , Some ( Some ( total_fee_msat) ) , true , true ) ;
1234
1143
}
1235
1144
1145
+ fn execute_lsps2_dance (
1146
+ lsps_nodes : & LSPSNodesWithPayer , intercept_scid : u64 , user_channel_id : u128 ,
1147
+ cltv_expiry_delta : u32 , promise_secret : [ u8 ; 32 ] , payment_size_msat : Option < u64 > ,
1148
+ ) {
1149
+ let service_node = & lsps_nodes. service_node ;
1150
+ let client_node = & lsps_nodes. client_node ;
1151
+
1152
+ let service_node_id = service_node. inner . node . get_our_node_id ( ) ;
1153
+ let client_node_id = client_node. inner . node . get_our_node_id ( ) ;
1154
+
1155
+ let client_handler = client_node. liquidity_manager . lsps2_client_handler ( ) . unwrap ( ) ;
1156
+ let service_handler = service_node. liquidity_manager . lsps2_service_handler ( ) . unwrap ( ) ;
1157
+
1158
+ let get_info_request_id = client_handler. request_opening_params ( service_node_id, None ) ;
1159
+ let get_info_request = get_lsps_message ! ( client_node, service_node_id) ;
1160
+
1161
+ service_node. liquidity_manager . handle_custom_message ( get_info_request, client_node_id) . unwrap ( ) ;
1162
+
1163
+ let get_info_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1164
+ if let LiquidityEvent :: LSPS2Service ( LSPS2ServiceEvent :: GetInfo {
1165
+ request_id,
1166
+ counterparty_node_id,
1167
+ token,
1168
+ } ) = get_info_event
1169
+ {
1170
+ assert_eq ! ( request_id, get_info_request_id) ;
1171
+ assert_eq ! ( counterparty_node_id, client_node_id) ;
1172
+ assert_eq ! ( token, None ) ;
1173
+ } else {
1174
+ panic ! ( "Unexpected event" ) ;
1175
+ }
1176
+
1177
+ let raw_opening_params = LSPS2RawOpeningFeeParams {
1178
+ min_fee_msat : 0 ,
1179
+ proportional : 0 ,
1180
+ valid_until : LSPSDateTime :: from_str ( "2035-05-20T08:30:45Z" ) . unwrap ( ) ,
1181
+ min_lifetime : 144 ,
1182
+ max_client_to_self_delay : 128 ,
1183
+ min_payment_size_msat : 1 ,
1184
+ max_payment_size_msat : 100_000_000 ,
1185
+ } ;
1186
+
1187
+ service_handler
1188
+ . opening_fee_params_generated (
1189
+ & client_node_id,
1190
+ get_info_request_id. clone ( ) ,
1191
+ vec ! [ raw_opening_params] ,
1192
+ )
1193
+ . unwrap ( ) ;
1194
+ let get_info_response = get_lsps_message ! ( service_node, client_node_id) ;
1195
+
1196
+ client_node
1197
+ . liquidity_manager
1198
+ . handle_custom_message ( get_info_response, service_node_id)
1199
+ . unwrap ( ) ;
1200
+
1201
+ let opening_params_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1202
+ let opening_fee_params = match opening_params_event {
1203
+ LiquidityEvent :: LSPS2Client ( LSPS2ClientEvent :: OpeningParametersReady {
1204
+ request_id,
1205
+ counterparty_node_id,
1206
+ opening_fee_params_menu,
1207
+ } ) => {
1208
+ assert_eq ! ( request_id, get_info_request_id) ;
1209
+ assert_eq ! ( counterparty_node_id, service_node_id) ;
1210
+ let opening_fee_params = opening_fee_params_menu. first ( ) . unwrap ( ) . clone ( ) ;
1211
+ assert ! ( is_valid_opening_fee_params( & opening_fee_params, & promise_secret) ) ;
1212
+ opening_fee_params
1213
+ } ,
1214
+ _ => panic ! ( "Unexpected event" ) ,
1215
+ } ;
1216
+
1217
+ let buy_request_id = client_handler
1218
+ . select_opening_params ( service_node_id, payment_size_msat, opening_fee_params. clone ( ) )
1219
+ . unwrap ( ) ;
1220
+
1221
+ let buy_request = get_lsps_message ! ( client_node, service_node_id) ;
1222
+ service_node. liquidity_manager . handle_custom_message ( buy_request, client_node_id) . unwrap ( ) ;
1223
+
1224
+ let buy_event = service_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1225
+ if let LiquidityEvent :: LSPS2Service ( LSPS2ServiceEvent :: BuyRequest {
1226
+ request_id,
1227
+ counterparty_node_id,
1228
+ opening_fee_params : ofp,
1229
+ payment_size_msat : psm,
1230
+ } ) = buy_event
1231
+ {
1232
+ assert_eq ! ( request_id, buy_request_id) ;
1233
+ assert_eq ! ( counterparty_node_id, client_node_id) ;
1234
+ assert_eq ! ( opening_fee_params, ofp) ;
1235
+ assert_eq ! ( payment_size_msat, psm) ;
1236
+ } else {
1237
+ panic ! ( "Unexpected event" ) ;
1238
+ }
1239
+
1240
+ let client_trusts_lsp = true ;
1241
+
1242
+ service_handler
1243
+ . invoice_parameters_generated (
1244
+ & client_node_id,
1245
+ buy_request_id. clone ( ) ,
1246
+ intercept_scid,
1247
+ cltv_expiry_delta,
1248
+ client_trusts_lsp,
1249
+ user_channel_id,
1250
+ )
1251
+ . unwrap ( ) ;
1252
+
1253
+ let buy_response = get_lsps_message ! ( service_node, client_node_id) ;
1254
+ client_node. liquidity_manager . handle_custom_message ( buy_response, service_node_id) . unwrap ( ) ;
1255
+
1256
+ let invoice_params_event = client_node. liquidity_manager . next_event ( ) . unwrap ( ) ;
1257
+ if let LiquidityEvent :: LSPS2Client ( LSPS2ClientEvent :: InvoiceParametersReady {
1258
+ request_id,
1259
+ counterparty_node_id,
1260
+ intercept_scid : iscid,
1261
+ cltv_expiry_delta : ced,
1262
+ payment_size_msat : psm,
1263
+ } ) = invoice_params_event
1264
+ {
1265
+ assert_eq ! ( request_id, buy_request_id) ;
1266
+ assert_eq ! ( counterparty_node_id, service_node_id) ;
1267
+ assert_eq ! ( intercept_scid, iscid) ;
1268
+ assert_eq ! ( cltv_expiry_delta, ced) ;
1269
+ assert_eq ! ( payment_size_msat, psm) ;
1270
+ } else {
1271
+ panic ! ( "Unexpected event" ) ;
1272
+ }
1273
+ }
1274
+
1236
1275
fn create_channel_with_manual_broadcast (
1237
1276
service_node_id : & PublicKey , client_node_id : & PublicKey , service_node : & LiquidityNode ,
1238
1277
client_node : & LiquidityNode , user_channel_id : u128 , expected_outbound_amount_msat : & u64 ,
0 commit comments