Network scorer methodology

The in-house scorer prices networks no third-party calculator covers (points programs, thin emissions, cash networks) into a comparable risk-adjusted USD/day, with every estimate explicitly flagged.

Why it exists

WhatToMine, NiceHash and Vast asks cover mature markets. The registry (src/scoring/registry.ts) covers everything else: pre-TGE points programs, freshly listed emissions plays, bandwidth networks. The point of the in-house registry is exactly that no third party computes an EV for these.

Tiers

The tier follows the token state (src/scoring/score.ts):

TierToken stateMeaning
AcashMeasured cash payouts (USDC or fiat). The only "real" number.
Blisted_liquidToken listed with deep DEX liquidity, priced live.
Clisted_thinListed but thin. Also the forced ceiling for CEX-only tokens: a token priced by manual CEX quote is downgraded from B to C, CEX-only never counts as liquid.
Dunlisted_pointsPre-TGE points, pure expected value. Also the fallback when no DEX price can be found at all. Plan items built on tier D are marked speculative.

The three gross models

Gross revenue, before risk adjustment, comes from one of three models (src/scoring/types.ts):

1. cash_measured

gross = usdPerDay, a measured payout. No model, no discount. This is the anchor everything else is compared against.

2. emissions (liquidity-adjusted)

For listed tokens emitting to node operators:


dailySellUsd = networkTokensPerDay * sellFraction * priceUsd
realizable   = 1 / (1 + 4 * dailySellUsd / liquidityUsd)
gross        = tokensPerDayPerUnit * priceUsd * realizable

The realizable fraction (src/scoring/liquidity.ts) answers: how much of the spot price is actually capturable when the whole network's daily sell pressure hits the available DEX depth. Ratio 0 gives 1.0, ratio 0.05 gives ~0.83, ratio 0.5 gives ~0.33. Below 50% realizable the entry is flagged "liquidite trop fine pour la pression vendeuse".

Pricing path, in order of preference:

  1. Contract address + chain via DexScreener token-pairs/v1/{chainId}/{tokenAddress}, filtered on baseToken.address, deepest pair wins. Address pricing is mandatory policy after the XTM incident: symbol search for "XTM" returned Xtime on MultiversX at $0.80 while real Tari XTM traded at ~$0.0005, a 1600x mispricing. A fake Solana "BLESS" pool showing $679M liquidity is the same trap.
  2. Address without chain via the legacy latest/dex/tokens/{address} endpoint.
  3. Symbol search, collision-prone, kept only for tokens whose address is not yet known; flagged in the output ("prix par symbole: collision possible, ajouter l'adresse").
  4. Manual CEX price (cexPriceUsd) when no DEX pair exists at all (example: Tari XTM, CEX-only as of 2026-07-25). The entry records the spot price, source, and lastVerified date, which is echoed in the flags so staleness stays visible. 24h CEX volume, when known, serves as a crude depth proxy for the realizable fraction; without it, a default 30% realizable is assumed. Tier is capped at C.
  5. Nothing found: flag "prix DEX introuvable", tier forced to D, gross 0.

3. points_ev (pre-TGE, calibrated on comparables)

For unlisted points programs:


gross = (comparableUsdAtTge * pTge * earlyMultiplier) / expectedFarmDays

Each points_ev result is flagged with its parameters, e.g. EV model (p=0.7, comp=$80).

Risk multipliers

The gross is then multiplied by:


riskMult = (1 - banToS) * (1 - death) * (1 - vestingHaircut * 0.5) * (kyc ? 0.9 : 1)
riskAdjUsdDay = gross * riskMult

scoreAll scores the whole registry concurrently and sorts by riskAdjUsdDay descending.

Contention and opportunity cost

Every entry declares what scarce resource it contends for: gpu, cpu, ip_slot, or none. This is what makes scores comparable to the oracle:

The score CLI takes --gpu-baseline to make the opportunity-cost comparison explicit against a known cash number (e.g. 2.9 $/day for a rented 4090).

Registry and review queue

The registry is a hand-maintained TypeScript list of NetworkEntry records: identity, kind (pow, depin_points, inference, bandwidth), token state, contention, needs, pricing reference, gross model, risks, and notes. It is versioned and reviewed like code.

New candidates flow in from the watcher: every NEW_COIN detection appends a ReviewQueueEntry to data/review-queue.jsonl with status to_review and a pre-filled NetworkEntry skeleton (kind pow, token state defaulted to listed_thin pending a DEX liquidity check). Nothing enters the scored registry without a human pass over that draft.

Honest-numbers policy

Every number that is not a measured payout is a seed, and the code says so: registry comments mark each figure as an estimate with the intended refinement path (log actual epoch payouts on a reference node, read on-chain distribution flows, run a host for a week). Score outputs carry flags exposing the pricing path, the realizable percentage, EV parameters, and manual-price verification dates. Tier A is reserved for measured cash; everything else is explicitly modeled, discounted, and labeled. If a number looks precise in the output, the flags tell you exactly how much to trust it.