1use futures::future::BoxFuture;
2use hopr_primitive_types::{
3 balance::{Balance, Currency},
4 prelude::{Address, HoprBalance},
5};
6
7use crate::chain::ChainReceipt;
8
9#[derive(Clone, Debug, PartialEq, Eq)]
11pub struct DeployedSafe {
12 pub address: Address,
14 pub owner: Address,
16 pub module: Address,
18 pub registered_nodes: Vec<Address>,
20}
21
22#[derive(Clone, Copy, Debug, PartialEq, Eq)]
24pub enum SafeSelector {
25 Owner(Address),
27 Address(Address),
29}
30
31impl SafeSelector {
32 pub fn satisfies(&self, safe: &DeployedSafe) -> bool {
33 match self {
34 SafeSelector::Owner(owner) => &safe.owner == owner,
35 SafeSelector::Address(address) => &safe.address == address,
36 }
37 }
38}
39
40#[async_trait::async_trait]
42#[auto_impl::auto_impl(&, Box, Arc)]
43pub trait ChainReadSafeOperations {
44 type Error: std::error::Error + Send + Sync + 'static;
45
46 async fn safe_allowance<C: Currency, A: Into<Address> + Send>(
48 &self,
49 safe_address: A,
50 ) -> Result<Balance<C>, Self::Error>;
51 async fn safe_info(&self, selector: SafeSelector) -> Result<Option<DeployedSafe>, Self::Error>;
55 async fn await_safe_deployment(
59 &self,
60 selector: SafeSelector,
61 timeout: std::time::Duration,
62 ) -> Result<DeployedSafe, Self::Error>;
63 async fn predict_module_address(
65 &self,
66 nonce: u64,
67 owner: &Address,
68 safe_address: &Address,
69 ) -> Result<Address, Self::Error>;
70}
71
72#[async_trait::async_trait]
74#[auto_impl::auto_impl(&, Box, Arc)]
75pub trait ChainWriteSafeOperations {
76 type Error: std::error::Error + Send + Sync + 'static;
77
78 async fn deploy_safe<'a>(
83 &'a self,
84 balance: HoprBalance,
85 ) -> Result<BoxFuture<'a, Result<ChainReceipt, Self::Error>>, Self::Error>;
86}