Skip to main content
VERSIONED — methodology history

Every change to the scoring engine

Scoring weights, dimension definitions, eligibility filters, question structure. Every published change is recorded here with the date, the rationale, the categories it reaches and the person named as approver. Superseding versions go on top. A changed fee or licence is a data change and a placement that was added, cut or archived is a universe change; each keeps its own ledger.

VERSION2026.09.15PUBLISHED2026-09-16APPROVEDmathias-siemonsmeier

Dimension scores carry tenths, and eleven more categories are re-read from primary sources

Effective from 2026-09-16 — the version every ranking on this site is scored with today. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Two changes land together. Every dimension score now resolves to tenths of a point rather than whole points (owner decision O-04b), and step 1 of the formula carries weightedTotal to six decimal places so a distance of exactly 2.5 weighted points rounds the same way for the engine and for anyone rebuilding the order from public/data/rankings.json. Separately, every row of cdp_stablecoins, data_availability, decentralised_compute, decentralised_id, depin_networks, kyc_compliance, layer1_chains, mpc_wallets, privacy_tools, revoke_tools and yield_aggregators was re-read on 2026-09-15 against each provider’s own pricing, terms, docs and status feeds, with a second verifier re-fetching every quote.

Rationale

Whole-point dimension scores threw away resolution the research already had, and forced the engine to break ties that the criteria themselves could separate. Tenths keep that detail, and the fixed rounding makes the published order reconstructible from the published file rather than only reproducible inside this engine. The two changes are published as one version because they were generated in one run: separating them would state an order that was never served. The re-read evidence is committed per category in research-pending/rereads/2026-09-15-<category>.json.

Changes
  • changedDimension scores resolve to tenths of a point (O-04b), and weightedTotal is rounded to six decimal places before the order is read. 518 published scores move across 107 categories that were not re-read; none of them moves by more than 4 points, and most move by 1.
  • fixed66 published scores change in the eleven re-read categories, against a verbatim source each. The largest moves are Reflexer RAI (−16), Beefy and Unrekt (−11), Aztec (−10) and Golem (+9) — all of them rows whose sources had moved since their last read.
  • changedPublished order moves in 38 of 119 categories and three #1s change: smart_contract_audits (Zellic → Certora) and travel_rule_compliance (Sumsub Travel Rule → CodeVASP) on the finer resolution, kyc_compliance (Veriff → Sumsub) on the re-read.
  • addedavailabilitySource (O-04g): for a reader who states a country, a row whose availability in that country rests on a region tag its record gives no source for sorts below every sourced row. It is inert in every order published here, which states no country.
  • changedThe personalised result changes too: replaying all 2,217 golden cases, the questionnaire’s winner moves in 29 of 119 categories — among them bridges (Relay → Across), hardware_wallet (BitBox → Trezor), exchange (Upbit → Bybit/OKX), restaking (Symbiotic → EigenLayer) and liquid_staking (Coinbase → Jito → Lido). The before/after is committed as the diff of tests/fixtures/wizard-goldens.
  • changedMeasured cost: answers no longer move the #1 in six categories that are not re-reads of new evidence — privacy_tools, dex_aggregator, hardware_wallet, remittances, cdp_stablecoins and web3_apps — because a finer basis separates those leaders by more than any single answer can close. hardware_wallet had come alive on 2026-09-09; it is inert again. The six are recorded as debt in check-wizard-answers-move-ranking.ts.
VERSION2026.09.14PUBLISHED2026-09-15APPROVEDmathias-siemonsmeier

Fourteen more categories re-read from primary sources ahead of their 25 September review date

Effective 2026-09-15 to 2026-09-16, superseded by 2026.09.15. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Every row of smart_accounts, crypto_neobanks, offramps, defi_dashboards, onchain_analytics, cross_chain_swaps, naming_services, bug_bounties, transaction_simulation, onchain_monitoring, decentralised_storage, rpc_nodes, indexers and mev_protection (105 rows) was re-read on 2026-09-14: pricing, availability and each published criterion score, from each provider’s own pricing, terms, docs, status feeds and on-chain calls, with an adversarial verifier re-fetching every quote. 101 rows were confirmed or corrected in full. 130 criterion scores changed, and pricing and availability text no source supported was removed or replaced with quoted text.

Rationale

The site promises a 45-day re-read. Only verified values were applied; where a source supported two bands the lower was kept. A value no primary source could confirm keeps its recorded value and is listed in that row’s structuralFacts.unverified with what was checked. Two providers’ operating status (Secure3, Venn Network) could not be confirmed and is recorded, not sunset. Countries this site cannot match stay in the quoted availability notes rather than in restrictedMarkets. The verified evidence is committed per category in research-pending/rereads/2026-09-14-<category>.json.

