@@ -3489,6 +3489,47 @@ fn test_dup_events_on_peer_disconnect() {
3489
3489
expect_payment_path_successful!(nodes[0]);
3490
3490
}
3491
3491
3492
+
3493
+ #[test]
3494
+ fn test_peer_disconnected_before_funding_broadcasted() {
3495
+ // Test that channels are closed with `ClosureReason::DisconnectedPeer` if the peer disconnects
3496
+ // before the funding transaction has been broadcasted.
3497
+ let chanmon_cfgs = create_chanmon_cfgs(2);
3498
+ let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
3499
+ let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
3500
+ let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
3501
+
3502
+ // Open a channel between `nodes[0]` and `nodes[1]`, for which the funding transaction is never
3503
+ // broadcasted, even though it's created by `nodes[0]`.
3504
+ let expected_temporary_channel_id = nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 1_000_000, 500_000_000, 42, None).unwrap();
3505
+ let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
3506
+ nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
3507
+ let accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
3508
+ nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
3509
+
3510
+ let (temporary_channel_id, tx, _funding_output) = create_funding_transaction(&nodes[0], 1_000_000, 42);
3511
+ assert_eq!(temporary_channel_id, expected_temporary_channel_id);
3512
+
3513
+ assert!(nodes[0].node.funding_transaction_generated(&temporary_channel_id, tx.clone()).is_ok());
3514
+
3515
+ let funding_created_msg = get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, nodes[1].node.get_our_node_id());
3516
+ assert_eq!(funding_created_msg.temporary_channel_id, expected_temporary_channel_id);
3517
+
3518
+ // Even though the funding transaction is created by `nodes[0]`, the `FundingCreated` msg is
3519
+ // never sent to `nodes[1]`, and therefore the tx never signed by either party nor broadcasted.
3520
+ {
3521
+ assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().len(), 0);
3522
+ }
3523
+
3524
+ // Ensure that the channel is closed with `ClosureReason::DisconnectedPeer` when the peers are
3525
+ // disconnected before the funding transaction was broadcasted.
3526
+ nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
3527
+ nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
3528
+
3529
+ check_closed_event!(nodes[0], 1, ClosureReason::DisconnectedPeer);
3530
+ check_closed_event!(nodes[1], 1, ClosureReason::DisconnectedPeer);
3531
+ }
3532
+
3492
3533
#[test]
3493
3534
fn test_simple_peer_disconnect() {
3494
3535
// Test that we can reconnect when there are no lost messages
0 commit comments