From f1c2118b028b9f08437a65fb2e33378b3a794e9c Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 21 Oct 2021 14:35:40 +0530 Subject: [PATCH] Allow generating extended keys --- src/bdk.udl | 17 ++++++++++++++++- src/lib.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/bdk.udl b/src/bdk.udl index c52b9ac..d183e43 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -1,5 +1,6 @@ namespace bdk { - + [Throws=BdkError] + ExtendedKeyInfo generate_extended_key(Network network, MnemonicType mnemonicType, string? password); }; [Error] @@ -146,3 +147,17 @@ interface PartiallySignedBitcoinTransaction { [Throws=BdkError] constructor([ByRef] OnlineWallet wallet, string recipient, u64 amount); }; + +dictionary ExtendedKeyInfo { + string mnemonic; + string xprv; + string fingerprint; +}; + +enum MnemonicType { + "Words12", + "Words15", + "Words18", + "Words21", + "Words24", +}; diff --git a/src/lib.rs b/src/lib.rs index 02c22b5..8d26c70 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +use bdk::bitcoin::secp256k1::Secp256k1; use bdk::bitcoin::util::psbt::PartiallySignedTransaction; use bdk::bitcoin::{Address, Network}; use bdk::blockchain::any::{AnyBlockchain, AnyBlockchainConfig}; @@ -7,6 +8,9 @@ use bdk::blockchain::{ }; use bdk::database::any::{AnyDatabase, SledDbConfiguration}; use bdk::database::{AnyDatabaseConfig, ConfigurableDatabase}; +use bdk::keys::bip39::{Language, Mnemonic, MnemonicType}; +use bdk::keys::{DerivableKey, ExtendedKey, GeneratableKey, GeneratedKey}; +use bdk::miniscript::BareCtx; use bdk::wallet::AddressIndex; use bdk::{ConfirmationTime, Error, SignOptions, Wallet}; use std::convert::TryFrom; @@ -260,5 +264,29 @@ impl WalletHolder for OnlineWallet { impl OfflineWalletOperations for OnlineWallet {} +pub struct ExtendedKeyInfo { + mnemonic: String, + xprv: String, + fingerprint: String, +} + +fn generate_extended_key( + network: Network, + mnemonic_type: MnemonicType, + password: Option, +) -> Result { + let mnemonic: GeneratedKey<_, BareCtx> = + Mnemonic::generate((mnemonic_type, Language::English)).unwrap(); + let mnemonic = mnemonic.into_key(); + let xkey: ExtendedKey = (mnemonic.clone(), password).into_extended_key()?; + let xprv = xkey.into_xprv(network).unwrap(); + let fingerprint = xprv.fingerprint(&Secp256k1::new()); + Ok(ExtendedKeyInfo { + mnemonic: mnemonic.to_string(), + xprv: xprv.to_string(), + fingerprint: fingerprint.to_string(), + }) +} + uniffi::deps::static_assertions::assert_impl_all!(OfflineWallet: Sync, Send); uniffi::deps::static_assertions::assert_impl_all!(OnlineWallet: Sync, Send);