{"name":"FOMO Radar","page":"https://cymetica.com/fomo-radar","summary":"Tracks which tokens credible wallets are buying right now on Robinhood Chain (4663) and on Solana. Both chains score conviction from per-wallet realized track records through the same code; a Solana pool the wallet source has not covered yet keeps the pool-level buy-pressure number and says so.","endpoints":{"signals":"/api/v1/clones/fomo-radar/signals?chain=robinhood|solana&filter=all|hot|fresh|exits&limit=40","traders":"/api/v1/clones/fomo-radar/traders?chain=robinhood|solana&limit=25","entities":"/api/v1/clones/fomo-radar/entities?limit=25","calibration":"/api/v1/clones/fomo-radar/calibration?chain=robinhood|solana","docs":"/api/v1/clones/fomo-radar/docs"},"calibrated_probability":{"question":"What share of signals at this conviction went 3x within 72h?","row_fields":{"probability_3x_72h":"the calibrated probability for this row's conviction, or null below the minimum sample count","probability_3x_72h_gated":"the same number multiplied by the market-wide regime exposure multiplier — 0.0 in a risk-off regime","probability_display":"the exact string the page shows; 'insufficient history (n/150)' whenever the labeled sample is too small","signal_type":"exit | hot | fresh | base — the primary category, one per row","type_precision":"rolling precision of this row's signal type (see below)"},"labeler":{"persisted":"every emitted signal is written to fomo_radar_signals BEFORE its outcome is known: chain, token, ts, score, signal type and the feature block; one row per token per 6h window","prices":"chain 4663 is indexed by no public OHLC source, so its price history is recorded from the chain's OWN trade prints (eth/tokens of each CurveBuy/CurveSell leg), bucketed at 60s inside the first hour and 900s afterwards; Solana falls back to the keyless public pool OHLC endpoint","labels":"max_multiple_72h, min_multiple_72h, hit_3x_72h, rugged_first5m (price -90% or liquidity -90% inside the first 5 minutes), rugged_24h, graduated (bonding-curve liquidity has left the curve contract) and graduation_survived","fail_closed":"a HIT is definitive the moment it trades at >= 3x the entry. With the complete trade record in hand a non-hit is a MISS even with zero prints (no trade == the price never moved). Without the record (source down, or the curve's own graduated() flag is true) a MISS still needs 3+ prints reaching half the window, else it is 'insufficient_data' and EXCLUDED from the fit with its reason published. On 4663 both the entry and the outcome are read from the chain, never from a board print"},"fit":{"model":"isotonic regression (monotone non-decreasing) of conviction -> P(3x within 72h): sklearn's IsotonicRegression when importable, otherwise the in-repo pool-adjacent-violators fit — same objective","window":"the newest labeled signals inside a rolling 60-day window (capped at 2,500), refitted every 15 minutes by the leader","brier":"OUT OF SAMPLE: fitted on the oldest 70% of the window, scored on the newest 30% it never saw. brier_base is what the constant base rate scored on the same tail — the bar the calibration must beat","bins":"predicted vs observed frequency per probability bucket on that same held-out tail; an empty bucket is dropped, never shown as 0%","min_samples":150},"signal_type_precision":{"types":["exit","hot","fresh","base"],"window":250,"min_samples":30,"note":"rolling share of that type's last labeled signals that hit 3x; below 30 labels the type reports 'insufficient history (n/N)' and no percentage. Above that floor a rate publishes only when its 95% Wilson score interval is tight (<=10pp wide): a confident 0-of-many low rate publishes, a noisy few-positives rate is held. ci_low/ci_high/ci_width/ci_ratio ride on each type.","sample_requirement_varies_with_rate":"By design the labels needed for a <=10pp interval scale with the rate: ~55 at a 2% rate, ~85 at 5%, ~145 at 10%, ~245 at 20%, ~385 at 50%. A rare type publishes long before a common one — a mid-range rate is genuinely harder to pin down, so this is correct, not a threshold bug. ci_ratio (top/bottom of the interval) is carried alongside ci_width because in EV terms a rare rate is about the ratio, not the difference."},"regime_gate":{"measure":"median 24h return and the share of tracked tokens below their 24h open, across the tracked Solana pool universe — the keyless, cross-launchpad slice of the meme market","states":{"risk-on":"multiplier 1.0","caution":"median <= -3.0% or share below open >= 0.6: multiplier 0.5","risk-off":"median <= -8.0% or share below open >= 0.75: multiplier 0.0, 'signals suppressed'","unmeasured":"fewer than 12 tracked tokens carry a 24h return: multiplier 0.0. We never claim risk-on by omission"},"note":"the answer to a bleeding market is zero exposure, not a better model — the gate scales the recommendation, it does not re-rank"}},"chains":{"robinhood":{"chain_id":4663,"source":"chain-4663 RPC: CurveBuy / CurveSell bonding-curve logs, tailed live","conviction_kind":"trader-credibility","trader_score":{"formula":"100*(wins+3)/(round_trips+6) + 15*tanh(realized_eth/0.5) + 5*min(1, round_trips/10)","range":[0,100],"no_history_value":50,"round_trip":"wallet sold >= 90% of the tokens it bought on that curve","score_raw":"the same formula without the 0-100 clip (max 120) — the ranking key and tie-breaker on /traders, so two wallets at 100.0 are no longer tied","avg_log_return":"mean of ln(proceeds_eth/cost_eth) over closed round trips — the statistic for a convex payoff (a +5% scalper and a 5x holder differ here even at the same win rate); null with no closed round trip","open_positions":"curves this wallet still holds in the window (bought, not yet 90% sold; at most 12 tracked per wallet) with open_cost_eth — open positions are counted but NOT marked to market"},"conviction":{"qualified_buyer":"trader score >= 60.0","formula":"raw = sum over qualified buyers of selectivity * overlap_discount * (score/100)^2 / (1+0.15*i) (i = rank by score); raw *= 1+log10(1+10*qualified_eth); conviction = 100*raw/(raw+3)","overlap_discount":"1/sqrt(k), k = size of this wallet's portfolio-overlap cluster among the curve's qualified buyers: two wallets are one voter when their bought-token sets in the window carry >= 8.0 nats of shared information (union-find, so transitive). No minimum portfolio size. A farm of k near-identical wallets casts sqrt(k) votes, not k (top_buyers[].cluster_size; row-level overlap_clusters, qualified_buyers_clustered, effective_qualified_buyers)","shared_information":"sum over tokens t both wallets bought (the curve being scored excluded — everyone in this vote bought it by definition) of ln(W / w_t), W = wallets active in the window, w_t = wallets that bought t. The day's hot coin (~400 of ~10k) is worth ~3.2 nats and never clusters anyone; two coins with ~6 buyers each are worth ~14.8 and do. Replaces the Jaccard ratio + min-3-tokens exemption (a cliff: a two-token farm cast 11.0 votes where the 36-token version cast 1.39). The threshold is the number the outcome labeler calibrates; until then it is a stated prior","vote_weight":"selectivity * overlap_discount * (score/100)^2 — what the wallet contributes before the rank decay; top_buyers is sorted by it, so the listed order is the order of influence, not of raw score","selectivity":"ln(N/n)/ln(N), N = tokens tracked in the window, n = distinct tokens this wallet bought in it; floored at 0.05 — a wallet that buys everything cannot vote for anything in particular (top_buyers[].selectivity, tokens_bought_in_window; row-level avg_buyer_selectivity)","co_purchase":"qualified buyers whose FIRST buy of the scored curve landed in the same block (same_block_groups) or the same transaction (atomic_groups) are linked into the SAME union-find as shared information, so they carry one k. Portfolio similarity has a ceiling by construction — a farm can give each puppet different obscure coins — but the puppets still have to buy the target and they tend to land together. Read straight from the curve trade logs (blockNumber, transactionHash); no new source. top_buyers[].first_buy_block / first_buy_tx show the link","entity_resolution":"conviction is summed over ENTITIES, not addresses (ET-25026). Union-find over four evidence rules links sibling wallets into one entity: same atomic transaction; same block on the scored curve; a common non-exchange funder (the address that submitted a wallet's first observed buy — self-submitted buys draw no edge, an in-repo exchange/infrastructure exclusion list is skipped, and any funder with more than 25 children is treated as infrastructure); a shared bundle id where the chain publishes one; and cosine similarity >= 0.85 of idf-weighted token-portfolio vectors sharing at least 2 tokens. An entity votes ONCE: its score is its BEST member's trader score (a farm can neither dilute nor amplify), its ETH is the SUM of its members' ETH on the curve, and its selectivity is computed on the entity's UNION portfolio — 40 tokens spread over 8 wallets is a 40-token buyer. The 1/sqrt(k) overlap discount is then charged per ENTITY in a cluster, never twice for wallets that already merged. Rows publish wallets, entities, qualified_entities, sibling_wallets, entity_summary and top_entities[]; the snapshot publishes entity_resolution with each rule's live/unavailable state. FAIL-CLOSED: a rule whose source is unavailable draws NO link and those wallets are counted at the address level, which the page and entity_resolution.fallback say out loud","note":"dollar volume alone can never create a signal — zero qualified buyers scores 0"},"tradeability":{"max_buy_5pct":"largest ETH/USD buy whose AVERAGE fill price is <= 5% over spot on the curve's reserve: constant-product (x*y=k on the virtual reserves), average price = spot*(1+x/R), so x_max = 0.05*R. Exact for xy=k; first-order on any other curve shape","curve_held":"ETH the curve CONTRACT itself holds (eth_getBalance), published next to the accounted reserve (liquidity_eth, getReserves) that prices the curve. On a fresh curve the reserve includes a ~1.68 ETH virtual base, so a row with eth_in ~= eth_sold shows $4.2k of liquidity over $25 held — and $25 is what sellers can take out. On a curve whose reserve is far above the base the liquidity has graduated to a pool the curve does not hold, so 0 here means 'held elsewhere', not 'cannot be sold'. Never estimated: null until read","thin":"true when max_buy_5pct_usd < $500; rows are flagged, not dropped","same_name_on_board":"how many OTHER rows carry the same token name — names are not unique on the launchpad; curve_address/token_address are the identity"},"window_seconds":21600,"fields":{"top_buyers[].bought_tokens":"tokens this wallet bought on this curve (this window)","top_buyers[].sold_tokens":"tokens this wallet sold BACK on this SAME curve (this window)","top_buyers[].eth_out":"ETH this wallet received selling on this curve","top_buyers[].cost_basis_eth":"eth_in / bought_tokens for this wallet on this curve; null when bought_tokens is 0 — never a fabricated number","top_buyers[].gone":"true once sold_tokens >= 90% of bought_tokens (same rule as a closed round trip)","top_sellers[]":"up to 5 sellers on this curve, sorted by trader score then ETH sold, each with the same bought/sold/gone fields","flow[]":"the last 20 trade legs on this curve, newest first: {side, address, address_short, score, eth, usd, tokens, ts}; usd is null with no live ETH/USD price","gone_wallets":"count of wallets on this curve that meet the 'gone' rule above","qualified_gone_wallets":"gone wallets whose trader score is >= the qualified threshold (the count the credible-exits rule uses)","tokens_bought":"sum of bought_tokens across all tracked buyers on this curve","tokens_sold":"sum of sold_tokens across all tracked sellers on this curve","exit_reason":"'net-selling' | 'credible-exits' | null — which exits trigger fired, see 'exits' below","identities_pending":"snapshot-level: rows whose curve -> token lookup has not resolved; identities are seeded from the last published snapshot on restart, so this is normally 0"}},"solana":{"source":"pool board: GeckoTerminal public trending + new Solana pools (keyless). Per-wallet trades: a public Solana JSON-RPC — getSignaturesForAddress on each tracked pool account, then getTransaction (jsonParsed) parsed into a swap leg from the SIGNER's own balance deltas (base-mint token delta against the SOL/WSOL or stable delta). No key of any kind","conviction_kind":"trader-credibility on a covered pool, buy-pressure on any pool the wallet source has not covered yet — each row says which, in its own conviction_kind","smart_money_feed":false,"trader_score":{"formula":"100*(wins+3)/(round_trips+6) + 15*tanh(realized_sol/0.5) + 5*min(1, round_trips/10) — the SAME function chain 4663 runs (src/api/routes/clones/fomo_credibility.py), denominated in SOL instead of ETH","range":[0,100],"no_history_value":50,"round_trip":"wallet sold >= 90% of the tokens it bought in that pool; the same close rule, folded by the same shared helper","avg_hold_seconds":"mean holding time of CLOSED round trips; null with none"},"conviction":{"qualified_buyer":"trader score >= 60.0","formula":"identical to the Robinhood formula above — selectivity, the portfolio-overlap discount and the rank decay are the same code path; 'block' is a Solana slot and 'tx' a signature","credible_wallet_share":"qualified buyers / buyers we have actually indexed on that pool — how much of the visible buying comes from wallets with a realized track record","coverage":"a pool is scored on credibility only after at least 8 swap legs of it have been parsed; until then the row keeps its buy_pressure number"},"buy_pressure":{"formula":"100 * (0.35*max(0,buy/sell imbalance 24h) + 0.20*max(0,buyer/seller imbalance 24h) + 0.20*max(0,1h imbalance) + 0.15*log10(1+buyers)/5 + 0.10*log10(1+liquidity_usd)/7)","note":"always published, on every row, next to the conviction — this is the pool-level number and it is wash-tradeable for the price of gas, which is exactly why the credibility layer exists"},"fail_closed":"when the per-wallet source is down or stale the whole board degrades to buy pressure, credibility_available goes false and wallet_source.message says credibility is unavailable. A track record is never invented, extrapolated or inferred from pool aggregates","persistence":"realized round trips take hours to accumulate through a free public RPC, so wallet records, their open positions and the per-pool signature cursors survive a restart"}},"filters":{"hot":"buy-pressure AND tradeable: 3+ qualified wallets opened a position in the last 15 minutes (or the buy rate is running above the token's own average), AND the curve is deep enough to act on (max_buy_5pct_usd >= $500). A burst on an untradeable curve is not hot; an unreadable reserve fails closed to not-hot. The raw burst is kept on 'hot_pressure'. Both chains now carry max_buy_5pct_usd: chain 4663 reads a per-curve reserve, Solana derives it from the pool's two-sided TVL (5% of reserve = cap * TVL/2 on xy=k), null when TVL is unread","fresh":"token launched in the last 24 hours","exits":"EITHER of two OR'd, Robinhood-only rules ('exit_reason' says which fired): 'net-selling' — >=2 qualified sellers AND qualified sell ETH > 1.3x qualified buy ETH AND eth_out > eth_in (the original, strict rule — can be true for zero tokens on a quiet day, which is a correct result, not a bug); 'credible-exits' — >=2 wallets with trader score >= 60 have fully exited this curve (sold back >= 90% of what they bought) AND the last hour is net selling (sells_1h >= buys_1h). Neither rule is weakened by the other existing."},"not_built_yet":{"entity_bundle_links":"bundle-id linking is wired but chain 4663 publishes no bundle id on its trade logs or receipts, so the rule reports 'unavailable' and those wallets are counted at the address level — never a guessed link. Everything else in conviction.entity_resolution is live","entity_funder_depth":"the funder edge uses the address that SUBMITTED a wallet's first observed buy (one hop, read from the trade's own transaction). A full first-funding trace back through the transfer graph needs a transfer-history index this slot does not hold yet","solana_wallet_layer":"BUILT (ET-25027): Solana wallets now carry the same realized track record as chain 4663, parsed from public-RPC swap transactions. NOT built: a Solana funder-hop / bundle link (same as 4663), and coverage is board-ordered rather than chain-wide — a pool that has never been on the board has no indexed wallets and stays on buy pressure","historical_backfill":"the labeler measures signals from the moment it was switched on — no past signal stream was ever persisted, and inventing one would not be a measurement. Until the labeled sample clears the minimum, every row reads 'insufficient history (n/N)' and carries no probability"},"not_available":{"trader_handles_or_names":"no keyless public source maps a chain-4663 wallet address to a human handle/name; we show the address (and its explorer link) and never invent or guess a handle","written_theses":"nothing on-chain carries a trader's reasoning for a buy/sell; we do not fabricate commentary — every field here is derived from actual trade logs","receipt_level_provenance":"we show aggregated per-wallet/per-curve totals and the last 20 raw legs (flow[]), not a per-fill receipt trail beyond that; a field we cannot compute from the indexed logs is always null, never estimated"}}