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: aneth_callsuch asbalanceOfortotalSupplyat a fixed block.nonce:eth_getTransactionCountat 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.
| Rule | Kind | Bar | Hard limit | Weight |
|---|---|---|---|---|
Market capitalization market_cap_usd | growth | ≥ $250k | none | 15% |
Effective holders effective_holders | growth | ≥ 150 | none | 20% |
Organic daily volume (time-weighted) organic_volume_usd | growth | ≥ $40.0k | none | 15% |
Effective / raw holders effective_ratio | integrity | ≥ 0.75 | < 0.5 | 15% |
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% | none | 5% |
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.
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.
- Market makers and arbitrage bots can look like wash wallets.
We require paired round trips of near-identical size within minutes and a near-zero net position. A bot that trades exactly that way will be flagged, and the finding says what was observed, not why.
- New shared infrastructure over-links.
A new exchange hot wallet, bridge or faucet that is not on the ignored-funder list will make unrelated wallets look linked. The list is configurable and versioned.
- Careful operators can evade funding links.
Wallets funded through many independent paths, mixers, or time-separated deposits will not cluster. Absence of a cluster is not proof of independence.
- Linked is not malicious.
Friends, a DAO's members, or an airdrop cohort can share a funder. Clusters are shown as “linked by funding source” and never as an accusation.
- Price from thin pools is noisy.
Market cap uses the median of the last five swaps. A manipulated thin pool can move it.
- Smart-contract wallets and account abstraction.
Lifetime transaction counts understate activity for some wallet types, which can overstate the fresh-wallet share.
- Cross-chain activity is invisible.
Ascertain reads one chain at a time.
- Receipts verify a sample.
Each finding cites a capped, evenly spread sample (24 facts) plus a digest. The derived metric is recomputed deterministically from the stored raw logs, which are public in the evidence JSON.
- Back-test data is simulated.
Current results come from seeded launches with planted ground truth. Replay on real HyperEVM tokens is supported by the CLI; real-token numbers are published only once run.
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
TransferandSwaplogs. 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.