AI agents now prepare and sign transactions with no person reading each one. the losses that follow are mostly not exotic, and each is visible before signing to anyone who reads the chain and the request:
· an unlimited approval to a spender that is a plain wallet or a week-old contract
· a transfer to an address that shares its first and last characters with one the signer used before
· a buy of a copy of a real token (on robinhood chain there are 3,148 copies of robinhood’s own stock tokens) or through a pool priced far from its oracle
· an x402 payment to a payTo that is not the paid agent’s registered wallet
· an instruction hidden in a token’s name that the agent reads as a command
the Prepared Transaction Envelope proposal (ERC-8265 thread) already gives the consumer a risk slot: an action (ALLOW / WARN / BLOCK), an optional score, free-form warnings and scanner verdicts. what it doesn’t define is what a risk source says, so a consumer that gets WARN can’t see what was read, can’t apply its own thresholds, and can’t tell “found nothing” from “couldn’t read it”.
the draft
a report a risk source returns about one prepared, unsigned request:
· binds to the exact request by a digest (for an envelope: the same pre-image its coverage uses, so writing the report into risk doesn’t move it)
· names its source by an ERC-8004 identity and is EIP-712 signed; the consumer rechecks the signer is that identity’s agentWallet or owner
· carries typed findings in five groups:
· tokens: launch facts read from a Launch Observations registry; a token that copies an issuer’s listed token; a pool’s deviation from a price feed
· approvals: amount, unlimited, share of supply, expiry, current allowance
· addresses: code (none / contract / 7702-delegated), first seen, verified source, prior transfers, lookalikes
· payments: x402 payTo against the payee’s registered agentWallet, with the outcomes of x402 Payee Verification (ERC-8478)
· texts: control characters, mixed scripts, addresses and instruction patterns in text the agent read
· every finding states the block it holds at and its evidence, and is read or not read. not read is never zero or false
· no score, no verdict, no recommended action: the consumer applies its own policy, and MAY project findings into the envelope’s warnings
it runs today
toll (ERC-8004 agent #20030) runs this as a live pre-sign check on robinhood chain: send a prepared tx, an EIP-712 request or an x402 requirement and get ALLOW / WARN / BLOCK with typed reasons, free over HTTP and MCP. a one-line client (@tollxyz/guard) puts it in front of a viem or ethers wallet. examples it blocks today: an unlimited approval to a plain wallet, a copy of an official stock token, an x402 payTo that is not the seller’s wallet.
it’s the third piece of one stack: Launch Observations (ERC-8470, what happened at a coin’s launch, on chain), x402 Payee Verification (ERC-8478, is this payee the agent you mean to pay), and this one, the format a wallet or agent reads before it signs.
questions for this thread
- reports as a member of the envelope’s risk slot, or a separate consumer-written field?
- is a fixed list of finding kinds right for v1, or should kinds be open from the start (namespaced, like Launch Observations)?
- should a signed report be anchorable on chain (a hash in a registry), or is off-chain EIP-712 enough?