mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-25 15:20:24 +01:00
Breakup CooperativeClosure into Local/Remote initiated
This commit is contained in:
parent
5bf58f0d33
commit
58f7942e11
7 changed files with 106 additions and 53 deletions
|
@ -184,8 +184,15 @@ pub enum ClosureReason {
|
||||||
HolderForceClosed,
|
HolderForceClosed,
|
||||||
/// The channel was closed after negotiating a cooperative close and we've now broadcasted
|
/// The channel was closed after negotiating a cooperative close and we've now broadcasted
|
||||||
/// the cooperative close transaction. Note the shutdown may have been initiated by us.
|
/// the cooperative close transaction. Note the shutdown may have been initiated by us.
|
||||||
//TODO: split between CounterpartyInitiated/LocallyInitiated
|
// Can be removed once we disallow downgrading to 0.0.121
|
||||||
CooperativeClosure,
|
CooperativeClosure,
|
||||||
|
/// The channel was closed after negotiating a cooperative close and we've now broadcasted
|
||||||
|
/// the cooperative close transaction. This indicates that the shutdown was initiated by our
|
||||||
|
/// counterparty.
|
||||||
|
CounterpartyInitiatedCooperativeClosure,
|
||||||
|
/// The channel was closed after negotiating a cooperative close and we've now broadcasted
|
||||||
|
/// the cooperative close transaction. This indicates that the shutdown was initiated by us.
|
||||||
|
LocallyInitiatedCooperativeClosure,
|
||||||
/// A commitment transaction was confirmed on chain, closing the channel. Most likely this
|
/// A commitment transaction was confirmed on chain, closing the channel. Most likely this
|
||||||
/// commitment transaction came from our counterparty, but it may also have come from
|
/// commitment transaction came from our counterparty, but it may also have come from
|
||||||
/// a copy of our own `ChannelMonitor`.
|
/// a copy of our own `ChannelMonitor`.
|
||||||
|
@ -231,6 +238,8 @@ impl core::fmt::Display for ClosureReason {
|
||||||
},
|
},
|
||||||
ClosureReason::HolderForceClosed => f.write_str("user manually force-closed the channel"),
|
ClosureReason::HolderForceClosed => f.write_str("user manually force-closed the channel"),
|
||||||
ClosureReason::CooperativeClosure => f.write_str("the channel was cooperatively closed"),
|
ClosureReason::CooperativeClosure => f.write_str("the channel was cooperatively closed"),
|
||||||
|
ClosureReason::CounterpartyInitiatedCooperativeClosure => f.write_str("the channel was cooperatively closed by our peer"),
|
||||||
|
ClosureReason::LocallyInitiatedCooperativeClosure => f.write_str("the channel was cooperatively closed by us"),
|
||||||
ClosureReason::CommitmentTxConfirmed => f.write_str("commitment or closing transaction was confirmed on chain."),
|
ClosureReason::CommitmentTxConfirmed => f.write_str("commitment or closing transaction was confirmed on chain."),
|
||||||
ClosureReason::FundingTimedOut => write!(f, "funding transaction failed to confirm within {} blocks", FUNDING_CONF_DEADLINE_BLOCKS),
|
ClosureReason::FundingTimedOut => write!(f, "funding transaction failed to confirm within {} blocks", FUNDING_CONF_DEADLINE_BLOCKS),
|
||||||
ClosureReason::ProcessingError { err } => {
|
ClosureReason::ProcessingError { err } => {
|
||||||
|
@ -255,7 +264,9 @@ impl_writeable_tlv_based_enum_upgradable!(ClosureReason,
|
||||||
(10, DisconnectedPeer) => {},
|
(10, DisconnectedPeer) => {},
|
||||||
(12, OutdatedChannelManager) => {},
|
(12, OutdatedChannelManager) => {},
|
||||||
(13, CounterpartyCoopClosedUnfundedChannel) => {},
|
(13, CounterpartyCoopClosedUnfundedChannel) => {},
|
||||||
(15, FundingBatchClosure) => {}
|
(15, FundingBatchClosure) => {},
|
||||||
|
(17, CounterpartyInitiatedCooperativeClosure) => {},
|
||||||
|
(19, LocallyInitiatedCooperativeClosure) => {},
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Intended destination of a failed HTLC as indicated in [`Event::HTLCHandlingFailed`].
|
/// Intended destination of a failed HTLC as indicated in [`Event::HTLCHandlingFailed`].
|
||||||
|
|
|
@ -1955,8 +1955,8 @@ fn do_during_funding_monitor_fail(confirm_a_first: bool, restore_b_before_conf:
|
||||||
|
|
||||||
send_payment(&nodes[0], &[&nodes[1]], 8000000);
|
send_payment(&nodes[0], &[&nodes[1]], 8000000);
|
||||||
close_channel(&nodes[0], &nodes[1], &channel_id, funding_tx, true);
|
close_channel(&nodes[0], &nodes[1], &channel_id, funding_tx, true);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -2634,8 +2634,8 @@ fn test_temporary_error_during_shutdown() {
|
||||||
assert_eq!(txn_a, txn_b);
|
assert_eq!(txn_a, txn_b);
|
||||||
assert_eq!(txn_a.len(), 1);
|
assert_eq!(txn_a.len(), 1);
|
||||||
check_spends!(txn_a[0], funding_tx);
|
check_spends!(txn_a[0], funding_tx);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -1256,6 +1256,9 @@ pub(super) struct ChannelContext<SP: Deref> where SP::Target: SignerProvider {
|
||||||
// We track whether we already emitted a `ChannelReady` event.
|
// We track whether we already emitted a `ChannelReady` event.
|
||||||
channel_ready_event_emitted: bool,
|
channel_ready_event_emitted: bool,
|
||||||
|
|
||||||
|
/// Some if we initiated to shut down the channel.
|
||||||
|
local_initiated_shutdown: Option<()>,
|
||||||
|
|
||||||
/// The unique identifier used to re-derive the private key material for the channel through
|
/// The unique identifier used to re-derive the private key material for the channel through
|
||||||
/// [`SignerProvider::derive_channel_signer`].
|
/// [`SignerProvider::derive_channel_signer`].
|
||||||
channel_keys_id: [u8; 32],
|
channel_keys_id: [u8; 32],
|
||||||
|
@ -4959,11 +4962,17 @@ impl<SP: Deref> Channel<SP> where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let closure_reason = if self.initiated_shutdown() {
|
||||||
|
ClosureReason::LocallyInitiatedCooperativeClosure
|
||||||
|
} else {
|
||||||
|
ClosureReason::CounterpartyInitiatedCooperativeClosure
|
||||||
|
};
|
||||||
|
|
||||||
assert!(self.context.shutdown_scriptpubkey.is_some());
|
assert!(self.context.shutdown_scriptpubkey.is_some());
|
||||||
if let Some((last_fee, sig)) = self.context.last_sent_closing_fee {
|
if let Some((last_fee, sig)) = self.context.last_sent_closing_fee {
|
||||||
if last_fee == msg.fee_satoshis {
|
if last_fee == msg.fee_satoshis {
|
||||||
let shutdown_result = ShutdownResult {
|
let shutdown_result = ShutdownResult {
|
||||||
closure_reason: ClosureReason::CooperativeClosure,
|
closure_reason,
|
||||||
monitor_update: None,
|
monitor_update: None,
|
||||||
dropped_outbound_htlcs: Vec::new(),
|
dropped_outbound_htlcs: Vec::new(),
|
||||||
unbroadcasted_batch_funding_txid: self.context.unbroadcasted_batch_funding_txid(),
|
unbroadcasted_batch_funding_txid: self.context.unbroadcasted_batch_funding_txid(),
|
||||||
|
@ -4998,7 +5007,7 @@ impl<SP: Deref> Channel<SP> where
|
||||||
.map_err(|_| ChannelError::Close("External signer refused to sign closing transaction".to_owned()))?;
|
.map_err(|_| ChannelError::Close("External signer refused to sign closing transaction".to_owned()))?;
|
||||||
let (signed_tx, shutdown_result) = if $new_fee == msg.fee_satoshis {
|
let (signed_tx, shutdown_result) = if $new_fee == msg.fee_satoshis {
|
||||||
let shutdown_result = ShutdownResult {
|
let shutdown_result = ShutdownResult {
|
||||||
closure_reason: ClosureReason::CooperativeClosure,
|
closure_reason,
|
||||||
monitor_update: None,
|
monitor_update: None,
|
||||||
dropped_outbound_htlcs: Vec::new(),
|
dropped_outbound_htlcs: Vec::new(),
|
||||||
unbroadcasted_batch_funding_txid: self.context.unbroadcasted_batch_funding_txid(),
|
unbroadcasted_batch_funding_txid: self.context.unbroadcasted_batch_funding_txid(),
|
||||||
|
@ -5263,6 +5272,11 @@ impl<SP: Deref> Channel<SP> where
|
||||||
self.context.channel_state.is_local_shutdown_sent()
|
self.context.channel_state.is_local_shutdown_sent()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if we initiated to shut down the channel.
|
||||||
|
pub fn initiated_shutdown(&self) -> bool {
|
||||||
|
self.context.local_initiated_shutdown.is_some()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if this channel is fully shut down. True here implies that no further actions
|
/// Returns true if this channel is fully shut down. True here implies that no further actions
|
||||||
/// may/will be taken on this channel, and thus this object should be freed. Any future changes
|
/// may/will be taken on this channel, and thus this object should be freed. Any future changes
|
||||||
/// will be handled appropriately by the chain monitor.
|
/// will be handled appropriately by the chain monitor.
|
||||||
|
@ -6177,6 +6191,7 @@ impl<SP: Deref> Channel<SP> where
|
||||||
// From here on out, we may not fail!
|
// From here on out, we may not fail!
|
||||||
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
|
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
|
||||||
self.context.channel_state.set_local_shutdown_sent();
|
self.context.channel_state.set_local_shutdown_sent();
|
||||||
|
self.context.local_initiated_shutdown = Some(());
|
||||||
self.context.update_time_counter += 1;
|
self.context.update_time_counter += 1;
|
||||||
|
|
||||||
let monitor_update = if update_shutdown_script {
|
let monitor_update = if update_shutdown_script {
|
||||||
|
@ -6437,6 +6452,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
|
||||||
channel_keys_id,
|
channel_keys_id,
|
||||||
|
|
||||||
blocked_monitor_updates: Vec::new(),
|
blocked_monitor_updates: Vec::new(),
|
||||||
|
local_initiated_shutdown: None,
|
||||||
},
|
},
|
||||||
unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 }
|
unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 }
|
||||||
})
|
})
|
||||||
|
@ -7237,6 +7253,8 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
|
||||||
channel_type,
|
channel_type,
|
||||||
channel_keys_id,
|
channel_keys_id,
|
||||||
|
|
||||||
|
local_initiated_shutdown: None,
|
||||||
|
|
||||||
blocked_monitor_updates: Vec::new(),
|
blocked_monitor_updates: Vec::new(),
|
||||||
},
|
},
|
||||||
unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 }
|
unfunded_context: UnfundedChannelContext { unfunded_channel_age_ticks: 0 }
|
||||||
|
@ -7811,6 +7829,7 @@ impl<SP: Deref> Writeable for Channel<SP> where SP::Target: SignerProvider {
|
||||||
(39, pending_outbound_blinding_points, optional_vec),
|
(39, pending_outbound_blinding_points, optional_vec),
|
||||||
(41, holding_cell_blinding_points, optional_vec),
|
(41, holding_cell_blinding_points, optional_vec),
|
||||||
(43, malformed_htlcs, optional_vec), // Added in 0.0.119
|
(43, malformed_htlcs, optional_vec), // Added in 0.0.119
|
||||||
|
(45, self.context.local_initiated_shutdown, option), // Added in 0.0.122
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -8098,6 +8117,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
|
||||||
|
|
||||||
let mut is_batch_funding: Option<()> = None;
|
let mut is_batch_funding: Option<()> = None;
|
||||||
|
|
||||||
|
let mut local_initiated_shutdown: Option<()> = None;
|
||||||
|
|
||||||
let mut pending_outbound_blinding_points_opt: Option<Vec<Option<PublicKey>>> = None;
|
let mut pending_outbound_blinding_points_opt: Option<Vec<Option<PublicKey>>> = None;
|
||||||
let mut holding_cell_blinding_points_opt: Option<Vec<Option<PublicKey>>> = None;
|
let mut holding_cell_blinding_points_opt: Option<Vec<Option<PublicKey>>> = None;
|
||||||
|
|
||||||
|
@ -8132,6 +8153,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
|
||||||
(39, pending_outbound_blinding_points_opt, optional_vec),
|
(39, pending_outbound_blinding_points_opt, optional_vec),
|
||||||
(41, holding_cell_blinding_points_opt, optional_vec),
|
(41, holding_cell_blinding_points_opt, optional_vec),
|
||||||
(43, malformed_htlcs, optional_vec), // Added in 0.0.119
|
(43, malformed_htlcs, optional_vec), // Added in 0.0.119
|
||||||
|
(45, local_initiated_shutdown, option),
|
||||||
});
|
});
|
||||||
|
|
||||||
let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
|
let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
|
||||||
|
@ -8362,6 +8384,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
|
||||||
channel_type: channel_type.unwrap(),
|
channel_type: channel_type.unwrap(),
|
||||||
channel_keys_id,
|
channel_keys_id,
|
||||||
|
|
||||||
|
local_initiated_shutdown,
|
||||||
|
|
||||||
blocked_monitor_updates: blocked_monitor_updates.unwrap(),
|
blocked_monitor_updates: blocked_monitor_updates.unwrap(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -11856,8 +11856,8 @@ mod tests {
|
||||||
}
|
}
|
||||||
let (_nodes_1_update, _none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
let (_nodes_1_update, _none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
||||||
|
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 1000000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 1000000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 1000000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 1000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_not_connected_to_peer_error<T>(res_err: Result<T, APIError>, expected_public_key: PublicKey) {
|
fn check_not_connected_to_peer_error<T>(res_err: Result<T, APIError>, expected_public_key: PublicKey) {
|
||||||
|
|
|
@ -871,8 +871,8 @@ fn test_update_fee_with_fundee_update_add_htlc() {
|
||||||
send_payment(&nodes[1], &vec!(&nodes[0])[..], 800000);
|
send_payment(&nodes[1], &vec!(&nodes[0])[..], 800000);
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1])[..], 800000);
|
send_payment(&nodes[0], &vec!(&nodes[1])[..], 800000);
|
||||||
close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true);
|
close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -985,8 +985,8 @@ fn test_update_fee() {
|
||||||
assert_eq!(get_feerate!(nodes[0], nodes[1], channel_id), feerate + 30);
|
assert_eq!(get_feerate!(nodes[0], nodes[1], channel_id), feerate + 30);
|
||||||
assert_eq!(get_feerate!(nodes[1], nodes[0], channel_id), feerate + 30);
|
assert_eq!(get_feerate!(nodes[1], nodes[0], channel_id), feerate + 30);
|
||||||
close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true);
|
close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1104,17 +1104,17 @@ fn fake_network_test() {
|
||||||
|
|
||||||
// Close down the channels...
|
// Close down the channels...
|
||||||
close_channel(&nodes[0], &nodes[1], &chan_1.2, chan_1.3, true);
|
close_channel(&nodes[0], &nodes[1], &chan_1.2, chan_1.3, true);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, false);
|
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, false);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[2], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
close_channel(&nodes[2], &nodes[3], &chan_3.2, chan_3.3, true);
|
close_channel(&nodes[2], &nodes[3], &chan_3.2, chan_3.3, true);
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CooperativeClosure, [nodes[3].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[2], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[3].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[3], 1, ClosureReason::CooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[3], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
||||||
close_channel(&nodes[1], &nodes[3], &chan_4.2, chan_4.3, false);
|
close_channel(&nodes[1], &nodes[3], &chan_4.2, chan_4.3, false);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[3].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[3].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[3], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[3], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -5619,7 +5619,7 @@ fn test_static_output_closing_tx() {
|
||||||
let closing_tx = close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true).2;
|
let closing_tx = close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true).2;
|
||||||
|
|
||||||
mine_transaction(&nodes[0], &closing_tx);
|
mine_transaction(&nodes[0], &closing_tx);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
connect_blocks(&nodes[0], ANTI_REORG_DELAY - 1);
|
connect_blocks(&nodes[0], ANTI_REORG_DELAY - 1);
|
||||||
|
|
||||||
let spend_txn = check_spendable_outputs!(nodes[0], node_cfgs[0].keys_manager);
|
let spend_txn = check_spendable_outputs!(nodes[0], node_cfgs[0].keys_manager);
|
||||||
|
@ -5627,7 +5627,7 @@ fn test_static_output_closing_tx() {
|
||||||
check_spends!(spend_txn[0], closing_tx);
|
check_spends!(spend_txn[0], closing_tx);
|
||||||
|
|
||||||
mine_transaction(&nodes[1], &closing_tx);
|
mine_transaction(&nodes[1], &closing_tx);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
|
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
|
||||||
|
|
||||||
let spend_txn = check_spendable_outputs!(nodes[1], node_cfgs[1].keys_manager);
|
let spend_txn = check_spendable_outputs!(nodes[1], node_cfgs[1].keys_manager);
|
||||||
|
|
|
@ -257,8 +257,8 @@ fn do_chanmon_claim_value_coop_close(anchors: bool) {
|
||||||
spendable_outputs_b
|
spendable_outputs_b
|
||||||
);
|
);
|
||||||
|
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 1000000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 1000000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 1000000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 1000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -68,8 +68,8 @@ fn pre_funding_lock_shutdown_test() {
|
||||||
|
|
||||||
assert!(nodes[0].node.list_channels().is_empty());
|
assert!(nodes[0].node.list_channels().is_empty());
|
||||||
assert!(nodes[1].node.list_channels().is_empty());
|
assert!(nodes[1].node.list_channels().is_empty());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 8000000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 8000000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 8000000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 8000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -113,8 +113,8 @@ fn expect_channel_shutdown_state() {
|
||||||
|
|
||||||
assert!(nodes[0].node.list_channels().is_empty());
|
assert!(nodes[0].node.list_channels().is_empty());
|
||||||
assert!(nodes[1].node.list_channels().is_empty());
|
assert!(nodes[1].node.list_channels().is_empty());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -196,8 +196,8 @@ fn expect_channel_shutdown_state_with_htlc() {
|
||||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
||||||
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
||||||
assert!(node_1_none.is_none());
|
assert!(node_1_none.is_none());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
|
|
||||||
// Shutdown basically removes the channelDetails, testing of shutdowncomplete state unnecessary
|
// Shutdown basically removes the channelDetails, testing of shutdowncomplete state unnecessary
|
||||||
assert!(nodes[0].node.list_channels().is_empty());
|
assert!(nodes[0].node.list_channels().is_empty());
|
||||||
|
@ -251,8 +251,8 @@ fn test_lnd_bug_6039() {
|
||||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
||||||
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
||||||
assert!(node_1_none.is_none());
|
assert!(node_1_none.is_none());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
|
|
||||||
// Shutdown basically removes the channelDetails, testing of shutdowncomplete state unnecessary
|
// Shutdown basically removes the channelDetails, testing of shutdowncomplete state unnecessary
|
||||||
assert!(nodes[0].node.list_channels().is_empty());
|
assert!(nodes[0].node.list_channels().is_empty());
|
||||||
|
@ -404,8 +404,8 @@ fn updates_shutdown_wait() {
|
||||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
||||||
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
||||||
assert!(node_1_none.is_none());
|
assert!(node_1_none.is_none());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
|
|
||||||
assert!(nodes[0].node.list_channels().is_empty());
|
assert!(nodes[0].node.list_channels().is_empty());
|
||||||
|
|
||||||
|
@ -414,8 +414,8 @@ fn updates_shutdown_wait() {
|
||||||
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, true);
|
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, true);
|
||||||
assert!(nodes[1].node.list_channels().is_empty());
|
assert!(nodes[1].node.list_channels().is_empty());
|
||||||
assert!(nodes[2].node.list_channels().is_empty());
|
assert!(nodes[2].node.list_channels().is_empty());
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[2], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -509,9 +509,27 @@ fn do_htlc_fail_async_shutdown(blinded_recipient: bool) {
|
||||||
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, true);
|
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, true);
|
||||||
assert!(nodes[1].node.list_channels().is_empty());
|
assert!(nodes[1].node.list_channels().is_empty());
|
||||||
assert!(nodes[2].node.list_channels().is_empty());
|
assert!(nodes[2].node.list_channels().is_empty());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 2, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id(), nodes[2].node.get_our_node_id()], 100000);
|
let event1 = ExpectedCloseEvent {
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
channel_capacity_sats: Some(100000),
|
||||||
|
channel_id: None,
|
||||||
|
counterparty_node_id: Some(nodes[0].node.get_our_node_id()),
|
||||||
|
discard_funding: false,
|
||||||
|
reason: Some(ClosureReason::LocallyInitiatedCooperativeClosure),
|
||||||
|
channel_funding_txo: None,
|
||||||
|
user_channel_id: None,
|
||||||
|
};
|
||||||
|
let event2 = ExpectedCloseEvent {
|
||||||
|
channel_capacity_sats: Some(100000),
|
||||||
|
channel_id: None,
|
||||||
|
counterparty_node_id: Some(nodes[2].node.get_our_node_id()),
|
||||||
|
discard_funding: false,
|
||||||
|
reason: Some(ClosureReason::CounterpartyInitiatedCooperativeClosure),
|
||||||
|
channel_funding_txo: None,
|
||||||
|
user_channel_id: None,
|
||||||
|
};
|
||||||
|
check_closed_events(&nodes[1], &[event1, event2]);
|
||||||
|
check_closed_event!(nodes[2], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
||||||
|
@ -652,7 +670,7 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
||||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.unwrap());
|
||||||
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
||||||
assert!(node_1_none.is_none());
|
assert!(node_1_none.is_none());
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
} else {
|
} else {
|
||||||
// If one node, however, received + responded with an identical closing_signed we end
|
// If one node, however, received + responded with an identical closing_signed we end
|
||||||
// up erroring and node[0] will try to broadcast its own latest commitment transaction.
|
// up erroring and node[0] will try to broadcast its own latest commitment transaction.
|
||||||
|
@ -692,9 +710,9 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
||||||
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, true);
|
close_channel(&nodes[1], &nodes[2], &chan_2.2, chan_2.3, true);
|
||||||
assert!(nodes[1].node.list_channels().is_empty());
|
assert!(nodes[1].node.list_channels().is_empty());
|
||||||
assert!(nodes[2].node.list_channels().is_empty());
|
assert!(nodes[2].node.list_channels().is_empty());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[2].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[2], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1135,9 +1153,9 @@ fn do_test_closing_signed_reinit_timeout(timeout_step: TimeoutStep) {
|
||||||
let node_0_2nd_closing_signed = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
|
let node_0_2nd_closing_signed = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
|
||||||
if timeout_step == TimeoutStep::NoTimeout {
|
if timeout_step == TimeoutStep::NoTimeout {
|
||||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.1.unwrap());
|
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed.1.unwrap());
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if timeout_step != TimeoutStep::NoTimeout {
|
if timeout_step != TimeoutStep::NoTimeout {
|
||||||
|
@ -1221,8 +1239,8 @@ fn do_simple_legacy_shutdown_test(high_initiator_fee: bool) {
|
||||||
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed.unwrap());
|
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed.unwrap());
|
||||||
let (_, node_0_none) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
|
let (_, node_0_none) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
|
||||||
assert!(node_0_none.is_none());
|
assert!(node_0_none.is_none());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1276,8 +1294,8 @@ fn simple_target_feerate_shutdown() {
|
||||||
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed);
|
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed);
|
||||||
let (_, node_0_none) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
|
let (_, node_0_none) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());
|
||||||
assert!(node_0_none.is_none());
|
assert!(node_0_none.is_none());
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn do_outbound_update_no_early_closing_signed(use_htlc: bool) {
|
fn do_outbound_update_no_early_closing_signed(use_htlc: bool) {
|
||||||
|
@ -1369,8 +1387,8 @@ fn do_outbound_update_no_early_closing_signed(use_htlc: bool) {
|
||||||
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
let (_, node_1_none) = get_closing_signed_broadcast!(nodes[1].node, nodes[0].node.get_our_node_id());
|
||||||
assert!(node_1_none.is_none());
|
assert!(node_1_none.is_none());
|
||||||
|
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::CooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[0], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[1].node.get_our_node_id()], 100000);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
check_closed_event!(nodes[1], 1, ClosureReason::LocallyInitiatedCooperativeClosure, [nodes[0].node.get_our_node_id()], 100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Add table
Reference in a new issue