← Blog

2026-05-22

Crossed Markets in AMM Pools: Arbitrage, Atomic Execution, and MEV

When the best bid on one AMM pool exceeds the best ask on another after fees, the market is crossed. Here's what causes it, how to read it, and why atomic execution changes the risk profile versus a traditional two-legged arb.

In a traditional order book, a crossed market — best bid above best ask — is an error state that lasts milliseconds before someone lifts the offer or hits the bid. In AMM pools, crossings appear regularly, persist for seconds to minutes, and have a specific structure that makes them readable in advance. The difference is that AMM quotes are fully deterministic: given the current pool state and your trade size, the exact execution price is computable before you submit the transaction. That predictability changes the risk profile of the trade considerably.

What makes AMM pools cross

Every AMM pool quotes its own price independently. The price in a Uniswap 0.01% WETH/USDC pool moves only when that pool is traded — an arbitrageur buying from the 0.05% pool doesn’t touch the 0.01% pool’s reserves. Multiple pools quoting the same pair can therefore drift apart.

Three common causes:

A large directional trade through one pool moves its price substantially while adjacent pools remain at their prior levels. The pool that absorbed the trade now quotes a different mid than the others, and the divergence is proportional to the trade size relative to that pool’s depth.

Differential liquidity concentration means a pool with capital concentrated tightly around the current price moves more per unit of volume than one with spread-out capital. Two pools that started at the same price can diverge quickly if one is much thinner around mid.

Fee tier lag creates a natural floor for crossings. A 0.30% pool has 30 bps of embedded spread — the pool’s mid must diverge from a 0.01% pool by more than 30 bps before it becomes profitable to arbitrage across the fee tiers. Inside that threshold, apparent price differences aren’t crossings at all; they’re within the cost of correcting them. The pools only appear in a tradeable crossed state when divergence exceeds the combined fee cost of both legs.

How fees are already in the price

This is where AMM analysis differs from a traditional order book. When you look at a live CME futures bid or ask, the fee is separate — you see the price and pay the exchange fee on top. In an AMM, the fee is structural: it’s baked into the math of what you receive when you sell and what you pay when you buy.

In net mode, the bid and ask already reflect this:

  • Net bid (what you receive selling into the pool) = pool mid × (1 − fee rate)
  • Net ask (what you pay buying from the pool) = pool mid × (1 + fee rate)

A crossed market in net mode means the net bid on one pool is above the net ask on another — after both pools have taken their fee. There is no additional deduction. The only remaining cost is gas.

The screenshot below shows this in real time on ETH/USDC.

Cross-venue spread alert in mackinac showing a profitable crossed market after fees
LP widget — ETH/USDC on Unichain. Net mode active; the alert fires when the net bid on one pool exceeds the net ask on another by more than the configured threshold.

The alert popup at 12:17:54 shows a specific crossing:

  • Buy from the 0.01% pool at a net ask of 2,121.715943 (execution price including price impact at the configured trade size)
  • Sell into the 0.05% pool at a net bid of 2,121.978287

The sell price exceeds the buy price by +1.2 bps. After approximately $1.00 in gas on Arbitrum, the net capture is +$14.00. Both prices are fully inclusive of fees — the 0.01% and 0.05% pool fees are already reflected in the numbers shown.

The best bid/ask line at the bottom of the table reads: best bid 2122.760120 (0.01%) · best ask 2125.216231 (0.3%) · spread $2.456111 — this is the consolidated spread across all venues. The alert fires when the configured minimum threshold is breached, so the trader sees the crossing, the profit at their trade size, and the net spread above threshold, without having to manually compare rows.

Atomic execution and MEV

A crossed AMM market creates a two-legged trade: buy from the cheap pool, sell into the expensive pool. The critical question is whether those two legs can be executed without the risk of one completing while the other fails or worsens.

The two-transaction approach is straightforward but fragile. You submit a buy transaction, wait for confirmation, then submit the sell. Between the two confirmations, any other participant can trade Pool A — closing the crossing — leaving you long ETH at a cost basis that assumed a sale price that no longer exists. You’ve taken on directional inventory without intending to.

MEV compounds this. Mempool-watching searchers can observe your first transaction and front-run your second leg, buying into the pool you’re about to sell, pushing the price against you. On Ethereum mainnet this is systematic and well-documented. On Arbitrum, the centralized sequencer reduces the attack surface but doesn’t eliminate it — private mempool techniques and sequencer-level ordering still apply.

Atomic execution eliminates the intermediate state. A single transaction calling both pool contracts through a router or custom contract ensures both swaps execute in the same block, or neither does. If the crossing closes between the time you submit and the time the transaction is included, the transaction reverts cleanly. You lose the gas cost — a few cents on Arbitrum — but not the cost of an unhedged inventory position.

On Arbitrum specifically, the sequencer’s first-in-first-out ordering means atomic transactions submitted directly have near-zero exposure to other searchers front-running the second leg. The primary residual risk is the crossing closing due to latency between observation and inclusion — a timing race, not an adversarial extraction.

What closes the crossing

Crossings don’t persist indefinitely. On Arbitrum at current block times (~250ms), crossings that are visible from on-chain state typically resolve within one to three blocks. Several mechanisms close them:

  • Arbitrage bots executing the same trade simultaneously, pushing the cheap pool’s ask higher and the expensive pool’s bid lower until the spread compresses to zero
  • Organic swap flow that happens to trade in the corrective direction
  • LP repositioning — mints that add liquidity at the current crossed price, effectively narrowing the effective spread

The persistence window is long enough to observe and act on, but short enough that execution infrastructure matters. A transaction that takes 500ms to construct and submit will frequently find the crossing closed on arrival. The alert threshold in the widget is set partly to filter out crossings that are too narrow to capture after the latency cost of executing them.

Reading the signal

Whether you’re executing or just observing, a crossed AMM market is information about the current equilibrium — which pool is lagging the reference price, how much fee-adjusted divergence has accumulated, and how quickly it resolves.

Crossings that resolve in one block suggest deep competition and efficient infrastructure is already monitoring the same pools. Crossings that persist for 10–15 blocks before closing suggest the opportunity is large enough that latency is less of a filter, or that the competition for this specific pair is lighter.

The direction of the crossing also carries information. If the cheaper pool is the higher-fee tier (the 0.30% pool is cheap relative to the 0.01% pool), it means the 0.30% pool absorbed a large trade and hasn’t been arbitraged back yet — the fee tier is creating the lag. If the cheaper pool is the lower-fee tier, it suggests something different about flow distribution across venues. The fee tier structure in the crossing is part of the signal, not just background.

Understanding that the fee is already in the price — that Net mode shows the all-in execution cost with nothing left to deduct — is the prerequisite for reading any of this accurately. A gross price comparison across pools will systematically mislead about which crossings are real.