@@ -17,9 +17,9 @@ use chain::keysinterface::{Recipient, KeysInterface};
1717use ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , MIN_CLTV_EXPIRY_DELTA } ;
1818use routing:: network_graph:: RoutingFees ;
1919use routing:: router:: { PaymentParameters , RouteHint , RouteHintHop } ;
20- use ln:: features:: { InitFeatures , InvoiceFeatures } ;
20+ use ln:: features:: { InitFeatures , InvoiceFeatures , ChannelTypeFeatures } ;
2121use ln:: msgs;
22- use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler , OptionalField , ChannelUpdate } ;
22+ use ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler , OptionalField , ChannelUpdate , ErrorAction } ;
2323use ln:: wire:: Encode ;
2424use util:: enforcing_trait_impls:: EnforcingSigner ;
2525use util:: events:: { ClosureReason , Event , MessageSendEvent , MessageSendEventsProvider } ;
@@ -922,3 +922,102 @@ fn test_0conf_channel_reorg() {
922922 } ) ;
923923 check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
924924}
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