lighter_rust/client/
signer_client.rs

1use crate::client::ApiClient;
2use crate::error::Result;
3use crate::nonce::NonceManager;
4use crate::signers::{EthereumSigner, Signer};
5use std::sync::Arc;
6
7#[derive(Debug)]
8pub struct SignerClient {
9    api_client: ApiClient,
10    signer: Arc<dyn Signer + Send + Sync>,
11    nonce_manager: Arc<NonceManager>,
12}
13
14impl SignerClient {
15    pub fn new(api_client: ApiClient, signer: Arc<dyn Signer + Send + Sync>) -> Self {
16        Self {
17            api_client,
18            signer,
19            nonce_manager: Arc::new(NonceManager::new()),
20        }
21    }
22
23    pub fn with_ethereum_signer(api_client: ApiClient, private_key: &str) -> Result<Self> {
24        let ethereum_signer = EthereumSigner::from_private_key(private_key)?;
25        let signer: Arc<dyn Signer + Send + Sync> = Arc::new(ethereum_signer);
26
27        Ok(Self::new(api_client, signer))
28    }
29
30    pub fn api_client(&self) -> &ApiClient {
31        &self.api_client
32    }
33
34    pub fn signer(&self) -> &Arc<dyn Signer + Send + Sync> {
35        &self.signer
36    }
37
38    pub fn generate_nonce(&self) -> Result<u64> {
39        self.nonce_manager.generate()
40    }
41
42    pub fn get_address(&self) -> Result<String> {
43        self.signer.get_address()
44    }
45}
46
47impl Clone for SignerClient {
48    fn clone(&self) -> Self {
49        Self {
50            api_client: self.api_client.clone(),
51            signer: self.signer.clone(),
52            nonce_manager: self.nonce_manager.clone(),
53        }
54    }
55}