Changes
  • fixed130 criterion scores corrected across the 14 categories, each against a verbatim source; every row’s pricing is dated to the 2026-09-14 read.
  • changedPublished order: four #1s change — smart_accounts (Safe → Squads Protocol), crypto_neobanks (Xapo Bank → Revolut), cross_chain_swaps (Relay → Across) and onchain_monitoring (BlockSec Phalcon → Hypernative). 78 published scores move, and the order moves in 12 of the 14 categories.
  • fixedAvailability read from the providers’ terms: LI.FI / Jumper, Rango and deBridge exclude the United States from cross_chain_swaps, as does Xapo Bank; Wirex excludes Canada, Japan, the Philippines, Singapore and South Korea; Nansen excludes Singapore; Kraken and MoonPay off-ramps exclude Japan; MetaMask Transaction Shield excludes the United Kingdom; Banxa’s off-ramp is limited to the regions where its docs list a sell payout rail (Europe and the UK, the US, Canada, Australia and Brazil).
  • fixedPrices re-read where vendors changed them: Alchemy’s Pay as You Go is now a flat $0.525 per 1M compute units; Revolut’s crypto fees are a flat 1.49% / 0.99%; Ormi and GoPlus publish rate cards previously recorded as quote-only; Goldsky’s Starter plan is a one-time $100 credit.
  • changedMeasured consequence recorded in the gates: leaders one re-read from changing rise from 39 to 40 (onchain_monitoring firmed up; mev_protection and cross_chain_swaps now lead narrowly).
VERSION2026.09.13PUBLISHED2026-09-14APPROVEDmathias-siemonsmeier

Fifteen categories re-read from primary sources ahead of their 25 September review date

Effective 2026-09-14 to 2026-09-15, superseded by 2026.09.14. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Every row of crypto_payroll, simple_buy, smart_contract_audits, defi_insurance, wallet_screening, oracles, block_explorers, prediction_markets, trading_bots, nft_marketplace, yield_vaults, stablecoin_yield, tokenised_tbills, tokenised_funds and tokenised_realestate (122 rows) was re-read on 2026-09-14: pricing, availability and each published criterion score, from each provider’s own pricing, terms, docs and registers, with an adversarial verifier re-fetching every quote. 95 rows were confirmed or corrected in full. 114 criterion scores changed, and pricing and availability text no source supported was removed or replaced with quoted text.

Rationale

The site promises a 45-day re-read. Only verified values were applied; where a source supported two bands the lower was kept. A number or score no primary source could confirm keeps its recorded value and is listed in that row’s structuralFacts.unverified with what was checked; an unsupported sentence was removed. One provider’s operating status (Breach Insurance) could not be confirmed and is recorded, not sunset. The verified evidence is committed per category in research-pending/rereads/2026-09-14-<category>.json.

Changes
  • fixed114 criterion scores corrected across the 15 categories, each against a verbatim source; every row’s pricing is dated to the 2026-09-14 read.
  • changedPublished order: four #1s change — simple_buy (Relai → Strike), stablecoin_yield (Ondo USDY → Spiko), smart_contract_audits (Certora → Zellic) and money_market_funds (Fidelity Treasury Digital Fund → Spiko US T-Bills Money Market Fund). Scores move in 16 categories.
  • fixedAvailability read from the providers’ terms: PayPal Crypto is for US residents; Revolut’s simple_buy row is its Cyprus-licensed EEA service; Coinbase USDC rewards are excluded for the EEA, Japan and Vietnam under its exhaustive eligible list; Spiko onboards clients from all countries except a published list (applied to both of its rows, which moves money_market_funds). Countries this site cannot match stay in the quoted notes.
  • addedsimple_buy for readers outside the named regions is recorded as a thin market with two eligible providers.
  • changedMeasured consequences recorded in the gates: leaders one re-read from changing rise from 38 to 39 (simple_buy and prediction_markets firmed up; money_market_funds, smart_contract_audits and wallet_screening now lead narrowly); categories where no wizard answer moves the #1 rise from 56 to 58; stablecoin_yield’s availability dimension no longer separates its rows.
VERSION2026.09.12PUBLISHED2026-09-14APPROVEDmathias-siemonsmeier

A tie is decided by the published criteria first

Effective 2026-09-14 to 2026-09-14, superseded by 2026.09.13. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

When two rows share a weighted total, the order between them is now decided first by their unrounded weighted averages of the published criterion scores, under the weights in use. Rows share a total because whole dimension points round their criterion scores together; the averages still separate them. Until this version a generic chain (a price factor, a count of scores at 9 or above, whole dimension points, then the name) decided every tie, and in 62 of the 175 tied pairs with criterion scores on both sides it placed first the row the published criteria rank lower.

Rationale

The order a reader sees should follow the criteria the page publishes wherever the arithmetic can tell them apart. The generic chain still decides a tie where the averages are equal or a row is not scored on its category’s criteria. No score changes: the averages order rows and are never added to a score. The per-category prose tie-break rules are still not applied. Owner decision O-04a.

Changes
  • changedTie key: criteriaAverage (unrounded weighted average of the published criterion scores) now comes directly after the weighted total and before the generic factors, in the engine, in formula.tieBreakChain and in the note that describes it.
  • changedPublished order: 130 positions move in 46 categories and no score changes. Five published #1s change: wallet (MetaMask → Rabby Wallet), stablecoin_issuance (Anchorage Digital → Brale), options_vaults (SOFA.org → Typus Finance), flash_loans (Dai Flash Mint → Morpho) and tokenised_commodities (Kinesis Gold → Matrixdock Gold).
  • fixedPersonalised weights are no longer rounded to one decimal. Rounding each dimension weight separately changed the ratio between dimensions the reader had not touched (a trust priority turned objectiveFit and quantitative 30:18 into 27.4:16.5), so a stated priority could reorder rows on criteria nobody re-weighted. Published weights are whole numbers, so no published order or score changes from this.
  • changedPersonalised orders: replaying the golden answer suite against the fixtures committed with 2026.09.11, 1,002 of 2,217 cases change their order and 181 their #1 (21 of them country briefs), mostly where answers leave rows tied on whole points and the criteria now decide; 45 change their confidence label. The tie key changes no score; the unrounded weights can move a reader’s weighted total, and with it their Fit for you number, by a small amount.
  • addedcheck-tie-order-vs-criteria: the count of tied pairs ordered against the published criteria falls from 62 to 0, and its ceiling is now 0. check-wizard-answers-move-ranking: categories where no answer moves the #1 fall from 58 to 56.
