Documentation

Inference coins

An inference coin is an ERC-20 token that stands for one unit of machine work: a million frontier model tokens, a billion open-weight tokens, an hour of an agent. Each has a published dollar price built from what those things actually cost today, and the protocol keeps the coin trading at that price with a single-sided Uniswap V3 pool. Three of them exist, all with 18 decimals, and all of them can be burned for dollars or for DIEM at the index.

The catalogue

Coin One unit is Reference price Staleness Redeems for
INT one million output tokens from a frontier model. The unit of intelligence. outFrontier 6 h USDC or DIEM
OPEN one billion output tokens from an open-weight model. Intelligence at cost. 1000 × outOpen 6 h USDC or DIEM
AGENT one hour of an agent working: 1.6M tokens read, 400k written, at frontier prices. 1.6 × inFrontier + 0.4 × outFrontier 6 h USDC or DIEM

OPEN is a billion tokens rather than a million because open-weight output costs fractions of a cent per million; at a million it would be an unusable ticket size. INT at a million is already a sensible one.

Only units whose price exists on-chain are offered. A unit priced from rental listings or wage statistics could only reach the chain through a key we control, so there is none.

Seven more assets are pair coins without being synthetic: DIEM and the six Coinbase tokenized stocks. They are described in DIEM and AI stocks.

Where the prices come from

All three reference prices are derived from four numbers the InferenceIndex contract publishes: the median input and output price per million tokens for a frontier class of models and for an open-weight class. A Chainlink Functions network samples OpenRouter's public price list once an hour, the contract keeps the last 168 samples, and anyone can push the median of that window to the PriceFeed. No single sample, provider or key can move a published price. The inference index has the whole mechanism, the model lists, and how they change.

Prices are stored on-chain as USD × 1e18 per whole coin, under a feed id of keccak256(bytes(symbol)). PriceFeed.getPrice reverts with Stale() when the last publish is older than the six-hour window and with Inactive() if the asset was never registered or was switched off. peek never reverts, and isFresh answers the same question as a bool.

How the peg holds

Each synthetic coin has one Uniswap V3 pool against USDC on the 0.30% fee tier, tick spacing 60. The PegManager owns all the liquidity in it and places it on one side at a time.

Take the feed price, convert it to a tick and floor it to the spacing. Call that t. The ask is coin only, in [t + 60, t + 120). The bid is dollars only, in [t − 60, t). A buyer always pays one tick spacing above the feed, about 0.6% over, and a seller who falls through to the pool receives one spacing below it. There is no range straddling the feed price, so the manager never trades against itself.

registerCoin mints coin worth $100,000 at the feed price into the ask. reprice burns both ranges, collects them, and re-places them around the current feed band. refill mints the ask back up to the seed when it has fallen below half of it, and reverts with RefillNotNeeded otherwise.

Both calls are permissionless. The placement is fully determined by the feed price and the rule above, so whoever calls reprice — the site, a cron, a stranger — gets the same result, and nothing about the caller changes where the liquidity lands. needsReprice(coin) is true when the feed band moved, a placed side has been fully crossed by the pool price, or at least $1 of that coin's dollars sits idle outside the bid; it is false while the feed is stale, because reprice would revert on a stale feed anyway. needsRefill(coin) is true when the ask holds less than half its seed.

When the coin sorts above USDC in the pool's token ordering, the tick axis inverts and the two ranges mirror: the coin-only band sits below t and the dollar-only band above it. Both orientations are exercised in the test suite.

Where the dollars go

Dollars paid into the ask do not stay in the peg pool. Each coin has a bidTargetUsd, set to $10,000 at launch. At every placement the manager forwards everything above that target to RedemptionVault.fund(coin, excess) and puts the target back in the bid. The thin bid keeps the pool two-sided so aggregators still route through it; the rest of the money sits in the vault backing redemption at the index. Redemption explains what happens to it there.