# #439 First-5-min swap table per launch (dataeng, 10 Oct)
File: /opt/ppcopy/first5.db (research-box, 470 MB) table b5(pool, venue, quote, side, t, dt, wallet, sender, tx15, tx_from, usd); index on pool, wallet. Script /opt/sw/dataeng/first5.py (rerun to refresh, ~3 min).
Rows 1.41M, swaps within 300 s after each pool's first swap (buys and sells; side by quote-side direction). Pools: v2 WETH 53.8k, v3 WETH 5.6k, v4 WETH 6.4k, v4 native 5.9k (r6nat..nat3, overlapping pools deduped by pool key only per source: use distinct), v4 USDG 14.3k (+16 SUSD).
- usd = quote amount x ETHUSD (1-min btceth) for WETH/native; USDG/SUSD taken as 6-decimals $1 (median swap $14, plausible).
- wallet = swap recipient: filled for v2 and v3 (the buyer). EMPTY for v4 (router is sender): use tx_from, filled only where we have it (from /opt/ppcopy/txfrom_all.db: 49k of 176k v2, 49k of 323k v3, 177k of 353k v4 WETH, only 304 of 369k v4 native, 485 of 190k USDG). For full v4 coverage tx_from must be fetched (about 1 paid call per block; ask me which pool set).
- Coverage ends where the tapes end (r6weth to 8 Oct, r6nat to 9 Oct; see fw/de-partial-9oct.md). Some pools appear in two sources (r6nat vs r6nat2/3): dedupe on (pool, tx15).
Not included: wallet realized PnL (needs the full tape per wallet; build on this table plus tapes if wanted).
Example: select wallet, count(distinct pool), sum(usd) from b5 where side='buy' and wallet is not null group by 1 order by 2 desc limit 20;
