mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-03-03 18:47:47 +01:00
Pass counterparty_node_id
to force_close_channel
This commit is contained in:
parent
84a6e7bc51
commit
14e52cd7a6
7 changed files with 37 additions and 33 deletions
|
@ -624,7 +624,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
||||||
let channel_id = get_slice!(1)[0] as usize;
|
let channel_id = get_slice!(1)[0] as usize;
|
||||||
if channel_id >= channels.len() { return; }
|
if channel_id >= channels.len() { return; }
|
||||||
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
|
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
|
||||||
channelmanager.force_close_channel(&channels[channel_id].channel_id).unwrap();
|
channelmanager.force_close_channel(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id).unwrap();
|
||||||
},
|
},
|
||||||
// 15 is above
|
// 15 is above
|
||||||
_ => return,
|
_ => return,
|
||||||
|
|
|
@ -637,7 +637,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force-close the channel.
|
// Force-close the channel.
|
||||||
nodes[0].node.force_close_channel(&OutPoint { txid: tx.txid(), index: 0 }.to_channel_id()).unwrap();
|
nodes[0].node.force_close_channel(&OutPoint { txid: tx.txid(), index: 0 }.to_channel_id(), &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
|
|
||||||
// Check that the force-close updates are persisted.
|
// Check that the force-close updates are persisted.
|
||||||
check_persisted_data!(nodes[0].node, filepath.clone());
|
check_persisted_data!(nodes[0].node, filepath.clone());
|
||||||
|
@ -776,7 +776,7 @@ mod tests {
|
||||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()));
|
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()));
|
||||||
|
|
||||||
// Force close the channel and check that the SpendableOutputs event was handled.
|
// Force close the channel and check that the SpendableOutputs event was handled.
|
||||||
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
|
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
let commitment_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
|
let commitment_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().pop().unwrap();
|
||||||
confirm_transaction_depth(&mut nodes[0], &commitment_tx, BREAKDOWN_TIMEOUT as u32);
|
confirm_transaction_depth(&mut nodes[0], &commitment_tx, BREAKDOWN_TIMEOUT as u32);
|
||||||
let event = receiver
|
let event = receiver
|
||||||
|
|
|
@ -213,7 +213,7 @@ mod tests {
|
||||||
|
|
||||||
// Force close because cooperative close doesn't result in any persisted
|
// Force close because cooperative close doesn't result in any persisted
|
||||||
// updates.
|
// updates.
|
||||||
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
|
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
|
||||||
check_closed_broadcast!(nodes[0], true);
|
check_closed_broadcast!(nodes[0], true);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
@ -247,7 +247,7 @@ mod tests {
|
||||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
nodes[1].node.force_close_channel(&chan.2).unwrap();
|
nodes[1].node.force_close_channel(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||||
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
|
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
|
||||||
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
|
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
|
||||||
|
@ -286,7 +286,7 @@ mod tests {
|
||||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
nodes[1].node.force_close_channel(&chan.2).unwrap();
|
nodes[1].node.force_close_channel(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||||
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
|
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
|
||||||
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
|
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
|
||||||
|
|
|
@ -224,7 +224,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ...and make sure we can force-close a frozen channel
|
// ...and make sure we can force-close a frozen channel
|
||||||
nodes[0].node.force_close_channel(&channel_id).unwrap();
|
nodes[0].node.force_close_channel(&channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
check_closed_broadcast!(nodes[0], true);
|
check_closed_broadcast!(nodes[0], true);
|
||||||
|
|
||||||
|
|
|
@ -1892,22 +1892,18 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `peer_node_id` should be set when we receive a message from a peer, but not set when the
|
/// `peer_msg` should be set when we receive a message from a peer, but not set when the
|
||||||
/// user closes, which will be re-exposed as the `ChannelClosed` reason.
|
/// user closes, which will be re-exposed as the `ChannelClosed` reason.
|
||||||
fn force_close_channel_with_peer(&self, channel_id: &[u8; 32], peer_node_id: Option<&PublicKey>, peer_msg: Option<&String>) -> Result<PublicKey, APIError> {
|
fn force_close_channel_with_peer(&self, channel_id: &[u8; 32], peer_node_id: &PublicKey, peer_msg: Option<&String>) -> Result<PublicKey, APIError> {
|
||||||
let mut chan = {
|
let mut chan = {
|
||||||
let mut channel_state_lock = self.channel_state.lock().unwrap();
|
let mut channel_state_lock = self.channel_state.lock().unwrap();
|
||||||
let channel_state = &mut *channel_state_lock;
|
let channel_state = &mut *channel_state_lock;
|
||||||
if let hash_map::Entry::Occupied(chan) = channel_state.by_id.entry(channel_id.clone()) {
|
if let hash_map::Entry::Occupied(chan) = channel_state.by_id.entry(channel_id.clone()) {
|
||||||
if let Some(node_id) = peer_node_id {
|
if chan.get().get_counterparty_node_id() != *peer_node_id {
|
||||||
if chan.get().get_counterparty_node_id() != *node_id {
|
return Err(APIError::ChannelUnavailable{err: "No such channel".to_owned()});
|
||||||
return Err(APIError::ChannelUnavailable{err: "No such channel".to_owned()});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if peer_node_id.is_some() {
|
if let Some(peer_msg) = peer_msg {
|
||||||
if let Some(peer_msg) = peer_msg {
|
self.issue_channel_close_events(chan.get(),ClosureReason::CounterpartyForceClosed { peer_msg: peer_msg.to_string() });
|
||||||
self.issue_channel_close_events(chan.get(),ClosureReason::CounterpartyForceClosed { peer_msg: peer_msg.to_string() });
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.issue_channel_close_events(chan.get(),ClosureReason::HolderForceClosed);
|
self.issue_channel_close_events(chan.get(),ClosureReason::HolderForceClosed);
|
||||||
}
|
}
|
||||||
|
@ -1929,10 +1925,12 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Force closes a channel, immediately broadcasting the latest local commitment transaction to
|
/// Force closes a channel, immediately broadcasting the latest local commitment transaction to
|
||||||
/// the chain and rejecting new HTLCs on the given channel. Fails if channel_id is unknown to the manager.
|
/// the chain and rejecting new HTLCs on the given channel. Fails if `channel_id` is unknown to
|
||||||
pub fn force_close_channel(&self, channel_id: &[u8; 32]) -> Result<(), APIError> {
|
/// the manager, or if the `counterparty_node_id` isn't the counterparty of the corresponding
|
||||||
|
/// channel.
|
||||||
|
pub fn force_close_channel(&self, channel_id: &[u8; 32], counterparty_node_id: &PublicKey) -> Result<(), APIError> {
|
||||||
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
||||||
match self.force_close_channel_with_peer(channel_id, None, None) {
|
match self.force_close_channel_with_peer(channel_id, counterparty_node_id, None) {
|
||||||
Ok(counterparty_node_id) => {
|
Ok(counterparty_node_id) => {
|
||||||
self.channel_state.lock().unwrap().pending_msg_events.push(
|
self.channel_state.lock().unwrap().pending_msg_events.push(
|
||||||
events::MessageSendEvent::HandleError {
|
events::MessageSendEvent::HandleError {
|
||||||
|
@ -1952,7 +1950,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
/// for each to the chain and rejecting new HTLCs on each.
|
/// for each to the chain and rejecting new HTLCs on each.
|
||||||
pub fn force_close_all_channels(&self) {
|
pub fn force_close_all_channels(&self) {
|
||||||
for chan in self.list_channels() {
|
for chan in self.list_channels() {
|
||||||
let _ = self.force_close_channel(&chan.channel_id);
|
let _ = self.force_close_channel(&chan.channel_id, &chan.counterparty.node_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5816,7 +5814,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
|
||||||
for chan in self.list_channels() {
|
for chan in self.list_channels() {
|
||||||
if chan.counterparty.node_id == *counterparty_node_id {
|
if chan.counterparty.node_id == *counterparty_node_id {
|
||||||
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
|
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
|
||||||
let _ = self.force_close_channel_with_peer(&chan.channel_id, Some(counterparty_node_id), Some(&msg.data));
|
let _ = self.force_close_channel_with_peer(&chan.channel_id, counterparty_node_id, Some(&msg.data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -5838,7 +5836,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
|
||||||
}
|
}
|
||||||
|
|
||||||
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
|
// Untrusted messages from peer, we throw away the error if id points to a non-existent channel
|
||||||
let _ = self.force_close_channel_with_peer(&msg.channel_id, Some(counterparty_node_id), Some(&msg.data));
|
let _ = self.force_close_channel_with_peer(&msg.channel_id, counterparty_node_id, Some(&msg.data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3362,7 +3362,7 @@ fn test_htlc_ignore_latest_remote_commitment() {
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
route_payment(&nodes[0], &[&nodes[1]], 10000000);
|
route_payment(&nodes[0], &[&nodes[1]], 10000000);
|
||||||
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
|
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
connect_blocks(&nodes[0], TEST_FINAL_CLTV + LATENCY_GRACE_PERIOD_BLOCKS + 1);
|
connect_blocks(&nodes[0], TEST_FINAL_CLTV + LATENCY_GRACE_PERIOD_BLOCKS + 1);
|
||||||
check_closed_broadcast!(nodes[0], true);
|
check_closed_broadcast!(nodes[0], true);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
@ -3425,7 +3425,7 @@ fn test_force_close_fail_back() {
|
||||||
// state or updated nodes[1]' state. Now force-close and broadcast that commitment/HTLC
|
// state or updated nodes[1]' state. Now force-close and broadcast that commitment/HTLC
|
||||||
// transaction and ensure nodes[1] doesn't fail-backwards (this was originally a bug!).
|
// transaction and ensure nodes[1] doesn't fail-backwards (this was originally a bug!).
|
||||||
|
|
||||||
nodes[2].node.force_close_channel(&payment_event.commitment_msg.channel_id).unwrap();
|
nodes[2].node.force_close_channel(&payment_event.commitment_msg.channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[2], true);
|
check_closed_broadcast!(nodes[2], true);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[2], 1, ClosureReason::HolderForceClosed);
|
||||||
|
@ -4749,7 +4749,7 @@ fn test_claim_sizeable_push_msat() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
|
|
||||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 98_000_000, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 98_000_000, InitFeatures::known(), InitFeatures::known());
|
||||||
nodes[1].node.force_close_channel(&chan.2).unwrap();
|
nodes[1].node.force_close_channel(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[1], true);
|
check_closed_broadcast!(nodes[1], true);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||||
|
@ -4778,7 +4778,7 @@ fn test_claim_on_remote_sizeable_push_msat() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
|
|
||||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 98_000_000, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 98_000_000, InitFeatures::known(), InitFeatures::known());
|
||||||
nodes[0].node.force_close_channel(&chan.2).unwrap();
|
nodes[0].node.force_close_channel(&chan.2, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[0], true);
|
check_closed_broadcast!(nodes[0], true);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
|
||||||
|
@ -8298,7 +8298,7 @@ fn test_manually_accept_inbound_channel_request() {
|
||||||
_ => panic!("Unexpected event"),
|
_ => panic!("Unexpected event"),
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes[1].node.force_close_channel(&temp_channel_id).unwrap();
|
nodes[1].node.force_close_channel(&temp_channel_id, &nodes[0].node.get_our_node_id()).unwrap();
|
||||||
|
|
||||||
let close_msg_ev = nodes[1].node.get_and_clear_pending_msg_events();
|
let close_msg_ev = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(close_msg_ev.len(), 1);
|
assert_eq!(close_msg_ev.len(), 1);
|
||||||
|
@ -8333,7 +8333,7 @@ fn test_manually_reject_inbound_channel_request() {
|
||||||
let events = nodes[1].node.get_and_clear_pending_events();
|
let events = nodes[1].node.get_and_clear_pending_events();
|
||||||
match events[0] {
|
match events[0] {
|
||||||
Event::OpenChannelRequest { temporary_channel_id, .. } => {
|
Event::OpenChannelRequest { temporary_channel_id, .. } => {
|
||||||
nodes[1].node.force_close_channel(&temporary_channel_id).unwrap();
|
nodes[1].node.force_close_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id()).unwrap();
|
||||||
}
|
}
|
||||||
_ => panic!("Unexpected event"),
|
_ => panic!("Unexpected event"),
|
||||||
}
|
}
|
||||||
|
@ -8975,8 +8975,14 @@ fn do_test_onchain_htlc_settlement_after_close(broadcast_alice: bool, go_onchain
|
||||||
// If `go_onchain_before_fufill`, broadcast the relevant commitment transaction and check that Bob
|
// If `go_onchain_before_fufill`, broadcast the relevant commitment transaction and check that Bob
|
||||||
// responds by (1) broadcasting a channel update and (2) adding a new ChannelMonitor.
|
// responds by (1) broadcasting a channel update and (2) adding a new ChannelMonitor.
|
||||||
let mut force_closing_node = 0; // Alice force-closes
|
let mut force_closing_node = 0; // Alice force-closes
|
||||||
if !broadcast_alice { force_closing_node = 1; } // Bob force-closes
|
let mut counterparty_node = 1; // Bob if Alice force-closes
|
||||||
nodes[force_closing_node].node.force_close_channel(&chan_ab.2).unwrap();
|
|
||||||
|
// Bob force-closes
|
||||||
|
if !broadcast_alice {
|
||||||
|
force_closing_node = 1;
|
||||||
|
counterparty_node = 0;
|
||||||
|
}
|
||||||
|
nodes[force_closing_node].node.force_close_channel(&chan_ab.2, &nodes[counterparty_node].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[force_closing_node], true);
|
check_closed_broadcast!(nodes[force_closing_node], true);
|
||||||
check_added_monitors!(nodes[force_closing_node], 1);
|
check_added_monitors!(nodes[force_closing_node], 1);
|
||||||
check_closed_event!(nodes[force_closing_node], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[force_closing_node], 1, ClosureReason::HolderForceClosed);
|
||||||
|
@ -9406,7 +9412,7 @@ fn do_test_tx_confirmed_skipping_blocks_immediate_broadcast(test_height_before_t
|
||||||
nodes[1].node.peer_disconnected(&nodes[2].node.get_our_node_id(), false);
|
nodes[1].node.peer_disconnected(&nodes[2].node.get_our_node_id(), false);
|
||||||
nodes[2].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
nodes[2].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||||
|
|
||||||
nodes[1].node.force_close_channel(&channel_id).unwrap();
|
nodes[1].node.force_close_channel(&channel_id, &nodes[2].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[1], true);
|
check_closed_broadcast!(nodes[1], true);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
|
|
@ -565,7 +565,7 @@ fn do_test_dup_htlc_onchain_fails_on_reload(persist_manager_post_event: bool, co
|
||||||
// Route a payment, but force-close the channel before the HTLC fulfill message arrives at
|
// Route a payment, but force-close the channel before the HTLC fulfill message arrives at
|
||||||
// nodes[0].
|
// nodes[0].
|
||||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 10000000);
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 10000000);
|
||||||
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
|
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[0], true);
|
check_closed_broadcast!(nodes[0], true);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed);
|
||||||
|
|
Loading…
Add table
Reference in a new issue