@@ -222,6 +222,8 @@ pub struct OpenChannelV2 {
222
222
pub htlc_basepoint : PublicKey ,
223
223
/// The first to-be-broadcast-by-channel-initiator transaction's per commitment point
224
224
pub first_per_commitment_point : PublicKey ,
225
+ /// The second to-be-broadcast-by-channel-initiator transaction's per commitment point
226
+ pub second_per_commitment_point : PublicKey ,
225
227
/// Channel flags
226
228
pub channel_flags : u8 ,
227
229
/// Optionally, a request to pre-set the to-channel-initiator output's scriptPubkey for when we
@@ -231,6 +233,8 @@ pub struct OpenChannelV2 {
231
233
/// type from the intersection of our feature bits with our counterparty's feature bits from
232
234
/// the Init message.
233
235
pub channel_type : Option < ChannelTypeFeatures > ,
236
+ /// Optionally, a requirement that only confirmed inputs can be added
237
+ pub require_confirmed_inputs : Option < ( ) > ,
234
238
}
235
239
236
240
/// An accept_channel message to be sent or received from a peer.
@@ -1707,10 +1711,12 @@ impl_writeable_msg!(OpenChannelV2, {
1707
1711
delayed_payment_basepoint,
1708
1712
htlc_basepoint,
1709
1713
first_per_commitment_point,
1714
+ second_per_commitment_point,
1710
1715
channel_flags,
1711
1716
shutdown_scriptpubkey
1712
1717
} , {
1713
1718
( 1 , channel_type, option) ,
1719
+ ( 2 , require_confirmed_inputs, option) ,
1714
1720
} ) ;
1715
1721
1716
1722
impl_writeable_msg ! ( RevokeAndACK , {
@@ -2690,14 +2696,15 @@ mod tests {
2690
2696
do_encoding_open_channel ( true , true , true ) ;
2691
2697
}
2692
2698
2693
- fn do_encoding_open_channelv2 ( random_bit : bool , shutdown : bool , incl_chan_type : bool ) {
2699
+ fn do_encoding_open_channelv2 ( random_bit : bool , shutdown : bool , incl_chan_type : bool , require_confirmed_inputs : bool ) {
2694
2700
let secp_ctx = Secp256k1 :: new ( ) ;
2695
2701
let ( _, pubkey_1) = get_keys_from ! ( "0101010101010101010101010101010101010101010101010101010101010101" , secp_ctx) ;
2696
2702
let ( _, pubkey_2) = get_keys_from ! ( "0202020202020202020202020202020202020202020202020202020202020202" , secp_ctx) ;
2697
2703
let ( _, pubkey_3) = get_keys_from ! ( "0303030303030303030303030303030303030303030303030303030303030303" , secp_ctx) ;
2698
2704
let ( _, pubkey_4) = get_keys_from ! ( "0404040404040404040404040404040404040404040404040404040404040404" , secp_ctx) ;
2699
2705
let ( _, pubkey_5) = get_keys_from ! ( "0505050505050505050505050505050505050505050505050505050505050505" , secp_ctx) ;
2700
2706
let ( _, pubkey_6) = get_keys_from ! ( "0606060606060606060606060606060606060606060606060606060606060606" , secp_ctx) ;
2707
+ let ( _, pubkey_7) = get_keys_from ! ( "0707070707070707070707070707070707070707070707070707070707070707" , secp_ctx) ;
2701
2708
let open_channelv2 = msgs:: OpenChannelV2 {
2702
2709
chain_hash : BlockHash :: from_hex ( "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000" ) . unwrap ( ) ,
2703
2710
temporary_channel_id : [ 2 ; 32 ] ,
@@ -2716,14 +2723,33 @@ mod tests {
2716
2723
delayed_payment_basepoint : pubkey_4,
2717
2724
htlc_basepoint : pubkey_5,
2718
2725
first_per_commitment_point : pubkey_6,
2726
+ second_per_commitment_point : pubkey_7,
2719
2727
channel_flags : if random_bit { 1 << 5 } else { 0 } ,
2720
2728
shutdown_scriptpubkey : if shutdown { OptionalField :: Present ( Address :: p2pkh ( & :: bitcoin:: PublicKey { compressed : true , inner : pubkey_1} , Network :: Testnet ) . script_pubkey ( ) ) } else { OptionalField :: Absent } ,
2721
2729
channel_type : if incl_chan_type { Some ( ChannelTypeFeatures :: empty ( ) ) } else { None } ,
2730
+ require_confirmed_inputs : if require_confirmed_inputs { Some ( ( ) ) } else { None } ,
2722
2731
} ;
2723
2732
let encoded_value = open_channelv2. encode ( ) ;
2724
2733
let mut target_value = Vec :: new ( ) ;
2725
2734
target_value. append ( & mut hex:: decode ( "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" ) . unwrap ( ) ) ;
2726
- target_value. append ( & mut hex:: decode ( "0202020202020202020202020202020202020202020202020202020202020202000c89d4000c89d412345678901234563214466870114476763303089620319800083a840000034dc0bcc0bc12345678031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d076602531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe33703462779ad4aad39514614751a71085f2f10e1c7a593e4e030efb5b8721ce55b0b0362c0a046dacce86ddd0343c6d3c7c79c2208ba0d9c9cf24a6d046d21d21f90f703f006a18d5653c4edf5391ff23a61f03ff83d237e880ee61187fa9f379a028e0a" ) . unwrap ( ) ) ;
2735
+ target_value. append ( & mut hex:: decode ( "0202020202020202020202020202020202020202020202020202020202020202" ) . unwrap ( ) ) ;
2736
+ target_value. append ( & mut hex:: decode ( "000c89d4" ) . unwrap ( ) ) ;
2737
+ target_value. append ( & mut hex:: decode ( "000c89d4" ) . unwrap ( ) ) ;
2738
+ target_value. append ( & mut hex:: decode ( "1234567890123456" ) . unwrap ( ) ) ;
2739
+ target_value. append ( & mut hex:: decode ( "3214466870114476" ) . unwrap ( ) ) ;
2740
+ target_value. append ( & mut hex:: decode ( "7633030896203198" ) . unwrap ( ) ) ;
2741
+ target_value. append ( & mut hex:: decode ( "00083a840000034d" ) . unwrap ( ) ) ;
2742
+ target_value. append ( & mut hex:: decode ( "c0bc" ) . unwrap ( ) ) ;
2743
+ target_value. append ( & mut hex:: decode ( "c0bc" ) . unwrap ( ) ) ;
2744
+ target_value. append ( & mut hex:: decode ( "12345678" ) . unwrap ( ) ) ;
2745
+ target_value. append ( & mut hex:: decode ( "031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f" ) . unwrap ( ) ) ;
2746
+ target_value. append ( & mut hex:: decode ( "024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766" ) . unwrap ( ) ) ;
2747
+ target_value. append ( & mut hex:: decode ( "02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337" ) . unwrap ( ) ) ;
2748
+ target_value. append ( & mut hex:: decode ( "03462779ad4aad39514614751a71085f2f10e1c7a593e4e030efb5b8721ce55b0b" ) . unwrap ( ) ) ;
2749
+ target_value. append ( & mut hex:: decode ( "0362c0a046dacce86ddd0343c6d3c7c79c2208ba0d9c9cf24a6d046d21d21f90f7" ) . unwrap ( ) ) ;
2750
+ target_value. append ( & mut hex:: decode ( "03f006a18d5653c4edf5391ff23a61f03ff83d237e880ee61187fa9f379a028e0a" ) . unwrap ( ) ) ;
2751
+ target_value. append ( & mut hex:: decode ( "02989c0b76cb563971fdc9bef31ec06c3560f3249d6ee9e5d83c57625596e05f6f" ) . unwrap ( ) ) ;
2752
+
2727
2753
if random_bit {
2728
2754
target_value. append ( & mut hex:: decode ( "20" ) . unwrap ( ) ) ;
2729
2755
} else {
@@ -2735,19 +2761,30 @@ mod tests {
2735
2761
if incl_chan_type {
2736
2762
target_value. append ( & mut hex:: decode ( "0100" ) . unwrap ( ) ) ;
2737
2763
}
2764
+ if require_confirmed_inputs {
2765
+ target_value. append ( & mut hex:: decode ( "0200" ) . unwrap ( ) ) ;
2766
+ }
2738
2767
assert_eq ! ( encoded_value, target_value) ;
2739
2768
}
2740
2769
2741
2770
#[ test]
2742
2771
fn encoding_open_channelv2 ( ) {
2743
- do_encoding_open_channelv2 ( false , false , false ) ;
2744
- do_encoding_open_channelv2 ( false , false , true ) ;
2745
- do_encoding_open_channelv2 ( false , true , false ) ;
2746
- do_encoding_open_channelv2 ( false , true , true ) ;
2747
- do_encoding_open_channelv2 ( true , false , false ) ;
2748
- do_encoding_open_channelv2 ( true , false , true ) ;
2749
- do_encoding_open_channelv2 ( true , true , false ) ;
2750
- do_encoding_open_channelv2 ( true , true , true ) ;
2772
+ do_encoding_open_channelv2 ( false , false , false , false ) ;
2773
+ do_encoding_open_channelv2 ( false , false , false , true ) ;
2774
+ do_encoding_open_channelv2 ( false , false , true , false ) ;
2775
+ do_encoding_open_channelv2 ( false , false , true , true ) ;
2776
+ do_encoding_open_channelv2 ( false , true , false , false ) ;
2777
+ do_encoding_open_channelv2 ( false , true , false , true ) ;
2778
+ do_encoding_open_channelv2 ( false , true , true , false ) ;
2779
+ do_encoding_open_channelv2 ( false , true , true , true ) ;
2780
+ do_encoding_open_channelv2 ( true , false , false , false ) ;
2781
+ do_encoding_open_channelv2 ( true , false , false , true ) ;
2782
+ do_encoding_open_channelv2 ( true , false , true , false ) ;
2783
+ do_encoding_open_channelv2 ( true , false , true , true ) ;
2784
+ do_encoding_open_channelv2 ( true , true , false , false ) ;
2785
+ do_encoding_open_channelv2 ( true , true , false , true ) ;
2786
+ do_encoding_open_channelv2 ( true , true , true , false ) ;
2787
+ do_encoding_open_channelv2 ( true , true , true , true ) ;
2751
2788
}
2752
2789
2753
2790
fn do_encoding_accept_channel ( shutdown : bool ) {
0 commit comments