Witness
Signed observations of who holds what, checked against the chain. One address, one block, two readers, every disagreement settled by the chain itself, signed by whoever looked. 6 entries, 3 people, Ethereum and Tezos.
What an entry is
A published work is a chain of references, and the chain starts with who holds the token. Every reader of a blockchain, ours included, can be wrong about that: an index lags, drops a token standard, or keeps listing a token after it moved. A witness entry records, for one address at one block, what each public reader returned, where the readers differ, and what the chain itself says about a random sample from each list and about every token the readers disagree on. The chain decides. A reader is right or wrong per token, never in general.
Each entry is a JSON file signed by whoever ran the check, in the same signature envelope the DP-1 playlist format uses. The signature covers the content, so an entry stays valid wherever it is served. Anyone can produce one, from their own readers, their own node, and their own key.
einstein-rosen (einstein-rosen.eth, einstein-rosen.tez)
2026-10-02 Ethereum · 0x99fc8AD516FBCC9bA3123D56e63A35d05AA9EFB8 at block 26,106,430
| Reader | Lists | Random sample: chain says held | Lists, other reader omits | …of which chain says held |
|---|---|---|---|---|
| feralfile-indexer Feral File | 375 | 120 / 120 | 1 | 1 |
| blockscout Blockscout (public instance) | 386 | 120 / 120 | 12 | 10 |
Signed by did:key:z6MkoX8i2dynyvLh4hUHZt8b42q9uAwwCWxM4NSX4YDfMtaC. Entry (JSON, every checked token with the chain’s answer) · both readers’ full lists. A second node confirmed all 2 not-held verdicts.
2026-10-02 Tezos · tz1YhWtCRd9LKr1rtd3wdCCz2ceNWAsS2Lnd at block 15,201,842
| Reader | Lists | Random sample: chain says held | Lists, other reader omits | …of which chain says held |
|---|---|---|---|---|
| tzkt Baking Bad (public TzKT instance) | 292 | 120 / 120 | 1 | 1 |
| objkt objkt.com (public GraphQL) | 291 | 120 / 120 | 0 | 0 |
Signed by did:key:z6MkoX8i2dynyvLh4hUHZt8b42q9uAwwCWxM4NSX4YDfMtaC. Entry (JSON, every checked token with the chain’s answer) · both readers’ full lists.
reas (reas.eth, reas.tez)
2026-10-02 Ethereum · 0x457ee5f723C7606c12a7264b52e285906F91eEA6 at block 26,106,431
| Reader | Lists | Random sample: chain says held | Lists, other reader omits | …of which chain says held |
|---|---|---|---|---|
| feralfile-indexer Feral File | 186 | 118 / 120 | 3 | 2 |
| blockscout Blockscout (public instance) | 192 | 114 / 120 | 9 | 5 |
Signed by did:key:z6MkoX8i2dynyvLh4hUHZt8b42q9uAwwCWxM4NSX4YDfMtaC. Entry (JSON, every checked token with the chain’s answer) · both readers’ full lists. A second node confirmed all 13 not-held verdicts.
2026-10-02 Tezos · tz1LBwyJMRkH4tcG19KwYzAW7fLYbjFmWdWy at block 15,201,817
| Reader | Lists | Random sample: chain says held | Lists, other reader omits | …of which chain says held |
|---|---|---|---|---|
| tzkt Baking Bad (public TzKT instance) | 173 | 117 / 120 | 3 | 1 |
| objkt objkt.com (public GraphQL) | 171 | 118 / 120 | 1 | 0 |
Signed by did:key:z6MkoX8i2dynyvLh4hUHZt8b42q9uAwwCWxM4NSX4YDfMtaC. Entry (JSON, every checked token with the chain’s answer) · both readers’ full lists. 8 tokens could not be asked this way (the contract has no standard ledger call) and count for neither reader.
thefunnyguys (thefunnyguys.eth, thefunnyguys.tez)
2026-10-02 Ethereum · 0x830cc132dd66F6491cEAA20206f398247143d9CF at block 26,106,203
| Reader | Lists | Random sample: chain says held | Lists, other reader omits | …of which chain says held |
|---|---|---|---|---|
| feralfile-indexer Feral File | 1,401 | 120 / 120 | 44 | 43 |
| blockscout Blockscout (public instance) | 2,060 | 92 / 120 | 703 | 276 |
Signed by did:key:z6MkoX8i2dynyvLh4hUHZt8b42q9uAwwCWxM4NSX4YDfMtaC. Entry (JSON, every checked token with the chain’s answer) · both readers’ full lists. A second node confirmed all 455 not-held verdicts. 1 token could not be asked this way (the contract has no standard ledger call) and count for neither reader.
2026-10-02 Tezos · tz1gMfctX4hBNpkUoE7RcYPBhNc1hpHddqh4 at block 15,201,790
| Reader | Lists | Random sample: chain says held | Lists, other reader omits | …of which chain says held |
|---|---|---|---|---|
| tzkt Baking Bad (public TzKT instance) | 6,403 | 120 / 120 | 9 | 8 |
| objkt objkt.com (public GraphQL) | 6,395 | 120 / 120 | 1 | 0 |
Signed by did:key:z6MkoX8i2dynyvLh4hUHZt8b42q9uAwwCWxM4NSX4YDfMtaC. Entry (JSON, every checked token with the chain’s answer) · both readers’ full lists. 2 tokens could not be asked this way (the contract has no standard ledger call) and count for neither reader.
How a check runs
Ask each reader for the address’s holdings. Pin a block. Compare the two lists per token standard. Then ask the chain, at that block, about a seeded random sample from each list and about every token only one reader lists. On Ethereum the question is ownerOf(tokenId) for ERC-721 and balanceOf(address, tokenId) for ERC-1155, by eth_call; on Tezos it is the contract’s own %ledger big map, read from a node by key hash. A token the reader lists that the chain says is held elsewhere, or that no longer exists, is a reader error or lag. A token the chain says is held that a reader omits is an under-count. A contract that cannot be asked this way is recorded as unanswerable and counts for neither side. Every not-held verdict is re-read on a second node.
Readers today: Ethereum, the Feral File indexer and Blockscout; Tezos, TzKT and objkt. The readers are the ones we and the apps around us depend on. None of them is treated as the truth.
Verify an entry
No install beyond Node. The script recomputes the canonical bytes, checks the payload hash, and checks the Ed25519 signature against the public key in the signer’s did:key.
git clone https://github.com/feral-file/status.git && cd status
curl -s https://witness.feralfile.com/data/witness/<entry>.json | node tools/witness/verify.mjs -
Append an entry
Run the same check from your own vantage point: your readers, your node, your key. Keep the schema and name your reader and its operator. Publish the file wherever you publish things, or open a pull request that adds it under data/witness/ in feral-file/status; this page lists every entry it finds there. The method, the schema, and the signing and verifying scripts are in tools/witness.
Every entry here so far was written by Feral File. The point of the shape is that the next one need not be.
Data
- entries.json — every entry on this page, summarized, with its URL and signers
- data/witness/ — the entries and the readers’ full lists, as published
- witness.md — this page as plain Markdown
- llms.txt — for agents
Data is served with open CORS. The page is regenerated by build_witness.py in the same repository as the status page.