Math

Fixed-point arithmetic libraries operating at 1e18 scale — the arithmetic backbone of the Fira protocol.

circle-info

Source: src/fira_bonding/libraries/math/PMath.sol, src/fira_bonding/libraries/math/LogExpMath.sol

PMath

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.

Last updated