Zero Latency Labs lists USDC-quoted perpetual futures. Every market is one perp
per asset, quoted in USDC, with no expiry or settlement date. The catch on the wire:
the API never accepts decimals, so you convert every human price or size into a raw
integer first.
Every price, quantity, and cash amount is a raw integer at a fixed scale. Send a
human number (for example 50000 for a 50,000 USDC BTC price) instead of the scaled
integer and you are wrong by a factor of billions — the single most common integration
error. Build the wire integer yourself: multiply by the scale, then floor.
Markets
Markets use the symbol format `<ASSET>-PERP`. There are six perpetual markets,
all quoted in USDC:
| Symbol | Base asset | Quote |
|---|
BTC-PERP | BTC | USDC |
ETH-PERP | ETH | USDC |
SOL-PERP | SOL | USDC |
XRP-PERP | XRP | USDC |
UNI-PERP | UNI | USDC |
AAVE-PERP | AAVE | USDC |
These are perpetual futures, so there is no expiry or settlement date. The order-level
expiry field is time-in-force, not a contract expiry.
The three units
Three integer scales cover everything on the wire. All amounts are denominated in
USDC, the collateral and quote asset.
| Unit | Field | Scale | Used for |
|---|
| CentiCents | cash size | 10⁻⁴ USDC (1 = 0.0001 USDC) | cash balances, deposits, withdrawals, transfers, fees, notional |
| PriceOfAtom | order price | 10⁻¹⁶ USDC per atom | limit order price |
| Atoms | order quantity | the asset’s smallest unit | order size |
An atom is the smallest size unit of an asset. Each asset has its own number of
atoms per whole unit (see Atoms per unit). The bridge between the
size and cash scales is a fixed constant: 10¹². Notional in 10⁻¹⁶ USDC
(= price × quantity) divided by 10¹² gives CentiCents.
Convert human to wire
Price
price is a PriceOfAtom: the USDC price of one atom, in units of 10⁻¹⁶ USDC.
price = floor( price_per_unit_usdc × 10¹⁶ / atoms_per_unit )
Equivalently, in CentiCents: price = price_per_unit_in_centicents × (10¹² / atoms_per_unit).
To go back: price_per_unit_usdc = price × atoms_per_unit / 10¹⁶.
Size
quantity is in atoms.
quantity = floor( human_size_in_units × atoms_per_unit )
To go back: human_size = quantity / atoms_per_unit.
The sign of quantity is the side: positive = long/buy, negative = short/sell.
It is a 64-bit signed integer.
Notional the exchange computes
notional_centicents = floor( price × |quantity| / 10¹² )
Worked examples
BTC — buy 0.5 @ 50,000 USDC
ETH — sell 2 @ 3,000 USDC
BTC has atoms_per_unit = 100,000,000 (10⁸). Conversion factor = 10¹² / 10⁸ = 10⁴.
- Price —
50,000 USDC → 500,000,000 CentiCents → × 10⁴ = 5,000,000,000,000.
Send price = 5000000000000.
- Size —
0.5 × 10⁸ = 50,000,000 atoms. Buy, so positive:
quantity = 50000000.
- Notional —
5e12 × 5e7 / 10¹² = 250,000,000 CentiCents = 25,000 USDC (= 0.5 × 50,000).
ETH has atoms_per_unit = 10,000,000,000 (10¹⁰). Conversion factor = 10¹² / 10¹⁰ = 100.
- Price —
3,000 USDC → 30,000,000 CentiCents → × 100 = 3,000,000,000.
Send price = 3000000000.
- Size —
2 × 10¹⁰ = 20,000,000,000 atoms. Sell, so negative:
quantity = -20000000000.
Atoms per unit
Each asset carries its own atom scale. The asset id is sent as a 16-bit field on
every order.
| Asset | Id | Atoms per whole unit |
|---|
| BTC | 0 | 100,000,000 (10⁸) |
| ETH | 1 | 10,000,000,000 (10¹⁰) |
| USDC | 2 | 1,000,000 (10⁶) |
| SOL | 3 | 1,000,000,000 (10⁹) |
| XRP | 4 | 1,000,000 (10⁶) |
| UNI | 5 | 100 (provisional) |
| AAVE | 6 | 100 (provisional) |
Provisional values may change before those markets are finalized; treat their sizes and
minimums as subject to change. USDC has an atom scale but no perp market — it is the
quote asset.
Round down everywhere
Every conversion truncates toward zero — there is no round-to-nearest.
- Your raw integers are floored when the exchange computes notional.
- Sub-tick price precision and sub-step size precision are silently lost.
Submit prices already aligned to the market tick and sizes already aligned to the step.
Do not assume the exchange rounds to your nearest tick. Anything below the tick or step
is dropped, which can change or invalidate your order.
Tick, step, and minimum size
Each market sets a price tick (in USDC), a size step, and a minimum order size
(both in atoms). Submit price as a multiple of the tick, and quantity as a multiple
of the step at or above the minimum.
| Market | Price tick | Size step (atoms) | Min order (atoms) | Min in units |
|---|
BTC-PERP | 1.00 USDC | 100 | 1,000 | 0.00001 BTC |
ETH-PERP | 0.10 USDC | 1,000 | 10,000 | 0.000001 ETH |
SOL-PERP | 0.001 USDC | 1,000 | 10,000 | 0.00001 SOL |
XRP-PERP | 0.0001 USDC | 1,000 | 10,000 | 0.01 XRP |
UNI-PERP | 0.0001 USDC | 1,000 | 10,000 | 100 UNI |
AAVE-PERP | 0.01 USDC | 1,000 | 10,000 | 100 AAVE |
SOL, XRP, UNI, and AAVE step and minimum sizes are provisional and may change before
those markets are finalized. No live endpoint returns these values today; a Market Data
API is planned.
The per-atom price ceiling
price is a 64-bit value capped below 2⁶³, so the maximum representable price is about
922 USDC per atom. This is a per-atom ceiling, not a per-unit ceiling: the per-unit
maximum is 922 USDC × atoms_per_unit (for BTC, 922 USDC × 10⁸), which no real price
approaches. The per-asset atom scales exist so each asset keeps enough price precision
while staying inside this range.
Next, see Orders and time-in-force for what to put in price
and quantity.