Who actually captures MEV on Base after Flashblocks: one week of measurements

# Who actually captures MEV on Base after Flashblocks: one week of measurements

*Dmitrii Luzin, October 2026. All numbers are from a bot I run on Base mainnet and from public on-chain data; the

Flashblocks decoder is open source (`flashblocks` crate, GitHub - Dimanoshe/flashblocks-rs: Decode Base Flashblocks in real time: Chainlink price updates from the 200 ms pre-confirmation stream, with logs_bloom confirmation. Rust, CLI, Python. · GitHub).*

Base moved to Flashblocks in 2025: every 2-second block is now published as ten ~200 ms preconfirmation slices. The

usual story is that this turned MEV into a pure latency race. I spent a week measuring what that race looks like from

the outside, with a bot that reacts to the public Flashblocks stream in single-digit milliseconds. The short version:

latency is table stakes, but almost all of the money is decided before a flashblock is published.

## Setup

- A Base node is not required. The raw Flashblocks stream (`wss://mainnet.flashblocks.base.org/ws`) carries the

transactions of each slice; the public preconf node (`wss://mainnet-preconf.base.org`) serves `pendingLogs`, i.e.

the event logs of those transactions, a median of **19 ms** after the raw slice (p99 66 ms, 153/153 swaps covered).

- Pool state is kept in memory (Uniswap v3/v4, PancakeSwap v3, Aerodrome Slipstream and forks, v2 pools) and

updated from the logs; the model re-executes every swap it sees and compares with the emitted event: 99.8% match on

Uniswap v3, 99.5% on v4, 95–97% on Slipstream after learning its dynamic fees from the events themselves.

- Reaction path from log arrival to a signed transaction at the sequencer: **5–8 ms** (cycle search ~2 ms, Rust

signing 0.7 ms, fire-and-forget broadcast 1.3 ms).

- Every opportunity found (≥ $1 after fees) is re-checked two ways: by rebuilding pool state from the previous block

plus the events of the current block up to the find (318/318 confirmed), and by executing the real transaction in

the EVM at the end of the block with a balance override (67/67 executed).

## Market 1: liquidations (Morpho Blue)

- 30 days, Base: $620k of liquidation bonus. **97% of it on markets priced by Chainlink SVR feeds**, where the right

to liquidate right after the price update is sold in an Atlas auction. Winners bid away 80–95% of the bonus; after

bids, liquidators kept ~$73k from auctions and ~$96k from the open race, almost all of the latter on crash days.

- The “open race” on SVR markets is mostly not a race at all: 387 of 438 cbXRP liquidations outside the auction sat

in the same block right after the auction transaction — leftovers of the auction winner, taken 1–50 places later.

- On Base both auction slots are reserved for a high-reputation solver set maintained by Chainlink; a new solver gets

simulated only in quiet auctions and enters the set after winning a large one. Bids from outside the set are

dropped before simulation during bursts (“dropped by max solutions cap”).

## Market 2: atomic arbitrage after user swaps

A block-receipt indexer records every atomic arbitrage on Base (≥ 2 swaps, cyclic profit, no external inflows).

A naive count gives ~$600k per week; a strict count — excluding swaps paid in native ETH, WETH↔ETH wraps outside pools

and inventory trades from third-party addresses, then verified by balance deltas on an archive node — gives

**~$8k per day for deals ≥ $10** (97% of the strict sample confirmed by balances). The median deal is cents; the money

is in the tail.

How the tail is won:

- In 100 of 133 sampled deals the arbitrage sits at **trigger + 1**: directly behind the user swap that moved the

pool, inside the same flashblock. Over 24 hours, 1,974 of ~2,170 deals ≥ $1 on the busiest cluster (an AXIS/USDC

v3+v4 group) were taken at trigger + 1; across all pools, ~90% of the money ≥ $1.

- The winners pay a flat **15 gwei priority** (~76% of the profit, median over 40 deals of one bot) and almost never

revert: the two leading contracts did 2,079 and 2,108 successful deals in a day with 0 and 3 reverts.

- The triggers are ordinary user swaps through the Uniswap Universal Router (39 of 40 sampled), from different

senders; the backrunners are four contracts rotating sender addresses.

A flashblock is published after it is sealed. A transaction that lands inside the trigger’s flashblock cannot be a

reaction to the published stream. In 20 live attempts my bot reached **places 1–3 of the next flashblock** with a

5–8 ms path — the best position available to a public-stream reactor — and lost every time. Of 3,199 opportunities

≥ $1 found over 12 hours, **not one survived to the end of its block**.

The documented mechanism that matches this pattern is an order-flow program: users’ swaps go through a protected RPC,

transactions that create an arbitrage opportunity are forwarded (anonymized) to enrolled searchers, who submit

backrun-only bundles; the profit is split between the user, the searcher, the builder and the operator. bloXroute’s

BackRunMe lists Base among its chains; enrollment is by application.

## What this means for a newcomer

1. Outside the two programs (Chainlink SVR for liquidations, order-flow programs for swaps) there is essentially

nothing left for a public-stream searcher on Base, however fast. Server location does not change this: the

decisive transactions are placed before the data becomes public.

2. Inside the programs the economics are explicit: winners give up ~76–95% of the profit, keep the rest, and compete

on reliability (zero reverts) more than on raw speed.

3. The public tooling is good enough to measure all of this at zero cost: pendingLogs at 19 ms, a pool model that

matches on-chain quoters to the unit, and a $0.05–0.12 price-check revert in the contract when the opportunity is

already gone (a `PriceMoved` check before the flash loan).

## Numbers at a glance

| Measurement | Value |

|—|—|

| pendingLogs delay after raw flashblock | 19 ms median, p99 66 ms |

| Pool model vs on-chain quoters | 68/68 quotes exact to the unit |

| Reaction path, log → sequencer | 5–8 ms |

| Strict arbitrage market, deals ≥ $10 | ~$8k/day |

| Deals ≥ $1 taken at trigger + 1 (same flashblock) | ~90% of money |

| Winner priority fee (busiest cluster) | 15 gwei flat ≈ 76% of profit |

| Opportunities ≥ $1 surviving to block end | 0 of 3,199 |

| Liquidation bonus via SVR auctions | 97% of $620k / 30 days |

*Questions and data requests: the bot’s indexer holds ~400k classified bot transactions with block position,

priority fee and trigger, plus SVR auction outcomes and Flashblocks timing. Happy to share cuts for research.*