Merge pull request #29 from notmandatory/allow-restoring-extended-key-from-mnemonic

Allow restoring extended key from mnemonic
This commit is contained in:
Sudarsan Balaji 2021-10-21 14:45:11 +05:30 committed by GitHub
commit cda099a2f2
3 changed files with 27 additions and 2 deletions

View File

@ -44,8 +44,15 @@ val unconfirmedFirstThenByTimestampDescending =
@ExperimentalUnsignedTypes
fun main(args: Array<String>) {
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<String>) {
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()}")

View File

@ -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]

View File

@ -288,5 +288,21 @@ fn generate_extended_key(
})
}
fn restore_extended_key(
network: Network,
mnemonic: String,
password: Option<String>,
) -> Result<ExtendedKeyInfo, Error> {
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);