Papers
The method · papers-score/1

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.

What it is

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.

Formula

Five parts, 100 points

Bands

Inputs

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.

InputWhat it counts
Try it

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.

Sources and windows

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.
Limits

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.
The weekly log

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".

Kinds in the log
KindNameWhat it is
The method entry

Loading…

Verify

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>"