_writing

note · 2026-09-20 · 12 min

45,000 pools in four days. Anatomy of a meme market on a new L2

What the scanner showed once I recorded every pool, swap and liquidity move on Robinhood Chain — before putting in the first dollar. Five different worlds instead of one market, traps, factories, and the single feature that predicts anything.

This is a data write-up, not a money story. The money story runs separately; this is what it stands on. Everything below was collected 10–13 September 2026 on Robinhood Chain: a new L2, 0.1 s blocks, no public mempool, Uniswap v4 as the main DEX, thousands of meme pools a day and almost no bots. A young market is the only place where $200 makes any sense, and the only one where nobody has collected the statistics yet.

Scanner first, bot second

The first thing I wrote was not a trading bot but a scanner. Every Initialize, every Swap, every liquidity move goes into SQLite with block precision. A pool that survives to three hours gets labeled: how many swaps, what volume, whether liquidity was pulled, who created it.

Dataset as of 13.09, 22:10 UTC
Pools44,807
Swaps4,833,953
Liquidity events (since 13.09 03:00)142,463
Labeled (survived to 3 h)36,839
Unique creators7,684

Why not trade right away: the first “conclusions” from 100 pools turned out to be garbage. “v3 is ten times better than v4”, “the top 3 pools make 90% of volume”, “a BEFORE_SWAP flag in the hook is certain death” — a day later the data overturned all of it. Conclusions are drawn on thousands of pools, not a hundred. And even on thousands — with caveats, below.

Five worlds instead of one market

Averages over the whole base are meaningless, because a “meme pool on RH” is five different phenomena with different economics. Full three hours of observation, excluding the 10.09 data-gap window (n = 32,007):

SegmentPoolsDeadMeaningfulRug within 10 min
v4, no hook, fee ≥ 50% — traps11,94880%0%
v4, no hook, normal fee10,04030%24%25%
Tokenized-stock hook6,09560%33%*
Other hooks2,05546%28%2%
v387543%23%
Launchpad6190%99%0%
v237521%56%**

“Meaningful” — ≥ 1 ETH of volume in three hours. “Dead” — no swaps after the first minutes. * For stock pools “meaningful” is measured in units of the stock token, a different scale. ** 91% of v2 swaps come from one contract; of the 52 “meaningful” v2 pools, 36 have at most three senders. That is not a market, that is one script.

Meaningful is not profitable. Of pools with ≥ 10 swaps in the first minute, 79–90% become meaningful, but only 39–45% finish above +10% from the entry price at second 60. A crude activity filter selects pools where something happens; what exactly happens is a separate question.

Traps: fees up to 100%

Uniswap v4 allows an LP fee of up to 100%. About a dozen bots with fixed signatures create a pool for every new token they see: 1,087 such pools appeared ~5.5 minutes after the launchpad pool of the same token, thousands more for tokens with no normal pool at all. Some tokens have 70–200 trap pools. Swaps in them are few, but the largest single loss in the base is 0.099 ETH at an 88% fee: you can buy, and you can sell only by giving almost everything back.

A separate kind of noise — the “ladder”: one address created 533 pools for two tokens with fees of 100, 110, 120 … 5,000 basis points. Why, I don’t know; possibly to clog routers.

The rule is simple: an abnormal fee without a dynamic hook — skip; the router only goes into the token’s most liquid pool. Without this rule any statistic over the base is meaningless: 35–40% of all pools are traps.

Factories: how a rug works

Since 13.09 the scanner records liquidity events, and the rug picture became concrete. Of 1,773 ordinary v4 pools with liquidity, 25% have ≥ 50% of it pulled within the first 10 minutes. On the launchpad — 0%, on pools with other hooks — 2%.

Who pulls it: in 12 of 12 bot positions I checked — the pool creator, who is also the only liquidity provider. The pattern repeats word for word:

  1. Fresh wallet.
  2. Token → pool → liquidity.
  3. 11 swaps through one router, 0.86 ETH in total — price ×1.37 in 30 seconds.
  4. Liquidity pulled 30–230 seconds after launch.

The only buyer is himself. A new wallet every time, so a “new deployer” filter lets it through. Later the factories learned more — a new launcher and a new token template for every pool — but that belongs to the money story.

The feature available at second 30 (277 pools with ≥ 5 swaps):

RulePools leftRug rate among them
No filter100%30%
≥ 3 independent buyers34%4%
≥ 5 independent buyers25%1%
Depth ≥ 1 ETH and ≥ 3 buyers18%0%

And a paradox that matters more than the table: in the dry run it was precisely the one-buyer pools that made the bot +26% (43 of 55 trades), while pools with three or more buyers made −30% (n = 10). The bot is de facto riding the rugger’s own pump and in four cases out of five exits on take-profit before he pulls liquidity: TP on average 65–85 s after entry, the pull 55 s after. In one case out of five it doesn’t make it. Those are the 20% write-offs.

The launchpad: zero rugs, but a ten-minute game

The only hook with 99% meaningful pools is the local launchpad. Liquidity sits with the hook and the creator cannot pull it: of 119 pools with liquidity — zero withdrawals. The launchpad router carries 48% of all ETH swaps in the base; the hook itself sold the tokens it collected for +204 ETH in the first two days.

But that does not mean money can be made there. Price relative to entry at second 30 (ETH pools, n = 64):

