1use std::{rc::Rc, sync::Arc};
2
3use anchor_client::solana_sdk::{self, pubkey::Pubkey, signer::Signer};
4
5pub struct DynSigner(Box<dyn Signer + Send + Sync>);
7
8impl Signer for DynSigner {
9 fn pubkey(&self) -> Pubkey {
10 self.0.pubkey()
11 }
12
13 fn try_pubkey(&self) -> Result<Pubkey, solana_sdk::signer::SignerError> {
14 self.0.try_pubkey()
15 }
16
17 fn sign_message(&self, message: &[u8]) -> solana_sdk::signature::Signature {
18 self.0.sign_message(message)
19 }
20
21 fn try_sign_message(
22 &self,
23 message: &[u8],
24 ) -> Result<solana_sdk::signature::Signature, solana_sdk::signer::SignerError> {
25 self.0.try_sign_message(message)
26 }
27
28 fn is_interactive(&self) -> bool {
29 self.0.is_interactive()
30 }
31}
32
33pub type SignerRef = Arc<DynSigner>;
35
36pub fn shared_signer(signer: impl Signer + Send + Sync + 'static) -> SignerRef {
38 SignerRef::new(DynSigner(Box::new(signer)))
39}
40
41pub struct LocalDynSigner(Box<dyn Signer>);
43
44impl Signer for LocalDynSigner {
45 fn pubkey(&self) -> Pubkey {
46 self.0.pubkey()
47 }
48
49 fn try_pubkey(&self) -> Result<Pubkey, solana_sdk::signer::SignerError> {
50 self.0.try_pubkey()
51 }
52
53 fn sign_message(&self, message: &[u8]) -> solana_sdk::signature::Signature {
54 self.0.sign_message(message)
55 }
56
57 fn try_sign_message(
58 &self,
59 message: &[u8],
60 ) -> Result<solana_sdk::signature::Signature, solana_sdk::signer::SignerError> {
61 self.0.try_sign_message(message)
62 }
63
64 fn is_interactive(&self) -> bool {
65 self.0.is_interactive()
66 }
67}
68
69pub type LocalSignerRef = Rc<LocalDynSigner>;
71
72pub fn local_signer(signer: impl Signer + 'static) -> LocalSignerRef {
74 LocalSignerRef::new(LocalDynSigner(Box::new(signer)))
75}