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:
| Structure | How a price appears | Who takes the other side |
|---|---|---|
| Quote-driven (dealer) | A dealer names bid and ask | The dealer, always — it holds inventory and risk |
| Order-driven (pure CLOB) | Emerges from users' limit orders | Another user; the venue only matches |
| Hybrid AMM + CLOB | Both: real orders and a curve | Whichever 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.
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 parameterbis a direct dial: largerbmeans 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
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.