use eyre::bail;
use solana_keypair::{keypair_from_seed, Keypair};
use solana_pubkey::Pubkey;
use solana_signature::Signature;
use solana_signer::Signer;
#[derive(Debug)]
#[allow(unused)]
pub struct TransactionSigner {
keypair: Keypair,
}
#[allow(unused)]
impl TransactionSigner {
pub fn from_private_key(key_b58: &str) -> eyre::Result<Self> {
let key_bytes = bs58::decode(key_b58).into_vec()?;
let keypair = if key_bytes.len() == 64 {
Keypair::try_from(key_bytes.as_slice())
.map_err(|e| eyre::eyre!("invalid 64-byte keypair: {e}"))?
} else if key_bytes.len() >= 32 {
keypair_from_seed(&key_bytes[..32])
.map_err(|e| eyre::eyre!("failed to create keypair from seed: {e}"))?
} else {
bail!(
"private key {} is wrong size (got {} bytes)",
key_b58,
key_bytes.len()
);
};
Ok(Self { keypair })
}
pub fn sign_bytes(&self, message: &[u8]) -> Signature {
self.keypair.sign_message(message)
}
pub fn public_key(&self) -> Pubkey {
self.keypair.pubkey()
}
pub fn public_key_b58(&self) -> String {
self.keypair.pubkey().to_string()
}
}
impl Clone for TransactionSigner {
fn clone(&self) -> Self {
Self {
keypair: self.keypair.insecure_clone(),
}
}
}