use anyhow::anyhow;
use parity_scale_codec::Encode;
use sc_keystore::LocalKeystore;
use sp_core::{
crypto::Pair as PairT,
sr25519::{Pair, Public, Signature},
H256,
};
use sp_keystore::Keystore;
use sp_runtime::KeyTypeId;
use std::path::Path;
const KEY_TYPE: KeyTypeId = KeyTypeId(*b"_tux");
pub const SHAWN_PHRASE: &str =
"news slush supreme milk chapter athlete soap sausage put clutch what kitten";
pub const SHAWN_PUB_KEY: &str = "d2bf4b844dfefd6772a8843e669f943408966a977e3ae2af1dd78e0f55f4df67";
pub fn insert_development_key_for_this_session(keystore: &LocalKeystore) -> anyhow::Result<()> {
keystore.sr25519_generate_new(KEY_TYPE, Some(SHAWN_PHRASE))?;
Ok(())
}
pub fn sign_with(
keystore: &LocalKeystore,
public: &Public,
message: &[u8],
) -> anyhow::Result<Signature> {
keystore
.sr25519_sign(KEY_TYPE, public, message)?
.ok_or(anyhow!("Key doesn't exist in keystore"))
}
pub fn insert_key(keystore: &LocalKeystore, seed: &str) -> anyhow::Result<()> {
let public_key = Pair::from_phrase(seed, None)?.0.public();
println!("The generated public key is {:?}", public_key);
keystore
.insert(KEY_TYPE, seed, public_key.as_ref())
.map_err(|()| anyhow!("Error inserting key"))?;
Ok(())
}
pub fn generate_key(keystore: &LocalKeystore, password: Option<String>) -> anyhow::Result<()> {
let (pair, phrase, _) = Pair::generate_with_phrase(password.as_deref());
println!("Generated public key is {:?}", pair.public());
println!("Generated Phrase is {}", phrase);
keystore
.insert(KEY_TYPE, phrase.as_ref(), pair.public().as_ref())
.map_err(|()| anyhow!("Error inserting key"))?;
Ok(())
}
pub fn has_key(keystore: &LocalKeystore, pubkey: &H256) -> bool {
keystore.has_keys(&[(pubkey.encode(), KEY_TYPE)])
}
pub fn get_keys(keystore: &LocalKeystore) -> anyhow::Result<impl Iterator<Item = Vec<u8>>> {
Ok(keystore.keys(KEY_TYPE)?.into_iter())
}
pub fn remove_key(keystore_path: &Path, pub_key: &H256) -> anyhow::Result<()> {
let filename = format!("{}{}", hex::encode(KEY_TYPE.0), hex::encode(pub_key.0));
let path = keystore_path.join(filename);
std::fs::remove_file(path)?;
Ok(())
}