@@ -9603,6 +9603,48 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9603
9603
Err(MsgHandleErrInternal::send_err_msg_no_close("TODO(splicing): Splicing is not implemented (splice_ack)".to_owned(), msg.channel_id))
9604
9604
}
9605
9605
9606
+ #[cfg(splicing)]
9607
+ fn internal_splice_locked(&self, counterparty_node_id: &PublicKey, msg: &msgs::SpliceLocked) -> Result<(), MsgHandleErrInternal> {
9608
+ let per_peer_state = self.per_peer_state.read().unwrap();
9609
+ let peer_state_mutex = per_peer_state.get(counterparty_node_id)
9610
+ .ok_or_else(|| {
9611
+ debug_assert!(false);
9612
+ MsgHandleErrInternal::send_err_msg_no_close(format!("Can't find a peer matching the passed counterparty node_id {}", counterparty_node_id), msg.channel_id)
9613
+ })?;
9614
+ let mut peer_state_lock = peer_state_mutex.lock().unwrap();
9615
+ let peer_state = &mut *peer_state_lock;
9616
+
9617
+ // Look for the channel
9618
+ match peer_state.channel_by_id.entry(msg.channel_id) {
9619
+ hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close(format!(
9620
+ "Got a message for a channel from the wrong node! No such channel for the passed counterparty_node_id {}",
9621
+ counterparty_node_id
9622
+ ), msg.channel_id)),
9623
+ hash_map::Entry::Occupied(mut chan_entry) => {
9624
+ if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9625
+ let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9626
+ let announcement_sigs_opt = try_channel_entry!(
9627
+ self, peer_state, chan.splice_locked(
9628
+ msg, &self.node_signer, self.chain_hash, &self.default_configuration,
9629
+ &self.best_block.read().unwrap(), &&logger,
9630
+ ), chan_entry
9631
+ );
9632
+ if let Some(announcement_sigs) = announcement_sigs_opt {
9633
+ log_trace!(logger, "Sending announcement_signatures for channel {}", chan.context.channel_id());
9634
+ peer_state.pending_msg_events.push(MessageSendEvent::SendAnnouncementSignatures {
9635
+ node_id: counterparty_node_id.clone(),
9636
+ msg: announcement_sigs,
9637
+ });
9638
+ }
9639
+ } else {
9640
+ return Err(MsgHandleErrInternal::send_err_msg_no_close("Channel is not funded, cannot splice".to_owned(), msg.channel_id));
9641
+ }
9642
+ },
9643
+ };
9644
+
9645
+ Err(MsgHandleErrInternal::send_err_msg_no_close("TODO(splicing): Splicing is not implemented (splice_locked)".to_owned(), msg.channel_id))
9646
+ }
9647
+
9606
9648
/// Process pending events from the [`chain::Watch`], returning whether any events were processed.
9607
9649
fn process_pending_monitor_events(&self) -> bool {
9608
9650
debug_assert!(self.total_consistency_lock.try_write().is_err()); // Caller holds read lock
@@ -12111,9 +12153,16 @@ where
12111
12153
12112
12154
#[cfg(splicing)]
12113
12155
fn handle_splice_locked(&self, counterparty_node_id: PublicKey, msg: &msgs::SpliceLocked) {
12114
- let _: Result<(), _> = handle_error!(self, Err(MsgHandleErrInternal::send_err_msg_no_close(
12115
- "Splicing not supported (splice_locked)".to_owned(),
12116
- msg.channel_id)), counterparty_node_id);
12156
+ let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || {
12157
+ let res = self.internal_splice_locked(&counterparty_node_id, msg);
12158
+ let persist = match &res {
12159
+ Err(e) if e.closes_channel() => NotifyOption::DoPersist,
12160
+ Err(_) => NotifyOption::SkipPersistHandleEvents,
12161
+ Ok(()) => NotifyOption::SkipPersistHandleEvents,
12162
+ };
12163
+ let _ = handle_error!(self, res, counterparty_node_id);
12164
+ persist
12165
+ });
12117
12166
}
12118
12167
12119
12168
fn handle_shutdown(&self, counterparty_node_id: PublicKey, msg: &msgs::Shutdown) {
0 commit comments