@@ -17,9 +17,9 @@ use chain::keysinterface::{Recipient, KeysInterface};
17
17
use ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , MIN_CLTV_EXPIRY_DELTA } ;
18
18
use routing:: network_graph:: RoutingFees ;
19
19
use routing:: router:: { PaymentParameters , RouteHint , RouteHintHop } ;
20
- use ln:: features:: { InitFeatures , InvoiceFeatures } ;
20
+ use ln:: features:: { InitFeatures , InvoiceFeatures , ChannelTypeFeatures } ;
21
21
use ln:: msgs;
22
- use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler , OptionalField , ChannelUpdate } ;
22
+ use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler , OptionalField , ChannelUpdate , ErrorAction } ;
23
23
use ln:: wire:: Encode ;
24
24
use util:: enforcing_trait_impls:: EnforcingSigner ;
25
25
use util:: events:: { ClosureReason , Event , MessageSendEvent , MessageSendEventsProvider } ;
@@ -922,3 +922,102 @@ fn test_0conf_channel_reorg() {
922
922
} ) ;
923
923
check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
924
924
}
925
+
926
+ #[ test]
927
+ fn test_zero_conf_accept_reject ( ) {
928
+ let mut channel_type_features = ChannelTypeFeatures :: only_static_remote_key ( ) ;
929
+ channel_type_features. set_zero_conf_required ( ) ;
930
+
931
+ // 1. Check we reject zero conf channels by default
932
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
933
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
934
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
935
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
936
+
937
+ nodes[ 0 ] . node . create_channel ( nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 10001 , 42 , None ) . unwrap ( ) ;
938
+ let mut open_channel_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendOpenChannel , nodes[ 1 ] . node. get_our_node_id( ) ) ;
939
+
940
+ open_channel_msg. channel_type = Some ( channel_type_features. clone ( ) ) ;
941
+
942
+ nodes[ 1 ] . node . handle_open_channel ( & nodes[ 0 ] . node . get_our_node_id ( ) , InitFeatures :: known ( ) , & open_channel_msg) ;
943
+
944
+ let msg_events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
945
+ match msg_events[ 0 ] {
946
+ MessageSendEvent :: HandleError { action : ErrorAction :: SendErrorMessage { ref msg, .. } , .. } => {
947
+ assert_eq ! ( msg. data, "No zero confirmation channels accepted" . to_owned( ) ) ;
948
+ } ,
949
+ _ => panic ! ( ) ,
950
+ }
951
+
952
+ // 2. Check we can manually accept zero conf channels via the right method
953
+ let mut manually_accept_conf = UserConfig :: default ( ) ;
954
+ manually_accept_conf. manually_accept_inbound_channels = true ;
955
+
956
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
957
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
958
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs,
959
+ & [ None , Some ( manually_accept_conf. clone ( ) ) ] ) ;
960
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
961
+
962
+ // 2.1 First try the non-0conf method to manually accept
963
+ nodes[ 0 ] . node . create_channel ( nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 10001 , 42 ,
964
+ Some ( manually_accept_conf) ) . unwrap ( ) ;
965
+ let mut open_channel_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendOpenChannel ,
966
+ nodes[ 1 ] . node. get_our_node_id( ) ) ;
967
+
968
+ open_channel_msg. channel_type = Some ( channel_type_features. clone ( ) ) ;
969
+
970
+ nodes[ 1 ] . node . handle_open_channel ( & nodes[ 0 ] . node . get_our_node_id ( ) , InitFeatures :: known ( ) ,
971
+ & open_channel_msg) ;
972
+
973
+ // Assert that `nodes[1]` has no `MessageSendEvent::SendAcceptChannel` in the `msg_events`.
974
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
975
+
976
+ let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
977
+
978
+ match events[ 0 ] {
979
+ Event :: OpenChannelRequest { temporary_channel_id, .. } => {
980
+ // Assert we fail to accept via the non-0conf method
981
+ assert ! ( nodes[ 1 ] . node. accept_inbound_channel( & temporary_channel_id,
982
+ & nodes[ 0 ] . node. get_our_node_id( ) , 0 ) . is_err( ) ) ;
983
+ } ,
984
+ _ => panic ! ( ) ,
985
+ }
986
+
987
+ let msg_events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
988
+ match msg_events[ 0 ] {
989
+ MessageSendEvent :: HandleError { action : ErrorAction :: SendErrorMessage { ref msg, .. } , .. } => {
990
+ assert_eq ! ( msg. data, "No zero confirmation channels accepted" . to_owned( ) ) ;
991
+ } ,
992
+ _ => panic ! ( ) ,
993
+ }
994
+
995
+ // 2.2 Try again with the 0conf method to manually accept
996
+ nodes[ 0 ] . node . create_channel ( nodes[ 1 ] . node . get_our_node_id ( ) , 100000 , 10001 , 42 ,
997
+ Some ( manually_accept_conf) ) . unwrap ( ) ;
998
+ let mut open_channel_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendOpenChannel ,
999
+ nodes[ 1 ] . node. get_our_node_id( ) ) ;
1000
+
1001
+ open_channel_msg. channel_type = Some ( channel_type_features) ;
1002
+
1003
+ nodes[ 1 ] . node . handle_open_channel ( & nodes[ 0 ] . node . get_our_node_id ( ) , InitFeatures :: known ( ) ,
1004
+ & open_channel_msg) ;
1005
+
1006
+ let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
1007
+
1008
+ match events[ 0 ] {
1009
+ Event :: OpenChannelRequest { temporary_channel_id, .. } => {
1010
+ // Assert we can accept via the 0conf method
1011
+ assert ! ( nodes[ 1 ] . node. accept_inbound_channel_from_trusted_peer_0conf(
1012
+ & temporary_channel_id, & nodes[ 0 ] . node. get_our_node_id( ) , 0 ) . is_ok( ) ) ;
1013
+ } ,
1014
+ _ => panic ! ( ) ,
1015
+ }
1016
+
1017
+ // Check we would send accept
1018
+ let msg_events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
1019
+ match msg_events[ 0 ] {
1020
+ MessageSendEvent :: SendAcceptChannel { .. } => { } ,
1021
+ _ => panic ! ( ) ,
1022
+ }
1023
+ }
0 commit comments