Core fixed-point math used throughout the protocol. Constants: ONE = 1e18, IONE = int256(1e18).
Key operations
Function
Description
Rounding
mulDown(a, b)
(a × b) / 1e18
Toward zero (conservative for user)
divDown(a, b)
(a × 1e18) / b
Toward zero
rawDivUp(a, b)
(a + b - 1) / b
Up (conservative for protocol)
abs(a)
Absolute value of int256
—
neg(a)
Negation (BT/FW flows are signed)
—
subNoNeg(a, b)
a - b, reverts if negative
—
sqrt(x)
Babylonian method integer square root
—
Int() / Uint()
Safe int256 ↔ uint256 casting
—
Int128() / Uint96()
Narrowing casts for storage packing
—
LogExpMath
Ported from Balancer's math library. Implements ln(x) and exp(x) for signed 256-bit integers at 1e18 scale.
Usage in the protocol
exp(x) — Converts between implied rates and exchange rates: exchangeRate = exp(lnImpliedRate × timeToExpiry / YEAR)
ln(x) — After computing a post-trade exchange rate, converts back to log-space implied rate for storage and TWAP tracking
Both functions use lookup tables and polynomial approximations. They revert on out-of-bounds inputs (e.g., ln(0) or overflow in exp). Precision is critical — rounding errors in exp compound over many trades and could allow arbitrage.