From e3dd7553962e6f872cf6717ab008235c07353c6e Mon Sep 17 00:00:00 2001 From: Alekos Filini Date: Wed, 15 Sep 2021 10:35:01 +0200 Subject: [PATCH] [descriptor] Fix `pk_h()` in the `descriptor!()` macro Instead of accepting just a `DescriptorPublicKey` it now accepts anything that implements `IntoDescriptorKey` like `pk_k()` does. --- src/descriptor/dsl.rs | 5 +++-- src/keys/mod.rs | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/descriptor/dsl.rs b/src/descriptor/dsl.rs index 76eb4ecd..b4fdcba7 100644 --- a/src/descriptor/dsl.rs +++ b/src/descriptor/dsl.rs @@ -571,8 +571,9 @@ macro_rules! fragment { ( pk ( $key:expr ) ) => ({ $crate::fragment!(c:pk_k ( $key )) }); - ( pk_h ( $key_hash:expr ) ) => ({ - $crate::impl_leaf_opcode_value!(PkH, $key_hash) + ( pk_h ( $key:expr ) ) => ({ + let secp = $crate::bitcoin::secp256k1::Secp256k1::new(); + $crate::keys::make_pkh($key, &secp) }); ( after ( $value:expr ) ) => ({ $crate::impl_leaf_opcode_value!(After, $value) diff --git a/src/keys/mod.rs b/src/keys/mod.rs index 1fbeada7..15b53e15 100644 --- a/src/keys/mod.rs +++ b/src/keys/mod.rs @@ -753,6 +753,20 @@ pub fn make_pk, Ctx: ScriptContext>( Ok((minisc, key_map, valid_networks)) } +// Used internally by `bdk::fragment!` to build `pk_h()` fragments +#[doc(hidden)] +pub fn make_pkh, Ctx: ScriptContext>( + descriptor_key: Pk, + secp: &SecpCtx, +) -> Result<(Miniscript, KeyMap, ValidNetworks), DescriptorError> { + let (key, key_map, valid_networks) = descriptor_key.into_descriptor_key()?.extract(secp)?; + let minisc = Miniscript::from_ast(Terminal::PkH(key))?; + + minisc.check_minsicript()?; + + Ok((minisc, key_map, valid_networks)) +} + // Used internally by `bdk::fragment!` to build `multi()` fragments #[doc(hidden)] pub fn make_multi, Ctx: ScriptContext>(