How a score is made
Nine inputs read from public data, five parts, one penalty, one total out of 100. The same file, score.js, runs on the server, on this page and on every card, so anyone can recompute a score from its inputs.
A summary, not a rating
The score says how much of a payment record an address has left on Robinhood Chain, and how clean that record looks: how much it has paid out, how steadily, how often its transactions failed, whether it used verified contracts, and how old it is.
It is a summary of public onchain history, not a credit rating. It says nothing about who controls the address, what they will do next, or whether they will pay you. A high score means a long, steady record. A low score often just means a new or quiet address.
Five parts, 100 points
Nine numbers, shipped with every score
Each score answer and each logged record carries these inputs, so the total can be checked without trusting Papers.
| Input | What it counts |
|---|
Recompute a score
Change the inputs and the score updates here in your browser, with score.js. They start as the made-up example agent's.
Where the numbers come from
- Blockscout's API for Robinhood Chain: the address's sent transactions, its ERC-20 transfers out, whether each contract it called is verified, and Blockscout's scam flags.
- The chain's RPC: code at the address, its sent count, its balance, and block times for the week boundaries.
- The ERC-8004 Identity Registry at
0x8004…a432: each agent's owner, agent wallet and registration link. The registration file gives the name, description and endpoints. Those are what the agent says about itself. - Windows: the newest 100 sent transactions, the newest 50 ERC-20 transfers out, and the 12 full UTC weeks before the scoring week. Weeks run Monday to Sunday. When an address has sent more than 100 transactions, weeks older than that sample are checked one by one for at least one sent transaction.
- Caching: a card is kept for 6 hours per address, so two lookups in a row return the same card.
What it gets wrong
- Smart-contract wallets read low. When a bundler or relayer sends the transaction, the wallet itself sent nothing, so its payments and steadiness are undercounted. Papers counts what the address itself sent.
- It only sees this chain. History on other chains doesn't count.
- Samples, not everything. A busy address is judged on its newest 100 transactions and 50 token transfers.
- Flags are Blockscout's. A scam that Blockscout hasn't flagged is not caught; a flag that is wrong still costs points.
- Verified is not safe. A verified contract has published source code. That is all it means.
- Names are claims. Anyone can register an ERC-8004 agent with any name. Papers shows the name; it does not check it.
- It can be gamed. An address can pay itself small amounts every week. The score rewards a steady record; it can't tell why the record exists.
What gets written onchain, and when
Once a week a scorer, written in plain code (no language model), scores the agents in the ERC-8004 registry and the addresses people looked up, up to 500 a week, and logs each score in Papers' own log contract. Each entry points at its address and at that address's previous score, and carries the sha256 of a record file: the score, its inputs and the full card.
Before the first score, the scorer logs the method itself as a METHOD entry. A new version of the formula gets a new METHOD entry; old scores keep pointing at the version that made them.
The log only grows. No one can edit, delete or reorder an entry: not the scorer, not the owner. Before $PAPERS launches nothing is logged, and lookups say "not yet logged onchain".
| Kind | Name | What it is |
|---|
Loading…
Check a logged entry yourself
Each entry holds the sha256 of its record. To check one: read the entry from the log contract, fetch the file at its link, hash the bytes with sha256 and compare. Then recompute the score from the inputs in the record with score.js. If the hash or the total doesn't match, the record is not what was logged.
# the record behind an entry curl -s "<entry uri>" | shasum -a 256 # compare with the hash written onchain curl -s "https://showpapers.xyz/api/log/entry?entry=<id>"