@@ -3069,7 +3069,7 @@ macro_rules! handle_error {
30693069 let logger = WithContext::from(
30703070 &$self.logger, Some(counterparty_node_id), Some(channel_id), None
30713071 );
3072- log_error!(logger, "Force-closing channel: {}", err.err);
3072+ log_error!(logger, "Closing channel: {}", err.err);
30733073
30743074 $self.finish_close_channel(shutdown_res);
30753075 if let Some(update) = update_option {
@@ -3192,6 +3192,23 @@ macro_rules! convert_channel_err {
31923192 },
31933193 }
31943194 };
3195+ ($self: ident, $peer_state: expr, $shutdown_result: expr, $funded_channel: expr, $channel_id: expr, COOP_CLOSED) => { {
3196+ let reason = ChannelError::Close(("Coop Closed".to_owned(), $shutdown_result.closure_reason.clone()));
3197+ let do_close = |_| {
3198+ (
3199+ $shutdown_result,
3200+ $self.get_channel_update_for_broadcast(&$funded_channel).ok(),
3201+ )
3202+ };
3203+ let mut locked_close = |shutdown_res_mut: &mut ShutdownResult, funded_channel: &mut FundedChannel<_>| {
3204+ locked_close_channel!($self, $peer_state, funded_channel, shutdown_res_mut, FUNDED);
3205+ };
3206+ let (close, mut err) =
3207+ convert_channel_err!($self, $peer_state, reason, $funded_channel, do_close, locked_close, $channel_id, _internal);
3208+ err.dont_send_error_message();
3209+ debug_assert!(close);
3210+ err
3211+ } };
31953212 ($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
31963213 let mut do_close = |reason| {
31973214 (
@@ -9788,13 +9805,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
97889805 msg.channel_id,
97899806 )
97909807 })?;
9791- let (tx, chan_option, shutdown_result) = {
9808+ let logger;
9809+ let tx_err: Option<(_, Result<Infallible, _>)> = {
97929810 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
97939811 let peer_state = &mut *peer_state_lock;
97949812 match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
97959813 hash_map::Entry::Occupied(mut chan_entry) => {
97969814 if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9797- let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9815+ logger = WithChannelContext::from(&self.logger, &chan.context, None);
97989816 let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
97999817 let (closing_signed, tx_shutdown_result) =
98009818 try_channel_entry!(self, peer_state, res, chan_entry);
@@ -9805,16 +9823,17 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
98059823 msg,
98069824 });
98079825 }
9808- if let Some((tx, mut close_res)) = tx_shutdown_result {
9826+ if let Some((tx, close_res)) = tx_shutdown_result {
98099827 // We're done with this channel, we've got a signed closing transaction and
98109828 // will send the closing_signed back to the remote peer upon return. This
98119829 // also implies there are no pending HTLCs left on the channel, so we can
98129830 // fully delete it from tracking (the channel monitor is still around to
98139831 // watch for old state broadcasts)!
9814- locked_close_channel!(self, peer_state, chan, close_res, FUNDED);
9815- (Some(tx), Some(chan_entry.remove()), Some(close_res))
9832+ let err = convert_channel_err!(self, peer_state, close_res, chan, &msg.channel_id, COOP_CLOSED);
9833+ chan_entry.remove();
9834+ Some((tx, Err(err)))
98169835 } else {
9817- ( None, None, None)
9836+ None
98189837 }
98199838 } else {
98209839 return try_channel_entry!(self, peer_state, Err(ChannelError::close(
@@ -9824,26 +9843,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
98249843 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))
98259844 }
98269845 };
9827- if let Some(broadcast_tx) = tx {
9828- let channel_id = chan_option.as_ref().map(|channel| channel.context().channel_id());
9829- log_info!(
9830- WithContext::from(&self.logger, Some(*counterparty_node_id), channel_id, None),
9831- "Broadcasting {}",
9832- log_tx!(broadcast_tx)
9833- );
9834- self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9835- }
9836- if let Some(chan) = chan_option.as_ref().and_then(Channel::as_funded) {
9837- if let Ok(update) = self.get_channel_update_for_broadcast(chan) {
9838- let mut pending_broadcast_messages =
9839- self.pending_broadcast_messages.lock().unwrap();
9840- pending_broadcast_messages
9841- .push(MessageSendEvent::BroadcastChannelUpdate { msg: update });
9842- }
9843- }
98449846 mem::drop(per_peer_state);
9845- if let Some(shutdown_result) = shutdown_result {
9846- self.finish_close_channel(shutdown_result);
9847+ if let Some((broadcast_tx, err)) = tx_err {
9848+ log_info!(logger, "Broadcasting {}", log_tx!(broadcast_tx));
9849+ self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9850+ let _ = handle_error!(self, err, *counterparty_node_id);
98479851 }
98489852 Ok(())
98499853 }
@@ -11045,12 +11049,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1104511049 if let Some(broadcast_tx) = msgs.signed_closing_tx {
1104611050 log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
1104711051 self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
11048-
11049- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
11050- pending_msg_events.push(MessageSendEvent::BroadcastChannelUpdate {
11051- msg: update
11052- });
11053- }
1105411052 }
1105511053 } else {
1105611054 // We don't know how to handle a channel_ready or signed_closing_tx for a
@@ -11064,40 +11062,46 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1106411062 }
1106511063 };
1106611064
11067- let mut shutdown_results = Vec::new();
11065+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
1106811066 let per_peer_state = self.per_peer_state.read().unwrap();
1106911067 let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
1107011068 if let Some((counterparty_node_id, _)) = channel_opt {
1107111069 **cp_id == counterparty_node_id
1107211070 } else { true }
1107311071 });
11074- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
11072+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
1107511073 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1107611074 let peer_state = &mut *peer_state_lock;
1107711075 peer_state.channel_by_id.retain(|_, chan| {
1107811076 let shutdown_result = match channel_opt {
1107911077 Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
1108011078 _ => unblock_chan(chan, &mut peer_state.pending_msg_events),
1108111079 };
11082- if let Some(mut shutdown_result ) = shutdown_result {
11080+ if let Some(shutdown ) = shutdown_result {
1108311081 let context = chan.context();
1108411082 let logger = WithChannelContext::from(&self.logger, context, None);
11085- log_trace!(logger, "Removing channel {} now that the signer is unblocked", context.channel_id());
11086- if let Some(funded_channel) = chan.as_funded_mut() {
11087- locked_close_channel!(self, peer_state, funded_channel, shutdown_result, FUNDED);
11083+ let chan_id = context.channel_id();
11084+ log_trace!(logger, "Removing channel {} now that the signer is unblocked", chan_id);
11085+ let (remove, err) = if let Some(funded) = chan.as_funded_mut() {
11086+ let err = convert_channel_err!(self, peer_state, shutdown, funded, &chan_id, COOP_CLOSED);
11087+ (true, err)
1108811088 } else {
11089- locked_close_channel!(self, chan.context(), UNFUNDED);
11090- }
11091- shutdown_results.push(shutdown_result);
11089+ debug_assert!(false);
11090+ let reason = shutdown.closure_reason.clone();
11091+ let err = ChannelError::Close((reason.to_string(), reason));
11092+ convert_channel_err!(self, peer_state, err, chan, &chan_id, UNFUNDED_CHANNEL)
11093+ };
11094+ debug_assert!(remove);
11095+ shutdown_results.push((Err(err), *cp_id));
1109211096 false
1109311097 } else {
1109411098 true
1109511099 }
1109611100 });
1109711101 }
1109811102 drop(per_peer_state);
11099- for shutdown_result in shutdown_results.drain(..) {
11100- self.finish_close_channel(shutdown_result );
11103+ for (err, counterparty_node_id) in shutdown_results {
11104+ let _ = handle_error!(self, err, counterparty_node_id );
1110111105 }
1110211106 }
1110311107
@@ -11108,11 +11112,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1110811112 fn maybe_generate_initial_closing_signed(&self) -> bool {
1110911113 let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
1111011114 let mut has_update = false;
11111- let mut shutdown_results = Vec::new();
1111211115 {
1111311116 let per_peer_state = self.per_peer_state.read().unwrap();
1111411117
11115- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
11118+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
1111611119 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1111711120 let peer_state = &mut *peer_state_lock;
1111811121 let pending_msg_events = &mut peer_state.pending_msg_events;
@@ -11129,17 +11132,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1112911132 });
1113011133 }
1113111134 debug_assert_eq!(tx_shutdown_result_opt.is_some(), funded_chan.is_shutdown());
11132- if let Some((tx, mut shutdown_res)) = tx_shutdown_result_opt {
11133- locked_close_channel!(self, peer_state, funded_chan, shutdown_res, FUNDED);
11134- shutdown_results.push(shutdown_res);
11135+ if let Some((tx, shutdown_res)) = tx_shutdown_result_opt {
1113511136 // We're done with this channel. We got a closing_signed and sent back
1113611137 // a closing_signed with a closing transaction to broadcast.
11137- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
11138- let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
11139- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
11140- msg: update
11141- });
11142- }
11138+ let err = convert_channel_err!(self, peer_state, shutdown_res, funded_chan, channel_id, COOP_CLOSED);
11139+ handle_errors.push((*cp_id, Err(err)));
1114311140
1114411141 log_info!(logger, "Broadcasting {}", log_tx!(tx));
1114511142 self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -11160,14 +11157,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1116011157 }
1116111158 }
1116211159
11163- for (counterparty_node_id, err) in handle_errors.drain(..) {
11160+ for (counterparty_node_id, err) in handle_errors {
1116411161 let _ = handle_error!(self, err, counterparty_node_id);
1116511162 }
1116611163
11167- for shutdown_result in shutdown_results.drain(..) {
11168- self.finish_close_channel(shutdown_result);
11169- }
11170-
1117111164 has_update
1117211165 }
1117311166
0 commit comments