VERSION2026.09.11PUBLISHED2026-09-14APPROVEDmathias-siemonsmeier

Confidence no longer calls a tied or one-move lead decisive, the agent API returns the published order, and the golden country briefs carry what the wizard sends

Effective 2026-09-14 to 2026-09-14, superseded by 2026.09.12. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Find My Best no longer calls a lead “decisive” or “strong” when the top two print the same score, or when the #1 is the published leader that the one-point robustness sweep found one move from losing first place; such leads are capped at “moderate”. /api/agent-query, /assistant and /api/v1/recommend now return ChainChoice’s published order instead of an agent ranking over a hand-typed catalogue, and outcome rates are withheld below a sample of 30. rankings.json now states the score transform the engine actually runs and computes each tie note from the two tied rows, and the golden fixtures’ country briefs were corrected to the signals the wizard sends. No published order or score changes in any of the 119 categories.

Rationale

Each part corrects something that stated more than the engine does: a confidence label over a tie or a fragile lead, an API pick the published ranking does not make, a formula text describing a removed branch, a tie note claiming the criteria did not separate rows whose criterion scores differ, and fixtures that froze a #1 no reader receives. Measured by replaying the golden suite against its committed fixtures: outside the country briefs, no order, winner, eligibility count or exclusion count moves, and the only field that changes is confidence. The country-brief changes come from the corrected fixture signals, not from an engine change.

