@@ -17,8 +17,9 @@ use bitcoin::transaction::Version;
17
17
use crate :: chain:: channelmonitor:: LATENCY_GRACE_PERIOD_BLOCKS ;
18
18
use crate :: chain:: ChannelMonitorUpdateStatus ;
19
19
use crate :: events:: bump_transaction:: WalletSource ;
20
- use crate :: events:: { ClosureReason , Event , MessageSendEvent , MessageSendEventsProvider , PaymentPurpose } ;
20
+ use crate :: events:: { ClosureReason , Event , MessageSendEvent , MessageSendEventsProvider } ;
21
21
use crate :: ln:: { functional_test_utils:: * , msgs} ;
22
+ use crate :: ln:: channel_state:: { ChannelDetails , ChannelShutdownState } ;
22
23
use crate :: ln:: msgs:: ChannelMessageHandler ;
23
24
use crate :: ln:: channelmanager:: { PaymentId , RAACommitmentOrder , RecipientOnionFields } ;
24
25
use crate :: util:: test_channel_signer:: SignerOp ;
@@ -695,3 +696,62 @@ fn test_async_holder_signatures_anchors() {
695
696
fn test_async_holder_signatures_remote_commitment_anchors ( ) {
696
697
do_test_async_holder_signatures ( true , true ) ;
697
698
}
699
+
700
+ #[ test]
701
+ fn test_closing_signed ( ) {
702
+ // Based off of `expect_channel_shutdown_state`.
703
+ // Test that we can asynchronously sign closing transactions.
704
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
705
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
706
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
707
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
708
+ let chan_1 = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
709
+
710
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: NotShuttingDown ) ;
711
+
712
+ nodes[ 0 ] . node . close_channel ( & chan_1. 2 , & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
713
+
714
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: ShutdownInitiated ) ;
715
+ expect_channel_shutdown_state ! ( nodes[ 1 ] , chan_1. 2 , ChannelShutdownState :: NotShuttingDown ) ;
716
+
717
+ let node_0_shutdown = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendShutdown , nodes[ 1 ] . node. get_our_node_id( ) ) ;
718
+ nodes[ 1 ] . node . handle_shutdown ( & nodes[ 0 ] . node . get_our_node_id ( ) , & node_0_shutdown) ;
719
+
720
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: ShutdownInitiated ) ;
721
+ expect_channel_shutdown_state ! ( nodes[ 1 ] , chan_1. 2 , ChannelShutdownState :: NegotiatingClosingFee ) ;
722
+
723
+ let node_1_shutdown = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendShutdown , nodes[ 0 ] . node. get_our_node_id( ) ) ;
724
+ nodes[ 0 ] . disable_channel_signer_op ( & nodes[ 1 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
725
+ nodes[ 0 ] . node . handle_shutdown ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_shutdown) ;
726
+
727
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: NegotiatingClosingFee ) ;
728
+ expect_channel_shutdown_state ! ( nodes[ 1 ] , chan_1. 2 , ChannelShutdownState :: NegotiatingClosingFee ) ;
729
+
730
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
731
+ assert ! ( events. is_empty( ) , "Expected no events, got {:?}" , events) ;
732
+ nodes[ 0 ] . enable_channel_signer_op ( & nodes[ 1 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
733
+ nodes[ 0 ] . node . signer_unblocked ( None ) ;
734
+
735
+ let node_0_closing_signed = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendClosingSigned , nodes[ 1 ] . node. get_our_node_id( ) ) ;
736
+ nodes[ 1 ] . disable_channel_signer_op ( & nodes[ 0 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
737
+ nodes[ 1 ] . node . handle_closing_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & node_0_closing_signed) ;
738
+
739
+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
740
+ assert ! ( events. is_empty( ) , "Expected no events, got {:?}" , events) ;
741
+ nodes[ 1 ] . enable_channel_signer_op ( & nodes[ 0 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
742
+ nodes[ 1 ] . node . signer_unblocked ( None ) ;
743
+
744
+ let node_1_closing_signed = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendClosingSigned , nodes[ 0 ] . node. get_our_node_id( ) ) ;
745
+ // From here we don't make any new signatures, so there's no need to test blocking the
746
+ // signer.
747
+ nodes[ 0 ] . node . handle_closing_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_closing_signed) ;
748
+ let ( _, node_0_2nd_closing_signed) = get_closing_signed_broadcast ! ( nodes[ 0 ] . node, nodes[ 1 ] . node. get_our_node_id( ) ) ;
749
+ nodes[ 1 ] . node . handle_closing_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & node_0_2nd_closing_signed. unwrap ( ) ) ;
750
+ let ( _, node_1_none) = get_closing_signed_broadcast ! ( nodes[ 1 ] . node, nodes[ 0 ] . node. get_our_node_id( ) ) ;
751
+ assert ! ( node_1_none. is_none( ) ) ;
752
+
753
+ assert ! ( nodes[ 0 ] . node. list_channels( ) . is_empty( ) ) ;
754
+ assert ! ( nodes[ 1 ] . node. list_channels( ) . is_empty( ) ) ;
755
+ check_closed_event ! ( nodes[ 0 ] , 1 , ClosureReason :: LocallyInitiatedCooperativeClosure , [ nodes[ 1 ] . node. get_our_node_id( ) ] , 100000 ) ;
756
+ check_closed_event ! ( nodes[ 1 ] , 1 , ClosureReason :: CounterpartyInitiatedCooperativeClosure , [ nodes[ 0 ] . node. get_our_node_id( ) ] , 100000 ) ;
757
+ }
0 commit comments