Skip to content

Commit b09be67

Browse files
committed
Add LSPS2 client<>service integration test
1 parent 4a00e8c commit b09be67

File tree

1 file changed

+103
-4
lines changed

1 file changed

+103
-4
lines changed

tests/integration_tests_rust.rs

+103-4
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
mod common;
99

1010
use common::{
11-
do_channel_full_cycle, expect_channel_ready_event, expect_event, expect_payment_received_event,
12-
expect_payment_successful_event, generate_blocks_and_wait, open_channel,
13-
premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd, setup_builder,
14-
setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestSyncStore,
11+
do_channel_full_cycle, expect_channel_ready_event, expect_event, expect_channel_pending_event,
12+
expect_payment_received_event, expect_payment_successful_event, generate_blocks_and_wait,
13+
open_channel, premine_and_distribute_funds, random_config, setup_bitcoind_and_electrsd,
14+
setup_builder, setup_node, setup_two_nodes, wait_for_tx, TestChainSource, TestSyncStore,
1515
};
1616

1717
use ldk_node::config::EsploraSyncConfig;
18+
use ldk_node::liquidity::LSPS2ServiceConfig;
1819
use ldk_node::payment::{
1920
ConfirmationStatus, PaymentDirection, PaymentKind, PaymentStatus, QrPaymentResult,
2021
SendingParameters,
@@ -990,3 +991,101 @@ fn unified_qr_send_receive() {
990991
assert_eq!(node_b.list_balances().total_onchain_balance_sats, 800_000);
991992
assert_eq!(node_b.list_balances().total_lightning_balance_sats, 200_000);
992993
}
994+
995+
#[test]
996+
fn lsps2_client_service_integration() {
997+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
998+
999+
let esplora_url = format!("http://{}", electrsd.esplora_url.as_ref().unwrap());
1000+
1001+
let mut sync_config = EsploraSyncConfig::default();
1002+
sync_config.onchain_wallet_sync_interval_secs = 100000;
1003+
sync_config.lightning_wallet_sync_interval_secs = 100000;
1004+
1005+
// Setup three nodes: service, client, and payer
1006+
let channel_opening_fee_ppm = 10_000;
1007+
let lsps2_service_config = LSPS2ServiceConfig {
1008+
require_token: None,
1009+
advertise_service: false,
1010+
channel_opening_fee_ppm,
1011+
channel_over_provisioning_ppm: 100_000,
1012+
max_payment_size_msat: 1_000_000_000,
1013+
min_payment_size_msat: 0,
1014+
min_channel_lifetime: 100,
1015+
min_channel_opening_fee_msat: 0,
1016+
max_client_to_self_delay: 1024,
1017+
};
1018+
1019+
let service_config = random_config(true);
1020+
setup_builder!(service_builder, service_config);
1021+
service_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
1022+
service_builder.set_liquidity_provider_lsps2(lsps2_service_config);
1023+
let service_node = service_builder.build().unwrap();
1024+
service_node.start().unwrap();
1025+
1026+
let service_node_id = service_node.node_id();
1027+
let service_addr = service_node.listening_addresses().unwrap().first().unwrap().clone();
1028+
1029+
let client_config = random_config(true);
1030+
setup_builder!(client_builder, client_config);
1031+
client_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
1032+
client_builder.set_liquidity_source_lsps2(service_node_id, service_addr, None);
1033+
let client_node = client_builder.build().unwrap();
1034+
client_node.start().unwrap();
1035+
1036+
let payer_config = random_config(true);
1037+
setup_builder!(payer_builder, payer_config);
1038+
payer_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
1039+
let payer_node = payer_builder.build().unwrap();
1040+
payer_node.start().unwrap();
1041+
1042+
let service_addr = service_node.onchain_payment().new_address().unwrap();
1043+
let client_addr = client_node.onchain_payment().new_address().unwrap();
1044+
let payer_addr = payer_node.onchain_payment().new_address().unwrap();
1045+
1046+
let premine_amount_sat = 10_000_000;
1047+
1048+
premine_and_distribute_funds(
1049+
&bitcoind.client,
1050+
&electrsd.client,
1051+
vec![service_addr, client_addr, payer_addr],
1052+
Amount::from_sat(premine_amount_sat),
1053+
);
1054+
service_node.sync_wallets().unwrap();
1055+
client_node.sync_wallets().unwrap();
1056+
payer_node.sync_wallets().unwrap();
1057+
1058+
// Open a channel payer -> service that will allow paying the JIT invoice
1059+
println!("Opening channel payer_node -> service_node!");
1060+
open_channel(&payer_node, &service_node, 5_000_000, false, &electrsd);
1061+
1062+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6);
1063+
service_node.sync_wallets().unwrap();
1064+
payer_node.sync_wallets().unwrap();
1065+
expect_channel_ready_event!(payer_node, service_node.node_id());
1066+
expect_channel_ready_event!(service_node, payer_node.node_id());
1067+
1068+
let invoice_description =
1069+
Bolt11InvoiceDescription::Direct(Description::new(String::from("asdf")).unwrap());
1070+
let jit_amount_msat = 100_000_000;
1071+
1072+
println!("Generating JIT invoice!");
1073+
let jit_invoice = client_node
1074+
.bolt11_payment()
1075+
.receive_via_jit_channel(jit_amount_msat, &invoice_description, 1024, None)
1076+
.unwrap();
1077+
1078+
let payment_id = payer_node.bolt11_payment().send(&jit_invoice, None).unwrap();
1079+
1080+
// Have the payer_node pay the invoice, therby triggering channel open service_node -> client_node.
1081+
println!("Paying JIT invoice!");
1082+
expect_channel_pending_event!(service_node, client_node.node_id());
1083+
expect_channel_ready_event!(service_node, client_node.node_id());
1084+
expect_channel_pending_event!(client_node, service_node.node_id());
1085+
expect_channel_ready_event!(client_node, service_node.node_id());
1086+
1087+
let service_fee_msat = (jit_amount_msat * channel_opening_fee_ppm as u64) / 1_000_000;
1088+
let expected_amount = jit_amount_msat - service_fee_msat;
1089+
expect_payment_successful_event!(payer_node, Some(payment_id), None);
1090+
expect_payment_received_event!(client_node, expected_amount);
1091+
}

0 commit comments

Comments
 (0)