A third of liquidity positions in pools DefiLlama does not track earned no fees at all. In the pools it tracks with published yields, none did.
Figures computed 31 August 2026 and fixed at that date — later builds do not recompute them.
DeFi's free data layer has an edge. Pools below its thresholds are not listed, so for practical purposes they do not exist — not to the dashboards, not to the screeners, not to anyone deciding where to put money. This report is about what is on the other side of that edge.
We reconstructed 199 liquidity positions from Base chain logs — every one an
ordinary Uniswap v3 position, opened and closed by its owner, held at least seven
days, with fees collected and counted from the Collect events rather than
estimated. Then we asked a question the position data can answer and the
advertised data cannot: how many earned nothing at all?
Of 199 verified positions, 19 collected zero fees — not a small amount, zero. Split by whether DefiLlama tracks the pool at all, they do not distribute evenly. They barely distribute.
| Group | Positions | Zero-fee | Rate | 95% interval |
|---|---|---|---|---|
| Tracked, with APY data in the hold window | 114 | 0 | 0% | 0 – 3.3% |
| Tracked, no APY datapoint in the window | 40 | 3 | 7.5% | 2.6 – 19.9% |
| Not tracked at all | 45 | 16 | 35.6% | 23.2 – 50.2% |
Intervals are Wilson score, 95%. For the top row, where nothing at all happened in 114 tries, the plainer way to say the same thing is the rule of three: zero events in 114 observations puts the true rate at roughly 3 in 114, about 2.6%, as an upper limit.
The 19 zero-fee positions belong to 18 distinct owners. This is not one wallet's bad month.
Not very, and it matters more that we say so than that a reader works it out.
Forty-five positions is not many. Measure a different forty-five long-tail positions and the answer would not come back at 35.6%; it would land somewhere in a band, and the honest width of that band is roughly 23% to 50%. So 35.6% is a marker inside that range, not a measurement of it. Anyone quoting this report should quote the range.
What barely moves is the comparison. The tracked group had zero zero-fee positions in 114, which caps its rate at about 3% however generously you draw the interval. The two ranges — 23–50% against 0–3% — do not overlap, do not touch, and are not close to touching. That holds even if you take the least flattering end of one and the most flattering end of the other.
The formal version: if the two groups were really the same, a split this lopsided would turn up about once in roughly 6 billion repetitions of the experiment (Fisher's exact test, two-sided, p = 1.8 × 10⁻¹⁰).
So the claim this report makes is the contrast, not the number. Positions in pools the free data cannot see fail to earn at a rate the tracked pools do not come near. How much higher is a question 45 positions cannot answer precisely, and we are not going to pretend otherwise.
A finding this clean is usually an artifact. We spent longer trying to break this one than producing it, and it is worth saying exactly how, because the failures are what make the number worth trusting.
Was it a measurement artifact — positions still open, fees not yet collected? No. All 19 were confirmed fully closed on-chain. The position lifecycle code was rewritten and re-run from scratch against a 20-position sample; it landed on identical birth and close blocks, difference of zero, 20 out of 20.
Was one actor inflating the count? No. The 19 positions span 18 owners with no shared transactions between them. Counting owners rather than positions moves the long-tail rate from 35.6% to 36.6% (15 of 41 owners) — the wrong direction for a single-actor explanation.
Was the timing cluster below confounding it? No. That cluster contains 20 positions, of which 12 earned zero fees and 8 earned fees normally. If the cluster were the cause, it would not contain a control group.
Twenty positions, nineteen unrelated owners, births spread across a month, each held for approximately 349,000 blocks — a spread of ±355, or 0.1%.
Every one is an ordinary self-signed mint() straight to the Nonfungible
Position Manager. No shared router, no relayer, no wrapper contract, nothing
linking the transactions. The openings are scattered. Something coordinates the
closes, and we do not know what.
We are publishing this rather than removing it. It is disclosed here because it is real, it is checkable, and it is the kind of detail that gets dropped when the goal is a tidy story.
Positions are identified by NFT token ID, never by wallet — a wallet can hold
many positions and positions change hands. Each position is bound to its birth by
the Transfer(0x0 → owner) event, and its fee income is summed from the Collect
events it actually emitted. Nothing is inferred from balances.
Only positions held at least seven days are included. Shorter holds make zero-fee outcomes uninformative — a position open for an hour in a quiet pool earning nothing tells you about the hour, not the pool.
Each position's pool is then matched against the DefiLlama record in the Candor archive over the exact window the position was held, producing the three groups above. One position of 200 was excluded for exceeding the log-retrieval budget, leaving 199 across 88 distinct pools.
Every position in the sample was opened between 24 March and 12 May 2026 and closed between 15 April and 27 May 2026 — a single nine-week window in spring 2026.
That window is the honest scope of the result. Dates are derived from block numbers against a known block-and-timestamp anchor at Base's two-second block interval; over this range that is accurate to within a few hours, so read them as calendar days rather than timestamps.