Changes
  • changedFind My Best confidence tier (W1-05): a lead is capped at “moderate” when the top two print the same score or when the #1 is the published leader that the sweep (rankings.json leaderSurvivesOnePointChange) found one move from losing first place. No order, score or eligibility changes. The replayed golden answer cases change confidence in 59 cases across the 17 categories listed: 44 strong → moderate and 15 decisive → moderate. The results page’s “How close was this call?” label is now read from the recomputed sweep instead of a linear estimate, and on personalised runs it says the sweep was not recomputed for the reader’s answers.
  • fixedGolden country briefs (W1-15), a fixture correction with no engine change: the DE, US and IN briefs now carry the ISO code, country name and questionnaire region the wizard sends when a reader picks a country; before, they carried the ISO code alone. Because availability scoring reads region and country name, 322 of the 342 country fixtures had frozen a different ranked list from the one readers receive (245 differ only in scores, 77 in order, 29 of those in the #1) (for example prediction_markets US: Polymarket, not Kalshi; business_banking US: Mercury, not Meow). The corrected exchange country=IN brief puts Upbit at #1 under the questionnaire region “asia”; the fixture now matches what readers receive, but the availability data behind that result has not been re-checked.
  • changedAgent API (W1-16): the pick is the #1 of /data/rankings.json for the category the question maps to. A stated country (the `country` field, or a named country) removes only the rows the engine excludes for that country and never reorders the rest. The retired agent ranking used typed card fees, spreads and APRs, twelve typed 0–10 security scores and a “most secure” objective, and returned Binance as #1 for Germany, where the engine excludes Binance. Responses now carry publishedRank, publishedScore, category and country and state no fee, spread or security score. A question with no published ranking (for example yield on XRP) returns no pick. No published or wizard order on chainchoice.io changes.
  • changedAgent API contract (W1-16): provider ids are now the engine’s ids (for example bybit_exchange, okx_exchange) instead of the retired catalogue ids (bybit, okx). The dated yield overlay is looked up by those ids, so a rate stored under a retired catalogue id is not found and no rate is stated for that row. Outcome rates (proceed rates at /api/agent-recommendations?stats=1, accuracy and archetype-cohort retention at /api/outcomes) are null below n = 30 and carry sampleSize and windowDays. API fixture diff: exchange binance → bybit_exchange; onramp stripe-crypto → transak; crypto_card gnosis-pay → etherfi_cash; exchange for DE binance → bybit_exchange; store trezor and tax koinly unchanged, now with publishedRank 1; earn XRP nexo → no pick.
  • fixedrankings.json formula (W1-11), no order or score change: formula.step2_absoluteScore now states the continuous transform the engine has run since af882424; the old text still described the removed `<= 20 ? round(40 + weightedTotal)` branch, which no published row reached (lowest weightedTotal 24). The file now also publishes engineMethodologyVersion and a per-category specVersion alongside methodologyVersion.
  • fixedrankings.json tie notes (W1-12), no order or score change: each tie note is computed from the two rows. The old note said for every tie that the published criteria did not separate them, and named pricing and evidence depth as what decided the order; the criterion vectors differ in 18 of the 20 ties, and the evidence-depth factor no longer exists. Each tie block names its kind, both unrounded weighted criterion averages and the row the criteria alone prefer, and formula.tieBreakChain publishes the engine’s tie-break keys. tieBreakDecisions.againstCriteria lists the adjacent pairs the chain orders against the criteria: 62 across the catalog, 5 of them at #1/#2 (wallet, stablecoin_issuance, options_vaults, flash_loans, tokenised_commodities). Reordering them is methodology v2, not part of this version.
  • changedGolden fixtures re-emitted for this version: against the fixtures committed with 2026.09.10, the 1,875 answer cases differ only in confidence (the 59 above) and in contentHash, which changes in all 2,217 cases because the methodology version is part of the receipt hash. The 342 country briefs differ as described under W1-15.
VERSION2026.09.10PUBLISHED2026-09-13APPROVEDmathias-siemonsmeier

dex, perp_dex and dex_aggregator re-read from primary sources: two closed venues, one replaced product, 69 corrected facts

Effective 2026-09-13 to 2026-09-14, superseded by 2026.09.11. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

The structural facts of all 36 rows in these three categories were last read on 23–27 July. On 2026-09-13 each scored fact was re-read from the protocol’s own docs, terms, audit pages, on-chain calls or DefiLlama’s API, and an adversarial verifier re-fetched every source and rejected quotes that were not verbatim or did not support the value. Drift’s program has been paused since 1 April 2026 and Odos shut down trading on 27 July 2026; both still ranked. The Synthetix Perps record described the retired debt-pool product rather than the Ethereum-mainnet order book live today. 69 values changed, and every row is now dated to the day it was read.

Rationale

Only verified values were applied. Where a source supports two bands the lower claim was kept. Three fields no primary source could confirm keep their lower-claim value and are recorded as unverified with the reason (PancakeSwap exploit history, Maverick upgradeability, Aster launch year); Bebop’s MEV protection is set to false because no Bebop source states it. The quotes, sources and verifier notes are committed in research-pending/rereads/2026-09-13-dex-perp_dex-dex_aggregator.json.

Changes
  • fixedDrift: sunsetAt 2026-04-01 (Velocity docs: “The Drift program is paused”). Odos: sunsetAt 2026-07-27 (odos.xyz: “Odos trading and API services have shut down”). Vertex: sunsetAt corrected to 2025-07-16, the day trading ceased.
  • fixedSynthetix Perps: perpModel offchain-orderbook, launchYear 2026, auditDepth limited, custody contract-custodied, matching offchain-matched, admin-controlled. It falls from #2 to the floor.
  • fixeddex_aggregator: Matcha immutable-core (0x Settler contracts are immutable); CowSwap partial open source and a permissioned solver set; 1inch, ParaSwap and UniswapX solvers permissioned; Jupiter closed-source routing; OpenOcean and DODO MEV protection stated in their apps; ParaSwap launched 2019. The published #1 changes from CowSwap to Matcha.
  • fixedperp_dex: GMX extensive audits, contract-custodied, hybrid matching; Hyperliquid limited audits; Jupiter Perps audited and admin-controlled; Paradex audited, bridged, offchain-matched; Lighter and Aster corrected; market counts and leverage updated from each venue.
  • fixeddex: Curve exploit severity moderate; Raydium constant-product and admin-controlled; chain counts for Uniswap (45), Curve (27), PancakeSwap (11), Balancer (12), Orca (1); governance text for PancakeSwap and Balancer.
  • changedPublished orders move in dex (Curve 54 → 49), perp_dex (Synthetix Perps, Drift to the floor; Hyperliquid 70 → 62, GMX 65 → 60, Jupiter Perps 67 → 60) and dex_aggregator (Matcha #1). Golden fixtures re-emitted.
VERSION2026.09.9PUBLISHED2026-09-13APPROVEDmathias-siemonsmeier

Seven perp venues, and GMX’s GM pools, are no longer shown as available where their own terms restrict them

Effective 2026-09-13 to 2026-09-13, superseded by 2026.09.10. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Gains Network (gTrade), GMX, Jupiter Perps, Helix, Paradex and Lighter carried supportedRegions ['us', 'europe', 'global'] with no availability note, so a US reader was told each leveraged venue was eligible for them; Hyperliquid carried no restriction at all. Each venue’s own terms, rendered and read on 2026-09-13, restrict US persons, and Helix, Paradex and Lighter also Canada, Helix and Lighter the United Kingdom. Each record now quotes its terms page with the date the page states, names as restricted the listed countries this site can match (the full lists stay in the quotes), and drops the US tag.

Rationale

Only what each page states was applied, quoted verbatim. Hyperliquid restricts Ontario, not Canada, so Canada is not excluded for it. Jupiter lists “the Republic of China”, which is ambiguous and not mapped. Synthetix’s website terms list sanctioned jurisdictions only and may not govern its perps product, Drift’s terms now sit on a Velocity Protocol page that did not render, Aster’s terms URL returns 404, and Vertex’s site returns 404; those rows are unchanged and still counted as unsourced.

Changes
  • fixedgmx_gm_pools (perp_house_vaults): the same GMX terms govern app.gmx.io, where GM and GLV pools are bought; restrictedMarkets United States and supportedRegions [global] → [europe, global]. The 2026-08-17 research found no terms in the documentation and could not render one behind the app; the page dated 20 August 2026 now renders. US readers now have one eligible perp_house_vaults option instead of two (market-coverage ratchet lowered accordingly).
  • fixedgains-network, gmx, jupiter-perps, helix, paradex, lighter: supportedRegions [us, europe, global] → [europe, global]; restrictedMarkets and a dated, quoted countryAvailabilityNote from each venue’s terms. hyperliquid: restrictedMarkets United States with its terms quoted.
  • changedPersonalised perp_dex runs for US readers no longer rank these seven; Canadian readers lose Helix, Paradex and Lighter; UK readers lose Helix and Lighter. The published ranking is unchanged in all 119 categories. One golden case changes its winner: perp_house_vaults country=US, where GMX GM pools is now excluded and Velocity’s insurance fund is the only eligible row. Fourteen other perp_house_vaults cases change only the count of rows whose terms list every country (2 → 1); no order moves. The golden set has no US, UK or Canadian perp_dex reader.
  • addedtests/leverage-availability.test.ts holds each sourced exclusion and lowers the unsourced leverage-tag ceiling from 19 to 12.
VERSION2026.09.8PUBLISHED2026-09-13APPROVEDmathias-siemonsmeier

dYdX is no longer shown as available where its own terms restrict it

Effective 2026-09-13 to 2026-09-13, superseded by 2026.09.9. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

AffectsPerp DEXs

dYdX carried supportedRegions ['us', 'europe', 'global'] — a literal 92 catalog rows share — with no availability note, so a reader in the United States or the United Kingdom was told a leveraged derivatives venue was eligible for them. dYdX’s help centre (updated 23 April 2026) lists the United States, Canada and the United Kingdom as restricted jurisdictions for the frontends dYdX Operations Services Ltd. operates. The record now quotes that page, names those markets as restricted, and drops the US tag.

Rationale

Only the restriction a source states was applied. Eleven other perp_dex rows and eight options_vaults rows carry region tags with no sourced note; their venues publish terms only inside JavaScript apps, and a restriction list typed from a search snippet would be the invented fact this catalog refuses. They are counted by a test that may only fall (19 today) and queued for re-reading.

Changes
  • fixeddYdX: restrictedMarkets United States, Canada, United Kingdom, from help.dydx.trade (read 2026-09-13); supportedRegions [us, europe, global] → [europe, global].
  • changedPersonalised perp_dex runs for US, UK and Canadian readers no longer rank dYdX. The published ranking is unchanged in all 119 categories, and no golden case moves (the golden set has no US or UK perp_dex reader).
  • addedtests/leverage-availability.test.ts: dYdX is excluded for US, GB and CA and kept for DE; leverage rows with an unsourced region tag may only fall from 19.
VERSION2026.09.7PUBLISHED2026-09-13APPROVEDmathias-siemonsmeier

Two chains called optimistic rollups have no proof system

Effective 2026-09-13 to 2026-09-13, superseded by 2026.09.8. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Thirteen l2_chains records were re-read against L2BEAT on 2026-09-13 because their oldest evidence had crossed the published 45-day cadence. Eleven agreed on every field L2BEAT carries (category, state validation, data availability, virtual machine) and were re-dated. Two did not: Blast and Manta Pacific were recorded as optimistic rollups, and L2BEAT now lists both under "Other" with State Validation "None" — invalid state roots cannot be challenged, so the fraud-proof guarantee "optimistic" implies does not exist. Both now carry rollupType `no_proof_system`, a value added for exactly this case. Polygon zkEVM, already scored as sunset, now records L2BEAT’s current reading of its data availability (external, custom DA) beside its pre-sunset Ethereum L1 history.

Rationale

A record re-dated without being re-read is a freshness claim nobody made; a record re-read and found wrong is a correction, and is published as one. rollupType is not one of the three published l2_chains criteria, so no published score or order can move. It does feed one personal preference: a reader who says L2 liquidity matters most gives optimistic rollups a +2 fit bonus, and two chains were collecting it for a label the source no longer supports.

Changes
  • fixedBlast and Manta Pacific: rollupType optimistic → no_proof_system, with taglines, descriptions and pricing notes rewritten to L2BEAT’s own classification and a dated correction in each reviewUpdate.
  • changedGolden wizard suite: 1 of 2,217 cases moves — l2_chains with l2_use = liquidity, where Blast falls 72 → 69 and stays 8th. The #1 (Arbitrum One) is unchanged, and the published rankings.json is unchanged in every category.
  • fixedEleven records re-dated 2026-09-13 after the re-read agreed; the review-cadence gate returns to its three named overdue categories (bridges, web3_apps, liquid_staking).
VERSION2026.09.6PUBLISHED2026-09-11APPROVEDmathias-siemonsmeier

Availability no longer decides a tie it had already been weighed in

Effective 2026-09-11 to 2026-09-13, superseded by 2026.09.7. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

When two rows tie on the weighted total, `tiebreakDelta` decides which prints first. It carried four factors, and the fourth read `dataConfidence === 'strong'` under the comment "strong evidence confidence". That is not an evidence reading: `dataConfidence` is derived from the availability score, and the interface renders it — correctly — under the label "Market availability". So a row was given an extra point for being available in more places, AFTER availability had already contributed its weight of 20 to the very total the two rows were tied on. Availability decided the position twice, and the second time it did so under a name that said evidence. The factor is removed; the tie-break now reads only advantage on the category’s one comparable pricing basis, the depth of a row’s published strengths, and whether it leads the heaviest dimension.

Rationale

A tie-break exists to separate rows that the published criteria could not. Feeding it a quantity that is already inside those criteria makes the same fact count twice, and the reader cannot see it happen — they are looking at two equal scores and an order that appears to come from somewhere published. Whether availability belongs in the score at all is a larger question this entry does not answer; what it fixes is availability being spent twice.

Changes
  • removedtiebreakDelta factor 4 (`dataConfidence === 'strong'`), which read the availability score rather than any evidence measure.
  • fixedMeasured by regenerating rankings.json: 0 of 119 categories change published order and 0 change any score — across all 983 rows the default ranking is untouched.
  • changedThe golden wizard suite, which sees personalised runs the published feed does not, moves in 2 of 119 fixtures: bridges (15 of 26 ordered lists, across and base-bridge swap at 2/3) and trading_bots (6 of 23, bitsgap and hummingbot at 4). In BOTH the id-to-score multiset is identical — no score moved, only the order among rows that were already tied.
  • addedcheck-tiebreak-reads-quality-only fails the build if the tie-break block references dataConfidence, avail.score or availability again, and also if it stops reading its published factors — a tie-break that reads nothing orders by insertion and looks deliberate while being arbitrary.
VERSION2026.09.5PUBLISHED2026-09-10APPROVEDmathias-siemonsmeier

The published review cadence is now one the work actually keeps

Effective 2026-09-10 to 2026-09-11, superseded by 2026.09.6. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Every category promised a 30-day review cadence. Measured across all 118 categories carrying one, the oldest evidence per category runs to a median of 35 days, p75 37, p90 38. The gate that enforces the promise allows a 7-day grace, so the bar sat at 37 — the corpus p75 — and roughly a quarter of the catalog was out of cadence at any moment by construction rather than by neglect. On 2026-09-10 that showed as 22 categories overdue with nothing changed but the clock, because the corpus carries a large cohort minted on one day and the whole cohort crosses together. The cadence published on every methodology page is now 45 days. At 45 plus the same grace, the overdue set is exactly three categories — bridges, web3_apps and liquid_staking — whose evidence is genuinely 162 days old and whose rows carry no source URL to re-read. The enforcement ceiling FALLS from 7 to 3 as a result, and may only fall further.

Rationale

A cadence is a promise to a reader about how stale the worst record on a page may be, and a promise missed on a schedule is worse than a longer promise kept. Closing the gap by research was measured and rejected as a remedy on its own: it would have meant re-reading 202 stale rows, 28 of which publish no source URL at all, so no amount of work would have brought those inside a 30-day bar. Nothing here was re-dated and no record moved — re-dating evidence that was not re-read is the one thing this codebase refuses outright. The number changed; the freshness did not, and it is the same number a reader can now check us against.

Changes
  • changedreviewCadenceDays 30 → 45 across all 119 category specs, and the two prose sites that quoted "the 30-day review cadence" in tokenised_bonds.
  • changedcheck-review-cadence-is-kept ceiling 7 → 3, negative-tested: restoring a single 30-day promise over 49-day evidence takes it to 4 and fails the build.
  • fixedMeasured by regenerating rankings.json: no category changed order and no score moved, and the golden suite confirms it independently — across all 119 fixtures and 2,217 cases the only fields that differ are methodologyVersion and contentHash. A cadence is a claim about freshness, not an input to any ranking.
VERSION2026.09.4PUBLISHED2026-09-09APPROVEDmathias-siemonsmeier

A tie is no longer broken by comparing one currency against another

Effective 2026-09-09 to 2026-09-10, superseded by 2026.09.5. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

The engine breaks a genuine score tie by relative advantage on the category’s one comparable pricing basis. That basis was already barred from deciding a tie when it is a derived ladder floor (`entryAnnualUsd`), and the rule gave two reasons: the floor rewards a cheap starter tier, AND it is "quoted in whatever currency the vendor publishes, so a tie could turn on an unconverted €39 beating a $49". The second reason is not special to that field, and the guard never checked it. hardware_wallet publishes twelve prices in USD and one in EUR — BitBox at 149, in a field named `oneTimeUsd` — so the tie-break read €149 and $149 as the same number. tax_software is mixed too and never moved, because its basis is `entryAnnualUsd`, which the older half of the same rule had already barred — the two halves were written for one reason and only one of them was being asked. The basis already carried a `currencies` list computed for exactly this question; the guard now asks it. A mixed-currency basis may still inform and display, and may no longer decide. Converting is deliberately NOT the fix: a rate converted at today’s mid-market is a number the vendor never published.

Rationale

A published order must not turn on a unit mismatch. €149 and $149 are not the same price, and a reader cannot see which of two tied rows was put first because one of them quotes in a weaker currency. The alternative — converting — would replace a published figure with an invented one and make the order depend on the day it was built.

Changes
  • changedbasisMayDecideRank now returns false when the basis carries more than one currency, alongside the existing entryAnnualUsd rule.
  • changedMeasured over all 119 categories by regenerating rankings.json: one category moves. hardware_wallet swaps two pairs, both TIED on score — ledger/coldcard at 67 and tangem/cypherock at 62. No score changed anywhere, and BitBox itself does not move: it is not tied with anyone.
  • changedThe golden wizard suite moves in 10 of its 2,217 personalised cases, all in hardware_wallet, and every one is a pair on an identical score (67/67, 62/62, 80/80).
  • addedtests/economic-semantics.test.ts asserts that a mixed-currency basis cannot decide rank, and pins the two categories that are mixed — so a future record that quietly adds a second currency to a third category is caught rather than silently reordering it.
VERSION2026.09.3PUBLISHED2026-09-06APPROVEDmathias-siemonsmeier

The country gate reaches every country the questionnaire offers

Effective 2026-09-06 to 2026-09-09, superseded by 2026.09.4. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

The eligibility gate now reads the decision layer's country verdict for every row before anything is scored. Until now the engine excluded a row only when the visitor's country was one of the 27 the region table maps; a visitor from any of the other 33 questionnaire countries — India, Nigeria, New Zealand, Hungary among them — was ranked against providers whose own market list omits their region, labelled "verify availability" as if it were unknown. The verdict is the same test on the 27 mapped countries (identical on all 26,217 country-by-row pairs) and resolves the other 33 through the wizard's own region at region resolution, which the verdict says. Only an ineligible verdict excludes; unknown is kept and labelled, exactly as before.

Rationale

The wizard tells the visitor it filters to providers they can sign up for. For 33 of the 60 countries it offers, it did not — the gate silently treated "not mapped" as "eligible", which is the conversion this platform's rules forbid in both directions. The verdict already existed, was published on every result as a label, and disagreed with the ranking it sat beside. A label that says "does not list your region" above a row ranked #1 for you is a ranking that contradicts its own evidence.

Changes
  • changedThe gate moved from scoreAvailability to collectProducts and reads assessCountry from the decision layer. It runs for all 60 questionnaire countries: the 27 mapped ones at country resolution, the other 33 at the wizard's region resolution (an EU member the table does not map is credited with an "eu" tag; Ukraine is not).
  • changedMeasured effect over every category by every questionnaire country (6,959 runs): 807 runs change, in 29 categories and 48 countries; 2,182 rows leave ranked lists and 73 runs change leader — none of them a published, no-answer ranking, which are untouched by construction. Survivors keep their relative order in every run.
  • changed19 further runs — bill_pay in 18 countries, crypto_card in New Zealand — now leave nothing eligible and show the pool for reference. Those rows had been ranked as recommendations with a "not confirmed" label; each is now labelled with its own verdict ("names Hungary as a restricted market", "lists its markets and your region is not among them") and the result says nothing is available rather than "limited availability".
  • fixedA restriction sentence is now matched word-bounded ("Niger" no longer matches "Nigeria"; "US" matches "US persons", not "industrial"). Previously a substring test.
  • changedpayment_gateway keeps its merchant-region test and applies the country verdict on top, so the one placement the default merchant-region signal turns away (coinbase, US-only) stays out of the published order for the same reason it always was.
  • changedExplicitly NOT excluded: a row whose liveness verdict is "discontinued". Six categories rank a sunset row at score 0, kept for reference, and dropping it would change a published order. That is a separate decision and will carry its own entry.
  • addedcheck-wizard-country-excludes gains a second clause for the unmapped countries (NG, IN, NZ, HU): no row the verdict calls ineligible may rank in a normal run, and a fallback run may only exist when nothing was eligible or unknown. Verified to fail with the gate disabled: 526 violations.
VERSION2026.09.2PUBLISHED2026-09-02APPROVEDmathias-siemonsmeier

Twenty points that ordered nothing leave the total

Effective 2026-09-02 to 2026-09-06, superseded by 2026.09.3. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

profileFit is no longer weighted. It took two values across 934 rows — 14 everywhere except the twelve payment_gateway rows — and was constant inside 114 of 114 categories, so its 20 of 106 points moved every product in a pool by an identical amount and never once decided an order. The published total is now 86 points across five dimensions. profileFit is still computed and still shown in every breakdown; it simply no longer pretends to rank.

Rationale

The dimension asked how well a product matches the visitor's profile, and the catalog cannot answer: supportedEntities is present on 148 of 922 rows and varies inside only 5 categories, and the profile vocabulary in bestFor separates both poles in 8 of 113 — eight rows name beginners, five name advanced users. Filling that gap by inference would print the invented number this platform exists to avoid. The questions behind it are not inert: experience_level reaches the ranking through the criterion weighting inside objectiveFit, where beginner versus advanced changes the score in 27 of 114 categories and changes the order in all 27. The signal already works, through the dimension that separates.

Changes
  • removedprofileFit removed from the weighting. The published composite is now availability 20, objectiveFit 30, frictionFit 10, trustBonus 8 and quantitative 18 — 86 points, down from 106.
  • fixedA stated priority for support raised profileFit, routing a visitor's answer into a dimension that could not move a result. It now raises frictionFit, where getting started and getting help are scored.
  • changedMeasured effect: 15 of 114 categories reordered and 3 changed leader (institutional_custody, payment_gateway, business_banking). Every one of the 36 swapped pairs sits within 0.02 points of 86 of its partner — products that were numerically tied before and after.
  • changedThe sensitivity analysis and the per-dimension breakdown no longer offer profileFit as a lever, since re-weighting a term that carries no weight cannot change an outcome. The breakdown still shows the number, labelled "shown, not scored".
  • fixedThe display rescale divided by a hardcoded 106 while the weights summed to 86, so the published band no longer spanned the achievable range. It now derives the divisor from the weights. Every score rose by 0 to 5 points, median 4; no category changed order and none changed leader.
  • fixedrankings.json now publishes the weight profile each category was actually scored with. It was scored on re-weighted profiles — exchange on 24.7/37/9.9/12.3/22.2, not the base — and published only the base, so the first step of the stated formula could not be rebuilt from the file: 98 of 934 products reconstructed, the rest were off by up to 0.15. All 934 now reconstruct exactly.
  • fixedThe gate behind the reconstructibility claim read the published weights, checked they existed, and never used them: it rebuilt only the pool-relative step. A payload declaring a weight the engine had stopped using passed as "934/934 rebuild from the payload's own formula". It now rebuilds the weighted total from the breakdown too, and fails on a tampered weight, a shifted weight and a missing weight profile.
VERSION2026.09.1PUBLISHED2026-09-02APPROVEDmathias-siemonsmeier

An empty string matched every market

Effective 2026-09-02 to 2026-09-02, superseded by 2026.09.2. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

scoreAvailability compared each of a product's markets against the visitor's country with String.includes. On the un-personalised path — every /best page, every prerendered route and the rankings.json feed itself — no country is stated, so the needle was the empty string and every market name matched. Two products were silently excluded from every published ranking, and a 20-versus-18 step became "does this row have a non-empty primaryMarkets array".

Rationale

bill_pay/swapin, restricted in the United Kingdom and Hungary, and stablecoin_yield/ethena_susde, restricted in the United States and Germany, are available nearly everywhere else. Both vanished from a catalog whose first rule is that an exclusion is published with its reason. The scoring half awarded six of 106 published points for catalog field population rather than for anything about the product. The country match now requires a stated country.

Changes
  • fixedRestored 2 products excluded from every published ranking by an always-true country match: bill_pay/swapin and stablecoin_yield/ethena_susde. The catalog publishes 934 scored products, up from 932.
  • fixedAvailability no longer awards a primary-market bonus when no country is stated. Measured effect: 2 categories changed leader (tokenised_tbills, tokenised_funds) and 6 reordered below the top.
  • addedEach category now publishes dimensionSpread in rankings.json — how far each dimension actually varied across its pool. A base weight is how much a dimension COULD move a score; the spread is how much it did.
  • addedMeasured and disclosed: profileFit takes two values across 934 rows and is constant in 114 of 114 categories, so its 20 of 106 points order nothing. frictionFit is constant in 98 categories, trustBonus in 99, quantitative in 103. objectiveFit alone reproduces the published leader in 103 of 114.
VERSION2026.09.0PUBLISHED2026-09-01APPROVEDmathias-siemonsmeier

User sentiment leaves the ranking

Effective 2026-09-01 to 2026-09-02, superseded by 2026.09.1. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Trustpilot and App Store averages no longer contribute to any score. They remain visible as evidence on the provider breakdown, labelled as context rather than a scored dimension. The quantitative dimension keeps its 0-18 range: fee and regulatory scoring are rescaled to span it, so the balance between the six dimensions is unchanged.

Rationale

Seven of 932 catalogued products carry a Trustpilot figure and six an App Store figure. Every other product received a flat neutral 2 of 5, which moved 919 products by an identical amount and therefore measured nothing. For the thirteen with data, the input imported a third party's star average into a ranking whose entire claim is that it reconstructs from published, checkable inputs. A ranking should not borrow a number it cannot show the working for.

Changes
  • removedSentiment (0-5) removed from the quantitative composite
  • changedFee (0-8) and regulatory (0-5) rescaled to span the dimension's unchanged 0-18 range
  • changedSentiment evidence relabelled "shown for context, not scored" on every surface that renders it
  • fixedEighteen surfaces advertised methodology v2026.04, a version that was never published; all now derive the stamp from this list
  • changedMeasured effect: 8 of 114 categories reordered. Two changed leader and both were ties — exchange (Bitstamp and Bybit both 82) and bridges (Across and Relay both 85). No leader moved past a product with a lower score.
VERSION2026.04.0PUBLISHED2026-04-27APPROVEDmathias-siemonsmeier

Geofence-aware referral routing

Effective 2026-04-27 to 2026-09-01, superseded by 2026.09.0. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

Outbound provider links now resolve to region-appropriate URLs at click time. US visitors clicking a US-restricted exchange are routed to the operator's US entity (where one exists) or shown a region-block notice instead of a dead link.

Rationale

Providers like Binance, OKX, and Bybit geofence their main domains for US residents. Sending US users to those domains created a broken click-out experience and undermined the recommendation's credibility. The new resolver detects region from the user's declared country (quiz signal) or browser locale and chooses the correct destination.

Changes
  • addedRegion detection from quiz signal + navigator.language fallback
  • addedRestricted-market alternates (binance.us for US Binance traffic)
  • addedBlock UI for restricted providers without a regional alternate
  • fixedRemoved hardcoded /en-US/ path from Bybit Card website URL
VERSION2026.04.0-launchPUBLISHED2026-04-01APPROVEDmathias-siemonsmeier

Initial published methodology

Effective 2026-04-01 to 2026-04-27, superseded by 2026.04.0. Overall ranks and Fit ranks in the categories below were scored under this version from its publish date; the measured effect on each order is stated in the changes.

First publicly versioned methodology. 11 categories with scoring weights, 5-dimension framework (fees, trust, support, control, liquidity), 6-question default decision flow per category.

Rationale

Launching the platform with a versioned methodology so every future change is traceable. Categories cover the practical entry points for crypto-curious users: exchanges, wallets, cards, on-ramps, staking, lending, tax software, portfolio trackers, payment gateways, bridges, and Web3 apps.

Changes
  • added11 categories with category-specific scoring
  • added5-dimension evaluation framework
  • addedDrift-monitoring infrastructure (saved decisions, weekly cron, score-delta alerts)
  • addedOutcome-tracking infrastructure (30-day follow-up, public accuracy stat)
ChainChoice
Compare onchain. A brighter future.
© 2026 ChainChoice. All rights reserved.
System statusFeeds last refreshed 9 days ago
Built from commit ba0993b · rankings.json sha256 e1eb24980abb
ChainChoice · The decision layer for crypto · Not financial adviceEducational analysis, not investment advice. Affiliate links may contribute to operations but never alter rankings.

ChainChoice provides informational content only. Nothing on this site constitutes financial, investment, legal, or tax advice. Always do your own research and consult a qualified professional before making financial decisions.