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}