Skip to content

Commit 1ff29e0

Browse files
committed
Test LSPS2-BOLT12 flow across LSP restart
Add an integration test that creates a BOLT12 JIT offer via LSPS2, restarts the LSP node after offer creation, and verifies payment still succeeds and opens the JIT channel path. Co-Authored-By: HAL 9000
1 parent b8b5073 commit 1ff29e0

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

tests/integration_tests_rust.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,6 +1904,102 @@ async fn do_lsps2_client_service_integration(client_trusts_lsp: bool) {
19041904
assert_eq!(client_node.payment(&payment_id).unwrap().status, PaymentStatus::Failed);
19051905
}
19061906

1907+
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
1908+
async fn lsps2_bolt12_payment_succeeds_after_lsp_restart() {
1909+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
1910+
1911+
let esplora_url = format!("http://{}", electrsd.esplora_url.as_ref().unwrap());
1912+
1913+
let mut sync_config = EsploraSyncConfig::default();
1914+
sync_config.background_sync_config = None;
1915+
1916+
let lsps2_service_config = LSPS2ServiceConfig {
1917+
require_token: None,
1918+
advertise_service: false,
1919+
channel_opening_fee_ppm: 10_000,
1920+
channel_over_provisioning_ppm: 100_000,
1921+
max_payment_size_msat: 1_000_000_000,
1922+
min_payment_size_msat: 0,
1923+
min_channel_lifetime: 100,
1924+
min_channel_opening_fee_msat: 0,
1925+
max_client_to_self_delay: 1024,
1926+
client_trusts_lsp: true,
1927+
};
1928+
1929+
let service_config = random_config(true);
1930+
setup_builder!(service_builder, service_config.node_config);
1931+
service_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
1932+
service_builder.set_liquidity_provider_lsps2(lsps2_service_config);
1933+
let service_node = service_builder.build(service_config.node_entropy.into()).unwrap();
1934+
service_node.start().unwrap();
1935+
let service_node_id = service_node.node_id();
1936+
let service_addr = service_node.listening_addresses().unwrap().first().unwrap().clone();
1937+
1938+
let client_config = random_config(true);
1939+
setup_builder!(client_builder, client_config.node_config);
1940+
client_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
1941+
client_builder.set_liquidity_source_lsps2(service_node_id, service_addr.clone(), None);
1942+
let client_node = client_builder.build(client_config.node_entropy.into()).unwrap();
1943+
client_node.start().unwrap();
1944+
1945+
let payer_config = random_config(true);
1946+
setup_builder!(payer_builder, payer_config.node_config);
1947+
payer_builder.set_chain_source_esplora(esplora_url, Some(sync_config));
1948+
let payer_node = payer_builder.build(payer_config.node_entropy.into()).unwrap();
1949+
payer_node.start().unwrap();
1950+
1951+
let service_onchain_addr = service_node.onchain_payment().new_address().unwrap();
1952+
let client_onchain_addr = client_node.onchain_payment().new_address().unwrap();
1953+
let payer_onchain_addr = payer_node.onchain_payment().new_address().unwrap();
1954+
1955+
premine_and_distribute_funds(
1956+
&bitcoind.client,
1957+
&electrsd.client,
1958+
vec![service_onchain_addr, client_onchain_addr, payer_onchain_addr],
1959+
Amount::from_sat(10_000_000),
1960+
)
1961+
.await;
1962+
service_node.sync_wallets().unwrap();
1963+
client_node.sync_wallets().unwrap();
1964+
payer_node.sync_wallets().unwrap();
1965+
1966+
open_channel(&payer_node, &service_node, 5_000_000, false, &electrsd).await;
1967+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6).await;
1968+
service_node.sync_wallets().unwrap();
1969+
payer_node.sync_wallets().unwrap();
1970+
expect_channel_ready_event!(payer_node, service_node.node_id());
1971+
expect_channel_ready_event!(service_node, payer_node.node_id());
1972+
1973+
let jit_amount_msat = 100_000_000;
1974+
let offer = client_node
1975+
.bolt12_payment()
1976+
.receive_via_jit_channel(jit_amount_msat, "lsps2-bolt12-after-restart", None, Some(1), None)
1977+
.unwrap();
1978+
1979+
service_node.stop().unwrap();
1980+
service_node.start().unwrap();
1981+
1982+
// Ensure peers are connected after the restart before paying the offer.
1983+
let _ = payer_node.connect(service_node_id, service_addr.clone(), false);
1984+
let _ = client_node.connect(service_node_id, service_addr, false);
1985+
1986+
let payment_id = payer_node
1987+
.bolt12_payment()
1988+
.send(&offer, Some(1), Some("restart".to_string()), None)
1989+
.unwrap();
1990+
1991+
expect_channel_pending_event!(service_node, client_node.node_id());
1992+
expect_channel_ready_event!(service_node, client_node.node_id());
1993+
expect_channel_pending_event!(client_node, service_node.node_id());
1994+
expect_channel_ready_event!(client_node, service_node.node_id());
1995+
1996+
let service_fee_msat = (jit_amount_msat * 10_000) / 1_000_000;
1997+
let expected_received_amount_msat = jit_amount_msat - service_fee_msat;
1998+
1999+
expect_payment_successful_event!(payer_node, Some(payment_id), None);
2000+
expect_payment_received_event!(client_node, expected_received_amount_msat);
2001+
}
2002+
19072003
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
19082004
async fn facade_logging() {
19092005
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();

0 commit comments

Comments
 (0)