61 lines
2.4 KiB
Rust
61 lines
2.4 KiB
Rust
// Copyright (c) 2020-2021 Bitcoin Dev Kit Developers
|
|
//
|
|
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
|
|
// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
|
|
// You may not use this file except in accordance with one or both of these
|
|
// licenses.
|
|
|
|
use bdk::bitcoin::secp256k1::Secp256k1;
|
|
use bdk::bitcoin::util::bip32::DerivationPath;
|
|
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<dyn Error>> {
|
|
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(())
|
|
}
|