# #682 DexScreener orders feed + #690 sell-probe stream (ppfeeds, 10 Oct 2026)

## #682 dsorders (research-box /opt/sw/dsorders/dsorders.py, service dsorders, guard entry)
- DB /opt/ppcopy/dsorders.db. dsorders(token,type,status,pay_ts ms,info_json,polled_t,first_seen,poll_no,src) one row per order (tokenProfile/communityTakeover/tokenAd);
  dspolled(token,poll_no,polled_t,n_orders,has_info,src) one row per poll (a token with 0 orders still has a dspolled row: use it to tell "no orders" from "not polled").
- BACKFILL (src='bf', poll_no 0): all 2383 distinct tokens with peak_cap>=300k in e1x-runners-v2.csv, biggest peak first, orders + tokens/v1 info (websites/socials/header). ~1 req/s, ~90 min, resumable (`python3 dsorders.py backfill`). Check `select count(*) from dspolled where src='bf'` = 2383 when done.
- LIVE (src='live'): tails radar.jsonl cross events; polls at 0, 5, 15, 60 min after first cross seen (info only at 0 and 60). Live jsonl /opt/sw/radar/dsorders.jsonl: {token,poll_no,t,first_seen,ds_paid_t (s, earliest tokenProfile),orders,has_info}.
- ASSUMED/GAP: radar's lowest level is 300k, not 30k. So live polling starts at the first 300k cross, not at 30k. Profile payment time is still exact (paymentTimestamp, history included), so cap-at-payment tests work; only the "detect it at 30k" lag test can't. Adding a 30k level to radar means ~10x more cross lines for every radar reader: not done, say if wanted.
- ds_paid_t is NOT written into radar rows (radar untouched); join on token. Example:
  `select p.token, min(o.pay_ts)/1000.0 from dspolled p left join dsorders o on o.token=p.token and o.type='tokenProfile' where p.src='bf' group by p.token`

## #690 sellprobed (/opt/sw/sellprobed/sellprobed.py, service sellprobed, guard entry)
- DB /opt/sw/ppdata/sellprobe.db (research-box) table probe(pool,t,block,sz_usd,ok,out_quote,impact,reserve_quote,venue,quote,cap_usd), 2 rows ($20,$100) per pool per 60 s, each pool for 4 h after its first radar cross (>=300k) or sellcross 100k row. Pools: v3 and v4 WETH/native/USDG (hooked or not). Not: v2, pons curve, stock/tokq quotes.
- CHANGED METHOD: no router eth_call sell. The sell sim reverts on ~90% of hooked pools for an unknown reason (sellcross.db: 35 of 39 revert 0x4713c18b), so ok would be noise. Instead on-chain pool state (v3 slot0/liquidity, v4 PoolManager extsload) and the math: impact of selling $20/$100 inside the current liquidity range (constant L, fee ignored, no tick crossing = lower bound), reserve_quote = virtual quote reserve (L*sqrtP). ok=1 if L>0, ok=0 if no liquidity at the current tick (drained/out of range), ok=NULL read failed. It cannot see a hook that blocks sells (that stays sellcross' job).
- No backfill (no archive state on free RPC). radar_hist column sellable_100k NOT added.
- COST: free RPC is saturated (429), so batches fall back to the paid research key: ~60 pools x 2 calls/min = ~7k req/h = ~$0.04/h (~$7/week if always paid, of the shared $20 cap). Say if you want 120 s spacing.
- First sample: 61 pools, 92 of 242 rows ok=0 (L=0 at current tick) - mostly dead or out-of-range pools in the 300k+ crosses of the last 4 h.
