use crate::client::error::ClientError;
use cosmrs::crypto::secp256k1;
use cosmrs::{bip32, AccountId};
const DERVIATION_PATH: &str = "m/44'/118'/0'/0/0";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SigningKey {
pub name: String,
pub key: Key,
}
impl SigningKey {
pub fn to_account(&self, prefix: &str) -> Result<AccountId, ClientError> {
let key: secp256k1::SigningKey = self.try_into()?;
let account = key
.public_key()
.account_id(prefix)
.map_err(ClientError::crypto)?;
Ok(account)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Key {
Mnemonic(String),
}
impl TryFrom<&SigningKey> for secp256k1::SigningKey {
type Error = ClientError;
fn try_from(signer: &SigningKey) -> Result<secp256k1::SigningKey, ClientError> {
match &signer.key {
Key::Mnemonic(phrase) => {
let seed = bip32::Mnemonic::new(phrase, bip32::Language::English)
.map_err(|_| ClientError::Mnemonic)?
.to_seed("");
Ok(
bip32::XPrv::derive_from_path(seed, &DERVIATION_PATH.parse().unwrap())
.map_err(|_| ClientError::DerviationPath)?
.into(),
)
}
}
}
}