Method v1How a Reading Is Made
Where every number comes from, how it turns into risk points, and what it cannot tell you. The method is one open file (src/lib/method.ts) that the site, the tests and the keeper script all run.
The reading
- Pick the report block: the chain head minus 20 blocks. Every read below uses that block, so a later reader can repeat it with archive calls.
- Find the token's pools: v4 Initialize events naming the token on the four PoolManagers, and v3-style pools that a known factory returns from getPool() for the token against WHYPE, USDC or KNTQ at each standard fee or spacing.
- Read each pool's price and active liquidity, value the depth within ±2% (pools against HYPE, WHYPE, USDC or KNTQ only), keep the six deepest; the deepest is the main pool.
- Re-read the same pools 1 hour, 24 hours and 7 days earlier (block numbers from the block time measured over the last 200,000 blocks).
- Read the main pool's 24 hours of Swap events for hourly closes and swap counts; replay its ModifyLiquidity events for positions (v4).
- Take candidate holders from the explorer's list, re-read every balance and code size on chain at the report block, set pools and position managers apart.
- Write the inputs document (keys sorted, one JSON encoding), hash it with keccak256, and run the method on it.
Indicators and formulas
LIQUIDITY · weight 25%Pool depth
How many dollars sit within 2% of the price, across the token's pools that a listed price can value.
Inputs: sqrt price + active liquidity of each pool at the report block; HYPE/KNTQ from Montra's public API, USDC at $1
points = clamp((log10 $250k − log10 depth) / (log10 $250k − log10 $1k)) × 10000
LP CONCENTRATION · weight 15%Who holds the liquidity
The largest single position's share of the liquidity that is in range right now, on the main v4 pool.
Inputs: every ModifyLiquidity event of the pool replayed to the report block; must add up to the pool's active liquidity
points = clamp((top share − 20%) / (90% − 20%)) × 10000
VOLATILITY · weight 20%How far the price swings
Daily volatility from the main pool's hourly closing prices over the last 24 hours.
Inputs: tick at the window start (archive read) + every Swap event in the window
σ = stdev(hourly log returns) × √24; points = clamp((σ − 2%) / (30% − 2%)) × 10000
HOLDERS · weight 25%Who holds the token
The ten largest holders' share of circulating supply, with pools and position managers set apart.
Inputs: candidate holders from the explorer's list; every balance re-read on chain at the report block; code size per address
points = clamp((top-10 share − 20%) / (80% − 20%)) × 10000
ACTIVITY CHANGE · weight 15%What changed lately
A burst of swaps in the last hour, or depth leaving the pools over 24 hours, whichever is larger.
Inputs: swaps in the last hour vs the 23 before; ±2% depth now vs 24 hours ago (archive read)
points = max(burst, fall); burst: 2× → 0, 10× → 10000 (log); fall: 0% → 0, 50% → 10000
OverallOne score, never a verdict
The weighted mean of the indicators read in full. Any missing indicator makes the whole reading "incomplete"; its band is never lower or moderate.
Overall score = weighted mean of the indicators that were read in full; weights renormalise over those. Bands: under 25 lower on measured inputs, 25–50 moderate, 50–75 elevated, 75 and up high. If any indicator is missing the band says "incomplete". Breakpoints in code: depth $250,000 / $1,000, LP share 20% / 90%, σ 2% / 30%, top-10 20% / 80%, burst 2× / 10×, depth fall 50%.
Sources
Elysium mainnet, chain id 99901, gas in HYPE, through the public RPC https://rpc.elysium.kinetiq.xyz (archive calls work there). The contracts below were identified on chain on 11 November 2026 (emitters of the v4 Swap event, explorer-verified names, getPool() answers) and read again for this site on 13 November 2026.
- Dollar prices: HYPE and KNTQ from Montra's public API (https://api.montramarkets.xyz/api/stats), USDC counted at $1.
- Candidate holders: the Elysium explorer API (https://elysium.kinetiq.xyz/explorer/api, tokenholderlist). Balances themselves are read on chain.
- Token list on the scanner: tokens in pools with swaps in the last ~hour (chain), and Montra's public token list (its figures, labelled as Montra's).
Limits
- A reading, not advice. Pervix never calls a token safe: low points mean low on the inputs it could measure, at the block it read.
- Every number is read from Elysium at one confirmed block (20 blocks behind the head), shown on the report. The chain keeps moving after that.
- If a read fails or cannot be decoded, that indicator is marked incomplete and left out of the score. An incomplete reading is never shown as low risk.
- Dollar values use HYPE and KNTQ prices from Montra's public API and USDC at $1. Pools against any other token have no dollar value and do not count toward depth.
- Depth within 2% assumes the active liquidity stays the same across that band.
- LP concentration covers the main pool when it is a Uniswap v4 pool. v3-style positions sit inside a position manager and are not split by owner.
- The holder list starts from the explorer's index; balances are then read on chain. An address missing from that index would be missed.
- Token names and symbols come from the token contracts themselves. Only HYPE, WHYPE, USDC and KNTQ are on the checked list; a well-known symbol (USDC, kHYPE, ETH…) at any other address is flagged as not checked.
- Pervix does not check a token's contract code (mint, pause, blocklist, upgrade). It measures the market around the token.
- The tools work without $PERVIX. Alerts run while a page is open; nothing is pushed to you yet.
PervixSignalBoard
Keepers register once and post readings: score, coverage, the five components, the inputs hash, and the inputs themselves (emitted in the event). The board refuses inputs that do not hash to the stated hash, an empty or oversized document, and a reading for a block that is not yet in the past (it reads the Elysium block number from the ArbSys precompile, since block.number there is the parent chain's). A keeper cannot post an older reading for a token after a newer one. Anyone can flag a reading with an evidence hash; the keeper can answer once. Users keep up to 64 open alert rules; checkRule() evaluates a rule against a reading the same way this site does. No owner, no fee, no funds, no upgrade.
Questions about risk
- Is a low score a safety rating?
- No. Pervix measures five market inputs at one block. It does not read the token's contract code, its team or anything off chain. Low points mean low on what was measured.
- Does Pervix hold or move funds?
- No. It reads the chain. PervixSignalBoard stores readings and alert rules and accepts no funds: it has no payable function, no owner and no upgrade path.
- Can a token be fake?
- Yes. Anyone can deploy a token with any symbol, and create pools for it. Only HYPE, WHYPE, USDC and KNTQ are on the checked list; a symbol copying one is flagged, and only pools against those four get a dollar value.
- Is PervixSignalBoard reviewed?
- It is new and has not had an independent security review. It holds no funds, has no admin and keeps one rule per namespace (keeper, rule owner). Its tests and a written self-review are in the repository.
Planned
- plannedPush notifications (browser push, email or messages) when a rule triggers. Today alerts run while a Pervix page is open, plus rules stored on chain.
- plannedMore chains than Elysium.
- plannedLP concentration for v3-style pools, split by position owner.
- plannedA hosted keeper that posts readings for many tokens on a schedule. Today anyone can run the keeper script in the repository.
- plannedLonger history (7-day and 30-day volatility) once a private RPC carries the extra reads.
- plannedAPI access for other apps.
- planned$PERVIX as the way to pay for alert quotas once they exist. Unproven until then.