@@ -21,6 +21,7 @@ use crate::chain::ChannelMonitorUpdateStatus;
21
21
use crate :: events:: bump_transaction:: WalletSource ;
22
22
use crate :: events:: { ClosureReason , Event , MessageSendEvent , MessageSendEventsProvider } ;
23
23
use crate :: ln:: { functional_test_utils:: * , msgs} ;
24
+ use crate :: ln:: channel_state:: { ChannelDetails , ChannelShutdownState } ;
24
25
use crate :: ln:: msgs:: ChannelMessageHandler ;
25
26
use crate :: ln:: channelmanager:: { PaymentId , RAACommitmentOrder , RecipientOnionFields } ;
26
27
use crate :: util:: test_channel_signer:: SignerOp ;
@@ -847,3 +848,62 @@ fn test_async_holder_signatures_anchors() {
847
848
fn test_async_holder_signatures_remote_commitment_anchors ( ) {
848
849
do_test_async_holder_signatures ( true , true ) ;
849
850
}
851
+
852
+ #[ test]
853
+ fn test_closing_signed ( ) {
854
+ // Based off of `expect_channel_shutdown_state`.
855
+ // Test that we can asynchronously sign closing transactions.
856
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
857
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
858
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
859
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
860
+ let chan_1 = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
861
+
862
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: NotShuttingDown ) ;
863
+
864
+ nodes[ 0 ] . node . close_channel ( & chan_1. 2 , & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
865
+
866
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: ShutdownInitiated ) ;
867
+ expect_channel_shutdown_state ! ( nodes[ 1 ] , chan_1. 2 , ChannelShutdownState :: NotShuttingDown ) ;
868
+
869
+ let node_0_shutdown = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendShutdown , nodes[ 1 ] . node. get_our_node_id( ) ) ;
870
+ nodes[ 1 ] . node . handle_shutdown ( & nodes[ 0 ] . node . get_our_node_id ( ) , & node_0_shutdown) ;
871
+
872
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: ShutdownInitiated ) ;
873
+ expect_channel_shutdown_state ! ( nodes[ 1 ] , chan_1. 2 , ChannelShutdownState :: NegotiatingClosingFee ) ;
874
+
875
+ let node_1_shutdown = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendShutdown , nodes[ 0 ] . node. get_our_node_id( ) ) ;
876
+ nodes[ 0 ] . disable_channel_signer_op ( & nodes[ 1 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
877
+ nodes[ 0 ] . node . handle_shutdown ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_shutdown) ;
878
+
879
+ expect_channel_shutdown_state ! ( nodes[ 0 ] , chan_1. 2 , ChannelShutdownState :: NegotiatingClosingFee ) ;
880
+ expect_channel_shutdown_state ! ( nodes[ 1 ] , chan_1. 2 , ChannelShutdownState :: NegotiatingClosingFee ) ;
881
+
882
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
883
+ assert ! ( events. is_empty( ) , "Expected no events, got {:?}" , events) ;
884
+ nodes[ 0 ] . enable_channel_signer_op ( & nodes[ 1 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
885
+ nodes[ 0 ] . node . signer_unblocked ( None ) ;
886
+
887
+ let node_0_closing_signed = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendClosingSigned , nodes[ 1 ] . node. get_our_node_id( ) ) ;
888
+ nodes[ 1 ] . disable_channel_signer_op ( & nodes[ 0 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
889
+ nodes[ 1 ] . node . handle_closing_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & node_0_closing_signed) ;
890
+
891
+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
892
+ assert ! ( events. is_empty( ) , "Expected no events, got {:?}" , events) ;
893
+ nodes[ 1 ] . enable_channel_signer_op ( & nodes[ 0 ] . node . get_our_node_id ( ) , & chan_1. 2 , SignerOp :: SignClosingTransaction ) ;
894
+ nodes[ 1 ] . node . signer_unblocked ( None ) ;
895
+
896
+ let node_1_closing_signed = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendClosingSigned , nodes[ 0 ] . node. get_our_node_id( ) ) ;
897
+ // From here we don't make any new signatures, so there's no need to test blocking the
898
+ // signer.
899
+ nodes[ 0 ] . node . handle_closing_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & node_1_closing_signed) ;
900
+ let ( _, node_0_2nd_closing_signed) = get_closing_signed_broadcast ! ( nodes[ 0 ] . node, nodes[ 1 ] . node. get_our_node_id( ) ) ;
901
+ nodes[ 1 ] . node . handle_closing_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & node_0_2nd_closing_signed. unwrap ( ) ) ;
902
+ let ( _, node_1_none) = get_closing_signed_broadcast ! ( nodes[ 1 ] . node, nodes[ 0 ] . node. get_our_node_id( ) ) ;
903
+ assert ! ( node_1_none. is_none( ) ) ;
904
+
905
+ assert ! ( nodes[ 0 ] . node. list_channels( ) . is_empty( ) ) ;
906
+ assert ! ( nodes[ 1 ] . node. list_channels( ) . is_empty( ) ) ;
907
+ check_closed_event ! ( nodes[ 0 ] , 1 , ClosureReason :: LocallyInitiatedCooperativeClosure , [ nodes[ 1 ] . node. get_our_node_id( ) ] , 100000 ) ;
908
+ check_closed_event ! ( nodes[ 1 ] , 1 , ClosureReason :: CounterpartyInitiatedCooperativeClosure , [ nodes[ 0 ] . node. get_our_node_id( ) ] , 100000 ) ;
909
+ }
0 commit comments