use futures::future::BoxFuture;
use hopr_types::primitive::{
balance::{Balance, Currency},
prelude::{Address, HoprBalance},
};
use crate::chain::ChainReceipt;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DeployedSafe {
pub address: Address,
pub owner: Address,
pub module: Address,
pub registered_nodes: Vec<Address>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SafeSelector {
Owner(Address),
Address(Address),
}
impl SafeSelector {
pub fn satisfies(&self, safe: &DeployedSafe) -> bool {
match self {
SafeSelector::Owner(owner) => &safe.owner == owner,
SafeSelector::Address(address) => &safe.address == address,
}
}
}
#[async_trait::async_trait]
#[auto_impl::auto_impl(&, Box, Arc)]
pub trait ChainReadSafeOperations {
type Error: std::error::Error + Send + Sync + 'static;
async fn safe_allowance<C: Currency, A: Into<Address> + Send>(
&self,
safe_address: A,
) -> Result<Balance<C>, Self::Error>;
async fn safe_info(&self, selector: SafeSelector) -> Result<Option<DeployedSafe>, Self::Error>;
async fn await_safe_deployment(
&self,
selector: SafeSelector,
timeout: std::time::Duration,
) -> Result<DeployedSafe, Self::Error>;
async fn predict_module_address(
&self,
nonce: u64,
owner: &Address,
safe_address: &Address,
) -> Result<Address, Self::Error>;
}
#[async_trait::async_trait]
#[auto_impl::auto_impl(&, Box, Arc)]
pub trait ChainWriteSafeOperations {
type Error: std::error::Error + Send + Sync + 'static;
async fn deploy_safe<'a>(
&'a self,
balance: HoprBalance,
) -> Result<BoxFuture<'a, Result<ChainReceipt, Self::Error>>, Self::Error>;
}