Support tr()
descriptors in dsl
This commit is contained in:
parent
cdc7057813
commit
fe1877fb18
@ -577,6 +577,23 @@ impl<A, B, C> From<(A, (B, (C, ())))> for TupleThree<A, B, C> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! group_multi_keys {
|
||||||
|
( $( $key:expr ),+ ) => {{
|
||||||
|
use $crate::keys::IntoDescriptorKey;
|
||||||
|
|
||||||
|
let keys = vec![
|
||||||
|
$(
|
||||||
|
$key.into_descriptor_key(),
|
||||||
|
)*
|
||||||
|
];
|
||||||
|
|
||||||
|
keys.into_iter().collect::<Result<Vec<_>, _>>()
|
||||||
|
.map_err($crate::descriptor::DescriptorError::Key)
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! fragment_internal {
|
macro_rules! fragment_internal {
|
||||||
@ -737,21 +754,22 @@ macro_rules! fragment {
|
|||||||
.and_then(|items| $crate::fragment!(thresh_vec($thresh, items)))
|
.and_then(|items| $crate::fragment!(thresh_vec($thresh, items)))
|
||||||
});
|
});
|
||||||
( multi_vec ( $thresh:expr, $keys:expr ) ) => ({
|
( multi_vec ( $thresh:expr, $keys:expr ) ) => ({
|
||||||
$crate::keys::make_multi($thresh, $keys)
|
|
||||||
});
|
|
||||||
( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({
|
|
||||||
use $crate::keys::IntoDescriptorKey;
|
|
||||||
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
|
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
|
||||||
|
|
||||||
let keys = vec![
|
$crate::keys::make_multi($thresh, $crate::miniscript::Terminal::Multi, $keys, &secp)
|
||||||
$(
|
});
|
||||||
$key.into_descriptor_key(),
|
( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({
|
||||||
)*
|
$crate::group_multi_keys!( $( $key ),* )
|
||||||
];
|
.and_then(|keys| $crate::fragment!( multi_vec ( $thresh, keys ) ))
|
||||||
|
});
|
||||||
|
( multi_a_vec ( $thresh:expr, $keys:expr ) ) => ({
|
||||||
|
let secp = $crate::bitcoin::secp256k1::Secp256k1::new();
|
||||||
|
|
||||||
keys.into_iter().collect::<Result<Vec<_>, _>>()
|
$crate::keys::make_multi($thresh, $crate::miniscript::Terminal::MultiA, $keys, &secp)
|
||||||
.map_err($crate::descriptor::DescriptorError::Key)
|
});
|
||||||
.and_then(|keys| $crate::keys::make_multi($thresh, keys, &secp))
|
( multi_a ( $thresh:expr $(, $key:expr )+ ) ) => ({
|
||||||
|
$crate::group_multi_keys!( $( $key ),* )
|
||||||
|
.and_then(|keys| $crate::fragment!( multi_a_vec ( $thresh, keys ) ))
|
||||||
});
|
});
|
||||||
|
|
||||||
// `sortedmulti()` is handled separately
|
// `sortedmulti()` is handled separately
|
||||||
|
@ -792,13 +792,18 @@ pub fn make_pkh<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
|
|||||||
|
|
||||||
// Used internally by `bdk::fragment!` to build `multi()` fragments
|
// Used internally by `bdk::fragment!` to build `multi()` fragments
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub fn make_multi<Pk: IntoDescriptorKey<Ctx>, Ctx: ScriptContext>(
|
pub fn make_multi<
|
||||||
|
Pk: IntoDescriptorKey<Ctx>,
|
||||||
|
Ctx: ScriptContext,
|
||||||
|
V: Fn(usize, Vec<DescriptorPublicKey>) -> Terminal<DescriptorPublicKey, Ctx>,
|
||||||
|
>(
|
||||||
thresh: usize,
|
thresh: usize,
|
||||||
|
variant: V,
|
||||||
pks: Vec<Pk>,
|
pks: Vec<Pk>,
|
||||||
secp: &SecpCtx,
|
secp: &SecpCtx,
|
||||||
) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
|
) -> Result<(Miniscript<DescriptorPublicKey, Ctx>, KeyMap, ValidNetworks), DescriptorError> {
|
||||||
let (pks, key_map, valid_networks) = expand_multi_keys(pks, secp)?;
|
let (pks, key_map, valid_networks) = expand_multi_keys(pks, secp)?;
|
||||||
let minisc = Miniscript::from_ast(Terminal::Multi(thresh, pks))?;
|
let minisc = Miniscript::from_ast(variant(thresh, pks))?;
|
||||||
|
|
||||||
minisc.check_miniscript()?;
|
minisc.check_miniscript()?;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user