# poolout.db (dataeng2, #306, 10 Oct 2026)
Path: research-box `/opt/ppcopy/poolout.db` (source/scripts `/opt/sw/dataeng/poolout.py`, `po_fill.py`, `po_run.sh`). Table `poolout`, one row per pool, indexes on created_t and root.
Rows: v2 WETH 101,571 (tape r6tape, created 21 Sep-9 Oct) | v3 WETH 6,177 | v4 WETH 15,463 (r6weth) | v4 native 2,737 (r6nat, PARTIAL: #142 asked 8,580; rest still unbuilt).
Tape ends 9 Oct ~07:20 UTC (no b084 yet), so `hours_covered` (capped 4) drops for late pools: filter hours_covered>=4 for complete rows.

## Columns
pool, venue(v2/v3/v4), src, token, quote, fee, hooks, created_t (unix), creator, root, seed_eth, first_swap_t, base_t, n_swaps_60s, n_recip_60s, res10/60/300/600, m60..m3600, maxm_4h, pull_t, hours_covered, glitch.
- creator = tx.from of the creation tx; root = crew.db funding root. Only v4 pools launched 5-9 Oct are in crew.db (7,901 of 18,200 v4 rows have both). v2/v3 and earlier v4: NULL for now. `creators_tx.py` (RPC job, running) fills creator for all; funding walk (root) for v2/v3/native is NOT done yet (needs free RPC; see below).
- seed_eth: v2 = first Sync WETH reserve; v4 = ETH side of liquidity added before the first swap, at init price (tick math); v3 = NULL (v3 mints have no tick data in the tape).
- base price = last swap at or before created_t+5 s (else first swap; base_t says when). m60..m3600 = price at last swap <= created_t+N s divided by base. NULL = no swap by then (or base later than N). 0 = pulled before N. maxm_4h = max swap price within 4 h / base. v2 price comes from Sync reserves (rq/rt).
- res10/60/300/600 = ETH-side reserve proxy: seed_eth + cumulative net ETH-side swap flow (v3: flow only; v4/v3 exclude later liquidity adds). v2 = real Sync reserve.
- n_swaps_60s / n_recip_60s: swaps and distinct swap recipients in the first 60 s after creation. Recipients are NOT tx.from (router recipients mix); true signers need tx.from per swap (txfrom.db/txshared.db, partial).
- pull_t: v3/v4 = first swap where in-range liquidity < 50% of its running max (time of last removal event before it); v2 = first Sync where WETH reserve < 50% of running max. NULL if none.
- glitch=1: any multiple was above 1e5 (price print glitch from drained/pulled pools); those multiples are set NULL. Drop glitch=1 rows for averages. Use medians; means are dominated by tiny-pool outliers.

## Not done / gaps (honest)
1. root for v2, v3, older v4 and native (funding walk) and creator for them: creators_tx job ~104k blocks, free RPC is saturated (about 1 block/s now), will take many hours; poolout refreshes it daily (cron 03:20 UTC) and fills as creators_tx.db grows.
2. native v4 pools 2,737 of 8,580 (#142 open).
3. no data after 9 Oct 07:20 UTC.
Example: select fee, hooks<>'' h, count(*), avg(m300) from poolout where venue='v4' and glitch=0 and hours_covered>=4 group by 1,2;
