@@ -3240,6 +3240,23 @@ macro_rules! convert_channel_err {
32403240 },
32413241 }
32423242 };
3243+ ($self: ident, $peer_state: expr, $shutdown_result: expr, $funded_channel: expr, $channel_id: expr, COOP_CLOSED) => { {
3244+ let reason = ChannelError::Close(("Coop Closed".to_owned(), $shutdown_result.closure_reason.clone()));
3245+ let do_close = |_| {
3246+ (
3247+ $shutdown_result,
3248+ $self.get_channel_update_for_broadcast(&$funded_channel).ok(),
3249+ )
3250+ };
3251+ let mut locked_close = |shutdown_res_mut: &mut ShutdownResult, funded_channel: &mut FundedChannel<_>| {
3252+ locked_close_channel!($self, $peer_state, funded_channel, shutdown_res_mut, FUNDED);
3253+ };
3254+ let (close, mut err) =
3255+ convert_channel_err!($self, $peer_state, reason, $funded_channel, do_close, locked_close, $channel_id, _internal);
3256+ err.dont_send_error_message();
3257+ debug_assert!(close);
3258+ (close, err)
3259+ } };
32433260 ($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
32443261 let mut do_close = |reason| {
32453262 (
@@ -9254,13 +9271,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
92549271 msg.channel_id,
92559272 )
92569273 })?;
9257- let (tx, chan_option, shutdown_result) = {
9274+ let logger;
9275+ let tx_err: Option<(_, Result<Infallible, _>)> = {
92589276 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
92599277 let peer_state = &mut *peer_state_lock;
92609278 match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
92619279 hash_map::Entry::Occupied(mut chan_entry) => {
92629280 if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9263- let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9281+ logger = WithChannelContext::from(&self.logger, &chan.context, None);
92649282 let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
92659283 let (closing_signed, tx_shutdown_result) =
92669284 try_channel_entry!(self, peer_state, res, chan_entry);
@@ -9271,16 +9289,17 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
92719289 msg,
92729290 });
92739291 }
9274- if let Some((tx, mut close_res)) = tx_shutdown_result {
9292+ if let Some((tx, close_res)) = tx_shutdown_result {
92759293 // We're done with this channel, we've got a signed closing transaction and
92769294 // will send the closing_signed back to the remote peer upon return. This
92779295 // also implies there are no pending HTLCs left on the channel, so we can
92789296 // fully delete it from tracking (the channel monitor is still around to
92799297 // watch for old state broadcasts)!
9280- locked_close_channel!(self, peer_state, chan, close_res, FUNDED);
9281- (Some(tx), Some(chan_entry.remove()), Some(close_res))
9298+ let (_, err) = convert_channel_err!(self, peer_state, close_res, chan, &msg.channel_id, COOP_CLOSED);
9299+ chan_entry.remove();
9300+ Some((tx, Err(err)))
92829301 } else {
9283- ( None, None, None)
9302+ None
92849303 }
92859304 } else {
92869305 return try_channel_entry!(self, peer_state, Err(ChannelError::close(
@@ -9290,26 +9309,15 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
92909309 hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close(format!("Got a message for a channel from the wrong node! No such channel for the passed counterparty_node_id {}", counterparty_node_id), msg.channel_id))
92919310 }
92929311 };
9293- if let Some(broadcast_tx) = tx {
9294- let channel_id = chan_option.as_ref().map(|channel| channel.context().channel_id());
9312+ mem::drop(per_peer_state);
9313+ if let Some((broadcast_tx, err)) = tx_err {
92959314 log_info!(
9296- WithContext::from(&self. logger, Some(*counterparty_node_id), channel_id, None) ,
9315+ logger,
92979316 "Broadcasting {}",
92989317 log_tx!(broadcast_tx)
92999318 );
93009319 self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9301- }
9302- if let Some(chan) = chan_option.as_ref().and_then(Channel::as_funded) {
9303- if let Ok(update) = self.get_channel_update_for_broadcast(chan) {
9304- let mut pending_broadcast_messages =
9305- self.pending_broadcast_messages.lock().unwrap();
9306- pending_broadcast_messages
9307- .push(MessageSendEvent::BroadcastChannelUpdate { msg: update });
9308- }
9309- }
9310- mem::drop(per_peer_state);
9311- if let Some(shutdown_result) = shutdown_result {
9312- self.finish_close_channel(shutdown_result);
9320+ let _ = handle_error!(self, err, *counterparty_node_id);
93139321 }
93149322 Ok(())
93159323 }
@@ -10404,12 +10412,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1040410412 if let Some(broadcast_tx) = msgs.signed_closing_tx {
1040510413 log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
1040610414 self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
10407-
10408- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
10409- pending_msg_events.push(MessageSendEvent::BroadcastChannelUpdate {
10410- msg: update
10411- });
10412- }
1041310415 }
1041410416 } else {
1041510417 // We don't know how to handle a channel_ready or signed_closing_tx for a
@@ -10423,40 +10425,45 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1042310425 }
1042410426 };
1042510427
10426- let mut shutdown_results = Vec::new();
10428+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
1042710429 let per_peer_state = self.per_peer_state.read().unwrap();
1042810430 let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
1042910431 if let Some((counterparty_node_id, _)) = channel_opt {
1043010432 **cp_id == counterparty_node_id
1043110433 } else { true }
1043210434 });
10433- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
10435+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
1043410436 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1043510437 let peer_state = &mut *peer_state_lock;
1043610438 peer_state.channel_by_id.retain(|_, chan| {
1043710439 let shutdown_result = match channel_opt {
1043810440 Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
1043910441 _ => unblock_chan(chan, &mut peer_state.pending_msg_events),
1044010442 };
10441- if let Some(mut shutdown_result ) = shutdown_result {
10443+ if let Some(shutdown_res ) = shutdown_result {
1044210444 let context = chan.context();
1044310445 let logger = WithChannelContext::from(&self.logger, context, None);
10444- log_trace!(logger, "Removing channel {} now that the signer is unblocked", context.channel_id());
10445- if let Some(funded_channel) = chan.as_funded_mut() {
10446- locked_close_channel!(self, peer_state, funded_channel, shutdown_result, FUNDED);
10446+ let chan_id = context.channel_id();
10447+ log_trace!(logger, "Removing channel {} now that the signer is unblocked", chan_id);
10448+ let (remove, err) = if let Some(funded_channel) = chan.as_funded_mut() {
10449+ convert_channel_err!(self, peer_state, shutdown_res, funded_channel, &chan_id, COOP_CLOSED)
1044710450 } else {
10448- locked_close_channel!(self, chan.context(), UNFUNDED);
10449- }
10450- shutdown_results.push(shutdown_result);
10451+ debug_assert!(false);
10452+ let reason = shutdown_res.closure_reason.clone();
10453+ let err = ChannelError::Close((reason.to_string(), reason));
10454+ convert_channel_err!(self, peer_state, err, chan, &chan_id, UNFUNDED_CHANNEL)
10455+ };
10456+ debug_assert!(remove);
10457+ shutdown_results.push((Err(err), *cp_id));
1045110458 false
1045210459 } else {
1045310460 true
1045410461 }
1045510462 });
1045610463 }
1045710464 drop(per_peer_state);
10458- for shutdown_result in shutdown_results.drain(..) {
10459- self.finish_close_channel(shutdown_result );
10465+ for (err, counterparty_node_id) in shutdown_results {
10466+ let _ = handle_error!(self, err, counterparty_node_id );
1046010467 }
1046110468 }
1046210469
@@ -10467,11 +10474,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1046710474 fn maybe_generate_initial_closing_signed(&self) -> bool {
1046810475 let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
1046910476 let mut has_update = false;
10470- let mut shutdown_results = Vec::new();
1047110477 {
1047210478 let per_peer_state = self.per_peer_state.read().unwrap();
1047310479
10474- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
10480+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
1047510481 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1047610482 let peer_state = &mut *peer_state_lock;
1047710483 let pending_msg_events = &mut peer_state.pending_msg_events;
@@ -10488,17 +10494,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1048810494 });
1048910495 }
1049010496 debug_assert_eq!(tx_shutdown_result_opt.is_some(), funded_chan.is_shutdown());
10491- if let Some((tx, mut shutdown_res)) = tx_shutdown_result_opt {
10492- locked_close_channel!(self, peer_state, funded_chan, shutdown_res, FUNDED);
10493- shutdown_results.push(shutdown_res);
10497+ if let Some((tx, shutdown_res)) = tx_shutdown_result_opt {
1049410498 // We're done with this channel. We got a closing_signed and sent back
1049510499 // a closing_signed with a closing transaction to broadcast.
10496- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
10497- let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
10498- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
10499- msg: update
10500- });
10501- }
10500+ let (_, err) = convert_channel_err!(self, peer_state, shutdown_res, funded_chan, channel_id, COOP_CLOSED);
10501+ handle_errors.push((*cp_id, Err(err)));
1050210502
1050310503 log_info!(logger, "Broadcasting {}", log_tx!(tx));
1050410504 self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -10519,14 +10519,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1051910519 }
1052010520 }
1052110521
10522- for (counterparty_node_id, err) in handle_errors.drain(..) {
10522+ for (counterparty_node_id, err) in handle_errors {
1052310523 let _ = handle_error!(self, err, counterparty_node_id);
1052410524 }
1052510525
10526- for shutdown_result in shutdown_results.drain(..) {
10527- self.finish_close_channel(shutdown_result);
10528- }
10529-
1053010526 has_update
1053110527 }
1053210528
0 commit comments