Today
Loading
Reading the latest snapshot.
Backing report · intents.near
An outsider's check of NEAR Intents, from public chain data
NEAR Intents keeps every user's balance in one contract, intents.near. For each token, the sum of those balances should never exceed what the contract actually holds on the token's own contract. Two read-only calls test it. Anyone can run them, at any block.
Today
Loading
Reading the latest snapshot.
29 September 2026
Not backed
Reading the replay.
Exhibit 1
USDT on BNB Chain, as held inside intents.near through the HOT Omni bridge. 25 September to 6 October 2026.
Reading.
// liabilities: the sum of every user's balance of the token
intents.near mt_batch_supply({"token_ids":["nep245:v2_1.omni.hot.tg:56_2CMMyVTGZkeyNZTSvS5sarzfir6g"]})
// holdings: what the contract owns on the token's own contract
v2_1.omni.hot.tg mt_balance_of({"account_id":"intents.near","token_id":"56_2CMMyVTGZkeyNZTSvS5sarzfir6g"})
// both as JSON-RPC "query" / "call_function" with "block_id": <height>
// on archival-rpc.mainnet.fastnear.com (the deprecated archival-rpc.mainnet.near.org now refuses every request)
Points: every 6 hours across the window and every hour from 29 Sep 12:00 to 3 Oct 00:00 UTC, each at the block closest to that time. Data: replay-series.csv.
The blocks where the unbacked amount changed, each found by bisection over block heights.
Reading.
Between two heights with the same shortfall the code assumes no net change; otherwise it splits the interval and recurses until each change is pinned to the first block that shows it. Changes that reverse within 10 blocks are in-flight receipts of ordinary deposits and withdrawals and are dropped. Source: src/replay.js findSteps, levels. Data: ghost-steps.csv.
| Block | Time (UTC) | Change | Unbacked after | Transaction (re-read from chain) |
|---|
The same check, once a day over the whole history archival RPC serves.
Reading.
Command: npm run history (resumable; every answer is cached). Data: data/raw/history/daily-top.json, summary data/derived/history.json.
The same rule run over every priced token at eight moments. The rule fires when a token's unbacked amount is worth $1,000 or more at that day's price.
Reading.
For each moment: intents.near mt_batch_supply for every token the 1Click API lists, then each token's own balance view for intents.near, all pinned to one block. Historical USD prices: coins.llama.fi/prices/historical/<unix>/coingecko:<id>, using the CoinGecko id the 1Click list gives each token.
The thesis's tested claim: what intents.near owes users, once a day, before and after the hole.
Reading.
| Measure | Back at the reference level | With any one token left out | Last sample | Result |
|---|
Command: npm run flows re-reads every daily sample from an archival node and requires every value to match. Data: data/raw/flows/daily-supply.json, result data/derived/flows.json, rules src/flows.js. THESIS.md, F6.
Exhibit 2
Reading.
Bars are what users are owed in USD. A notch marks what the contract holds; a red segment would show a shortfall.
Reading.
intents.near mt_tokens({"from_index":"0","limit":2000}) // every token id the ledger lists
intents.near mt_batch_supply({"token_ids":[...100 ids...]}) // what users are owed
<ft> ft_balance_of({"account_id":"intents.near"}) // NEP-141 holdings
<mt> mt_batch_balance_of({"account_id":"intents.near","token_ids":[...]}) // NEP-245
// all at one "block_id"; prices from GET https://1click.chaindefuser.com/v0/tokens
Full table, every token with a balance: backing-now.csv.
| Token | Chain | Owed (USD) | Held / owed | Status |
|---|
Exhibit 3
Your browser asks a public NEAR RPC node directly. Read-only views, no wallet, nothing signed. By default it checks the 25 largest liabilities (about 25 requests, seconds); tick the box to check every priced token (about 170 requests, two to four minutes on the free public node, which rate-limits).
Uses free.rpc.fastnear.com for chain reads and the 1Click token list for prices. The code it runs is the same module the command line uses: lib/check.js.
Exhibit 4
The checker posts each result to a small contract on NEAR testnet, pinned to the mainnet block it checked. A lending market or vault could refuse NEAR Intents tokens as collateral unless is_backed_at_or_after(block) returns true. The contract derives "backed" from the numbers; it never takes the checker's word for it.
Reading the contract on testnet...
// read (this page, live, testnet RPC):
ghostcount.testnet latest({})
ghostcount.testnet is_backed_at_or_after({"block":"<mainnet height>"})
// write (CLI: npm run attest), signed by a function-call key that can only call attest:
ghostcount.testnet attest({"a":{"mainnet_block":"...","owed_usd_cents":"...","shortfall_usd_cents":"...",
"short_priced_tokens":[...],"report_sha256":"...", ...}})
Exhibit 5
Layer 1 proves intents.near holds the tokens it owes. Most of those tokens are themselves claims on coins somewhere else, and the contracts have administrators. Some of that second layer can be checked from public data, to the coin. Most of it cannot.
Priced liabilities in intents.near, by how far their reserves can be verified from public data.
btc-connector.bridge.near, read from chain; UTXOs looked up on Bitcoin.
btc-connector.bridge.near get_config({}) // signer: v1.signer, root key, change address
btc-connector.bridge.near get_utxos_paged({"from_index":0,"limit":40}) // every UTXO + key path
btc-connector.bridge.near get_btc_pending_infos_paged(...) // withdrawals in flight
nbtc.bridge.near ft_total_supply({})
v1.signer public_key({"domain_id":0})
v1.signer derived_public_key({"path":"<path>","predecessor":"btc-connector.bridge.near","domain_id":0})
// key = root + sha3-256("near-mpc-recovery v0.1.0 epsilon derivation:btc-connector.bridge.near,<path>") * G
// address = bech32 P2WPKH of hash160(compressed key), as in contracts/satoshi-bridge/src/kdf.rs
GET https://mempool.space/api/address/<address>/utxo
GET https://blockstream.info/api/address/<address>/utxo
wrap.near, read from chain.
wrap.near ft_total_supply({})
query view_account wrap.near // amount + locked; storage_usage * 10^19 yoctoNEAR is reserved for storage
query view_access_key_list wrap.near // no keys: nobody can redeploy or sign for it
// near_deposit mints 1:1 for attached NEAR, near_withdraw burns and sends NEAR back
// (github.com/near/core-contracts, w-near/src/w_near.rs)
Roles read from the contract's own access-control views.
intents.near acl_get_super_admins({"skip":0,"limit":100})
intents.near acl_get_grantees({"role":"<Role>","skip":0,"limit":100}) // 12 roles
intents.sputnik-dao.near get_policy({})
query view_access_key_list intents.near
NEAR-side supply of each token, how much of it sits inside intents.near, and whether what backs it can be checked.
| Token | Route | In intents.near | Reserves |
|---|
<ft> ft_total_supply({}) // whole NEAR-side supply
<ft> ft_balance_of({"account_id":"intents.near"})
omft.near acl_get_grantees({"role":"TokenDepositer",...}) // who may mint PoA tokens
Priced liabilities in intents.near, grouped by the contract that issues each token.
Read from each bridge contract's access-control views.
omft.near acl_get_grantees({"role":"TokenDepositer","skip":0,"limit":100})
omft.near acl_get_super_admins({"skip":0,"limit":100})
v2_1.omni.hot.tg / omdep.near / omni.bridge.near acl_get_super_admins(...)
query view_account / view_access_key_list <each holder>
// PoA factory source: contracts/poa/factory/src/contract.rs, ft_deposit()
// #[access_control_any(roles(Role::DAO, Role::TokenDepositer))]
v1.signer state, read from chain.
Method
git clone https://github.com/spragginsdesigns/ghostcount && cd ghostcount
npm run rebuild:quick # live check + re-reads recorded history, minutes
npm run rebuild # full: dense replay, step search, controls
npm run check # print today's check only
npm run demo # serve this page on localhost:4110
intents.near against the NEAR-side token contracts. Layer 2 is checked here only for wNEAR and nBTC; for the PoA Bridge and HOT Omni the reserves are not published in a form anyone outside could verify.