1use hopr_primitive_types::{
2 balance::{Balance, Currency},
3 prelude::Address,
4};
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub struct DeployedSafe {
9 pub address: Address,
11 pub owner: Address,
13 pub module: Address,
15}
16
17#[derive(Clone, Copy, Debug, PartialEq, Eq)]
19pub enum SafeSelector {
20 Owner(Address),
22 Address(Address),
24}
25
26impl SafeSelector {
27 pub fn satisfies(&self, safe: &DeployedSafe) -> bool {
28 match self {
29 SafeSelector::Owner(owner) => &safe.owner == owner,
30 SafeSelector::Address(address) => &safe.address == address,
31 }
32 }
33}
34
35#[async_trait::async_trait]
37#[auto_impl::auto_impl(&, Box, Arc)]
38pub trait ChainReadSafeOperations {
39 type Error: std::error::Error + Send + Sync + 'static;
40
41 async fn safe_allowance<C: Currency, A: Into<Address> + Send>(
43 &self,
44 safe_address: A,
45 ) -> Result<Balance<C>, Self::Error>;
46 async fn safe_info(&self, selector: SafeSelector) -> Result<Option<DeployedSafe>, Self::Error>;
50 async fn await_safe_deployment(
54 &self,
55 selector: SafeSelector,
56 timeout: std::time::Duration,
57 ) -> Result<DeployedSafe, Self::Error>;
58 async fn predict_module_address(
60 &self,
61 nonce: u64,
62 owner: &Address,
63 safe_address: &Address,
64 ) -> Result<Address, Self::Error>;
65}