Skip to content

Commit a5456d8

Browse files
committed
lsps2: Test multi-LSP BOLT12 selection
Extend the order-independent fee-selection scenario through a real BOLT12 payment. Also prove that BOLT11 consumption and BOLT12 response handling share the same replenished lease pool. Co-Authored-By: HAL 9000
1 parent 6bc7dcb commit a5456d8

1 file changed

Lines changed: 63 additions & 2 deletions

File tree

tests/integration_tests_rust.rs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4294,17 +4294,18 @@ async fn lsps2_multi_lsp_picks_cheapest() {
42944294
}
42954295

42964296
async fn do_lsps2_multi_lsp_picks_cheapest(reverse_order: bool) {
4297-
let (_bitcoind, electrsd) = setup_bitcoind_and_electrsd();
4297+
let (bitcoind, electrsd) = setup_bitcoind_and_electrsd();
42984298
let esplora_url = format!("http://{}", electrsd.esplora_url.as_ref().unwrap());
42994299

43004300
let mut sync_config = EsploraSyncConfig::default();
43014301
sync_config.background_sync_config = None;
43024302

43034303
// Cheap LSP: 10_000 ppm.
4304+
let cheap_opening_fee_ppm = 10_000;
43044305
let cheap_cfg = LSPS2ServiceConfig {
43054306
require_token: None,
43064307
advertise_service: false,
4307-
channel_opening_fee_ppm: 10_000,
4308+
channel_opening_fee_ppm: cheap_opening_fee_ppm,
43084309
channel_over_provisioning_ppm: 100_000,
43094310
max_payment_size_msat: 1_000_000_000,
43104311
min_payment_size_msat: 0,
@@ -4360,6 +4361,40 @@ async fn do_lsps2_multi_lsp_picks_cheapest(reverse_order: bool) {
43604361
let client = client_builder.build(client_config.node_entropy.into()).unwrap();
43614362
client.start().unwrap();
43624363

4364+
let payer_config = random_config();
4365+
setup_builder!(payer_builder, payer_config.node_config);
4366+
payer_builder.set_chain_source_esplora(esplora_url.clone(), Some(sync_config));
4367+
let payer = payer_builder.build(payer_config.node_entropy.into()).unwrap();
4368+
payer.start().unwrap();
4369+
4370+
let client_addr = client.listening_addresses().unwrap().first().unwrap().clone();
4371+
payer.connect(client.node_id(), client_addr, false).unwrap();
4372+
4373+
let cheap_onchain_addr = cheap.onchain_payment().new_address().unwrap();
4374+
let client_onchain_addr = client.onchain_payment().new_address().unwrap();
4375+
let payer_onchain_addr = payer.onchain_payment().new_address().unwrap();
4376+
premine_and_distribute_funds(
4377+
&bitcoind.client,
4378+
&electrsd.client,
4379+
vec![cheap_onchain_addr, client_onchain_addr, payer_onchain_addr],
4380+
Amount::from_sat(10_000_000),
4381+
)
4382+
.await;
4383+
cheap.sync_wallets().unwrap();
4384+
client.sync_wallets().unwrap();
4385+
payer.sync_wallets().unwrap();
4386+
4387+
open_channel(&payer, &cheap, 5_000_000, true, &electrsd).await;
4388+
generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6).await;
4389+
cheap.sync_wallets().unwrap();
4390+
payer.sync_wallets().unwrap();
4391+
expect_channel_ready_event!(payer, cheap.node_id());
4392+
expect_channel_ready_event!(cheap, payer.node_id());
4393+
while payer.status().latest_node_announcement_broadcast_timestamp.is_none() {
4394+
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
4395+
}
4396+
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
4397+
43634398
let invoice_description =
43644399
Bolt11InvoiceDescription::Direct(Description::new(String::from("asdf")).unwrap()).into();
43654400
let jit_invoice = client
@@ -4377,6 +4412,32 @@ async fn do_lsps2_multi_lsp_picks_cheapest(reverse_order: bool) {
43774412
let route_hint_src = first_hop.expect("route hint should have at least one hop").src_node_id;
43784413
assert_eq!(route_hint_src, cheap_id, "expected cheaper LSP to be selected.");
43794414

4415+
// Consuming the BOLT11 lease schedules a replacement. The BOLT12 flow shares that cache and
4416+
// must retain the same cheapest-LSP selection regardless of registration order.
4417+
let payment_amount_msat = 100_000_000;
4418+
let offer = client
4419+
.bolt12_payment()
4420+
.receive_via_jit_channel(payment_amount_msat, "multi LSP", None, None, None)
4421+
.unwrap();
4422+
let payment_id = payer.bolt12_payment().send(&offer, None, None, None).unwrap();
4423+
4424+
expect_channel_pending_event!(cheap, client.node_id());
4425+
expect_channel_ready_event!(cheap, client.node_id());
4426+
expect_event!(cheap, PaymentForwarded);
4427+
expect_channel_pending_event!(client, cheap.node_id());
4428+
expect_channel_ready_event!(client, cheap.node_id());
4429+
expect_payment_successful_event!(payer, Some(payment_id), None);
4430+
let fee_msat = payment_amount_msat * cheap_opening_fee_ppm as u64 / 1_000_000;
4431+
let receiver_payment_id =
4432+
expect_payment_received_event!(client, payment_amount_msat - fee_msat).unwrap();
4433+
match client.payment(&receiver_payment_id).unwrap().kind {
4434+
PaymentKind::Bolt12Offer { counterparty_skimmed_fee_msat, .. } => {
4435+
assert_eq!(counterparty_skimmed_fee_msat, Some(fee_msat));
4436+
},
4437+
_ => panic!("Unexpected payment kind"),
4438+
}
4439+
4440+
payer.stop().unwrap();
43804441
client.stop().unwrap();
43814442
cheap.stop().unwrap();
43824443
expensive.stop().unwrap();

0 commit comments

Comments
 (0)