perps-math (perps engine)
and kimia-math (everything else). Both use 9-decimal fixed-point internally
and always round down.
Constants
perps-math
funding
calculate_funding_rate(mark_twap, oracle_twap, oracle_price) → i128calculate_funding_payment(base, funding_delta) → i64update_twap(twap, price, elapsed, period) → u64
margin
calculate_margin_requirement(base, price, margin_ratio) → u64calculate_health(collateral, pnl, maint_req) → i64has_sufficient_initial_margin(...)max_position_size(collateral, price, initial_margin_ratio) → u64calculate_liquidation_price(base, entry, collateral, maint_margin_ratio) → u64
pnl
calculate_unrealized_pnl(base, mark, quote_entry) → i64settle_close(base, quote_entry, close_amount, close_price) → (realized_pnl, new_base, new_quote)
safe_math
All returningOption<T>, no panics:
mul_div_down / mul_div_upapply_bps_down / apply_bps_upbase_to_quote(base, price)normalize_pyth_price(pyth_price, pyth_expo, target_expo)
kimia-math
Fixed-point
mul_fp(a, b) = a · b / ONE, u128 intermediatediv_fp(a, b) = a · ONE / bONE = 1_000_000_000signed_delta(new, old), for yield deltas (negative means no yield)
exp / ln (exp_ln.rs)
ln_fp(x), range-reduced to[0.5, 2.0)via Taylor onz = (x-1)/(x+1)exp_fp(x), range-reduced via powers of 2pow_frac(base, exponent),exp(exponent · ln(base))forexponent ∈ [0, ONE]
insurance
process_positive_funding(funding, skim_bps) → (insurance_skim, vault_yield)process_negative_funding(fund_balance, loss) → (new_balance, uncovered_loss)

