Skip to content

Commit b8cdde8

Browse files
authored
Merge pull request #3107 from mhrheaume/mhr/closure_reason_abandoned
Updated `ClosureReason::HolderForceClosed` with whether txn was broadcasted.
2 parents a666401 + 808d814 commit b8cdde8

15 files changed

+72
-51
lines changed

lightning-persister/src/fs_store.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ mod tests {
447447
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
448448
let error_message = "Channel force-closed";
449449
nodes[1].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[0].node.get_our_node_id(), error_message.to_string()).unwrap();
450-
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed, [nodes[0].node.get_our_node_id()], 100000);
450+
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[0].node.get_our_node_id()], 100000);
451451
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
452452

453453
// Set the store's directory to read-only, which should result in
@@ -485,7 +485,7 @@ mod tests {
485485
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
486486
let error_message = "Channel force-closed";
487487
nodes[1].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[0].node.get_our_node_id(), error_message.to_string()).unwrap();
488-
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed, [nodes[0].node.get_our_node_id()], 100000);
488+
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[0].node.get_our_node_id()], 100000);
489489
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
490490
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
491491
let update_id = update_map.get(&added_monitors[0].1.channel_id()).unwrap();

lightning-persister/src/test_utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ pub(crate) fn do_test_store<K: KVStore>(store_0: &K, store_1: &K) {
106106
// updates.
107107
let error_message = "Channel force-closed";
108108
nodes[0].node.force_close_broadcasting_latest_txn(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
109-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
109+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
110110
check_closed_broadcast!(nodes[0], true);
111111
check_added_monitors!(nodes[0], 1);
112112

lightning/src/chain/channelmonitor.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2873,7 +2873,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
28732873
F::Target: FeeEstimator,
28742874
L::Target: Logger,
28752875
{
2876-
let (claimable_outpoints, _) = self.generate_claimable_outpoints_and_watch_outputs(ClosureReason::HolderForceClosed);
2876+
let (claimable_outpoints, _) = self.generate_claimable_outpoints_and_watch_outputs(ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) });
28772877
self.onchain_tx_handler.update_claims_view_from_requests(
28782878
claimable_outpoints, self.best_block.height, self.best_block.height, broadcaster,
28792879
fee_estimator, logger

lightning/src/events/mod.rs

+24-3
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,21 @@ pub enum ClosureReason {
278278
/// Closure generated from [`ChannelManager::force_close_channel`], called by the user.
279279
///
280280
/// [`ChannelManager::force_close_channel`]: crate::ln::channelmanager::ChannelManager::force_close_channel.
281-
HolderForceClosed,
281+
HolderForceClosed {
282+
/// Whether or not the latest transaction was broadcasted when the channel was force
283+
/// closed.
284+
///
285+
/// Channels closed using [`ChannelManager::force_close_broadcasting_latest_txn`] will have
286+
/// this field set to true, whereas channels closed using [`ChannelManager::force_close_without_broadcasting_txn`]
287+
/// or force-closed prior to being funded will have this field set to false.
288+
///
289+
/// This will be `None` for objects generated or written by LDK 0.0.123 and
290+
/// earlier.
291+
///
292+
/// [`ChannelManager::force_close_broadcasting_latest_txn`]: crate::ln::channelmanager::ChannelManager::force_close_broadcasting_latest_txn.
293+
/// [`ChannelManager::force_close_without_broadcasting_txn`]: crate::ln::channelmanager::ChannelManager::force_close_without_broadcasting_txn.
294+
broadcasted_latest_txn: Option<bool>
295+
},
282296
/// The channel was closed after negotiating a cooperative close and we've now broadcasted
283297
/// the cooperative close transaction. Note the shutdown may have been initiated by us.
284298
///
@@ -355,7 +369,14 @@ impl core::fmt::Display for ClosureReason {
355369
ClosureReason::CounterpartyForceClosed { peer_msg } => {
356370
f.write_fmt(format_args!("counterparty force-closed with message: {}", peer_msg))
357371
},
358-
ClosureReason::HolderForceClosed => f.write_str("user force-closed the channel"),
372+
ClosureReason::HolderForceClosed { broadcasted_latest_txn } => {
373+
f.write_str("user force-closed the channel")?;
374+
if let Some(brodcasted) = broadcasted_latest_txn {
375+
write!(f, " and {} the latest transaction", if *brodcasted { "broadcasted" } else { "did not broadcast" })
376+
} else {
377+
Ok(())
378+
}
379+
},
359380
ClosureReason::LegacyCooperativeClosure => f.write_str("the channel was cooperatively closed"),
360381
ClosureReason::CounterpartyInitiatedCooperativeClosure => f.write_str("the channel was cooperatively closed by our peer"),
361382
ClosureReason::LocallyInitiatedCooperativeClosure => f.write_str("the channel was cooperatively closed by us"),
@@ -382,7 +403,7 @@ impl core::fmt::Display for ClosureReason {
382403
impl_writeable_tlv_based_enum_upgradable!(ClosureReason,
383404
(0, CounterpartyForceClosed) => { (1, peer_msg, required) },
384405
(1, FundingTimedOut) => {},
385-
(2, HolderForceClosed) => {},
406+
(2, HolderForceClosed) => { (1, broadcasted_latest_txn, option) },
386407
(6, CommitmentTxConfirmed) => {},
387408
(4, LegacyCooperativeClosure) => {},
388409
(8, ProcessingError) => { (1, err, required) },

lightning/src/ln/async_signer_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ fn do_test_async_holder_signatures(anchors: bool, remote_commitment: bool) {
373373
nodes[1].node.force_close_broadcasting_latest_txn(&chan_id, &nodes[0].node.get_our_node_id(), error_message.to_string()).unwrap();
374374
check_added_monitors(&nodes[1], 1);
375375
check_closed_broadcast(&nodes[1], 1, true);
376-
check_closed_event(&nodes[1], 1, ClosureReason::HolderForceClosed, false, &[nodes[0].node.get_our_node_id()], 100_000);
376+
check_closed_event(&nodes[1], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, false, &[nodes[0].node.get_our_node_id()], 100_000);
377377
} else {
378378
// We'll connect blocks until the sender has to go onchain to time out the HTLC.
379379
connect_blocks(&nodes[0], TEST_FINAL_CLTV + LATENCY_GRACE_PERIOD_BLOCKS + 1);

lightning/src/ln/chanmon_update_fail_tests.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
216216
// PaymentPathFailed event
217217

218218
assert_eq!(nodes[0].node.list_channels().len(), 0);
219-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
219+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
220220
}
221221

222222
#[test]
@@ -3232,13 +3232,13 @@ fn do_test_durable_preimages_on_closed_channel(close_chans_before_reload: bool,
32323232
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
32333233
nodes[1].node.force_close_broadcasting_latest_txn(&chan_id_bc, &nodes[2].node.get_our_node_id(), error_message.to_string()).unwrap();
32343234
check_closed_broadcast(&nodes[1], 1, true);
3235-
check_closed_event(&nodes[1], 1, ClosureReason::HolderForceClosed, false, &[nodes[2].node.get_our_node_id()], 100000);
3235+
check_closed_event(&nodes[1], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, false, &[nodes[2].node.get_our_node_id()], 100000);
32363236
}
32373237

32383238
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
32393239
nodes[1].node.force_close_broadcasting_latest_txn(&chan_id_ab, &nodes[0].node.get_our_node_id(), error_message.to_string()).unwrap();
32403240
check_closed_broadcast(&nodes[1], 1, true);
3241-
check_closed_event(&nodes[1], 1, ClosureReason::HolderForceClosed, false, &[nodes[0].node.get_our_node_id()], 100000);
3241+
check_closed_event(&nodes[1], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, false, &[nodes[0].node.get_our_node_id()], 100000);
32423242
}
32433243

32443244
// Now reload node B
@@ -3260,7 +3260,7 @@ fn do_test_durable_preimages_on_closed_channel(close_chans_before_reload: bool,
32603260
let error_message = "Channel force-closed";
32613261

32623262
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id_ab, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
3263-
check_closed_event(&nodes[0], 1, ClosureReason::HolderForceClosed, false, &[nodes[1].node.get_our_node_id()], 100000);
3263+
check_closed_event(&nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, false, &[nodes[1].node.get_our_node_id()], 100000);
32643264
let as_closing_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
32653265
assert_eq!(as_closing_tx.len(), 1);
32663266

@@ -3403,7 +3403,7 @@ fn do_test_reload_mon_update_completion_actions(close_during_reload: bool) {
34033403
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id_ab, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
34043404
check_added_monitors!(nodes[0], 1);
34053405
check_closed_broadcast!(nodes[0], true);
3406-
check_closed_event(&nodes[0], 1, ClosureReason::HolderForceClosed, false, &[nodes[1].node.get_our_node_id()], 100_000);
3406+
check_closed_event(&nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, false, &[nodes[1].node.get_our_node_id()], 100_000);
34073407
let as_closing_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
34083408
mine_transaction_without_consistency_checks(&nodes[1], &as_closing_tx[0]);
34093409
}

lightning/src/ln/channelmanager.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -3188,7 +3188,7 @@ where
31883188
}
31893189
} else {
31903190
let mut chan_phase = remove_channel_phase!(self, chan_phase_entry);
3191-
shutdown_result = Some(chan_phase.context_mut().force_shutdown(false, ClosureReason::HolderForceClosed));
3191+
shutdown_result = Some(chan_phase.context_mut().force_shutdown(false, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) }));
31923192
}
31933193
},
31943194
hash_map::Entry::Vacant(_) => {
@@ -3357,7 +3357,7 @@ where
33573357
let closure_reason = if let Some(peer_msg) = peer_msg {
33583358
ClosureReason::CounterpartyForceClosed { peer_msg: UntrustedString(peer_msg.to_string()) }
33593359
} else {
3360-
ClosureReason::HolderForceClosed
3360+
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(broadcast) }
33613361
};
33623362
let logger = WithContext::from(&self.logger, Some(*peer_node_id), Some(*channel_id), None);
33633363
if let hash_map::Entry::Occupied(chan_phase_entry) = peer_state.channel_by_id.entry(channel_id.clone()) {
@@ -5531,7 +5531,7 @@ where
55315531
log_error!(logger,
55325532
"Force-closing pending channel with ID {} for not establishing in a timely manner", chan_id);
55335533
update_maps_on_chan_removal!(self, &context);
5534-
shutdown_channels.push(context.force_shutdown(false, ClosureReason::HolderForceClosed));
5534+
shutdown_channels.push(context.force_shutdown(false, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) }));
55355535
pending_msg_events.push(MessageSendEvent::HandleError {
55365536
node_id: counterparty_node_id,
55375537
action: msgs::ErrorAction::SendErrorMessage {
@@ -8018,7 +8018,7 @@ where
80188018
let reason = if let MonitorEvent::HolderForceClosedWithInfo { reason, .. } = monitor_event {
80198019
reason
80208020
} else {
8021-
ClosureReason::HolderForceClosed
8021+
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }
80228022
};
80238023
failed_channels.push(chan.context.force_shutdown(false, reason.clone()));
80248024
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
@@ -12584,7 +12584,7 @@ mod tests {
1258412584

1258512585
nodes[0].node.force_close_channel_with_peer(&chan.2, &nodes[1].node.get_our_node_id(), None, true).unwrap();
1258612586
check_added_monitors!(nodes[0], 1);
12587-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
12587+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
1258812588

1258912589
// Confirm that the channel_update was not sent immediately to node[1] but was cached.
1259012590
let node_1_events = nodes[1].node.get_and_clear_pending_msg_events();
@@ -12643,7 +12643,7 @@ mod tests {
1264312643
nodes[0].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
1264412644
check_closed_broadcast!(nodes[0], true);
1264512645
check_added_monitors!(nodes[0], 1);
12646-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
12646+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
1264712647

1264812648
{
1264912649
// Assert that nodes[1] is awaiting removal for nodes[0] once nodes[1] has been
@@ -13380,7 +13380,7 @@ mod tests {
1338013380
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
1338113381
check_closed_broadcast(&nodes[0], 1, true);
1338213382
check_added_monitors(&nodes[0], 1);
13383-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
13383+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
1338413384
{
1338513385
let txn = nodes[0].tx_broadcaster.txn_broadcast();
1338613386
assert_eq!(txn.len(), 1);

0 commit comments

Comments
 (0)