// Copyright (c) 2020-2021 Bitcoin Dev Kit Developers // // This file is licensed under the Apache License, Version 2.0 or the MIT license // , at your option. // You may not use this file except in accordance with one or both of these // licenses. use bdk::bitcoin::bip32::DerivationPath; use bdk::bitcoin::secp256k1::Secp256k1; use bdk::bitcoin::Network; use bdk::descriptor; use bdk::descriptor::IntoWalletDescriptor; use bdk::keys::bip39::{Language, Mnemonic, WordCount}; use bdk::keys::{GeneratableKey, GeneratedKey}; use bdk::miniscript::Tap; use bdk::Error as BDK_Error; use std::error::Error; use std::str::FromStr; /// This example demonstrates how to generate a mnemonic phrase /// using BDK and use that to generate a descriptor string. fn main() -> Result<(), Box> { let secp = Secp256k1::new(); // In this example we are generating a 12 words mnemonic phrase // but it is also possible generate 15, 18, 21 and 24 words // using their respective `WordCount` variant. let mnemonic: GeneratedKey<_, Tap> = Mnemonic::generate((WordCount::Words12, Language::English)) .map_err(|_| BDK_Error::Generic("Mnemonic generation error".to_string()))?; println!("Mnemonic phrase: {}", *mnemonic); let mnemonic_with_passphrase = (mnemonic, None); // define external and internal derivation key path let external_path = DerivationPath::from_str("m/86h/0h/0h/0").unwrap(); let internal_path = DerivationPath::from_str("m/86h/0h/0h/1").unwrap(); // generate external and internal descriptor from mnemonic let (external_descriptor, ext_keymap) = descriptor!(tr((mnemonic_with_passphrase.clone(), external_path)))? .into_wallet_descriptor(&secp, Network::Testnet)?; let (internal_descriptor, int_keymap) = descriptor!(tr((mnemonic_with_passphrase, internal_path)))? .into_wallet_descriptor(&secp, Network::Testnet)?; println!("tpub external descriptor: {}", external_descriptor); println!("tpub internal descriptor: {}", internal_descriptor); println!( "tprv external descriptor: {}", external_descriptor.to_string_with_secret(&ext_keymap) ); println!( "tprv internal descriptor: {}", internal_descriptor.to_string_with_secret(&int_keymap) ); Ok(()) }