# #235 contract caps + #335/#566 social/meta table (dataeng, 10 Oct)
## Contract caps - /opt/ppcopy/tokcaps.db table t(token PK, size, hash, sel, owner, supply, decimals, name, symbol)
21,159 tokens = every token in e1-runners.csv + e1x-runners-v2.csv (all venues, 21 Sep-9 Oct). Runtime code size, code hash (8,087 distinct), 4-byte selector list (comma sep), owner() now (null if no owner(): 15,590; zero address = renounced: 1,736; other: 3,833), totalSupply, decimals, name, symbol. Paid research RPC, ~100k calls. Script /opt/sw/dataeng/tokcaps.py (resumable, picks up new rows of the two csv).
NOT done (say which you want): owner at creation / +300 s (needs historic eth_call; paid archive call per token at block+N: ~42k calls ~ $0.25), buy/sell tax simulation (needs per-token stateOverride sell sim: that is ppfeeds' eth_call method), tokenURI/launchpad-event fields, kit B coins since 1 Oct not in the csvs.
## Social/meta - /opt/ppcopy/dsmeta.db (copy after stage 2; building), same 21,159 tokens
ds(token, polled_t, has_profile, pair, pair_created_ms, name, symbol, x_url, tg_url, web_url, gh_url, other_json, image, header, mcap): from DexScreener tokens/v1/robinhood. Only 1,338 of 21,159 (6%) have a DexScreener profile at all (1,285 an X link, 1,199 a website, 57 a GitHub, 486 Telegram); the rest are 'no socials known'. web(url, status, bytes, title, tpl_hash, ok): homepage fetched, tag-skeleton hash for template clustering; gh(repo, created, pushed, stars): GitHub public API.
NOT reachable free: X account age/followers/known followers (no free X API), domain age (needs whois), DexScreener 'paid' flag history (dsorders.db by another role has the order feed live), per-field first-seen history (DexScreener gives only the current snapshot; polled_t is when I saw it, not when it appeared). So a gMAK tier-1/2 score can only use: has_profile (proxy for DEX paid), website template cluster, GitHub age, 'x link present'. Raw X age remains blocked.
## Per-token feature table for the rug-tier arms (#566): dsmeta.db table tier(token, has_profile, has_x, has_tg, has_web, tpl_hash, tpl_cluster_n, web_ok, gh_created, gh_age_days_at_poll, pair_created_ms, polled_t)
Joins to e1/e1x by token. Snapshot at the time of writing: 1,338 with profile; 439 sites fetched (stage 2 still running in the background, 1,190 total; re-run `python3 -I dsmeta.py 4` after it finishes and copy to /opt/ppcopy), only 5 GitHub repos resolved so far (GitHub unauthenticated limit 60/h, job running). Template clusters are almost all singletons (439 distinct hashes for 439 sites), so "template slop" cannot be flagged with this hash yet; a coarser fingerprint (title / script file names) would be the next step.
No-look-ahead warning: has_profile etc. are as of polled_t (10 Oct), NOT as of entry. For entry-time arms only has_x/has_profile at launch matter and we cannot know them; use this table for a post-hoc "did it have socials" cut, not as an entry filter.
