use bip32::{XPrv, XPub};
use crate::{box_seed, generate_boxed_seed_bytes, get_derivation_path, parse_mnemonic};
#[derive(Clone, Debug)]
pub struct HDWallet {
seed: Box<[u8]>,
}
impl HDWallet {
pub fn new() -> Self {
HDWallet {
seed: generate_boxed_seed_bytes(),
}
}
pub fn from_bytes(seed: &[u8]) -> Result<Self, String> {
Ok(HDWallet {
seed: Box::from(seed),
})
}
pub fn from_mnemonic_str(mnemonic: &str) -> Result<Self, String> {
let seed = parse_mnemonic(mnemonic.to_string())?.to_seed("");
Ok(HDWallet {
seed: box_seed(&seed),
})
}
pub fn private_key_at_path(
&self,
account: usize,
change: usize,
index: usize,
) -> Result<XPrv, String> {
match XPrv::derive_from_path(&self.seed, &get_derivation_path(account, change, index)?) {
Ok(private_key) => Ok(private_key),
Err(e) => Err(e.to_string()),
}
}
pub fn public_key_at_path(
&self,
account: usize,
change: usize,
index: usize,
) -> Result<XPub, String> {
match XPrv::derive_from_path(&self.seed, &get_derivation_path(account, change, index)?) {
Ok(private_key) => Ok(private_key.public_key()),
Err(e) => Err(e.to_string()),
}
}
pub fn keypair_at_path(
&self,
account: usize,
change: usize,
index: usize,
) -> Result<(XPrv, XPub), String> {
match XPrv::derive_from_path(&self.seed, &get_derivation_path(account, change, index)?) {
Ok(private_key) => Ok((private_key.clone(), private_key.public_key())),
Err(e) => Err(e.to_string()),
}
}
pub fn to_bytes(&self) -> &[u8] {
&self.seed
}
}