use crate::{
BlockCount,
errors::{Error, Result, UsageError},
};
pub const SYSTEM_RESERVE: u64 = 10_000_000_000;
#[derive(Clone, Copy, Default)]
pub(crate) enum WaitType {
WaitFor,
#[default]
WaitUpTo,
}
pub struct Config {
pub wait_up_to: BlockCount,
pub wait_for: BlockCount,
pub mx_lock_duration: BlockCount,
#[cfg(not(feature = "ethexe"))]
pub system_reserve: u64,
pub(crate) wait_type: WaitType,
}
impl Config {
const fn default() -> Self {
Self {
wait_up_to: 100,
wait_for: 100,
mx_lock_duration: 100,
#[cfg(not(feature = "ethexe"))]
system_reserve: SYSTEM_RESERVE,
wait_type: WaitType::WaitUpTo,
}
}
pub(crate) fn wait_type() -> WaitType {
unsafe { CONFIG.wait_type }
}
pub fn wait_for() -> BlockCount {
unsafe { CONFIG.wait_for }
}
pub fn wait_up_to() -> BlockCount {
unsafe { CONFIG.wait_up_to }
}
pub fn mx_lock_duration() -> BlockCount {
unsafe { CONFIG.mx_lock_duration }
}
#[cfg(not(feature = "ethexe"))]
pub fn system_reserve() -> u64 {
unsafe { CONFIG.system_reserve }
}
pub fn set_wait_for(duration: BlockCount) -> Result<()> {
if duration == 0 {
return Err(Error::Gstd(UsageError::EmptyWaitDuration));
}
unsafe { CONFIG.wait_for = duration };
Ok(())
}
pub fn set_default_wait_for(duration: BlockCount) -> Result<()> {
Self::set_wait_for(duration)?;
unsafe { CONFIG.wait_type = WaitType::WaitFor };
Ok(())
}
pub fn set_wait_up_to(duration: BlockCount) -> Result<()> {
if duration == 0 {
return Err(Error::Gstd(UsageError::EmptyWaitDuration));
}
unsafe { CONFIG.wait_up_to = duration };
Ok(())
}
pub fn set_default_wait_up_to(duration: BlockCount) -> Result<()> {
Self::set_wait_up_to(duration)?;
unsafe { CONFIG.wait_type = WaitType::WaitUpTo };
Ok(())
}
pub fn set_mx_lock_duration(duration: BlockCount) -> Result<()> {
if duration == 0 {
return Err(Error::Gstd(UsageError::ZeroMxLockDuration));
}
unsafe { CONFIG.mx_lock_duration = duration };
Ok(())
}
#[cfg(not(feature = "ethexe"))]
pub fn set_system_reserve(amount: u64) -> Result<()> {
if amount == 0 {
return Err(Error::Gstd(UsageError::ZeroSystemReservationAmount));
}
unsafe { CONFIG.system_reserve = amount };
Ok(())
}
}
static mut CONFIG: Config = Config::default();