@@ -3242,6 +3242,23 @@ macro_rules! convert_channel_err {
3242
3242
},
3243
3243
}
3244
3244
};
3245
+ ($self: ident, $peer_state: expr, $shutdown_result: expr, $funded_channel: expr, $channel_id: expr, COOP_CLOSED) => { {
3246
+ let reason = ChannelError::Close(("Coop Closed".to_owned(), $shutdown_result.closure_reason.clone()));
3247
+ let do_close = |_| {
3248
+ (
3249
+ $shutdown_result,
3250
+ $self.get_channel_update_for_broadcast(&$funded_channel).ok(),
3251
+ )
3252
+ };
3253
+ let mut locked_close = |shutdown_res_mut: &mut ShutdownResult, funded_channel: &mut FundedChannel<_>| {
3254
+ locked_close_channel!($self, $peer_state, funded_channel, shutdown_res_mut, FUNDED);
3255
+ };
3256
+ let (close, mut err) =
3257
+ convert_channel_err!($self, $peer_state, reason, $funded_channel, do_close, locked_close, $channel_id, _internal);
3258
+ err.dont_send_error_message();
3259
+ debug_assert!(close);
3260
+ (close, err)
3261
+ } };
3245
3262
($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
3246
3263
let mut do_close = |reason| {
3247
3264
(
@@ -9312,13 +9329,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9312
9329
msg.channel_id,
9313
9330
)
9314
9331
})?;
9315
- let (tx, chan_option, shutdown_result) = {
9332
+ let logger;
9333
+ let tx_err: Option<(_, Result<Infallible, _>)> = {
9316
9334
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
9317
9335
let peer_state = &mut *peer_state_lock;
9318
9336
match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
9319
9337
hash_map::Entry::Occupied(mut chan_entry) => {
9320
9338
if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9321
- let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9339
+ logger = WithChannelContext::from(&self.logger, &chan.context, None);
9322
9340
let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
9323
9341
let (closing_signed, tx_shutdown_result) =
9324
9342
try_channel_entry!(self, peer_state, res, chan_entry);
@@ -9329,16 +9347,17 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9329
9347
msg,
9330
9348
});
9331
9349
}
9332
- if let Some((tx, mut close_res)) = tx_shutdown_result {
9350
+ if let Some((tx, close_res)) = tx_shutdown_result {
9333
9351
// We're done with this channel, we've got a signed closing transaction and
9334
9352
// will send the closing_signed back to the remote peer upon return. This
9335
9353
// also implies there are no pending HTLCs left on the channel, so we can
9336
9354
// fully delete it from tracking (the channel monitor is still around to
9337
9355
// watch for old state broadcasts)!
9338
- locked_close_channel!(self, peer_state, chan, close_res, FUNDED);
9339
- (Some(tx), Some(chan_entry.remove()), Some(close_res))
9356
+ let (_, err) = convert_channel_err!(self, peer_state, close_res, chan, &msg.channel_id, COOP_CLOSED);
9357
+ chan_entry.remove();
9358
+ Some((tx, Err(err)))
9340
9359
} else {
9341
- ( None, None, None)
9360
+ None
9342
9361
}
9343
9362
} else {
9344
9363
return try_channel_entry!(self, peer_state, Err(ChannelError::close(
@@ -9348,26 +9367,15 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9348
9367
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))
9349
9368
}
9350
9369
};
9351
- if let Some(broadcast_tx) = tx {
9352
- let channel_id = chan_option.as_ref().map(|channel| channel.context().channel_id());
9370
+ mem::drop(per_peer_state);
9371
+ if let Some((broadcast_tx, err)) = tx_err {
9353
9372
log_info!(
9354
- WithContext::from(&self. logger, Some(*counterparty_node_id), channel_id, None) ,
9373
+ logger,
9355
9374
"Broadcasting {}",
9356
9375
log_tx!(broadcast_tx)
9357
9376
);
9358
9377
self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9359
- }
9360
- if let Some(chan) = chan_option.as_ref().and_then(Channel::as_funded) {
9361
- if let Ok(update) = self.get_channel_update_for_broadcast(chan) {
9362
- let mut pending_broadcast_messages =
9363
- self.pending_broadcast_messages.lock().unwrap();
9364
- pending_broadcast_messages
9365
- .push(MessageSendEvent::BroadcastChannelUpdate { msg: update });
9366
- }
9367
- }
9368
- mem::drop(per_peer_state);
9369
- if let Some(shutdown_result) = shutdown_result {
9370
- self.finish_close_channel(shutdown_result);
9378
+ let _ = handle_error!(self, err, *counterparty_node_id);
9371
9379
}
9372
9380
Ok(())
9373
9381
}
@@ -10462,12 +10470,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10462
10470
if let Some(broadcast_tx) = msgs.signed_closing_tx {
10463
10471
log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
10464
10472
self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
10465
-
10466
- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
10467
- pending_msg_events.push(MessageSendEvent::BroadcastChannelUpdate {
10468
- msg: update
10469
- });
10470
- }
10471
10473
}
10472
10474
} else {
10473
10475
// We don't know how to handle a channel_ready or signed_closing_tx for a
@@ -10481,40 +10483,45 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10481
10483
}
10482
10484
};
10483
10485
10484
- let mut shutdown_results = Vec::new();
10486
+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
10485
10487
let per_peer_state = self.per_peer_state.read().unwrap();
10486
10488
let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
10487
10489
if let Some((counterparty_node_id, _)) = channel_opt {
10488
10490
**cp_id == counterparty_node_id
10489
10491
} else { true }
10490
10492
});
10491
- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
10493
+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
10492
10494
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
10493
10495
let peer_state = &mut *peer_state_lock;
10494
10496
peer_state.channel_by_id.retain(|_, chan| {
10495
10497
let shutdown_result = match channel_opt {
10496
10498
Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
10497
10499
_ => unblock_chan(chan, &mut peer_state.pending_msg_events),
10498
10500
};
10499
- if let Some(mut shutdown_result ) = shutdown_result {
10501
+ if let Some(shutdown_res ) = shutdown_result {
10500
10502
let context = chan.context();
10501
10503
let logger = WithChannelContext::from(&self.logger, context, None);
10502
- log_trace!(logger, "Removing channel {} now that the signer is unblocked", context.channel_id());
10503
- if let Some(funded_channel) = chan.as_funded_mut() {
10504
- locked_close_channel!(self, peer_state, funded_channel, shutdown_result, FUNDED);
10504
+ let chan_id = context.channel_id();
10505
+ log_trace!(logger, "Removing channel {} now that the signer is unblocked", chan_id);
10506
+ let (remove, err) = if let Some(funded_channel) = chan.as_funded_mut() {
10507
+ convert_channel_err!(self, peer_state, shutdown_res, funded_channel, &chan_id, COOP_CLOSED)
10505
10508
} else {
10506
- locked_close_channel!(self, chan.context(), UNFUNDED);
10507
- }
10508
- shutdown_results.push(shutdown_result);
10509
+ debug_assert!(false);
10510
+ let reason = shutdown_res.closure_reason.clone();
10511
+ let err = ChannelError::Close((reason.to_string(), reason));
10512
+ convert_channel_err!(self, peer_state, err, chan, &chan_id, UNFUNDED_CHANNEL)
10513
+ };
10514
+ debug_assert!(remove);
10515
+ shutdown_results.push((Err(err), *cp_id));
10509
10516
false
10510
10517
} else {
10511
10518
true
10512
10519
}
10513
10520
});
10514
10521
}
10515
10522
drop(per_peer_state);
10516
- for shutdown_result in shutdown_results.drain(..) {
10517
- self.finish_close_channel(shutdown_result );
10523
+ for (err, counterparty_node_id) in shutdown_results {
10524
+ let _ = handle_error!(self, err, counterparty_node_id );
10518
10525
}
10519
10526
}
10520
10527
@@ -10525,11 +10532,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10525
10532
fn maybe_generate_initial_closing_signed(&self) -> bool {
10526
10533
let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
10527
10534
let mut has_update = false;
10528
- let mut shutdown_results = Vec::new();
10529
10535
{
10530
10536
let per_peer_state = self.per_peer_state.read().unwrap();
10531
10537
10532
- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
10538
+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
10533
10539
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
10534
10540
let peer_state = &mut *peer_state_lock;
10535
10541
let pending_msg_events = &mut peer_state.pending_msg_events;
@@ -10546,17 +10552,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10546
10552
});
10547
10553
}
10548
10554
debug_assert_eq!(tx_shutdown_result_opt.is_some(), funded_chan.is_shutdown());
10549
- if let Some((tx, mut shutdown_res)) = tx_shutdown_result_opt {
10550
- locked_close_channel!(self, peer_state, funded_chan, shutdown_res, FUNDED);
10551
- shutdown_results.push(shutdown_res);
10555
+ if let Some((tx, shutdown_res)) = tx_shutdown_result_opt {
10552
10556
// We're done with this channel. We got a closing_signed and sent back
10553
10557
// a closing_signed with a closing transaction to broadcast.
10554
- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
10555
- let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
10556
- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
10557
- msg: update
10558
- });
10559
- }
10558
+ let (_, err) = convert_channel_err!(self, peer_state, shutdown_res, funded_chan, channel_id, COOP_CLOSED);
10559
+ handle_errors.push((*cp_id, Err(err)));
10560
10560
10561
10561
log_info!(logger, "Broadcasting {}", log_tx!(tx));
10562
10562
self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -10577,14 +10577,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10577
10577
}
10578
10578
}
10579
10579
10580
- for (counterparty_node_id, err) in handle_errors.drain(..) {
10580
+ for (counterparty_node_id, err) in handle_errors {
10581
10581
let _ = handle_error!(self, err, counterparty_node_id);
10582
10582
}
10583
10583
10584
- for shutdown_result in shutdown_results.drain(..) {
10585
- self.finish_close_channel(shutdown_result);
10586
- }
10587
-
10588
10584
has_update
10589
10585
}
10590
10586
0 commit comments