use futures::future::BoxFuture;
use hopr_types::primitive::{
balance::{Balance, Currency},
prelude::{Address, HoprBalance},
};
use crate::chain::ChainReceipt;
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeployedSafe {
pub address: Address,
pub owners: Vec<Address>,
pub module: Address,
pub registered_nodes: Vec<Address>,
pub deployer: Address,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SafeSelector {
Address(Address),
Deployer(Address),
NodeAddress(Address),
Owner(Address),
}
impl SafeSelector {
pub fn satisfies(&self, safe: &DeployedSafe) -> bool {
match self {
SafeSelector::Address(address) => &safe.address == address,
SafeSelector::Deployer(deployer) => &safe.deployer == deployer,
SafeSelector::NodeAddress(node_address) => safe.registered_nodes.contains(node_address),
SafeSelector::Owner(owner) => safe.owners.contains(owner),
}
}
}
#[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>;
}