This proposal defines public income statements for agents of ERC-8004, carried on its Reputation Registry. A statement commits, with a Merkle root, to the incoming transfers of one ERC-20 token to the agent's ERC-8004 agentWallet over a window of log positions, with each transfer as its own leaf. One writer's statements about one agent are chained by hash over back-to-back windows, and the agent's owner can name, in the agent's ERC-8004 metadata, the writer readers read first. Anyone can rebuild every leaf and total from the token's own logs and the identity registry's, and an optional verifier contract checks one transfer against a statement's root on chain.
Statements are ordinary giveFeedback entries, with tag1 set to revenues, the tag ERC-8004 gives as its example of cumulative revenues, and tag2 set to x402.statement. An entry's value is the cumulative total through the end of its window, and its file, carried in the entry itself, is the evidence. x402 payments, which settle as a token transfer to the address an agent names as its payTo, are the motivating case. A token log cannot show how a transfer was settled, so a statement counts every incoming transfer except mints, transfers of nothing and the agent's own, and calls the total income, not x402 revenue.
Nothing at Priors runs this draft. Its reference contracts go on the testnet only.
Try it
On Robinhood Chain testnet (46630), with the reference contracts at their pinned commits and test tokens of no value. Each action shows the call it prepares before your wallet signs it, and each send is simulated first.
Set up
Four steps, once: your wallet on Robinhood Chain testnet, a little test ETH for its fees, test dollars of no value, and a testnet identity. The forms below fill from them.
1
Wallet
Not connected. Any browser wallet works: the lab switches it to Robinhood Chain testnet (46630) and sends nothing on another chain.
2
Test ETH
For the testnet's network fees. The lab's drip sends a little to a connected wallet once a day.
3
Test dollars
The Lab Test Dollar (no value) that lines lend and launches pair with.
4
Testnet identity
An ERC-8004 identity on the testnet registry, for the forms that take an agent id.
The testnet contracts
Contract
Address on testnet (46630)
The lab's income statement verifier (IncomeStatementVerifier)
Deploy the reference contract from its pinned commit with your own wallet, on the testnet: you become its lender, launchpad or backer. Its address shows once the receipt is in, and Check a contract below reads it.
With an agent
Your agent gets the same lab through the MCP server at https://lab.priors.trade/mcp or the HTTP API described by /openapi.json. It reads, and gets back unsigned testnet transactions to sign with its own testnet key. The lab holds no key of its own for you and never asks for one.
MCP tools for ERC-8458
lab_erc(8458)
What the draft does on the lab, its contracts and an agent's next calls.
lab_setup(address)
Test ETH, test dollars and the testnet identities of an address, with the calls to register one and mint test dollars.
Post an income statement (writer). Who signs: the statement's writer
lab_deploy_prepare(8458, "verifier", { })
Your own IncomeStatementVerifier.
lab_check_contract(8458, chain, address)
The conformance read of any contract, on testnet or mainnet: supportsInterface and the views.
lab_feedback_draft(8458, note, txHash?)
The report text and the thread and issue links. It posts nothing.
HTTP
GET https://lab.priors.trade/api/lab/erc/8458
GET https://lab.priors.trade/api/lab/read/8458/verify_payment?root=<root>&proof=<proof>&payment_chain=<payment_chain>&asset=<asset>&agent_id=<agent_id>&owner=<owner>&payer=<payer>&pay_to=<pay_to>&amount=<amount>&paid_at=<paid_at>&tx_hash=<tx_hash>&log_index=<log_index>
GET https://lab.priors.trade/api/lab/read/8458/leaf_hash?payment_chain=<payment_chain>&asset=<asset>&agent_id=<agent_id>&owner=<owner>&payer=<payer>&pay_to=<pay_to>&amount=<amount>&paid_at=<paid_at>&tx_hash=<tx_hash>&log_index=<log_index>
GET https://lab.priors.trade/api/lab/read/8458/statements?agent_id=<agent_id>&writer=<writer>
GET https://lab.priors.trade/api/lab/read/8458/payments?agent_id=<agent_id>&writer=<writer>&statement_tx=<statement_tx>
GET https://lab.priors.trade/api/lab/prepare/8458/prove_payment?root=<root>&proof=<proof>&payment_chain=<payment_chain>&asset=<asset>&agent_id=<agent_id>&owner=<owner>&payer=<payer>&pay_to=<pay_to>&amount=<amount>&paid_at=<paid_at>&tx_hash=<tx_hash>&log_index=<log_index>
GET https://lab.priors.trade/api/lab/prepare/8458/post_statement?agent_id=<agent_id>&value=<value>&value_decimals=<value_decimals>&feedback_uri=<feedback_uri>&feedback_hash=<feedback_hash>
GET https://lab.priors.trade/api/lab/deploy/8458/verifier
GET https://lab.priors.trade/api/lab/check/8458/<chain>/<address>
GET https://lab.priors.trade/api/lab/setup/<address>
Connect it, for example in Claude Code: claude mcp add --transport http priors-lab https://lab.priors.trade/mcp
A prompt to copy
Use the Priors lab on Robinhood Chain testnet (chain id 46630), where every token is a test token of no value. Its MCP server is https://lab.priors.trade/mcp and this draft's page is https://lab.priors.trade/erc/8458.md. Try ERC-8458, Agent Income Statements (a draft under review). Start with lab_setup for my testnet address to see my test ETH, test dollars and identities, then prove one payment against a statement's root, then post an income statement (writer), then your own incomestatementverifier with lab_prepare(8458, <action>, params). Each prepare returns an unsigned transaction { chainId: 46630, to, data, value }: sign and send it yourself with a testnet key, and refuse any other chain. Never ask me for a key. After each transaction, read the result back with lab_read and tell me what changed. If the draft or its reference code looks wrong, draft a report with lab_feedback_draft.
Check a contract
Paste any contract on either chain: the lab reads supportsInterface for IIncomeStatementVerifier 0xcc3df75f (computed from the pinned interface) and ERC-165's own, then calls each view. It only reads, so another implementer can test conformance with nothing signed.
Feedback
What you found goes where the draft is worked on: the discussion of the text in its thread on Ethereum Magicians, a bug in the reference code in its repository's issues. You post it under your own account. The lab posts nothing for anyone.