diff --git a/src/descriptor/dsl.rs b/src/descriptor/dsl.rs index 34081ab1..ccbe2b2b 100644 --- a/src/descriptor/dsl.rs +++ b/src/descriptor/dsl.rs @@ -77,11 +77,14 @@ macro_rules! impl_top_level_pk { #[macro_export] macro_rules! impl_top_level_tr { ( $internal_key:expr, $tap_tree:expr ) => {{ - use $crate::miniscript::descriptor::{Descriptor, DescriptorPublicKey, Tr}; + use $crate::miniscript::descriptor::{ + Descriptor, DescriptorPublicKey, KeyMap, TapTree, Tr, + }; use $crate::miniscript::Tap; #[allow(unused_imports)] - use $crate::keys::{DescriptorKey, IntoDescriptorKey}; + use $crate::keys::{DescriptorKey, IntoDescriptorKey, ValidNetworks}; + let secp = $crate::bitcoin::secp256k1::Secp256k1::new(); $internal_key @@ -89,12 +92,19 @@ macro_rules! impl_top_level_tr { .and_then(|key: DescriptorKey| key.extract(&secp)) .map_err($crate::descriptor::DescriptorError::Key) .and_then(|(pk, mut key_map, mut valid_networks)| { - let tap_tree = $tap_tree.map(|(tap_tree, tree_keymap, tree_networks)| { - key_map.extend(tree_keymap.into_iter()); - valid_networks = $crate::keys::merge_networks(&valid_networks, &tree_networks); + let tap_tree = $tap_tree.map( + |(tap_tree, tree_keymap, tree_networks): ( + TapTree, + KeyMap, + ValidNetworks, + )| { + key_map.extend(tree_keymap.into_iter()); + valid_networks = + $crate::keys::merge_networks(&valid_networks, &tree_networks); - tap_tree - }); + tap_tree + }, + ); Ok(( Descriptor::::Tr(Tr::new(pk, tap_tree)?), @@ -1179,4 +1189,35 @@ mod test { descriptor!(wsh(v: pk(uncompressed_pk))).unwrap(); } + + #[test] + fn test_dsl_tr_only_key() { + let private_key = + PrivateKey::from_wif("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR").unwrap(); + let (descriptor, _, _) = descriptor!(tr(private_key)).unwrap(); + + assert_eq!( + descriptor.to_string(), + "tr(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c)#heq9m95v" + ) + } + + #[test] + fn test_dsl_tr_simple_tree() { + let private_key = + PrivateKey::from_wif("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR").unwrap(); + let (descriptor, _, _) = + descriptor!(tr(private_key, { pk(private_key), pk(private_key) })).unwrap(); + + assert_eq!(descriptor.to_string(), "tr(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c,{pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c),pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c)})#xy5fjw6d") + } + + #[test] + fn test_dsl_tr_single_leaf() { + let private_key = + PrivateKey::from_wif("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR").unwrap(); + let (descriptor, _, _) = descriptor!(tr(private_key, pk(private_key))).unwrap(); + + assert_eq!(descriptor.to_string(), "tr(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c,pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c))#lzl2vmc7") + } } diff --git a/src/wallet/signer.rs b/src/wallet/signer.rs index 19041ba4..96e3034e 100644 --- a/src/wallet/signer.rs +++ b/src/wallet/signer.rs @@ -302,8 +302,7 @@ impl InputSigner for SignerWrapper> { let tap_key_origins = psbt.inputs[input_index] .tap_key_origins .iter() - .map(|(pk, (_, keysource))| (SinglePubKey::XOnly(*pk), keysource)) - .collect::>(); + .map(|(pk, (_, keysource))| (SinglePubKey::XOnly(*pk), keysource)); let (public_key, full_path) = match psbt.inputs[input_index] .bip32_derivation .iter()