@@ -1198,6 +1198,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
11981198 direction : PaymentDirection :: Outbound ,
11991199 status : PaymentStatus :: Pending ,
12001200 max_total_lsp_fee_limit_msat : None ,
1201+ max_proportional_lsp_fee_limit_ppm_msat : None ,
12011202 } ;
12021203 self . payment_store . insert ( payment) ?;
12031204
@@ -1218,6 +1219,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
12181219 direction : PaymentDirection :: Outbound ,
12191220 status : PaymentStatus :: Failed ,
12201221 max_total_lsp_fee_limit_msat : None ,
1222+ max_proportional_lsp_fee_limit_ppm_msat : None ,
12211223 } ;
12221224
12231225 self . payment_store . insert ( payment) ?;
@@ -1306,6 +1308,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
13061308 direction : PaymentDirection :: Outbound ,
13071309 status : PaymentStatus :: Pending ,
13081310 max_total_lsp_fee_limit_msat : None ,
1311+ max_proportional_lsp_fee_limit_ppm_msat : None ,
13091312 } ;
13101313 self . payment_store . insert ( payment) ?;
13111314
@@ -1327,6 +1330,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
13271330 direction : PaymentDirection :: Outbound ,
13281331 status : PaymentStatus :: Failed ,
13291332 max_total_lsp_fee_limit_msat : None ,
1333+ max_proportional_lsp_fee_limit_ppm_msat : None ,
13301334 } ;
13311335 self . payment_store . insert ( payment) ?;
13321336
@@ -1382,6 +1386,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
13821386 direction : PaymentDirection :: Outbound ,
13831387 amount_msat : Some ( amount_msat) ,
13841388 max_total_lsp_fee_limit_msat : None ,
1389+ max_proportional_lsp_fee_limit_ppm_msat : None ,
13851390 } ;
13861391 self . payment_store . insert ( payment) ?;
13871392
@@ -1403,6 +1408,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
14031408 direction : PaymentDirection :: Outbound ,
14041409 amount_msat : Some ( amount_msat) ,
14051410 max_total_lsp_fee_limit_msat : None ,
1411+ max_proportional_lsp_fee_limit_ppm_msat : None ,
14061412 } ;
14071413
14081414 self . payment_store . insert ( payment) ?;
@@ -1577,6 +1583,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
15771583 direction : PaymentDirection :: Inbound ,
15781584 status : PaymentStatus :: Pending ,
15791585 max_total_lsp_fee_limit_msat : None ,
1586+ max_proportional_lsp_fee_limit_ppm_msat : None ,
15801587 } ;
15811588
15821589 self . payment_store . insert ( payment) ?;
@@ -1603,12 +1610,38 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
16031610 description,
16041611 expiry_secs,
16051612 max_total_lsp_fee_limit_msat,
1613+ None ,
1614+ )
1615+ }
1616+
1617+ /// Returns a payable invoice that can be used to request a variable amount payment (also known
1618+ /// as "zero-amount" invoice) and receive it via a newly created just-in-time (JIT) channel.
1619+ ///
1620+ /// When the returned invoice is paid, the configured [LSPS2]-compliant LSP will open a channel
1621+ /// to us, supplying just-in-time inbound liquidity.
1622+ ///
1623+ /// If set, `max_proportional_lsp_fee_limit_ppm_msat` will limit how much proportional fee, in
1624+ /// parts-per-million millisatoshis, we allow the LSP to take for opening the channel to us.
1625+ /// We'll use its cheapest offer otherwise.
1626+ ///
1627+ /// [LSPS2]: https://github.com/BitcoinAndLightningLayerSpecs/lsp/blob/main/LSPS2/README.md
1628+ pub fn receive_variable_amount_payment_via_jit_channel (
1629+ & self , description : & str , expiry_secs : u32 ,
1630+ max_proportional_lsp_fee_limit_ppm_msat : Option < u64 > ,
1631+ ) -> Result < Bolt11Invoice , Error > {
1632+ self . receive_payment_via_jit_channel_inner (
1633+ None ,
1634+ description,
1635+ expiry_secs,
1636+ None ,
1637+ max_proportional_lsp_fee_limit_ppm_msat,
16061638 )
16071639 }
16081640
16091641 fn receive_payment_via_jit_channel_inner (
16101642 & self , amount_msat : Option < u64 > , description : & str , expiry_secs : u32 ,
16111643 max_total_lsp_fee_limit_msat : Option < u64 > ,
1644+ max_proportional_lsp_fee_limit_ppm_msat : Option < u64 > ,
16121645 ) -> Result < Bolt11Invoice , Error > {
16131646 let liquidity_source =
16141647 self . liquidity_source . as_ref ( ) . ok_or ( Error :: LiquiditySourceUnavailable ) ?;
@@ -1638,18 +1671,20 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
16381671 log_info ! ( self . logger, "Connected to LSP {}@{}. " , peer_info. node_id, peer_info. address) ;
16391672
16401673 let liquidity_source = Arc :: clone ( & liquidity_source) ;
1641- let ( invoice, lsp_opening_fee) = tokio:: task:: block_in_place ( move || {
1642- runtime. block_on ( async move {
1643- liquidity_source
1644- . lsps2_receive_to_jit_channel (
1645- amount_msat,
1646- description,
1647- expiry_secs,
1648- max_total_lsp_fee_limit_msat,
1649- )
1650- . await
1651- } )
1652- } ) ?;
1674+ let ( invoice, lsp_total_opening_fee, lsp_prop_opening_fee) =
1675+ tokio:: task:: block_in_place ( move || {
1676+ runtime. block_on ( async move {
1677+ liquidity_source
1678+ . lsps2_receive_to_jit_channel (
1679+ amount_msat,
1680+ description,
1681+ expiry_secs,
1682+ max_total_lsp_fee_limit_msat,
1683+ max_proportional_lsp_fee_limit_ppm_msat,
1684+ )
1685+ . await
1686+ } )
1687+ } ) ?;
16531688
16541689 // Register payment in payment store.
16551690 let payment_hash = PaymentHash ( invoice. payment_hash ( ) . to_byte_array ( ) ) ;
@@ -1660,7 +1695,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
16601695 amount_msat,
16611696 direction : PaymentDirection :: Inbound ,
16621697 status : PaymentStatus :: Pending ,
1663- max_total_lsp_fee_limit_msat : Some ( lsp_opening_fee) ,
1698+ max_total_lsp_fee_limit_msat : lsp_total_opening_fee,
1699+ max_proportional_lsp_fee_limit_ppm_msat : lsp_prop_opening_fee,
16641700 } ;
16651701
16661702 self . payment_store . insert ( payment) ?;
0 commit comments