use bip0039::Mnemonic;
use libsecp256k1::{PublicKey, SecretKey};
use rand::thread_rng;
pub fn generate_keypair() -> (SecretKey, PublicKey) {
let sk = SecretKey::random(&mut thread_rng());
(sk, PublicKey::from_secret_key(&sk))
}
pub fn to_phrase(sk: SecretKey) -> Result<String, String> {
match Mnemonic::from_entropy(sk.serialize()) {
Ok(res) => Ok(res.to_string()),
Err(err) => return Err(err.to_string()),
}
}
pub fn from_phrase(phrase: String) -> Result<SecretKey, String> {
let sk = match Mnemonic::from_phrase(phrase) {
Ok(res) => res.into_entropy(),
Err(err) => return Err(err.to_string()),
};
match SecretKey::parse_slice(&sk) {
Ok(s) => Ok(s),
Err(err) => return Err(err.to_string()),
}
}
#[cfg(test)]
mod tests {
use super::{from_phrase, generate_keypair, to_phrase};
#[test]
fn mnemomic() -> Result<(), String> {
let (sk, _) = generate_keypair();
let phrase = match to_phrase(sk) {
Ok(res) => res,
Err(err) => return Err(err.to_string()),
};
let recovered_sk = match from_phrase(phrase) {
Ok(res) => res,
Err(err) => return Err(err.to_string()),
};
assert_eq!(sk, recovered_sk);
Ok(())
}
}