@@ -3069,7 +3069,7 @@ macro_rules! handle_error {
3069
3069
let logger = WithContext::from(
3070
3070
&$self.logger, Some(counterparty_node_id), Some(channel_id), None
3071
3071
);
3072
- log_error!(logger, "Force-closing channel: {}", err.err);
3072
+ log_error!(logger, "Closing channel: {}", err.err);
3073
3073
3074
3074
$self.finish_close_channel(shutdown_res);
3075
3075
if let Some(update) = update_option {
@@ -3192,6 +3192,23 @@ macro_rules! convert_channel_err {
3192
3192
},
3193
3193
}
3194
3194
};
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
+ } };
3195
3212
($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
3196
3213
let mut do_close = |reason| {
3197
3214
(
@@ -9788,13 +9805,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9788
9805
msg.channel_id,
9789
9806
)
9790
9807
})?;
9791
- let (tx, chan_option, shutdown_result) = {
9808
+ let logger;
9809
+ let tx_err: Option<(_, Result<Infallible, _>)> = {
9792
9810
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
9793
9811
let peer_state = &mut *peer_state_lock;
9794
9812
match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
9795
9813
hash_map::Entry::Occupied(mut chan_entry) => {
9796
9814
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);
9798
9816
let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
9799
9817
let (closing_signed, tx_shutdown_result) =
9800
9818
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/
9805
9823
msg,
9806
9824
});
9807
9825
}
9808
- if let Some((tx, mut close_res)) = tx_shutdown_result {
9826
+ if let Some((tx, close_res)) = tx_shutdown_result {
9809
9827
// We're done with this channel, we've got a signed closing transaction and
9810
9828
// will send the closing_signed back to the remote peer upon return. This
9811
9829
// also implies there are no pending HTLCs left on the channel, so we can
9812
9830
// fully delete it from tracking (the channel monitor is still around to
9813
9831
// 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)))
9816
9835
} else {
9817
- ( None, None, None)
9836
+ None
9818
9837
}
9819
9838
} else {
9820
9839
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/
9824
9843
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))
9825
9844
}
9826
9845
};
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
- }
9844
9846
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);
9847
9851
}
9848
9852
Ok(())
9849
9853
}
@@ -11045,12 +11049,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11045
11049
if let Some(broadcast_tx) = msgs.signed_closing_tx {
11046
11050
log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
11047
11051
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
- }
11054
11052
}
11055
11053
} else {
11056
11054
// 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/
11064
11062
}
11065
11063
};
11066
11064
11067
- let mut shutdown_results = Vec::new();
11065
+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
11068
11066
let per_peer_state = self.per_peer_state.read().unwrap();
11069
11067
let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
11070
11068
if let Some((counterparty_node_id, _)) = channel_opt {
11071
11069
**cp_id == counterparty_node_id
11072
11070
} else { true }
11073
11071
});
11074
- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
11072
+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
11075
11073
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
11076
11074
let peer_state = &mut *peer_state_lock;
11077
11075
peer_state.channel_by_id.retain(|_, chan| {
11078
11076
let shutdown_result = match channel_opt {
11079
11077
Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
11080
11078
_ => unblock_chan(chan, &mut peer_state.pending_msg_events),
11081
11079
};
11082
- if let Some(mut shutdown_result ) = shutdown_result {
11080
+ if let Some(shutdown ) = shutdown_result {
11083
11081
let context = chan.context();
11084
11082
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)
11088
11088
} 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));
11092
11096
false
11093
11097
} else {
11094
11098
true
11095
11099
}
11096
11100
});
11097
11101
}
11098
11102
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 );
11101
11105
}
11102
11106
}
11103
11107
@@ -11108,11 +11112,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11108
11112
fn maybe_generate_initial_closing_signed(&self) -> bool {
11109
11113
let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
11110
11114
let mut has_update = false;
11111
- let mut shutdown_results = Vec::new();
11112
11115
{
11113
11116
let per_peer_state = self.per_peer_state.read().unwrap();
11114
11117
11115
- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
11118
+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
11116
11119
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
11117
11120
let peer_state = &mut *peer_state_lock;
11118
11121
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/
11129
11132
});
11130
11133
}
11131
11134
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 {
11135
11136
// We're done with this channel. We got a closing_signed and sent back
11136
11137
// 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)));
11143
11140
11144
11141
log_info!(logger, "Broadcasting {}", log_tx!(tx));
11145
11142
self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -11160,14 +11157,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11160
11157
}
11161
11158
}
11162
11159
11163
- for (counterparty_node_id, err) in handle_errors.drain(..) {
11160
+ for (counterparty_node_id, err) in handle_errors {
11164
11161
let _ = handle_error!(self, err, counterparty_node_id);
11165
11162
}
11166
11163
11167
- for shutdown_result in shutdown_results.drain(..) {
11168
- self.finish_close_channel(shutdown_result);
11169
- }
11170
-
11171
11164
has_update
11172
11165
}
11173
11166
0 commit comments