[keys] Add BIP39 support
This commit is contained in:
@@ -39,7 +39,7 @@ macro_rules! impl_top_level_pk {
|
||||
( $descriptor_variant:ident, $key:expr ) => {{
|
||||
use $crate::keys::ToDescriptorKey;
|
||||
$key.to_descriptor_key()
|
||||
.into_key_and_secret()
|
||||
.and_then(|key| key.into_key_and_secret())
|
||||
.map(|(pk, key_map)| {
|
||||
(
|
||||
$crate::miniscript::Descriptor::<
|
||||
@@ -181,6 +181,23 @@ macro_rules! impl_node_opcode_three {
|
||||
/// assert_eq!(key_map_a.len(), key_map_b.len());
|
||||
/// # Ok::<(), Box<dyn std::error::Error>>(())
|
||||
/// ```
|
||||
///
|
||||
/// ------
|
||||
///
|
||||
/// Simple 2-of-2 multi-signature, equivalent to: `wsh(multi(2, ...))`
|
||||
///
|
||||
/// ```
|
||||
/// # use std::str::FromStr;
|
||||
/// let my_key_1 = bitcoin::PublicKey::from_str("02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c")?;
|
||||
/// let my_key_2 = bitcoin::PrivateKey::from_wif("cVt4o7BGAig1UXywgGSmARhxMdzP5qvQsxKkSsc1XEkw3tDTQFpy")?;
|
||||
///
|
||||
/// let (descriptor, key_map) = bdk::descriptor! {
|
||||
/// wsh (
|
||||
/// multi 2, my_key_1, my_key_2
|
||||
/// )
|
||||
/// }?;
|
||||
/// # Ok::<(), Box<dyn std::error::Error>>(())
|
||||
/// ```
|
||||
#[macro_export]
|
||||
macro_rules! descriptor {
|
||||
( bare ( $( $minisc:tt )* ) ) => ({
|
||||
@@ -262,7 +279,8 @@ macro_rules! fragment {
|
||||
});
|
||||
( pk_k $key:expr ) => ({
|
||||
use $crate::keys::ToDescriptorKey;
|
||||
$key.to_descriptor_key().into_key_and_secret()
|
||||
$key.to_descriptor_key()
|
||||
.and_then(|key| key.into_key_and_secret())
|
||||
.and_then(|(pk, key_map)| Ok(($crate::impl_leaf_opcode_value!(PkK, pk)?.0, key_map)))
|
||||
});
|
||||
( pk $key:expr ) => ({
|
||||
@@ -337,8 +355,7 @@ macro_rules! fragment {
|
||||
use $crate::keys::{ToDescriptorKey, DescriptorKey};
|
||||
|
||||
$keys.into_iter()
|
||||
.map(ToDescriptorKey::to_descriptor_key)
|
||||
.map(DescriptorKey::into_key_and_secret)
|
||||
.map(|key| key.to_descriptor_key().and_then(DescriptorKey::into_key_and_secret))
|
||||
.collect::<Result<Vec<_>, _>>()
|
||||
.map(|items| items.into_iter().unzip())
|
||||
.and_then(|(keys, key_maps): (Vec<_>, Vec<_>)| {
|
||||
@@ -351,12 +368,15 @@ macro_rules! fragment {
|
||||
})
|
||||
});
|
||||
( multi $thresh:expr $(, $key:expr )+ ) => ({
|
||||
use $crate::keys::ToDescriptorKey;
|
||||
|
||||
let mut keys = vec![];
|
||||
$(
|
||||
keys.push($key);
|
||||
keys.push($key.to_descriptor_key());
|
||||
)*
|
||||
|
||||
$crate::fragment!(multi_vec $thresh, keys)
|
||||
keys.into_iter().collect::<Result<Vec<_>, _>>()
|
||||
.and_then(|keys| $crate::fragment!(multi_vec $thresh, keys))
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user