BUILD WITH CMC API · REAL WORLD ASSETS TRACK
Before you compare
check the wrapper
Open the dated measurement, issuer evidence and methodology
Latest recomputable observation · 28 September 2026, 15:14 UTC.
CoinMarketCap returned 793 tokenised references and 1,449 token rows. Bell routed
38 to DO NOT COMPARE, 97 to INVESTIGATE, and 658 to no-rule-hit.
88 references include computed quote-comparison fields. The complete
normalized inputs and the receipt are linked below; make verify-capture
recomputes this observation without an API key. A computed quote comparison is not
proof that units, claims or executable liquidity match.
Recomputed whole-catalogue base rate · 28 September. CoinMarketCap tells you which tokenised assets exist. Bell checks which references have rows that pass its filtered quote checks, and what needs review before a decision. Of the 250 references carrying more than one representation, 88 have a filtered quote comparison, and behind the 162 refusals sit 163 rule hits: 40 triggered price or field review rules, 107 are missing-coverage reasons, and 16 leave fewer than two eligible spot routes. Review triggers are not proof of economic contradiction. Every number on this page was produced by a command you can run yourself, with no API key. These dated counts in the strip below are that dated measurement, so they carry its date: this page ships no JavaScript and cannot show you today's. The product page reads the live receipt and prints both.
In that 28 September measurement, the 107 coverage reasons are a missing price or quote without positive reported volume; 16 more have fewer than two eligible spot routes. The remaining 40 are price or field review triggers, including the reported zero-market-cap/positive-volume pair. They tell an analyst what to verify, not whether the underlying market is economically contradictory. These are rule hits rather than references, and one reference can trigger more than one rule. The calculation is recomputed from the complete normalized capture; the receipt records the input and rule-code SHA-256 values.
Bell attaches issuer-published instrument notes to exact CoinMarketCap token IDs. For Alphabet, the Backed product page identifies a Class A tracker certificate; Robinhood's Final Terms identify a debt security linked to Class A; and Ondo's GOOGLon page identifies Class A while its GOOGon page identifies Class C. CoinMarketCap groups GOOGon under its Alphabet Class A reference. Bell identifies crypto_id 42272 as a Class C route and keeps it in the CMC-grouped quote set. The displayed spread is labelled as combining Class A and C routes, not as a same-class spread. Four dated, hashed excerpts from Backed, Ondo and xStocks are linked in the pair-review receipt; raw pages and signed legal archives are not included. These sources describe products; they do not independently verify backing, redemption, custody or legal rights.
Reproduce the preserved 28 September observation
The live receipt can advance as CMC publishes new data. This dated capture preserves one exact observation and its normalized public inputs so you can recompute it without credentials.
make verify-capture make base-rateRecomputes the preserved 15:14 UTC receipt and 28 Sep population rate from its paired credential-free inputs. The rate artifact includes the input and rule-code SHA-256 values.
Check it in 30 seconds, no key required
Clone the repository and run these. None of them touch the network, and none need a CoinMarketCap credential. Each of the first three finished in well under a second on every machine this has been run on; the gate's own range is stated with it below, generated from a file a clock wrote rather than typed into this page.
git clone https://github.com/dyplux/bell.git && cd bell make base-rateUnder a second. Prints the whole-catalogue measurement: 793 references, 543 with a single representation and nothing to compare, 250 where a comparison could be attempted, 162 refused, 88 published. Refusal rate 64.8%, Wilson 95% interval 58.7 to 70.5%.
python3 bell/verify_rule_boundaries.pyUnder a second. An executable specification of the decision boundaries: 1.99x stays below the dispersion rule, 2x is an inclusive warning, 9.99x stays a warning, 10x is an inclusive stop, and missing or zero prices do not fabricate a ratio. All 8 checks pass.
make demoUnder a second. Recomputes the 50 highest-priority flagged references from the dated replay receipt and prints 35 refused, 10 comparable, 5 held for investigation, with the reasoning for each. Those 50 are a priority-sorted slice, not a sample: the references carrying no signal are not in the list, so the three counts are not a rate. The rate over the whole catalogue, with its denominator, is the command above.
make check-offlineThe gate was observed between 17.71 and 33.63 seconds across 2 machines, cold runs included.
make time-gate runs the gate against a clock and writes
proof/gate-runtime.json; make sync-counts writes this sentence out
of that file, and a test requires the two figures to be exactly the fastest and slowest in
it and the count to be the number of machines in it. It is a record of the machines it
has run on, not a bound on yours. Two reviewers have measured 16.7 and 29 seconds,
outside it in both directions, which is what a third machine is entitled to do.
What that gate proves, and what it does not
- The suite
- 600 tests, 466 Python and 134 JavaScript. One Python test needs a network and a CoinMarketCap key; without them it is skipped and the runner says so.
- The re-derivation
make check-offlinerecomputes the 28 September capture from its 16 MB normalized inputs, replays the original 21 September distribution from 16.5 MB of shipped inputs with a hash-pinned frozen scanner, and separately verifies the later-rule 21 September replay. Each scan is recomputed, so a changed count fails the gate.- The submission gate
- Runs a submission gate over 216 tracked files, inspecting every one for anything private or unreleasable.
- The recovered 21 September distribution is replayed
- Of the 30 dated observations in the population history, two legacy observations have separately bundled receipts; new observations retain a full receipt archive and compare its complete summary with the chained history. Per-reference rows are compared when a retained receipt has a same-rule series step. The original 21 September receipt was recovered from the publisher runtime on 29 September and matches that history entry. A hash-pinned copy of the original scanner reproduces its 35 / 662 / 94 state split from those inputs. A separate replay applies the later rule set to the same inputs and is kept as a distinct result. The 28 September capture is a separate, fully replayable capture outside that history.
- The chain
- every one of the 30 shipped here is chained to the one before it, so editing a single record invalidates every digest after it.
- The chain is not a signature
- It defeats a quiet single-record edit. It does not defeat anyone who rewrites the whole file, the chain and the committed anchor together, because all three live in this repository. There is no external attestation and no date attestation, and the module says so in its own docstring.
- Reference changes stay within one rule set
- The retained v3 receipts form their own short segment, separate from v2. Across the
first 15-minute interval, iShares Russell 2000 ETF moved from
do_not_comparetoinvestigateasZERO_MCAP_POSITIVE_VOLUMEdisappeared. This is two observed points, not a daily or monthly history. The per-reference deltas are derived from the retained receipts and checked bymake verify. - Older per-reference rows are not value-checked
- Every newly retained receipt is checked against the full history summary, even when a rule change prevents adding it to the current comparable series. For series steps with a retained receipt, `make verify` also compares every reference row. Older steps without retained receipts remain origin-checked only; their row values cannot be re-derived and are printed as UNVERIFIED.
- Rule changes are not market changes
- Where a receipt predates the current rule set, the recomputed state counts are reported beside the recorded ones rather than compared, because they answer to different rules.
Two searches that show both halves
On the product page, search these two. They are the affirmative and the refusal, and both hold on the dated replay receipt in this repository as well as on the live one, so a local clone shows what this page describes.
- Coinbase Global, Inc. returns COMPARABLE · FLAGGED: routes under one CMC RWA reference pass Bell's price and reported-volume filters, so Bell names the filtered spread, cheapest route, and which route has the highest reported 24h volume. This does not establish equivalent units or claims, and reported volume is not market depth. The qualifier is there because the scan also raised a flag on this reference, and the flags are on the card under the verdict. This is the output the product exists to produce, with the thing it still wants you to look at attached to it.
- Silver returns DO NOT SHORTLIST: its representations are quoted at a ratio above the inclusive 10x block floor. That rule is a review stop; the observed spread does not establish whether unit, instrument or claim differences explain it. Bell keeps the example amount uncommitted and states what to verify before any wrapper is considered comparable.
What it refuses to do
A monitor that refuses is only worth reading if you know how often, so the rate is measured over the whole catalogue rather than argued from examples. The refusals are also split rather than totalled: 107 of the 163 rule hits are missing-coverage reasons, 40 are price or field review triggers, and 16 have no eligible spot pair. A review trigger is not proof of an economic contradiction.
The same discipline applies to the 543 references the rate excludes. One representation is nothing to compare, so they are not scored as passes and not counted against the rate. But excluding them was the only thing this product said about 68% of the catalogue. So it measures them too, as a partition of references rather than a count of reasons, which is the only shape that cannot hide a group: 462 carry a field CoinMarketCap does not report, 2 trigger quote or field review rules, 4 are complete with a context note, and 75 are complete with nothing observed against them. Those four sum to 543. The majority of the catalogue cannot be compared, and for most of that majority the reason is the source rather than the asset. That is a coverage fact, not a verdict on any issuer.
The same discipline applies to Bell's own history. Where two published receipts were produced under different rule sets, the page refuses to print a delta between them and says so, because subtracting them would state a market change nobody observed.
A clean result is descriptive only. Bell does not prove backing, redemption, custody, legal eligibility, solvency or executable liquidity, and it is not a safety score or an investment recommendation. Where the Startup plan does not return a surface, such as RWA market pairs, that is stated rather than filled in.
The receipts
Every figure above is traceable to a dated file in the repository or to the live credential-free endpoint.
Which CMC surfaces it uses
All 7 of the dedicated RWA endpoints are called by this repository, and 17 distinct CoinMarketCap endpoints in total. Be exact about what "called" buys: 6 are in the published scan a reader can exercise without a key, 11 more are in a key-gated audit path, and one of those, market-pairs/list, is refused outright on the Startup plan. An endpoint that answers 403 is called and not used, and a count of 17 does not say so. The published population scan calls five of the seven: map, assets list, quotes latest, info and issuers list, joined on stable identifiers rather than on tickers, because a ticker is reused across representations. cryptocurrency/info resolves chain and contract identity, which the RWA family does not carry.
An exported case receipt names, for each surface, the endpoint, the payload digest, how many requests were made, how many returned, the HTTP status codes with their counts and the request window. Those come from the replay package's collection manifest, so the artefact states which observation they describe rather than implying they measured whatever scan is loaded. Credentials and transport headers are recorded nowhere, which is the one thing that cannot be published without breaking the credential-free claim.
Be precise about what that record is worth. The payload digest is recomputable: the payload ships, so anyone can hash it and check. The request counts, status codes and per-response digests are self-declared. The individual HTTP responses are not shipped, so nothing in this repository can recompute them, and a verifier that only rejects obvious placeholders is not verifying them. They are recorded so a reader knows what the collection looked like, not offered as proof that it did. Shipping the raw responses would make them checkable and would also mean publishing what the credential returned, which is the trade this project has not made.
The other two are deliberately outside that loop rather than missing.
market-pairs/list is not returned on the Startup plan, and the receipt says
so in words instead of filling the field with a zero. issuers, the
single-issuer endpoint, is used by the per-reference audit path in
bell/rwa_audit.py, which also reaches the DEX family. Historical OHLCV lives in
bell/bell.py and key/info in bell/live_contract_probe.py. Grep the repository and count: the list above is what you will find.
The join is where the work is. Reconciling the 7,811 rows the map returns against the 7,942 the asset list returns exposes 131 rows with no stable reference ID, which is the kind of surface disagreement a price-first tool never sees because it drops those rows before it starts.