gmsol/utils/
signer.rs

1use std::{rc::Rc, sync::Arc};
2
3use anchor_client::solana_sdk::{self, pubkey::Pubkey, signer::Signer};
4
5/// Dyn signer.
6pub 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
33/// Shared Signer.
34pub type SignerRef = Arc<DynSigner>;
35
36/// Create a new shared signer.
37pub fn shared_signer(signer: impl Signer + Send + Sync + 'static) -> SignerRef {
38    SignerRef::new(DynSigner(Box::new(signer)))
39}
40
41/// Local dyn signer.
42pub 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
69/// Local Signer.
70pub type LocalSignerRef = Rc<LocalDynSigner>;
71
72/// Create a new local signer.
73pub fn local_signer(signer: impl Signer + 'static) -> LocalSignerRef {
74    LocalSignerRef::new(LocalDynSigner(Box::new(signer)))
75}