1#![allow(async_fn_in_trait)]
2
3use anyhow::Result;
4
5use solana_client_wasm::WasmClient as RpcClient;
6use solana_sdk::{pubkey::Pubkey, signature::Signature, transaction::Transaction};
7use std::sync::Arc;
8
9use crate::core::{
10 error::WalletError, transaction::TransactionOrVersionedTransaction, wallet::WalletReadyState,
11};
12
13pub trait WalletAdapterEvents {
14 fn emit_connect(&mut self, public_key: Pubkey);
15 fn emit_disconnect(&mut self);
16 fn emit_error(&mut self, error: WalletError);
17 fn ready_state_change(&mut self, ready_state: WalletReadyState);
18 fn emit_transaction_sent(&mut self, signature: Signature);
19}
20
21pub trait WalletAdapter: WalletAdapterEvents + Send + Sync {
22 fn name(&self) -> String;
23 fn url(&self) -> String;
24 fn icon(&self) -> String;
25 fn ready_state(&self) -> WalletReadyState;
26 fn public_key(&self) -> Option<Pubkey>;
27 fn connecting(&self) -> bool;
28 fn connected(&self) -> bool {
29 self.public_key().is_some()
30 }
31 async fn auto_connect(&mut self) -> Result<bool, WalletError>;
32 async fn connect(&mut self) -> Result<bool, WalletError>;
33 async fn disconnect(&mut self) -> Result<bool, WalletError>;
34 async fn send_transaction(
35 &mut self,
36 client: Arc<RpcClient>,
37 transaction: TransactionOrVersionedTransaction,
38 ) -> Result<Signature, WalletError>;
39 async fn sign_transaction(
40 &mut self,
41 transaction: Transaction,
42 ) -> Result<Signature, WalletError>;
43 async fn sign_send_transaction(
44 &mut self,
45 transaction: Transaction,
46 ) -> Result<Signature, WalletError>;
47 async fn sign_message(&mut self, message: &str) -> Result<Signature, WalletError>;
48}
49
50pub trait SignerWalletAdapter: WalletAdapter {
51 async fn sign_transaction(&self, transaction: &mut Transaction) -> Result<()>;
52
53 async fn sign_all_transactions(&self, transactions: &mut [Transaction]) -> Result<()>;
54}
55
56pub trait MessageSignerWalletAdapter: SignerWalletAdapter {
57 async fn sign_message(&self, message: &[u8]) -> Result<Vec<u8>>;
58}
59
60pub trait SignInMessageSignerWalletAdapter: MessageSignerWalletAdapter {
61 async fn sign_in(&self) -> Result<()>;
62}