@@ -4294,17 +4294,18 @@ async fn lsps2_multi_lsp_picks_cheapest() {
42944294}
42954295
42964296async 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