@@ -3071,7 +3071,7 @@ macro_rules! handle_error {
30713071 let logger = WithContext::from(
30723072 &$self.logger, Some(counterparty_node_id), Some(channel_id), None
30733073 );
3074- log_error!(logger, "Force-closing channel: {}", err.err);
3074+ log_error!(logger, "Closing channel: {}", err.err);
30753075
30763076 $self.finish_close_channel(shutdown_res);
30773077 if let Some(update) = update_option {
@@ -3194,6 +3194,23 @@ macro_rules! convert_channel_err {
31943194 },
31953195 }
31963196 };
3197+ ($self: ident, $peer_state: expr, $shutdown_result: expr, $funded_channel: expr, $channel_id: expr, COOP_CLOSED) => { {
3198+ let reason = ChannelError::Close(("Coop Closed".to_owned(), $shutdown_result.closure_reason.clone()));
3199+ let do_close = |_| {
3200+ (
3201+ $shutdown_result,
3202+ $self.get_channel_update_for_broadcast(&$funded_channel).ok(),
3203+ )
3204+ };
3205+ let mut locked_close = |shutdown_res_mut: &mut ShutdownResult, funded_channel: &mut FundedChannel<_>| {
3206+ locked_close_channel!($self, $peer_state, funded_channel, shutdown_res_mut, FUNDED);
3207+ };
3208+ let (close, mut err) =
3209+ convert_channel_err!($self, $peer_state, reason, $funded_channel, do_close, locked_close, $channel_id, _internal);
3210+ err.dont_send_error_message();
3211+ debug_assert!(close);
3212+ err
3213+ } };
31973214 ($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
31983215 let mut do_close = |reason| {
31993216 (
@@ -9759,13 +9776,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
97599776 msg.channel_id,
97609777 )
97619778 })?;
9762- let (tx, chan_option, shutdown_result) = {
9779+ let logger;
9780+ let tx_err: Option<(_, Result<Infallible, _>)> = {
97639781 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
97649782 let peer_state = &mut *peer_state_lock;
97659783 match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
97669784 hash_map::Entry::Occupied(mut chan_entry) => {
97679785 if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9768- let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9786+ logger = WithChannelContext::from(&self.logger, &chan.context, None);
97699787 let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
97709788 let (closing_signed, tx_shutdown_result) =
97719789 try_channel_entry!(self, peer_state, res, chan_entry);
@@ -9776,16 +9794,17 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
97769794 msg,
97779795 });
97789796 }
9779- if let Some((tx, mut close_res)) = tx_shutdown_result {
9797+ if let Some((tx, close_res)) = tx_shutdown_result {
97809798 // We're done with this channel, we've got a signed closing transaction and
97819799 // will send the closing_signed back to the remote peer upon return. This
97829800 // also implies there are no pending HTLCs left on the channel, so we can
97839801 // fully delete it from tracking (the channel monitor is still around to
97849802 // watch for old state broadcasts)!
9785- locked_close_channel!(self, peer_state, chan, close_res, FUNDED);
9786- (Some(tx), Some(chan_entry.remove()), Some(close_res))
9803+ let err = convert_channel_err!(self, peer_state, close_res, chan, &msg.channel_id, COOP_CLOSED);
9804+ chan_entry.remove();
9805+ Some((tx, Err(err)))
97879806 } else {
9788- ( None, None, None)
9807+ None
97899808 }
97909809 } else {
97919810 return try_channel_entry!(self, peer_state, Err(ChannelError::close(
@@ -9795,26 +9814,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
97959814 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))
97969815 }
97979816 };
9798- if let Some(broadcast_tx) = tx {
9799- let channel_id = chan_option.as_ref().map(|channel| channel.context().channel_id());
9800- log_info!(
9801- WithContext::from(&self.logger, Some(*counterparty_node_id), channel_id, None),
9802- "Broadcasting {}",
9803- log_tx!(broadcast_tx)
9804- );
9805- self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9806- }
9807- if let Some(chan) = chan_option.as_ref().and_then(Channel::as_funded) {
9808- if let Ok(update) = self.get_channel_update_for_broadcast(chan) {
9809- let mut pending_broadcast_messages =
9810- self.pending_broadcast_messages.lock().unwrap();
9811- pending_broadcast_messages
9812- .push(MessageSendEvent::BroadcastChannelUpdate { msg: update });
9813- }
9814- }
98159817 mem::drop(per_peer_state);
9816- if let Some(shutdown_result) = shutdown_result {
9817- self.finish_close_channel(shutdown_result);
9818+ if let Some((broadcast_tx, err)) = tx_err {
9819+ log_info!(logger, "Broadcasting {}", log_tx!(broadcast_tx));
9820+ self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9821+ let _ = handle_error!(self, err, *counterparty_node_id);
98189822 }
98199823 Ok(())
98209824 }
@@ -11060,12 +11064,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1106011064 if let Some(broadcast_tx) = msgs.signed_closing_tx {
1106111065 log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
1106211066 self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
11063-
11064- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
11065- pending_msg_events.push(MessageSendEvent::BroadcastChannelUpdate {
11066- msg: update
11067- });
11068- }
1106911067 }
1107011068 } else {
1107111069 // We don't know how to handle a channel_ready or signed_closing_tx for a
@@ -11079,40 +11077,46 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1107911077 }
1108011078 };
1108111079
11082- let mut shutdown_results = Vec::new();
11080+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
1108311081 let per_peer_state = self.per_peer_state.read().unwrap();
1108411082 let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
1108511083 if let Some((counterparty_node_id, _)) = channel_opt {
1108611084 **cp_id == counterparty_node_id
1108711085 } else { true }
1108811086 });
11089- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
11087+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
1109011088 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1109111089 let peer_state = &mut *peer_state_lock;
1109211090 peer_state.channel_by_id.retain(|_, chan| {
1109311091 let shutdown_result = match channel_opt {
1109411092 Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
1109511093 _ => unblock_chan(chan, &mut peer_state.pending_msg_events),
1109611094 };
11097- if let Some(mut shutdown_result ) = shutdown_result {
11095+ if let Some(shutdown ) = shutdown_result {
1109811096 let context = chan.context();
1109911097 let logger = WithChannelContext::from(&self.logger, context, None);
11100- log_trace!(logger, "Removing channel {} now that the signer is unblocked", context.channel_id());
11101- if let Some(funded_channel) = chan.as_funded_mut() {
11102- locked_close_channel!(self, peer_state, funded_channel, shutdown_result, FUNDED);
11098+ let chan_id = context.channel_id();
11099+ log_trace!(logger, "Removing channel {} now that the signer is unblocked", chan_id);
11100+ let (remove, err) = if let Some(funded) = chan.as_funded_mut() {
11101+ let err = convert_channel_err!(self, peer_state, shutdown, funded, &chan_id, COOP_CLOSED);
11102+ (true, err)
1110311103 } else {
11104- locked_close_channel!(self, chan.context(), UNFUNDED);
11105- }
11106- shutdown_results.push(shutdown_result);
11104+ debug_assert!(false);
11105+ let reason = shutdown.closure_reason.clone();
11106+ let err = ChannelError::Close((reason.to_string(), reason));
11107+ convert_channel_err!(self, peer_state, err, chan, &chan_id, UNFUNDED_CHANNEL)
11108+ };
11109+ debug_assert!(remove);
11110+ shutdown_results.push((Err(err), *cp_id));
1110711111 false
1110811112 } else {
1110911113 true
1111011114 }
1111111115 });
1111211116 }
1111311117 drop(per_peer_state);
11114- for shutdown_result in shutdown_results.drain(..) {
11115- self.finish_close_channel(shutdown_result );
11118+ for (err, counterparty_node_id) in shutdown_results {
11119+ let _ = handle_error!(self, err, counterparty_node_id );
1111611120 }
1111711121 }
1111811122
@@ -11123,11 +11127,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1112311127 fn maybe_generate_initial_closing_signed(&self) -> bool {
1112411128 let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
1112511129 let mut has_update = false;
11126- let mut shutdown_results = Vec::new();
1112711130 {
1112811131 let per_peer_state = self.per_peer_state.read().unwrap();
1112911132
11130- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
11133+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
1113111134 let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1113211135 let peer_state = &mut *peer_state_lock;
1113311136 let pending_msg_events = &mut peer_state.pending_msg_events;
@@ -11144,17 +11147,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1114411147 });
1114511148 }
1114611149 debug_assert_eq!(tx_shutdown_result_opt.is_some(), funded_chan.is_shutdown());
11147- if let Some((tx, mut shutdown_res)) = tx_shutdown_result_opt {
11148- locked_close_channel!(self, peer_state, funded_chan, shutdown_res, FUNDED);
11149- shutdown_results.push(shutdown_res);
11150+ if let Some((tx, shutdown_res)) = tx_shutdown_result_opt {
1115011151 // We're done with this channel. We got a closing_signed and sent back
1115111152 // a closing_signed with a closing transaction to broadcast.
11152- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
11153- let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
11154- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
11155- msg: update
11156- });
11157- }
11153+ let err = convert_channel_err!(self, peer_state, shutdown_res, funded_chan, channel_id, COOP_CLOSED);
11154+ handle_errors.push((*cp_id, Err(err)));
1115811155
1115911156 log_info!(logger, "Broadcasting {}", log_tx!(tx));
1116011157 self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -11175,14 +11172,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1117511172 }
1117611173 }
1117711174
11178- for (counterparty_node_id, err) in handle_errors.drain(..) {
11175+ for (counterparty_node_id, err) in handle_errors {
1117911176 let _ = handle_error!(self, err, counterparty_node_id);
1118011177 }
1118111178
11182- for shutdown_result in shutdown_results.drain(..) {
11183- self.finish_close_channel(shutdown_result);
11184- }
11185-
1118611179 has_update
1118711180 }
1118811181
0 commit comments