use crate::types::{Money, OddsX10000};
#[inline]
fn clamp_i128_to_i64(v: i128) -> i64 {
v.clamp(i64::MIN as i128, i64::MAX as i128) as i64
}
#[inline]
pub fn backer_profit(stake: Money, odds: OddsX10000) -> Money {
let stake_i = stake.0 as i128;
let odds_i = odds.0 as i128;
let profit = (stake_i * (odds_i - 10_000)) / 10_000;
Money(clamp_i128_to_i64(profit))
}
#[inline]
pub fn derived_odds(odds: OddsX10000) -> OddsX10000 {
let o = odds.0 as u64;
if o <= 10_000 {
return OddsX10000(OddsX10000::MAX);
}
let derived = (o * 10_000) / (o - 10_000);
let raw = OddsX10000(derived.min(u32::MAX as u64) as u32);
raw.floor_tick().unwrap_or(OddsX10000(OddsX10000::MAX))
}
#[inline]
pub fn implied_maker_stake_from_taker(taker_stake: Money, trade_price: OddsX10000) -> Money {
let denom = trade_price.0 as i128 - 10_000;
if taker_stake.0 <= 0 || denom <= 0 {
return Money::zero();
}
let v = (taker_stake.0 as i128 * denom) / 10_000;
Money(clamp_i128_to_i64(v))
}
#[inline]
pub fn implied_taker_capacity_from_maker(maker_stake: Money, trade_price: OddsX10000) -> Money {
let denom = trade_price.0 as i128 - 10_000;
if maker_stake.0 <= 0 || denom <= 0 {
return Money::zero();
}
let numerator = maker_stake.0 as i128 * 10_000;
let v = (numerator + denom - 1) / denom;
Money(clamp_i128_to_i64(v))
}