pub mod json;
pub mod key;
pub mod node;
use crate::{
api::config::GearConfig,
keystore::key::Key,
result::{Error, Result},
utils,
};
use lazy_static::lazy_static;
use std::{
fs,
path::{Path, PathBuf},
};
use subxt::{sp_core::sr25519, PairSigner};
lazy_static! {
static ref KEYSTORE_PATH: PathBuf = utils::home().join("keystore");
static ref KEYSTORE_JSON_PATH: PathBuf = utils::home().join("keystore.json");
}
pub fn generate(passwd: Option<&str>) -> Result<PairSigner<GearConfig, sr25519::Pair>> {
let pair = Key::generate_with_phrase::<sr25519::Pair>(passwd)?;
fs::write(&*KEYSTORE_PATH, pair.1)?;
Ok(pair.0)
}
pub fn login(suri: &str, passwd: Option<&str>) -> Result<PairSigner<GearConfig, sr25519::Pair>> {
let pair = Key::from_string(suri).pair::<sr25519::Pair>(passwd)?;
fs::write(&*KEYSTORE_PATH, suri)?;
Ok(pair.0)
}
pub fn cache(passwd: Option<&str>) -> Result<PairSigner<GearConfig, sr25519::Pair>> {
let pair = if (*KEYSTORE_PATH).exists() {
let suri = fs::read_to_string(&*KEYSTORE_PATH).map_err(|_| Error::Logout)?;
Key::from_string(&suri).pair::<sr25519::Pair>(passwd)?.0
} else if (*KEYSTORE_JSON_PATH).exists() {
decode_json_file(&*KEYSTORE_JSON_PATH, passwd)?
} else {
return Err(Error::Logout);
};
Ok(pair)
}
pub fn keyring(passwd: Option<&str>) -> Result<PairSigner<GearConfig, sr25519::Pair>> {
Ok(Key::from_keyring()?.pair::<sr25519::Pair>(passwd)?.0)
}
pub fn decode_json_file(
path: impl AsRef<Path>,
passphrase: Option<&str>,
) -> Result<PairSigner<GearConfig, sr25519::Pair>> {
let encrypted = serde_json::from_slice::<json::Encrypted>(&fs::read(&path)?)?;
let pair = encrypted.create(passphrase.ok_or(Error::InvalidPassword)?)?;
fs::copy(path, &*KEYSTORE_JSON_PATH)?;
Ok(PairSigner::new(pair))
}