Skip to content

Commit a9288e5

Browse files
committed
Fix type inference for the tr() descriptor, add basic tests
1 parent c25b9ce commit a9288e5

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

src/descriptor/dsl.rs

+49-8
Original file line numberDiff line numberDiff line change
@@ -77,24 +77,34 @@ macro_rules! impl_top_level_pk {
7777
#[macro_export]
7878
macro_rules! impl_top_level_tr {
7979
( $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+
};
8183
use $crate::miniscript::Tap;
8284

8385
#[allow(unused_imports)]
84-
use $crate::keys::{DescriptorKey, IntoDescriptorKey};
86+
use $crate::keys::{DescriptorKey, IntoDescriptorKey, ValidNetworks};
87+
8588
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
8689

8790
$internal_key
8891
.into_descriptor_key()
8992
.and_then(|key: DescriptorKey<Tap>| key.extract(&secp))
9093
.map_err($crate::descriptor::DescriptorError::Key)
9194
.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+
);
98108

99109
Ok((
100110
Descriptor::<DescriptorPublicKey>::Tr(Tr::new(pk, tap_tree)?),
@@ -1179,4 +1189,35 @@ mod test {
11791189

11801190
descriptor!(wsh(v: pk(uncompressed_pk))).unwrap();
11811191
}
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+
}
11821223
}

src/wallet/signer.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -302,13 +302,12 @@ impl InputSigner for SignerWrapper<DescriptorXKey<ExtendedPrivKey>> {
302302
let tap_key_origins = psbt.inputs[input_index]
303303
.tap_key_origins
304304
.iter()
305-
.map(|(pk, (_, keysource))| (SinglePubKey::XOnly(*pk), keysource))
306-
.collect::<Vec<_>>();
305+
.map(|(pk, (_, keysource))| (SinglePubKey::XOnly(*pk), keysource));
307306
let (public_key, full_path) = match psbt.inputs[input_index]
308307
.bip32_derivation
309308
.iter()
310309
.map(|(pk, keysource)| (SinglePubKey::FullKey(PublicKey::new(*pk)), keysource))
311-
.chain(tap_key_origins.into_iter())
310+
.chain(tap_key_origins)
312311
.filter_map(|(pk, keysource)| {
313312
if self.matches(keysource, secp).is_some() {
314313
Some((pk, keysource.1.clone()))

0 commit comments

Comments
 (0)