use subxt_signer::sr25519::Keypair;
#[derive(Clone)]
pub struct WalletSigner {
inner: Keypair,
}
impl WalletSigner {
pub fn new(keypair: Keypair) -> Self {
Self { inner: keypair }
}
pub fn from_sp_core_pair(pair: sp_core::sr25519::Pair) -> Self {
use sp_core::Pair;
let seed = pair.to_raw_vec();
let keypair = Keypair::from_secret_key(seed[..32].try_into().unwrap())
.expect("Valid 32-byte seed");
Self { inner: keypair }
}
pub fn from_seed(seed: &str) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {
use subxt_signer::SecretUri;
let uri: SecretUri = seed.parse()?;
let keypair = Keypair::from_uri(&uri)?;
Ok(Self { inner: keypair })
}
pub fn keypair(&self) -> &Keypair {
&self.inner
}
pub fn public_key(&self) -> [u8; 32] {
self.inner.public_key().0
}
}
impl std::fmt::Debug for WalletSigner {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WalletSigner")
.field("public_key", &hex::encode(self.public_key()))
.finish()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_signer_from_uri() {
let signer = WalletSigner::from_seed("//Alice").unwrap();
assert!(!signer.public_key().iter().all(|&b| b == 0));
}
#[test]
fn test_signer_debug() {
let signer = WalletSigner::from_seed("//Alice").unwrap();
let debug_str = format!("{:?}", signer);
assert!(debug_str.contains("WalletSigner"));
assert!(debug_str.contains("public_key"));
}
}