[keys] Add BIP39 support

This commit is contained in:
Alekos Filini
2020-09-18 17:26:58 +02:00
parent 751a553925
commit ab9d964868
5 changed files with 166 additions and 31 deletions

View File

@@ -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))
});
}