@@ -38,8 +38,10 @@ pub(crate) struct LightningWalletBalance {
3838
3939pub ( crate ) struct LightningWalletImpl {
4040 pub ( crate ) ldk_node : Arc < ldk_node:: Node > ,
41+ logger : Arc < Logger > ,
4142 payment_receipt_flag : watch:: Receiver < ( ) > ,
4243 channel_pending_receipt_flag : watch:: Receiver < u128 > ,
44+ splice_pending_receipt_flag : watch:: Receiver < u128 > ,
4345 lsp_node_id : PublicKey ,
4446 lsp_socket_addr : SocketAddress ,
4547}
@@ -163,18 +165,22 @@ impl LightningWallet {
163165 let ldk_node = Arc :: new ( builder. build_with_store ( Arc :: clone ( & store) ) ?) ;
164166 let ( payment_receipt_sender, payment_receipt_flag) = watch:: channel ( ( ) ) ;
165167 let ( channel_pending_sender, channel_pending_receipt_flag) = watch:: channel ( 0 ) ;
168+ let ( splice_pending_sender, splice_pending_receipt_flag) = watch:: channel ( 0 ) ;
166169 let ev_handler = Arc :: new ( LdkEventHandler {
167170 event_queue,
168171 ldk_node : Arc :: clone ( & ldk_node) ,
169172 tx_metadata,
170173 payment_receipt_sender,
171174 channel_pending_sender,
172- logger,
175+ splice_pending_sender,
176+ logger : Arc :: clone ( & logger) ,
173177 } ) ;
174178 let inner = Arc :: new ( LightningWalletImpl {
175179 ldk_node,
180+ logger,
176181 payment_receipt_flag,
177182 channel_pending_receipt_flag,
183+ splice_pending_receipt_flag,
178184 lsp_node_id,
179185 lsp_socket_addr,
180186 } ) ;
@@ -204,6 +210,12 @@ impl LightningWallet {
204210 flag. wait_for ( |t| t == & channel_id) . await . expect ( "channel pending not received" ) ;
205211 }
206212
213+ pub ( crate ) async fn await_splice_pending ( & self , channel_id : u128 ) {
214+ let mut flag = self . inner . splice_pending_receipt_flag . clone ( ) ;
215+ flag. mark_unchanged ( ) ;
216+ flag. wait_for ( |t| t == & channel_id) . await . expect ( "splice pending not received" ) ;
217+ }
218+
207219 pub ( crate ) fn get_on_chain_address ( & self ) -> Result < Address , NodeError > {
208220 self . inner . ldk_node . onchain_payment ( ) . new_address ( )
209221 }
@@ -295,6 +307,32 @@ impl LightningWallet {
295307 }
296308 }
297309
310+ pub ( crate ) async fn splice_balance_into_channel (
311+ & self , amount : Amount ,
312+ ) -> Result < UserChannelId , NodeError > {
313+ // find existing channel to splice into
314+ let channels = self . inner . ldk_node . list_channels ( ) ;
315+ let channel = channels. iter ( ) . find ( |c| c. counterparty_node_id == self . inner . lsp_node_id ) ;
316+
317+ // todo fix this, for now leave some onchain balance for fees
318+ let amt = amount. saturating_sub ( Amount :: from_sats ( 10_000 ) . unwrap ( ) ) ;
319+
320+ match channel {
321+ Some ( chan) => {
322+ self . inner . ldk_node . splice_in (
323+ & chan. user_channel_id ,
324+ chan. counterparty_node_id ,
325+ amt. sats_rounding_up ( ) ,
326+ ) ?;
327+ Ok ( chan. user_channel_id )
328+ } ,
329+ None => {
330+ log_error ! ( self . inner. logger, "No existing channel to splice into" ) ;
331+ Err ( NodeError :: WalletOperationFailed )
332+ } ,
333+ }
334+ }
335+
298336 pub ( crate ) async fn open_channel_with_lsp ( & self ) -> Result < UserChannelId , NodeError > {
299337 let bal = self . inner . ldk_node . list_balances ( ) . spendable_onchain_balance_sats ;
300338
@@ -407,6 +445,11 @@ impl graduated_rebalancer::LightningWallet for LightningWallet {
407445 } )
408446 }
409447
448+ fn has_channel_with_lsp ( & self ) -> bool {
449+ let channels = self . inner . ldk_node . list_channels ( ) ;
450+ channels. iter ( ) . any ( |c| c. counterparty_node_id == self . inner . lsp_node_id )
451+ }
452+
410453 fn open_channel_with_lsp (
411454 & self , _amt : Amount ,
412455 ) -> Pin < Box < dyn Future < Output = Result < u128 , Self :: Error > > + Send + ' _ > > {
@@ -435,6 +478,38 @@ impl graduated_rebalancer::LightningWallet for LightningWallet {
435478 }
436479 } )
437480 }
481+
482+ fn splice_to_lsp_channel (
483+ & self , amt : Amount ,
484+ ) -> Pin < Box < dyn Future < Output = Result < u128 , Self :: Error > > + Send + ' _ > > {
485+ Box :: pin ( async move { self . splice_balance_into_channel ( amt) . await . map ( |c| c. 0 ) } )
486+ }
487+
488+ fn await_splice_pending (
489+ & self , channel_id : u128 ,
490+ ) -> Pin < Box < dyn Future < Output = OutPoint > + Send + ' _ > > {
491+ Box :: pin ( async move {
492+ // todo since we can't see if we have any active splices, we just await the next splice pending event
493+ // this is kinda race-y hopefully we can fix
494+ self . await_splice_pending ( channel_id) . await ;
495+ loop {
496+ let channels = self . inner . ldk_node . list_channels ( ) ;
497+ let chan = channels
498+ . into_iter ( )
499+ . find ( |c| c. user_channel_id . 0 == channel_id && c. funding_txo . is_some ( ) ) ;
500+ match chan {
501+ Some ( c) => {
502+ println ! ( "\n RETURNING HERE\n " ) ;
503+ return c. funding_txo . expect ( "channel has no funding txo" )
504+ } ,
505+ None => {
506+ self . await_splice_pending ( channel_id) . await ;
507+ // Wait for the next channel pending event
508+ } ,
509+ }
510+ }
511+ } )
512+ }
438513}
439514
440515impl From < PaymentStatus > for TxStatus {
0 commit comments