Skip to content

Commit 66ea28f

Browse files
committed
Support tr() descriptors in dsl
1 parent c81a3a0 commit 66ea28f

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

src/descriptor/dsl.rs

+29-11
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,23 @@ impl<A, B, C> From<(A, (B, (C, ())))> for TupleThree<A, B, C> {
577577
}
578578
}
579579

580+
#[doc(hidden)]
581+
#[macro_export]
582+
macro_rules! group_multi_keys {
583+
( $( $key:expr ),+ ) => {{
584+
use $crate::keys::IntoDescriptorKey;
585+
586+
let keys = vec![
587+
$(
588+
$key.into_descriptor_key(),
589+
)*
590+
];
591+
592+
keys.into_iter().collect::<Result<Vec<_>, _>>()
593+
.map_err($crate::descriptor::DescriptorError::Key)
594+
}};
595+
}
596+
580597
#[doc(hidden)]
581598
#[macro_export]
582599
macro_rules! fragment_internal {
@@ -737,21 +754,22 @@ macro_rules! fragment {
737754
.and_then(|items| $crate::fragment!(thresh_vec($thresh, items)))
738755
});
739756
( multi_vec ( $thresh:expr, $keys:expr ) ) => ({
740-
$crate::keys::make_multi($thresh, $keys)
757+
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
758+
759+
$crate::keys::make_multi($thresh, $crate::miniscript::Terminal::Multi, $keys, &secp)
741760
});
742761
( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({
743-
use $crate::keys::IntoDescriptorKey;
762+
$crate::group_multi_keys!( $( $key ),* )
763+
.and_then(|keys| $crate::fragment!( multi_vec ( $thresh, keys ) ))
764+
});
765+
( multi_a_vec ( $thresh:expr, $keys:expr ) ) => ({
744766
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
745767

746-
let keys = vec![
747-
$(
748-
$key.into_descriptor_key(),
749-
)*
750-
];
751-
752-
keys.into_iter().collect::<Result<Vec<_>, _>>()
753-
.map_err($crate::descriptor::DescriptorError::Key)
754-
.and_then(|keys| $crate::keys::make_multi($thresh, keys, &secp))
768+
$crate::keys::make_multi($thresh, $crate::miniscript::Terminal::MultiA, $keys, &secp)
769+
});
770+
( multi_a ( $thresh:expr $(, $key:expr )+ ) ) => ({
771+
$crate::group_multi_keys!( $( $key ),* )
772+
.and_then(|keys| $crate::fragment!( multi_a_vec ( $thresh, keys ) ))
755773
});
756774

757775
// `sortedmulti()` is handled separately

src/keys/mod.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -792,13 +792,18 @@ pub fn make_pkh<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
792792

793793
// Used internally by `bdk::fragment!` to build `multi()` fragments
794794
#[doc(hidden)]
795-
pub fn make_multi<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
795+
pub fn make_multi<
796+
Pk: IntoDescriptorKey<Ctx>,
797+
Ctx: ScriptContext,
798+
V: Fn(usize, Vec<DescriptorPublicKey>) -> Terminal<DescriptorPublicKey, Ctx>,
799+
>(
796800
thresh: usize,
801+
variant: V,
797802
pks: Vec<Pk>,
798803
secp: &SecpCtx,
799804
) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
800805
let (pks, key_map, valid_networks) = expand_multi_keys(pks, secp)?;
801-
let minisc = Miniscript::from_ast(Terminal::Multi(thresh, pks))?;
806+
let minisc = Miniscript::from_ast(variant(thresh, pks))?;
802807

803808
minisc.check_miniscript()?;
804809

0 commit comments

Comments
 (0)