use hopper_runtime::{error::ProgramError, ProgramResult};
#[inline(always)]
pub fn check_slippage(actual_output: u64, minimum_output: u64) -> ProgramResult {
if actual_output < minimum_output {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}
#[inline(always)]
pub fn check_max_input(actual_input: u64, maximum_input: u64) -> ProgramResult {
if actual_input > maximum_input {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}
#[inline(always)]
pub fn check_min_amount(amount: u64, minimum: u64) -> ProgramResult {
if amount < minimum {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}
#[inline(always)]
pub fn check_max_amount(amount: u64, maximum: u64) -> ProgramResult {
if amount > maximum {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}
#[inline(always)]
pub fn check_nonzero(amount: u64) -> ProgramResult {
if amount == 0 {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}
#[inline(always)]
pub fn check_within_bps(actual: u64, expected: u64, tolerance_bps: u16) -> ProgramResult {
if expected == 0 {
return if actual == 0 {
Ok(())
} else {
Err(ProgramError::InvalidArgument)
};
}
let (larger, smaller) = if actual >= expected {
(actual as u128, expected as u128)
} else {
(expected as u128, actual as u128)
};
let diff = larger - smaller;
let deviation_bps = (diff * 10_000) / (expected as u128);
if deviation_bps > tolerance_bps as u128 {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}
#[inline(always)]
pub fn check_price_bounds(price: u64, min_price: u64, max_price: u64) -> ProgramResult {
if price < min_price || price > max_price {
return Err(ProgramError::InvalidArgument);
}
Ok(())
}