bulk_client/transaction/
signer.rs1use eyre::bail;
2use solana_keypair::{keypair_from_seed, Keypair};
3use solana_pubkey::Pubkey;
4
5use solana_signature::Signature;
6use solana_signer::Signer;
7
8#[derive(Debug)]
18#[allow(unused)]
19pub struct TransactionSigner {
20 keypair: Keypair,
21}
22
23#[allow(unused)]
24impl TransactionSigner {
25 pub fn from_private_key(key_b58: &str) -> eyre::Result<Self> {
30 let key_bytes = bs58::decode(key_b58).into_vec()?;
31
32 let keypair = if key_bytes.len() == 64 {
33 Keypair::try_from(key_bytes.as_slice())
35 .map_err(|e| eyre::eyre!("invalid 64-byte keypair: {e}"))?
36 } else if key_bytes.len() >= 32 {
37 keypair_from_seed(&key_bytes[..32])
39 .map_err(|e| eyre::eyre!("failed to create keypair from seed: {e}"))?
40 } else {
41 bail!(
42 "private key {} is wrong size (got {} bytes)",
43 key_b58,
44 key_bytes.len()
45 );
46 };
47
48 Ok(Self { keypair })
49 }
50
51 pub fn sign_bytes(&self, message: &[u8]) -> Signature {
57 self.keypair.sign_message(message)
58 }
59
60 pub fn public_key(&self) -> Pubkey {
62 self.keypair.pubkey()
63 }
64
65 pub fn public_key_b58(&self) -> String {
67 self.keypair.pubkey().to_string()
68 }
69}
70
71impl Clone for TransactionSigner {
72 fn clone(&self) -> Self {
73 Self {
74 keypair: self.keypair.insecure_clone(),
75 }
76 }
77}