@@ -108,6 +108,9 @@ pub trait LightningWallet: Send + Sync {
108108 & self , payment_hash : [ u8 ; 32 ] ,
109109 ) -> Pin < Box < dyn Future < Output = Option < ReceivedLightningPayment > > + Send + ' _ > > ;
110110
111+ /// Check if we already have a channel with the LSP
112+ fn has_channel_with_lsp ( & self ) -> bool ;
113+
111114 /// Open a channel with the LSP using on-chain funds
112115 fn open_channel_with_lsp (
113116 & self , amt : Amount ,
@@ -117,6 +120,16 @@ pub trait LightningWallet: Send + Sync {
117120 fn await_channel_pending (
118121 & self , channel_id : u128 ,
119122 ) -> Pin < Box < dyn Future < Output = OutPoint > + Send + ' _ > > ;
123+
124+ /// Splice funds from on-chain to an existing channel with the LSP
125+ fn splice_to_lsp_channel (
126+ & self , amt : Amount ,
127+ ) -> Pin < Box < dyn Future < Output = Result < u128 , Self :: Error > > + Send + ' _ > > ;
128+
129+ /// Wait for a splice pending notification, returns the splice outpoint
130+ fn await_splice_pending (
131+ & self , channel_id : u128 ,
132+ ) -> Pin < Box < dyn Future < Output = OutPoint > + Send + ' _ > > ;
120133}
121134
122135/// Represents a payment from the lightning wallet
@@ -313,32 +326,51 @@ where
313326 }
314327 }
315328
316- /// Perform on-chain to lightning rebalance by opening a channel
329+ /// Perform on-chain to lightning rebalance by opening a channel or splicing into an existing one
317330 async fn do_onchain_rebalance ( & self , params : TriggerParams ) {
318- // This should open a channel with the LSP using available on-chain funds
319-
320331 let _ = self . balance_mutex . lock ( ) . await ;
321332
322- log_info ! ( self . logger, "Opening channel with LSP with on-chain funds" ) ;
333+ let ( channel_outpoint, user_channel_id) = if self . ln_wallet . has_channel_with_lsp ( ) {
334+ log_info ! ( self . logger, "Splicing into channel with LSP with on-chain funds" ) ;
323335
324- // todo for now we can only open a channel, eventually move to splicing
325- let user_chan_id = match self . ln_wallet . open_channel_with_lsp ( params. amount ) . await {
326- Ok ( chan_id) => chan_id,
327- Err ( e) => {
328- log_error ! ( self . logger, "Failed to open channel with LSP: {e:?}" ) ;
329- return ;
330- } ,
331- } ;
336+ let user_chan_id = match self . ln_wallet . splice_to_lsp_channel ( params. amount ) . await {
337+ Ok ( chan_id) => chan_id,
338+ Err ( e) => {
339+ log_error ! ( self . logger, "Failed to open channel with LSP: {e:?}" ) ;
340+ return ;
341+ } ,
342+ } ;
343+
344+ log_info ! ( self . logger, "Initiated splice opened with LSP" ) ;
345+
346+ let channel_outpoint = self . ln_wallet . await_splice_pending ( user_chan_id) . await ;
347+
348+ log_info ! ( self . logger, "Splice initiated at: {channel_outpoint}" ) ;
349+
350+ ( channel_outpoint, user_chan_id)
351+ } else {
352+ log_info ! ( self . logger, "Opening channel with LSP with on-chain funds" ) ;
332353
333- log_info ! ( self . logger, "Initiated channel opened with LSP" ) ;
354+ let user_chan_id = match self . ln_wallet . open_channel_with_lsp ( params. amount ) . await {
355+ Ok ( chan_id) => chan_id,
356+ Err ( e) => {
357+ log_error ! ( self . logger, "Failed to open channel with LSP: {e:?}" ) ;
358+ return ;
359+ } ,
360+ } ;
361+
362+ log_info ! ( self . logger, "Initiated channel opened with LSP" ) ;
334363
335- let channel_outpoint = self . ln_wallet . await_channel_pending ( user_chan_id) . await ;
364+ let channel_outpoint = self . ln_wallet . await_channel_pending ( user_chan_id) . await ;
336365
337- log_info ! ( self . logger, "Channel open succeeded at: {channel_outpoint}" , ) ;
366+ log_info ! ( self . logger, "Channel open succeeded at: {channel_outpoint}" ) ;
367+
368+ ( channel_outpoint, user_chan_id)
369+ } ;
338370
339371 self . event_handler . handle_event ( RebalancerEvent :: OnChainRebalanceInitiated {
340372 trigger_id : params. id ,
341- user_channel_id : user_chan_id ,
373+ user_channel_id,
342374 channel_outpoint,
343375 } ) ;
344376 }
0 commit comments