From 852f7a64680ce97ff0d6d6a940d6833378647e47 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 21 Oct 2021 14:40:26 +0530 Subject: [PATCH 1/2] Allow restoring extended keys from mnemonic --- src/bdk.udl | 2 ++ src/lib.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/bdk.udl b/src/bdk.udl index d183e43..e830577 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -1,6 +1,8 @@ namespace bdk { [Throws=BdkError] ExtendedKeyInfo generate_extended_key(Network network, MnemonicType mnemonicType, string? password); + [Throws=BdkError] + ExtendedKeyInfo restore_extended_key(Network network, string mnemonic, string? password); }; [Error] diff --git a/src/lib.rs b/src/lib.rs index 8d26c70..8364ecf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -288,5 +288,21 @@ fn generate_extended_key( }) } +fn restore_extended_key( + network: Network, + mnemonic: String, + password: Option, +) -> Result { + let mnemonic = Mnemonic::from_phrase(mnemonic.as_ref(), Language::English).unwrap(); + 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); From 3b9df0d1109f2329e89363ddd7d6e1e13598c385 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 21 Oct 2021 14:44:29 +0530 Subject: [PATCH 2/2] Ensure restoration of extended key from mnemonic --- bindings/bdk-kotlin/demo/src/main/kotlin/Main.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bindings/bdk-kotlin/demo/src/main/kotlin/Main.kt b/bindings/bdk-kotlin/demo/src/main/kotlin/Main.kt index 115c67e..ef6d335 100644 --- a/bindings/bdk-kotlin/demo/src/main/kotlin/Main.kt +++ b/bindings/bdk-kotlin/demo/src/main/kotlin/Main.kt @@ -44,8 +44,15 @@ val unconfirmedFirstThenByTimestampDescending = @ExperimentalUnsignedTypes fun main(args: Array) { + val network = Network.TESTNET + val mnemonicType = MnemonicType.WORDS12 + val password: String? = null println("Generating key...") - println("${generateExtendedKey(Network.TESTNET, MnemonicType.WORDS12, null)}") + val extendedKey = generateExtendedKey(network, mnemonicType, password) + println("generated key: $extendedKey") + println("Attempting restore extended key...") + val restoredKey = restoreExtendedKey(network, extendedKey.mnemonic, password) + println("restored key: $restoredKey") println("Configuring an in-memory wallet on electrum..") val descriptor = "wpkh(tprv8ZgxMBicQKsPeSitUfdxhsVaf4BXAASVAbHypn2jnPcjmQZvqZYkeqx7EHQTWvdubTSDa5ben7zHC7sUsx4d8tbTvWdUtHzR8uhHg2CW7MT/*)" val amount = 1000uL @@ -55,7 +62,7 @@ fun main(args: Array) { BlockchainConfig.Electrum( ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5u, null, 10u) ) - val wallet = OnlineWallet(descriptor, Network.TESTNET, db, client) + val wallet = OnlineWallet(descriptor, network, db, client) wallet.sync(LogProgress(), null) println("Initial wallet balance: ${wallet.getBalance()}") println("Please send $amount satoshis to address: ${wallet.getNewAddress()}")