eas_sdk_rs/
client.rs

1use std::sync::Arc;
2
3use ethers::providers::Middleware;
4
5use crate::eas::EAS;
6use crate::schema_registry::SchemaRegistry;
7
8use crate::contracts::eas::EAS as EasContract;
9use crate::contracts::schema_registry::SchemaRegistry as SchemaRegistryContract;
10
11use ethers::core::k256::ecdsa::SigningKey;
12
13use ethers::prelude::*;
14
15pub struct Client<M: Middleware> {
16    pub eas: EAS<M>,
17    pub schema_registry: SchemaRegistry<M>,
18}
19
20impl<M: Middleware + 'static> Client<M> {
21    pub async fn new_with_middleware<T: Into<::ethers::core::types::Address>>(
22        eas_contract_address: T,
23        middlewhare: Arc<M>,
24        schema_contract_address: Option<T>,
25    ) -> Result<Self, Box<dyn std::error::Error>> {
26        let eas_contract = EasContract::new(eas_contract_address, middlewhare.clone());
27
28        let schema = match schema_contract_address {
29            Some(address) => address.into(),
30            None => eas_contract.get_schema_registry().call().await?,
31        };
32
33        let schema = SchemaRegistryContract::new(schema, middlewhare.clone());
34
35        Ok(Self {
36            eas: EAS::new(eas_contract),
37            schema_registry: SchemaRegistry::new(schema),
38        })
39    }
40}
41
42impl Client<SignerMiddleware<Provider<Http>, Wallet<SigningKey>>> {
43    pub async fn new<T: Into<::ethers::core::types::Address>>(
44        endpoint: &str,
45        eas_contract_address: T,
46        schema_contract_address: Option<T>,
47        signing_key: SigningKey,
48    ) -> Result<Self, Box<dyn std::error::Error>> {
49        let provider = Provider::<Http>::try_from(endpoint)?;
50        let chain_id = provider.get_chainid().await?.as_u64();
51
52        let wallet = Wallet::from(signing_key).with_chain_id(chain_id);
53        let client = Arc::new(SignerMiddleware::new(provider, wallet));
54
55        Client::new_with_middleware(eas_contract_address, client, schema_contract_address).await
56    }
57}