1 min5 min10 min20 min30 min60 min
p250.890.790.370.130.100.08
median1.001.050.890.640.400.16
p751.161.531.591.451.800.88
p901.362.072.362.222.622.19

Peak: median 1.62× at minute eight, p90 9.1×. After three hours the median is 0.145×. Volume stops at a median of minute 65. The simulation says tight stops lose here (TP +30 / SL −30 / 5 minutes → −5.5%), and asymmetry works: half the position at +100%, trailing, out by minute 20 → +10…20% on paper. A dry run of 41 trades gave −1.9%: 24 stops at minute five with a peak of +25%. Bots churn these pools, and the quote for our size jumps harder than the prints in the tape. Verdict for now: a small, noisy edge, unconfirmed.

The pool creator is the main feature

Of everything you can compute at second 30, the strongest predictor of the outcome is not volume, not swap count, not the hook — it is who created the pool. Three cohorts under identical entry rules:

CreatorPoolsMeaningfulMean outcomeMedian
New deployer, first pool42571%+21.2%+9.4%
Repeat deployer10128%−2.5%−11.2%
Secondary pool of an existing token7036%−8.1%−19.9%

The blacklist of serial creators builds itself: a wallet with 24 tokens and 24 dead pools, a wallet with 23 pools of the same test token, a wallet with 103 pools and 9% meaningful. Launchpad pools are created by four relayers — the rule does not apply to them.

The feature’s limit is the factories: they change wallets for every token and pass as “new”. So the creator is a necessary condition, not a sufficient one.

Hooks as platform identifiers

A hook address is effectively a platform identifier, and the spread between platforms is wider than between any activity filters. There are hooks with 66% meaningful pools and hooks with 0% — with identical flags. The BEFORE_SWAP flag by itself predicts nothing. The hook whitelist and blacklist are recomputed daily.

The first block is not worth fighting for

The sniper’s intuition — “you have to be first”. On this market it doesn’t hold.

  • In ordinary pools the price one minute after the first trade is, at the median, 13% above the first trade. On the launchpad it is below the first — there the first buy is made by the launcher inside the creation transaction.
  • In the first three swaps of ordinary pools, 163 bot wallets make 58% of trades, 42% of those within the first 5 seconds. But the size is dust: 265 pools at 0.0008 ETH, 84 pools at 0.0004 ETH. These are honeypot probes, not positions.
  • The only participant with money and selectivity in the first seconds: 23 pools at 0.035 ETH, 61% meaningful.
  • A pool’s “meaningfulness” does not depend on who entered first.

No public mempool, priority fee is zero, block order is first come, first served. There is a race, but not for the first block: for the first meaningful minute.

Time of day

By UTC hour: 02–05 — 25–30% meaningful at lower flow; 14–16 — 16–18% at twice the noise; 22–01 — 12–24%. The Saturday-to-Sunday night gave 10% meaningful and 43% dead against 26% / 24% on weekdays. The market regime changes by day; one day is not statistics, a week of data is mandatory. Meanwhile the pool flow kept growing: 355/hour on 10.09 → 755/hour on 13.09.

What broke in the data

Half of the early numbers were noise not because of the market but because of my own defects. The honest list:

DefectEffectFix
Swap direction for v4 computed from the sign, as in v3Buys and sells swapped in every v4 poolDedicated direction function; 1.82M rows recomputed
The Swap WebSocket subscription silently degrades: the library falls back to polling with truncated getLogs, while Initialize keeps workingTwo 3-hour collection gaps: 5–10% of swaps, thousands of pools look “dead”Reconciliation via getLogs every 30 s; gaps backfilled
On shutdown the scanner labeled pools younger than 3 hours2,158 pools labeled on 69 minutes of dataYoung pools are not labeled; adopted on restart
Creator field was not populatedThe main feature was invisibleResolved on insert + recomputed
The simulator “sold” at the last price of a pool that had gone silentTrailing ROI overstated several timesPenalty for exiting a dead pool, a separate “pessimistic” column
The node cuts dense getLogs (“log query timed out”)Backfill took hoursRanges ≤ 20k blocks

Infrastructure breaks more quietly than strategies. A strategy that doesn’t work shows up in PnL. A subscription that silently stopped receiving events shows up only as “the bot found no candidates overnight”.

What became the strategy

The only segment with an honest plus: the first pool of a new creator with real buys in the first 30 seconds — enter at second 30, take profit +50% on the whole position, stop −30%, exit on liquidity pull. Three dry runs in a row:

RunTradesWinnersRugsROI
12.09, night2060%3+4.6%
13.09, day8467%17+13.0%
13.09, evening6170%13+14.0%
Total17767%36 (20%)+12.2%

The simulation says +19…26% — it doesn’t see rugs. Replaying the same positions at swap prices with harsh slippage — 0…+7%. Honest estimate: 0…+12% per position, with a fat tail. The structure of a day: 50 take-profits (+0.084 ETH, on average after 85 s), 17 write-offs (−0.051), 13 timeouts (+0.005), 4 stops (−0.005).

What the dry run could not see, and what the first week of real money added, is in the diary. Spoiler: the gap between “the quote at the moment of decision” and “execution one second later” turned out to be bigger than the whole edge.

Contract addresses, keys and exact filter thresholds do not go here.

← all notes · questions: @zick0x