Skip to content

Commit e9ab795

Browse files
committed
Updated ClosureReason::HolderForceClosed with broadcasted txn.
1 parent 2701bc5 commit e9ab795

15 files changed

+62
-51
lines changed

lightning-persister/src/fs_store.rs

Lines changed: 2 additions & 2 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,11 @@ 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+
broadcasted_latest_txn: Option<bool>
285+
},
282286
/// The channel was closed after negotiating a cooperative close and we've now broadcasted
283287
/// the cooperative close transaction. Note the shutdown may have been initiated by us.
284288
///
@@ -340,7 +344,14 @@ impl core::fmt::Display for ClosureReason {
340344
ClosureReason::CounterpartyForceClosed { peer_msg } => {
341345
f.write_fmt(format_args!("counterparty force-closed with message: {}", peer_msg))
342346
},
343-
ClosureReason::HolderForceClosed => f.write_str("user force-closed the channel"),
347+
ClosureReason::HolderForceClosed { broadcasted_latest_txn } => {
348+
f.write_str("user force-closed the channel")?;
349+
if let Some(brodcasted) = broadcasted_latest_txn {
350+
write!(f, " and {} the latest transaction", if *brodcasted { "broadcasted" } else { "did not broadcast" })
351+
} else {
352+
Ok(())
353+
}
354+
},
344355
ClosureReason::LegacyCooperativeClosure => f.write_str("the channel was cooperatively closed"),
345356
ClosureReason::CounterpartyInitiatedCooperativeClosure => f.write_str("the channel was cooperatively closed by our peer"),
346357
ClosureReason::LocallyInitiatedCooperativeClosure => f.write_str("the channel was cooperatively closed by us"),
@@ -362,7 +373,7 @@ impl core::fmt::Display for ClosureReason {
362373
impl_writeable_tlv_based_enum_upgradable!(ClosureReason,
363374
(0, CounterpartyForceClosed) => { (1, peer_msg, required) },
364375
(1, FundingTimedOut) => {},
365-
(2, HolderForceClosed) => {},
376+
(2, HolderForceClosed) => { (1, broadcasted_latest_txn, option) },
366377
(6, CommitmentTxConfirmed) => {},
367378
(4, LegacyCooperativeClosure) => {},
368379
(8, ProcessingError) => { (1, err, required) },

lightning/src/ln/async_signer_tests.rs

Lines changed: 1 addition & 1 deletion
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

Lines changed: 5 additions & 5 deletions
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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3153,7 +3153,7 @@ where
31533153
}
31543154
} else {
31553155
let mut chan_phase = remove_channel_phase!(self, chan_phase_entry);
3156-
shutdown_result = Some(chan_phase.context_mut().force_shutdown(false, ClosureReason::HolderForceClosed));
3156+
shutdown_result = Some(chan_phase.context_mut().force_shutdown(false, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) }));
31573157
}
31583158
},
31593159
hash_map::Entry::Vacant(_) => {
@@ -3322,7 +3322,7 @@ where
33223322
let closure_reason = if let Some(peer_msg) = peer_msg {
33233323
ClosureReason::CounterpartyForceClosed { peer_msg: UntrustedString(peer_msg.to_string()) }
33243324
} else {
3325-
ClosureReason::HolderForceClosed
3325+
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(broadcast) }
33263326
};
33273327
let logger = WithContext::from(&self.logger, Some(*peer_node_id), Some(*channel_id), None);
33283328
if let hash_map::Entry::Occupied(chan_phase_entry) = peer_state.channel_by_id.entry(channel_id.clone()) {
@@ -5497,7 +5497,7 @@ where
54975497
log_error!(logger,
54985498
"Force-closing pending channel with ID {} for not establishing in a timely manner", chan_id);
54995499
update_maps_on_chan_removal!(self, &context);
5500-
shutdown_channels.push(context.force_shutdown(false, ClosureReason::HolderForceClosed));
5500+
shutdown_channels.push(context.force_shutdown(false, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) }));
55015501
pending_msg_events.push(MessageSendEvent::HandleError {
55025502
node_id: counterparty_node_id,
55035503
action: msgs::ErrorAction::SendErrorMessage {
@@ -7984,7 +7984,7 @@ where
79847984
let reason = if let MonitorEvent::HolderForceClosedWithInfo { reason, .. } = monitor_event {
79857985
reason
79867986
} else {
7987-
ClosureReason::HolderForceClosed
7987+
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }
79887988
};
79897989
failed_channels.push(chan.context.force_shutdown(false, reason.clone()));
79907990
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
@@ -12458,7 +12458,7 @@ mod tests {
1245812458

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

1246312463
// Confirm that the channel_update was not sent immediately to node[1] but was cached.
1246412464
let node_1_events = nodes[1].node.get_and_clear_pending_msg_events();
@@ -12517,7 +12517,7 @@ mod tests {
1251712517
nodes[0].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
1251812518
check_closed_broadcast!(nodes[0], true);
1251912519
check_added_monitors!(nodes[0], 1);
12520-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
12520+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
1252112521

1252212522
{
1252312523
// Assert that nodes[1] is awaiting removal for nodes[0] once nodes[1] has been
@@ -13254,7 +13254,7 @@ mod tests {
1325413254
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id, &nodes[1].node.get_our_node_id(), error_message.to_string()).unwrap();
1325513255
check_closed_broadcast(&nodes[0], 1, true);
1325613256
check_added_monitors(&nodes[0], 1);
13257-
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
13257+
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true) }, [nodes[1].node.get_our_node_id()], 100000);
1325813258
{
1325913259
let txn = nodes[0].tx_broadcaster.txn_broadcast();
1326013260
assert_eq!(txn.len(), 1);

0 commit comments

Comments
 (0)