@@ -10625,3 +10625,60 @@ fn test_batch_funding_close_after_funding_signed() {
10625
10625
// Ensure the channels don't exist anymore.
10626
10626
assert!(nodes[0].node.list_channels().is_empty());
10627
10627
}
10628
+
10629
+ fn do_test_funding_and_commitment_tx_confirm_same_block(confirm_remote_commitment: bool) {
10630
+ // Tests that a node will forget the channel (when it only requires 1 confirmation) if the
10631
+ // funding and commitment transaction confirm in the same block.
10632
+ let chanmon_cfgs = create_chanmon_cfgs(2);
10633
+ let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
10634
+ let mut min_depth_1_block_cfg = test_default_channel_config();
10635
+ min_depth_1_block_cfg.channel_handshake_config.minimum_depth = 1;
10636
+ let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[Some(min_depth_1_block_cfg), Some(min_depth_1_block_cfg)]);
10637
+ let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
10638
+
10639
+ let funding_tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 1_000_000, 0);
10640
+ let chan_id = chain::transaction::OutPoint { txid: funding_tx.txid(), index: 0 }.to_channel_id();
10641
+
10642
+ assert_eq!(nodes[0].node.list_channels().len(), 1);
10643
+ assert_eq!(nodes[1].node.list_channels().len(), 1);
10644
+
10645
+ let (closing_node, other_node) = if confirm_remote_commitment {
10646
+ (&nodes[1], &nodes[0])
10647
+ } else {
10648
+ (&nodes[0], &nodes[1])
10649
+ };
10650
+
10651
+ closing_node.node.force_close_broadcasting_latest_txn(&chan_id, &other_node.node.get_our_node_id()).unwrap();
10652
+ let mut msg_events = closing_node.node.get_and_clear_pending_msg_events();
10653
+ assert_eq!(msg_events.len(), 1);
10654
+ match msg_events.pop().unwrap() {
10655
+ MessageSendEvent::HandleError { action: msgs::ErrorAction::SendErrorMessage { .. }, .. } => {},
10656
+ _ => panic!("Unexpected event"),
10657
+ }
10658
+ check_added_monitors(closing_node, 1);
10659
+ check_closed_event(closing_node, 1, ClosureReason::HolderForceClosed, false, &[other_node.node.get_our_node_id()], 1_000_000);
10660
+
10661
+ let commitment_tx = {
10662
+ let mut txn = closing_node.tx_broadcaster.txn_broadcast();
10663
+ assert_eq!(txn.len(), 1);
10664
+ let commitment_tx = txn.pop().unwrap();
10665
+ check_spends!(commitment_tx, funding_tx);
10666
+ commitment_tx
10667
+ };
10668
+
10669
+ mine_transactions(&nodes[0], &[&funding_tx, &commitment_tx]);
10670
+ mine_transactions(&nodes[1], &[&funding_tx, &commitment_tx]);
10671
+
10672
+ check_closed_broadcast(other_node, 1, true);
10673
+ check_added_monitors(other_node, 1);
10674
+ check_closed_event(other_node, 1, ClosureReason::CommitmentTxConfirmed, false, &[closing_node.node.get_our_node_id()], 1_000_000);
10675
+
10676
+ assert!(nodes[0].node.list_channels().is_empty());
10677
+ assert!(nodes[1].node.list_channels().is_empty());
10678
+ }
10679
+
10680
+ #[test]
10681
+ fn test_funding_and_commitment_tx_confirm_same_block() {
10682
+ do_test_funding_and_commitment_tx_confirm_same_block(false);
10683
+ do_test_funding_and_commitment_tx_confirm_same_block(true);
10684
+ }
0 commit comments