@@ -77,24 +77,34 @@ macro_rules! impl_top_level_pk {
77
77
#[ macro_export]
78
78
macro_rules! impl_top_level_tr {
79
79
( $internal_key: expr, $tap_tree: expr ) => { {
80
- use $crate:: miniscript:: descriptor:: { Descriptor , DescriptorPublicKey , Tr } ;
80
+ use $crate:: miniscript:: descriptor:: {
81
+ Descriptor , DescriptorPublicKey , KeyMap , TapTree , Tr ,
82
+ } ;
81
83
use $crate:: miniscript:: Tap ;
82
84
83
85
#[ allow( unused_imports) ]
84
- use $crate:: keys:: { DescriptorKey , IntoDescriptorKey } ;
86
+ use $crate:: keys:: { DescriptorKey , IntoDescriptorKey , ValidNetworks } ;
87
+
85
88
let secp = $crate:: bitcoin:: secp256k1:: Secp256k1 :: new( ) ;
86
89
87
90
$internal_key
88
91
. into_descriptor_key( )
89
92
. and_then( |key: DescriptorKey <Tap >| key. extract( & secp) )
90
93
. map_err( $crate:: descriptor:: DescriptorError :: Key )
91
94
. and_then( |( pk, mut key_map, mut valid_networks) | {
92
- let tap_tree = $tap_tree. map( |( tap_tree, tree_keymap, tree_networks) | {
93
- key_map. extend( tree_keymap. into_iter( ) ) ;
94
- valid_networks = $crate:: keys:: merge_networks( & valid_networks, & tree_networks) ;
95
-
96
- tap_tree
97
- } ) ;
95
+ let tap_tree = $tap_tree. map(
96
+ |( tap_tree, tree_keymap, tree_networks) : (
97
+ TapTree <DescriptorPublicKey >,
98
+ KeyMap ,
99
+ ValidNetworks ,
100
+ ) | {
101
+ key_map. extend( tree_keymap. into_iter( ) ) ;
102
+ valid_networks =
103
+ $crate:: keys:: merge_networks( & valid_networks, & tree_networks) ;
104
+
105
+ tap_tree
106
+ } ,
107
+ ) ;
98
108
99
109
Ok ( (
100
110
Descriptor :: <DescriptorPublicKey >:: Tr ( Tr :: new( pk, tap_tree) ?) ,
@@ -1179,4 +1189,35 @@ mod test {
1179
1189
1180
1190
descriptor ! ( wsh( v: pk( uncompressed_pk) ) ) . unwrap ( ) ;
1181
1191
}
1192
+
1193
+ #[ test]
1194
+ fn test_dsl_tr_only_key ( ) {
1195
+ let private_key =
1196
+ PrivateKey :: from_wif ( "cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR" ) . unwrap ( ) ;
1197
+ let ( descriptor, _, _) = descriptor ! ( tr( private_key) ) . unwrap ( ) ;
1198
+
1199
+ assert_eq ! (
1200
+ descriptor. to_string( ) ,
1201
+ "tr(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c)#heq9m95v"
1202
+ )
1203
+ }
1204
+
1205
+ #[ test]
1206
+ fn test_dsl_tr_simple_tree ( ) {
1207
+ let private_key =
1208
+ PrivateKey :: from_wif ( "cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR" ) . unwrap ( ) ;
1209
+ let ( descriptor, _, _) =
1210
+ descriptor ! ( tr( private_key, { pk( private_key) , pk( private_key) } ) ) . unwrap ( ) ;
1211
+
1212
+ assert_eq ! ( descriptor. to_string( ) , "tr(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c,{pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c),pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c)})#xy5fjw6d" )
1213
+ }
1214
+
1215
+ #[ test]
1216
+ fn test_dsl_tr_single_leaf ( ) {
1217
+ let private_key =
1218
+ PrivateKey :: from_wif ( "cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR" ) . unwrap ( ) ;
1219
+ let ( descriptor, _, _) = descriptor ! ( tr( private_key, pk( private_key) ) ) . unwrap ( ) ;
1220
+
1221
+ assert_eq ! ( descriptor. to_string( ) , "tr(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c,pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c))#lzl2vmc7" )
1222
+ }
1182
1223
}
0 commit comments