use hopper_runtime::{AccountView, Address, LayoutContract, ProgramError, ProgramResult};
#[inline(always)]
pub fn require(cond: bool, err: ProgramError) -> ProgramResult {
if cond {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_eq<T: PartialEq>(a: T, b: T, err: ProgramError) -> ProgramResult {
if a == b {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_neq<T: PartialEq>(a: T, b: T, err: ProgramError) -> ProgramResult {
if a != b {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_gte<T: PartialOrd>(a: T, b: T, err: ProgramError) -> ProgramResult {
if a >= b {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_gt<T: PartialOrd>(a: T, b: T, err: ProgramError) -> ProgramResult {
if a > b {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_signer(account: &AccountView) -> ProgramResult {
account.require_signer()
}
#[inline(always)]
pub fn require_writable(account: &AccountView) -> ProgramResult {
account.require_writable()
}
#[inline(always)]
pub fn require_payer(account: &AccountView) -> ProgramResult {
account.require_payer()
}
#[inline(always)]
pub fn require_owner(account: &AccountView, owner: &Address) -> ProgramResult {
account.require_owned_by(owner)
}
#[inline(always)]
pub fn require_address(account: &AccountView, expected: &Address) -> ProgramResult {
if hopper_runtime::address::address_eq(account.address(), expected) {
Ok(())
} else {
Err(ProgramError::InvalidArgument)
}
}
#[inline(always)]
pub fn require_keys_eq(a: &Address, b: &Address, err: ProgramError) -> ProgramResult {
if hopper_runtime::address::address_eq(a, b) {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_keys_neq(a: &Address, b: &Address, err: ProgramError) -> ProgramResult {
if !hopper_runtime::address::address_eq(a, b) {
Ok(())
} else {
Err(err)
}
}
#[inline(always)]
pub fn require_disc(account: &AccountView, expected: u8) -> ProgramResult {
account.require_disc(expected)
}
#[inline(always)]
pub fn require_layout<T: LayoutContract>(account: &AccountView) -> ProgramResult {
account.check_layout::<T>().map(|_| ())
}
#[inline(always)]
pub fn require_has_data(account: &AccountView) -> ProgramResult {
if !account.is_data_empty() {
Ok(())
} else {
Err(ProgramError::AccountDataTooSmall)
}
}
#[inline(always)]
pub fn require_data_len(account: &AccountView, min_len: usize) -> ProgramResult {
if account.data_len() >= min_len {
Ok(())
} else {
Err(ProgramError::AccountDataTooSmall)
}
}
#[inline(always)]
pub fn require_unique_2(a: &AccountView, b: &AccountView) -> ProgramResult {
if hopper_runtime::address::address_eq(a.address(), b.address()) {
Err(ProgramError::InvalidArgument)
} else {
Ok(())
}
}
#[inline(always)]
pub fn require_version<T: LayoutContract>(account: &AccountView) -> ProgramResult {
account.check_version(T::VERSION).map(|_| ())
}
#[inline(always)]
pub fn require_unique_3(a: &AccountView, b: &AccountView, c: &AccountView) -> ProgramResult {
require_unique_2(a, b)?;
require_unique_2(a, c)?;
require_unique_2(b, c)
}