Liquidity: Hybrid AMM + CLOB

A market with no resting orders cannot be traded. This document explains the cold-start problem, the market-structure vocabulary around it, and why Verex prices its automated liquidity with LMSR rather than a constant-product curve.

The cold-start problem

A pure order book only works when somebody is already quoting. A brand-new market has nobody: the first trader sees an empty book, the spread is effectively infinite, and there is no price at all. This is the cold-start problem, and it is the reason almost no prediction market is a pure order book.

The standard answer is an automated market maker — a formula that will always quote a price, funded once, requiring no counterparty. Verex today approximates this with an operator-run ladder: five price levels either side of the current estimate, weighted [5,4,3,2,1] so depth thins as you move away from the middle, repriced after each fill from the operator's own inventory.

The vocabulary, in order

It helps to name the three structures precisely, because “hybrid” only means something relative to them:

StructureHow a price appearsWho takes the other side
Quote-driven (dealer)A dealer names bid and askThe dealer, always — it holds inventory and risk
Order-driven (pure CLOB)Emerges from users' limit ordersAnother user; the venue only matches
Hybrid AMM + CLOBBoth: real orders and a curveWhichever is cheaper at that size

The third is the target design. Today Verex sits between the second and third: a real order book whose operator quotes are priced by the formula, but with the curve still off-chain (Phase A). The formula behaves like a tireless dealer that never withdraws its quote, while real users can still post better prices and be matched first.

Why not constant product

The obvious curve is Uniswap's constant product, x · y = k. It was the original plan here, and simulation is what ruled it out.

CPMM was designed for two assets whose relative price can go anywhere from 0 to infinity. Prediction-market outcomes are not like that — they are bounded in [0, 1] and must sum to 1. Near the tails the curve fights that constraint: at extreme probabilities a constant-product pool will happily quote a Yes token above $1.00, which is a price no rational buyer should ever pay, since $1 is the absolute maximum the token can ever pay out.

This is not a tuning problem. The curve's shape is wrong for a bounded asset; no choice of reserves fixes the tail behaviour.

LMSR — a curve built for probabilities

Hanson's Logarithmic Market Scoring Rule is the standard prediction-market maker, and it is built around the constraint CPMM violates. Prices come straight from a softmax over the quantity sold of each outcome:

price_i = e^(q_i / b) / Σⱼ e^(q_j / b)

Three properties fall out of that formula for free, and they are exactly the ones a prediction market needs:

  • Prices always sum to 1. It is a softmax — normalisation is structural, not enforced afterwards.
  • Prices stay inside (0, 1). The $1.00-quote failure mode cannot occur.
  • Loss is bounded. The maximum the maker can lose is b · ln(n) — for a binary market, b · ln 2. The liquidity parameter b is a direct dial: larger b means tighter spreads and deeper quotes, paid for with a larger worst-case subsidy.

That last property is what makes LMSR fundable. The operator can decide in advance exactly how much it is willing to spend to make a market liquid, and the formula guarantees it cannot exceed that.

Does the order book change?

No — and this is the point most easily misread. LMSR replaces how the operator decides its quotes, not how orders match. The matching engine keeps price-time priority; user limit orders still rest in the book and still fill first when they are better.

Concretely, the change is to the ladder's centre. Today the centre is a stored probability that gets nudged to the last traded price. Under LMSR the centre is computed from the outcome quantities the operator has sold, so it moves because inventory moved — the quote responds to actual exposure rather than to the last print.

One consequence surprises almost everyone the first time: after a trade, the operator's previous levels are gone entirely. Buy at 51¢ on a book centred at 50¢ and the 45–49¢ bids you were just looking at no longer exist. They were not filled — they were cancelled. Every re-quote tears down the whole ladder and posts a fresh one around the new centre.

This is the difference between an order and a quote. An order is a standing instruction that persists until its owner cancels it; a quote is a statement of what the venue will do right now, and it is only valid until the next fill. The operator's rungs are quotes. They are cancelled DB-side only — nothing was escrowed on-chain when they were posted, so withdrawing them costs one update and no transaction.

Two things this does not touch. Your own resting orders are never cancelled — the sweep is scoped to the market maker's own orders, so a user bid inside the spread survives every re-quote and still gets hit first. And depth is not additive across time: the book you see is always exactly one ladder, the most recent one, never an accumulation of every price the market has passed through.

This was planned in two phases. Phase A — LMSR computing the quote centres inside the market maker, with everything else unchanged — is what Verex runs today. Phase B would put an actual pool on-chain so traders could transact directly against the curve even if the off-chain matcher were unavailable.

How the two venues merge

Phase B is deliberately deferred, so this section describes the design rather than the running system. Every benefit an on-chain pool provides — surviving operator downtime, resisting censorship, letting anyone verify the quote — is a benefit of not having to trust the operator. On a testnet with test USDC there is no adversary to resist and nobody who can lose money, so those guarantees buy nothing yet. They start mattering on mainnet, and that is when this gets built.

Once a curve exists on-chain alongside the book, an incoming order is matched against combined depth. The curve is read as a set of virtual resting orders — one at each price tick — and merged into the real book. A large order is then split across whichever side is cheaper at each level.

The result is strictly better than either venue alone: real orders provide tight prices at small size, the curve provides unlimited depth at a predictable cost, and the trader simply sees one book with an average fill price.

Not the same as negative risk. Negative risk is a capital-efficiency mechanism — holding No on every candidate but one is equivalent to holding Yes on that one, so the collateral can be reused. It reduces the capital needed to quote; it does not create liquidity where none exists. The two solve different problems and compose fine.