The Write Lock Problem
Picture an order book as a sorted list. Every new order slots into it, every fill pulls something out, every cancel edits it. On a centralized exchange, that list is just a single-threaded data structure sitting in memory. Fast. On a blockchain, the same list lives in an on-chain account — and Solana's runtime has one rule that changes everything: only one transaction can hold the write lock on an account at a time. So conflicting writes get serialized. They run one after another, never side by side.
At low volume, that's fine. At high volume, the order book account becomes a single-threaded resource — the same bottleneck a CEX has, except now the leader (the validator whose turn it is to build the block) has just 400ms to drain whatever writes are queued before the block closes. Market makers fire off hundreds of updates a second, and if they all hit the same account, the runtime has to chew through them in order. The matching engine can be flawless and still choke. Per-market throughput is capped by how many serialized writes fit in a single slot, and whatever doesn't fit slips to the next slot or gets dropped on retry.
Ethereum's answer was to give up. Gas costs made frequent order updates a non-starter anyway. A single order placement on Uniswap runs $2-50 in gas depending on congestion, so a market maker who needs to refresh quotes every few hundred milliseconds would bleed out fast. The industry pivoted to AMMs (automated market makers) instead, where liquidity providers deposit once and a math formula handles price discovery. The catch: permanent impermanent loss (the loss a liquidity provider takes when the pool's price moves away from where they deposited, versus just holding the tokens), no limit orders, and MEV (maximal extractable value — the profit bots skim by reordering or front-running your trades) baked right into the design.
Solana flips the economics. A fresh block every 400ms. Fees in fractions of a cent. But none of that touches the write-lock constraint. The hard part here isn't cost. It's concurrency.
Phoenix: Inline Matching
Serum was Solana's first CLOB (central limit order book — the classic exchange model where buyers and sellers post bids and asks that match by price). It kept order submission and order matching separate. Orders landed in a request queue (an on-chain account), and a separate program called the "crank" would read the queue every so often, match orders against the book, and write the results back. The problem was that the crank was an off-chain process — someone had to run it and pay for it. If the crank operator went down, the book froze, and orders just sat in the queue, unmatched.
Phoenix pulled matching inline. The order transaction itself checks the book, finds counterparties, executes the fills, and updates balances all at once, atomically. What makes that hard is a hard ceiling: Solana caps compute per transaction at 1.4 million compute units (CU), and the default allocation is only 200K CU. So a Phoenix market order that walks through several price levels, matches against a handful of resting orders, executes partial fills, and updates maker and taker balances all has to fit in that budget. The matching engine is written to shave off every wasted memory access and computation. Each order node in the book is a fixed-size struct, laid out so it can be read sequentially.
Phoenix matches FIFO (First In, First Out). At a given price level, whoever got there first gets filled first — the same model CME and most traditional exchanges use. It rewards speed: land your order on-chain first and you have priority. For a market maker, that turns the whole thing into a race about how fast your transaction lands, not just how you price it.
Manifest: Zero Fees, Permissionless Markets
Manifest stakes out a different corner of the design space. Phoenix is built for execution quality and tight spreads on a curated set of markets. Manifest is built for accessibility: anyone can spin up a market.
| Phoenix | Manifest | |
|---|---|---|
| Market creation cost | 3 SOL ($500) | <0.01 SOL ($1.50) |
| Trading fees | Configurable per market | Zero, permanently |
| Matching priority | FIFO | FIFO |
| Cross-market capital | No (siloed per market) | Yes (Global Orders) |
The fee structure matters more than it looks. Zero fees means no protocol revenue, and no protocol revenue means the protocol has no incentive to steer flow toward particular markets. That's on purpose: it's meant to be infrastructure, not a business. Market makers set their own spreads, and the protocol takes nothing on top.
Global Orders: Cross-Margin Without Leverage
This is Manifest's biggest design call, and the part worth slowing down for.
Here's how capital normally flows on a CLOB. You deposit USDC into one specific market's vault account, and those funds are locked there. You can place and cancel orders, but the capital stays put until you withdraw. Market-make on five pairs and you need five separate deposits, so your capital ends up fragmented.
Manifest changes that. With a Global Order, your USDC never actually leaves your account when you place the order. The order sits on the book as a promise — a commitment to spend the money if someone fills it. The funds only move the instant the fill happens.
So one $100K balance can sit on ten different markets at once. Each market shows the full $100K of liquidity behind your orders — same capital, 10x the on-book depth. The catch: if two markets try to fill against you in the same slot and your balance can't cover both, one of them just fails.
The order book itself isn't the hard part. The hard part is nailing capital efficiency and settlement guarantees at the same time.
RISK: SIMULTANEOUS FILLS ACROSS MARKETS
Say you have $100K in your global account. You post $80K buy orders across eight markets. On a normal day, only one or two fill at once, so the math holds.
Now a market-wide crash hits and multiple pairs dump at the same time. Three markets try to fill your orders in the same slot. Manifest handles them first-come-first-served within the block: fill one, deduct $80K, balance drops to $20K. Fill two fails. Fill three fails. Your orders were on the book, but they turned out to be phantom liquidity at the exact moment the market needed them most.
This isn't a bug — it's the trade-off baked into the design. Capital efficiency and settlement guarantees pull against each other. If you use Global Orders, you have to model your worst-case simultaneous-fill scenario and size accordingly. Quoting your full balance everywhere, the naive way, just paints a false picture of depth.
Aggregator Routing: Who Fills Your Orders
A CLOB can have flawless matching logic and still do zero volume if nobody routes orders to it. That's the aggregator problem: how does trade flow actually reach the book?
Jupiter is Solana's dominant aggregator (the router that shops your trade across every venue for the best price). It routes through AMMs like Orca and Raydium and CLOBs like Phoenix and Manifest, all at once. When you swap SOL for USDC on Jupiter, the router compares prices across every integrated venue, splits the order if that helps, and executes against whatever combination gives the best output. Your CLOB is competing on price with every AMM pool out there.
0x came out of Ethereum, where they built a Request-for-Quote (RFQ) system: professional market makers respond to quote requests in real time, competing to fill each order. On Solana, 0x's Swap API aggregates across venues the same way Jupiter does. For a market maker, being wired into both aggregators means more flow. The real question is what kind of flow.
Aggregator flow skews retail. Someone swapping $500 of SOL on a frontend isn't watching the order book or timing their execution — they just take whatever best price the aggregator finds. That flow is less toxic than direct DEX trading, where sophisticated players watch the book and snipe stale quotes. For a market maker, retail aggregator flow is the good kind. You quote a spread, the fill comes in, and the price hasn't moved against you by the time you hedge.
The downside is that aggregator integration is all-or-nothing. Best price, you get the fill. Not the best price, you get nothing. No loyalty, no relationship, no "you filled me last time so I'll route to you again." Just pure price competition, every single order.
Cancel Latency: The Market Maker's Real Problem
On a centralized exchange, canceling an order is instant — a message over a WebSocket, acknowledged in microseconds. No fee, no queue, no race. On a Solana CLOB, a cancel is a full transaction. It has to be submitted, propagated, included in a block, and confirmed. At Solana's baseline that's 400ms per slot — an eternity when prices are moving.
This asymmetry is the defining constraint of on-chain market making. Posting a quote is a commitment you can't instantly take back. Every resting order is a liability — a promise to trade at a fixed price no matter what the market does before your cancel lands. When a big order hits the mempool (the pool of pending transactions waiting to be included) and moves the price, the gap between "price moved" and "cancel confirmed" is exactly where market makers bleed. And there are sophisticated players — "snipers" — whose entire job is to fill stale quotes in that window, before the cancel arrives.
Cancel Latency in Practice
400ms
Solana slot time — baseline cancel window
50–200ms
Practical landing time with priority fee
<1ms
CEX cancel acknowledgment (WebSocket)
80%
Solana validators running Jito software (2024)
The cancel problem bleeds straight into quoting strategy. A market maker quoting tight spreads across many price levels is the most exposed — more resting orders means more chances to get filled at a stale price during a move. The rational response is one of two things. Quote wider (which makes snipers less profitable but also makes you less competitive), or pour money into cancel infrastructure — colocation with validators, low-latency RPC nodes, priority fee tuning. That's why professional on-chain market making is expensive. The edge isn't in the pricing model. It's in the infrastructure that lands your cancels on-chain faster than the competition.
Jito: Block Auctions, Bundles, and the Private Mempool
Jito isn't one tool. It's a layered MEV infrastructure that runs across most of Solana's validator set. To make sense of it, you have to pull apart four distinct pieces.
Block Engine. Jito runs a block engine — a service that validators (running Jito-patched software) connect to. The block engine receives bundles and individual transactions, simulates them, and assembles the most profitable ordering for the validator. As of 2024, 80% of Solana validators run Jito software, which means most blocks are built through the Jito block engine. A transaction sent only to standard RPC has no path into a Jito block unless it's also forwarded.
Bundles. A bundle is an ordered sequence of up to five transactions submitted atomically. All five execute in sequence, or none do. The classic market-maker use case: [cancel stale bid] → [cancel stale ask] → [place new bid] → [place new ask]. No bot can wedge a transaction between the cancel and the requote, because the whole sequence lands as one unit. Bundles can also include a fill — [fill incoming order] → [hedge on another venue] — so the hedge lands in the same slot as the fill.
Tips. Every bundle includes a tip — a direct SOL payment to the validator (via a Jito tip account), separate from the base transaction fee. The tip is the auction price for block ordering priority. During quiet markets, median tips are a fraction of a cent. During high-volatility events (token launches, major liquidations), they spike: competitive bundles have been observed paying 1–5 SOL ($150–750 at $150/SOL) for a single bundle to lock in first-in-block execution. The tip market is a second-price auction dynamic (the winner pays the second-highest bid) — you need to outbid the next competitor, not maximize your payment.
ShredStream. Shreds are the raw data fragments Solana validators broadcast as they build blocks — before the block is complete or confirmed. Jito's ShredStream service lets subscribers receive shreds directly from validators in real time, giving them the earliest possible view of what's landing on-chain. For a market maker, this is the cancel signal: when ShredStream shows a large order approaching their resting quotes, they have 50–100ms to fire off a cancel bundle before the order lands. Without ShredStream, you're reacting to confirmed state — already too late.
The difference between regular trading and Jito-mediated trading is architectural. A standard transaction goes to a public RPC node, propagates through gossip, and competes for inclusion on base fee alone. It's visible to anyone watching the mempool. A Jito bundle goes through a private channel straight to the block engine, gets simulated off-chain, and is only revealed to the network when it lands in a confirmed block. No front-running window. No public visibility. The bundle either executes as written or gets dropped silently.
| Standard tx | Jito bundle | |
|---|---|---|
| Visibility before landing | Public mempool — anyone can see | Private — only block engine sees |
| Atomicity | Single tx — can be reordered around | Up to 5 txs — all land in order or none do |
| Priority mechanism | Priority fee (lamports/CU) | Tip (flat SOL) + priority fee |
| Failure mode | Tx included but reverts — fee still paid | Bundle dropped if simulation fails — no fee |
| Front-run risk | High — visible in gossip | None — private until confirmed |
| Typical cost | 0.000005 SOL base fee | 0.0001–5 SOL tip (market-rate dependent) |
The spread you see on a Solana CLOB encodes all of this. It isn't the market maker's profit margin. It's the sum of four things: expected adverse selection from fills before cancels land, Jito tip cost amortized across expected fill volume, infrastructure costs (ShredStream, colocation, low-latency RPC), and the actual profit target — likely the smallest of the four during volatile periods. A 5 bps spread (bps = basis points; 1 bps = 0.01%) on a liquid pair on Phoenix might be 1 bps of actual profit and 4 bps of operational overhead that simply doesn't exist on a centralized exchange.
The Mechanism Landscape: AMM, RFQ, Intent, CLOB
A CLOB is one answer to the price discovery problem. Three others coexist on-chain, each making different trade-offs.
| Mechanism | Examples | Price discovery | Who takes risk |
|---|---|---|---|
| AMM (x·y=k) | Uniswap, Orca, Raydium | Formula — price moves with each swap | LPs (impermanent loss) |
| RFQ | 0x, Hashflow | Market makers quote on request, off-chain | Market maker |
| Intent-based | UniswapX, Across, CoW Protocol | Solver competition — best fill wins | Solver (short window) |
| On-chain CLOB | Phoenix, Manifest | Transparent book — FIFO matching | Market maker |
AMMs trade execution simplicity for capital efficiency. Liquidity providers deposit once and the formula handles everything. But the formula is predictable, which means every large order is sandwichable, LPs absorb adverse selection by design, and there are no limit orders. AMMs work for passive liquidity. They fail for tight spreads.
RFQ flips the model: no public book, no formula. A user requests a quote, market makers compete to respond, the best bid wins. Zero MEV exposure, because the price is agreed before the tx broadcasts. But it needs market makers to be online, responsive, and willing to quote every token, so long-tail assets get no coverage.
Intent-based routing (UniswapX, CoW Protocol) abstracts the venue entirely. The user signs an intent — "give me at least X for Y" — and solvers (bots competing to fill it) find the optimal path across AMMs, CLOBs, and private inventory. The user gets best execution, the solver captures the surplus, and MEV gets redirected from extractors to solvers and partially returned to users. The risk is solver centralization: a handful of solvers end up handling the majority of flow.
On-chain CLOBs are the only model where price is transparent before the trade and limit orders are native. Every resting order is a public commitment. Market makers compete on spread. Takers see the full depth. The cost: write-lock contention, compute constraints, and MEV exposure on every cancel-requote cycle.
Derivative Markets: Hyperliquid, dYdX, GMX
Spot CLOBs solve one problem: matching buyers and sellers of existing assets. Derivatives add a second layer — synthetic exposure, leverage, funding rates, liquidation engines, oracle pricing. Each one solved it differently.
GMX / GLP model. No order book at all. Liquidity providers deposit a basket of assets into a pool (GLP), and traders open long or short positions against the pool as their counterparty. Prices come from Chainlink oracles — no book depth, no spread. The pool earns fees when traders lose and bleeds when traders win. That's capital efficient for LPs when traders are net unprofitable, and structurally fragile when they're not.
dYdX v4 (Cosmos app-chain). Off-chain order book, on-chain settlement. Validators run the matching engine off-chain in their local state, and only the fills hit the Cosmos chain. The result is sub-second latency. The trade-off: you have to trust validators to match orders honestly, and censorship is possible at the validator level. dYdX chose performance over full on-chain transparency.
Hyperliquid. A purpose-built L1 (HyperBFT consensus, Tendermint-derived — BFT means Byzantine Fault Tolerant: the network agrees even if some validators act maliciously). The entire matching engine runs on-chain on their own chain, so there's no shared congestion with other applications, and order acknowledgment comes in under 1ms. The validator set is small (20 initially), which is the central trust assumption. HIP-1 defines the native token standard for deploying assets directly on Hyperliquid's L1. HIP-2 handles automatic liquidity seeding for new HIP-1 spot markets — the protocol bootstraps initial order book depth at the auction clearing price, so a new market doesn't cold-start with an empty book. The HLP (Hyperliquidity Provider) vault acts as the native market maker, soaking up flow the external maker ecosystem doesn't cover.
The structural difference between Phoenix and Hyperliquid comes down to one question: who controls the sequencer? On Solana, Solana's decentralized validator set sequences your transactions. On Hyperliquid, Hyperliquid's validator set does. You get 400x the speed in exchange for trusting a smaller committee. Whether that trade-off is acceptable depends on what you're trading and how much you're putting at risk.
| Phoenix | Hyperliquid | dYdX v4 | GMX | |
|---|---|---|---|---|
| Chain | Solana | Own L1 (HyperBFT) | Own L1 (Cosmos) | Arbitrum / Avalanche |
| Matching | On-chain, inline | On-chain, own chain | Off-chain (validators) | Oracle — no book |
| Latency | 400ms | <1ms ack, 2s finality | 500ms | Oracle refresh rate |
| Validator trust | 1,800+ Solana validators | 20 (semi-centralised) | dYdX validator set | Chainlink oracle network |
| Derivatives | Spot only | Perps + spot | Perps | Perps (synthetic) |
| MEV exposure | High (Solana mempool) | Low (own mempool) | Low (off-chain matching) | Oracle latency arb |
Scalability: Where Each Model Breaks
Every trading architecture has a ceiling. The question is where it cracks under load — and whether that ceiling is infrastructure, economics, or trust.
AMMs scale until MEV does. Each swap is O(1) — constant cost no matter how big the book is, since there's no book to traverse and no matching logic — so Solana AMMs handle millions of swaps. But as TVL grows, so does the size of sandwichable trades. MEV extraction scales with liquidity. Concentrated liquidity (Orca Whirlpools) improves capital efficiency but narrows the range that earns fees, which concentrates IL risk. The model doesn't break. It just becomes more extractive at scale.
On-chain CLOBs (Solana) hit write-lock ceilings. Phoenix and Manifest are bottlenecked by Solana's account write-lock rule: only one writer can hold the lock on the order book account at a time. At low volume, fine. At high volume, the account becomes a serial resource — concurrent writers don't fail outright, they queue and execute one after another, and per-market throughput is capped by how many of those serialized writes fit in 400ms. The practical throughput for a single Phoenix market under contested conditions is far below Solana's theoretical 65,000 TPS. Compute limits per transaction add a second ceiling: deep order walks that touch many price levels hit the 1.4M CU cap.
Own-chain CLOBs (Hyperliquid, dYdX) remove the shared congestion problem. No other applications compete for the same write locks, so the matching engine gets the full validator throughput. Hyperliquid processes 100,000+ orders per second in their own benchmarks. But the ceiling just moves: now it's the validator set size and the trust model. Fewer validators means faster BFT consensus but a smaller security set, and a cartel of validators could front-run orders or censor cancels. This is a governance and decentralization problem, not an infrastructure one — and it gets harder to solve as the platform grows more valuable.
RFQ scales with market maker capital, not infrastructure. There's no order book to contend for, no write-lock bottleneck. Throughput is limited by how many quote requests market makers can respond to per second. For liquid pairs, that's effectively unlimited. For long-tail assets, market makers simply don't show up. The model scales horizontally — add more market makers — but fails vertically: there's no native price discovery, so takers depend entirely on the market maker being honest and competitive.
Intent-based routing scales with solver infrastructure. Solvers run off-chain, spin up as needed, and compete on every order independently. The on-chain footprint is a single settlement tx per fill. From a pure throughput perspective, this is the most scalable model of the bunch. The risk is solver centralization: if three solvers handle 90% of flow, the "competitive solver auction" becomes oligopolistic pricing in practice. The user sees best execution today. Whether that holds as solver market structure consolidates is the open question.
No model wins cleanly. AMMs win on simplicity and passive liquidity. RFQ wins on MEV protection for liquid pairs. Intent-based wins on user execution quality. On-chain CLOBs win on transparency and limit order support. Own-chain CLOBs win on raw throughput — at the cost of the decentralization properties that make on-chain trading meaningful in the first place.
Where This Goes
The technical stack for on-chain CLOBs on Solana is production-ready. Phoenix and Manifest both work. Orders match, settlements clear, and the matching engines survive real load. The matching engine is the solved problem.
The unsolved problems are all economic. Capital efficiency vs. settlement guarantees (Global Orders). Spread compression vs. MEV exposure (Jito costs). Aggregator integration vs. adverse selection (flow quality). These are the same problems centralized exchanges have spent decades optimizing. The difference is that on-chain, every parameter is visible, every trade-off is measurable, and every design decision plays out in public.
The interesting question isn't whether on-chain order books can work. They can. The interesting question is whether the economic equilibrium they settle into beats AMMs for the median user — and whether own-chain CLOBs like Hyperliquid can keep their speed advantage without giving up the decentralization that makes the whole model trustworthy. That answer depends on how many sophisticated market makers show up, how much capital they deploy, how much MEV they're willing to absorb, and whether the validator sets running these systems stay honest as the stakes grow. The matching engine was the prerequisite. Now the game is about who plays it, on which chain, under which rules.
The matching engine was the prerequisite.
Capital flow, aggregator routing, MEV economics. Three separate games, all running simultaneously, all deciding whether the book survives.
— AILEENA MACHINA / 2026
References
- Phoenix Protocol — On-Chain CLOB Architecture
- Manifest — Permissionless CLOB & Global Orders
- Jito Labs — Block Engine & Bundle Documentation
- Jito ShredStream — Real-Time Validator Data
- Jito MEV Dashboard — On-Chain Tip & Bundle Data
- Jupiter Aggregator — Routing Across Solana Venues
- Solana Transaction Compute Budget
- Solana Validator Economics & Jito Adoption (Helius)
- Hyperliquid — HIP-1 & HIP-2 Specification
- Hyperliquid — HLP Vault & Liquidity Design
- dYdX v4 — Cosmos App-Chain Architecture
- GMX — GLP Pool and Oracle Pricing Model
- CoW Protocol — Intent-Based Settlement
- UniswapX — Solver Auction Design
- Flashbots — MEV Research & Bundle Auction Theory