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()}") 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);