use solana_keypair::Keypair;
use solana_pubkey::Pubkey;
use solana_signer::Signer;
use crate::WalletError;
use crate::WalletResult;
use crate::WalletSolanaSignAndSendTransaction;
use crate::WalletSolanaSignIn;
use crate::WalletSolanaSignMessage;
use crate::WalletSolanaSignTransaction;
use crate::WalletStandard;
pub trait WalletSolanaPubkey {
fn try_solana_pubkey(&self) -> WalletResult<Pubkey>;
fn solana_pubkey(&self) -> Pubkey {
self.try_solana_pubkey().unwrap_or_default()
}
}
impl WalletSolanaPubkey for Keypair {
fn try_solana_pubkey(&self) -> WalletResult<Pubkey> {
let pubkey = Signer::try_pubkey(self)?;
Ok(pubkey)
}
}
impl<T> WalletSolanaPubkey for T
where
T: WalletSolana,
{
fn try_solana_pubkey(&self) -> WalletResult<Pubkey> {
self.try_public_key()
.ok_or(WalletError::WalletNotConnected)
.and_then(|bytes| Pubkey::try_from(bytes).map_err(|_| WalletError::WalletPublicKey))
}
}
pub trait WalletSolana:
WalletSolanaSignMessage
+ WalletSolanaSignTransaction
+ WalletSolanaSignAndSendTransaction
+ WalletSolanaSignIn
+ WalletStandard
{
}
impl<T> WalletSolana for T where
T: WalletSolanaSignMessage
+ WalletSolanaSignTransaction
+ WalletSolanaSignAndSendTransaction
+ WalletSolanaSignIn
+ WalletStandard
{
}