Skip to content
Ascertain
Tokens
Methodology

How a verdict is made, and how to check it.

Rules are code. Every signal is a deterministic function of chain data with a version string. The same data and the same rule version always produce the same verdict.

Principles

  • Evidence first. A finding is published only if every cited fact re-fetches from chain state, through a second, separate RPC source (a different provider when one is configured), and matches byte for byte. Failed findings are withheld and listed, with the reason.
  • Rules decide, AI advises. Verdicts come from deterministic, versioned rules. Optional AI-written commentary can downgrade a verdict to WAIT or NO-GO. It can never upgrade one.
  • Effective holders, not raw holders. Linked wallets are merged before counting, so one operator cannot look like hundreds of people.
  • Honest about limits. Ascend's real thresholds are internal. Ours are configurable estimates, labelled as such. Known blind spots are listed below.
  • No custody, read-only. Ascertain never holds funds or keys and never signs transactions for users. No private user data is stored.

Signals

Each signal lives in src/engine/signals.ts. Rule versions bump whenever a definition changes.

Concentration

concentration@1.0.0 · concentration()

Top-1, top-5, top-10 share of circulating supply, HHI and Gini. Pool and burn addresses are excluded.

Why it matters: Ascend checks for concentrated accumulation.

Funding-source clusters

funding-clusters@1.0.0 · fundingClusters()

Wallets whose first HYPE or gas funding traces to the same source within 2 hops form a cluster of at least 3. Known exchange and bridge hot wallets are ignored as sources.

Why it matters: One operator running many wallets.

Same-block entry

same-block-entry@1.0.0 · sameBlockEntry()

5 or more wallets making their first buy in the same block with sizes within 5% of each other.

Why it matters: Coordinated accumulation.

Wash loops

wash-loops@1.0.0 · washLoops()

A wallet with at least 4 buy-then-sell pairs of near-identical size within 60 minutes, at least $5.0k gross, and net position under 10% of gross. Also wallet-to-wallet token cycles (A to B to A, A to B to C to A) that return at least 90% of what they sent.

Why it matters: Fake volume.

Wallet age and activity

wallet-age@1.0.0 · walletAge()

Share of holders with at most 3 lifetime transactions that were funded shortly before their first buy.

Why it matters: Throwaway wallets.

Effective holders

effective-holders@1.0.0 · effectiveHolders()

Holders after merging wallets linked by funding cluster, same-block batch or wash loop. Union-find over the linked sets.

Why it matters: Unique holders, the input Ascend buyback weighting depends on.

Volume per unique wallet

volume-per-wallet@1.0.0 · volumePerWallet()

Daily volume split into organic and inflated (wash wallets, same-block batches, clusters of 10+). Time-weighted organic volume uses the last 7 days, newer days weigh more, a single day is capped at 3× the window median.

Why it matters: Organic versus inflated volume.

Market cap

market-cap@1.0.0 · marketCap()

Median price of the last five swaps times (total supply minus burned).

Why it matters: Ascend qualification input.

Evidence receipts and the verifier

Each finding stores, per cited fact: chain id, block number, contract address, transaction hash or call data, the raw returned value, and the rule version that produced it. A separate verifier job re-fetches each item from an independent RPC and compares the canonical string byte for byte.

  • log: a transfer or swap log, compared by address, topics and data.
  • tx: a funding transaction, compared by sender, recipient, value and block.
  • call: an eth_call such as balanceOf or totalSupply at a fixed block.
  • nonce: eth_getTransactionCount at a fixed block.

Every receipt has a copy-paste cast command. Findings that fail are on the public withheld list. Finding ids are content hashes, so they change when data or rules change.

Thresholds (estimates)

Config 2026.10-estimate.1 · status: estimate. Estimated from the criteria Ascend has published (market capitalization, unique holders, volume, checks for concentrated or coordinated accumulation). Ascend's real thresholds are internal. These numbers are NOT official Ascend decisions.

RuleKindBarHard limitWeight
Market capitalization
market_cap_usd
growth≥ $250knone15%
Effective holders
effective_holders
growth≥ 150none20%
Organic daily volume (time-weighted)
organic_volume_usd
growth≥ $40.0knone15%
Effective / raw holders
effective_ratio
integrity≥ 0.75< 0.515%
Top-10 holder share
top10_share
integrity≤ 45%> 80%10%
Top-1 holder share
top1_share
integrity≤ 10%> 25%5%
Inflated volume share
inflated_volume_share
integrity≤ 15%> 35%15%
Fresh-wallet share
fresh_wallet_share
integrity≤ 35%none5%

Verdict logic. Any hard failure gives NO-GO. Otherwise, all rules passing on verified evidence gives GO. Anything else, including a rule whose evidence was withheld, gives WAIT. Three intents choose which rules apply: creator (all), trader (organic activity), staker (exposure).

Sources: Ascend docs, Kinetiq Elysium docs. Both are marked as evolving; thresholds are re-checked against them before each release.

Back-test

Five seeded launches on the Elysium testnet chain model with planted ground truth: clean, early-stage, concentrated, wash-traded and clustered. Run npm run backtest to regenerate evidence/backtest-summary.json and the per-finding evidence JSON.

5/5
Verdicts correct
7/7
Planted clusters found
12/12
Planted wash wallets found
0
False-positive clusters (clean)
0
False-positive wash wallets (clean)
0
Effective-holder max error

These are results on simulated data with a known answer. They show the signals find planted patterns and leave a clean token alone; they are not a claim about accuracy on real tokens.

Known blind spots

Each case below has a test in tests/blindspots.test.ts that pins how it is handled.

Indexing

Ascertain indexes a configurable list of tokens. Verdicts need the full holder set and every swap, so unindexed addresses get an honest “not indexed” page with a read-only on-chain probe rather than a guess.

  • Today: five simulated launches that follow the Ascend design (closed hook pool, USDC quote, no bonding curve) on the Elysium testnet chain model (id 99801).
  • Adapters: a standard ERC-20 plus pool adapter reads Transfer and Swap logs. The Ascend hook-pool adapter plugs in once Ascend publishes testnet addresses and the hook interface.
  • Replay mode: npm run replay -- --chain 999 --token 0x… runs the engine and verifier on real HyperEVM tokens, so back-tests use real behaviour while Elysium mainnet is pre-launch.

Safety wording

Ascertain describes observable on-chain patterns only. It never accuses a named person of wrongdoing, and clusters are described as “linked by funding source”. No audit is claimed. Scores are estimates and not financial advice.