An agent that buys stock. Without an allowance.
To swap on Uniswap, a router must be allowed to move your tokens. The usual way is approve() — a standing permission with no ceiling and no expiry. We keep it off the allowlist on purpose: once granted, there is nothing left for a policy to govern.
So this agent never grants one. The authorisation is an EIP-2612 signature — exact amount, 20-minute expiry — carried inside the same transaction as the swap. When the transaction ends, the remaining allowance is zero. That is measured after every purchase, not assumed.
1 · What the chain says right now
Reading Chainlink, the pool and the ledger…
4 · What gets checked before anything is signed
market.price-band
A human wrote down the prices this agent may trade between. The agent cannot argue with it, and a price it could not measure counts as outside.
swap.slippage
The per-call cap watches what goes in; this watches what comes out. A drained pool returns less for the same money and no budget rule would notice.
budget.reserve
The floor the policy will not spend below. It is the only rule that looks at what is left rather than at today.
approval.threshold
Above it, a second key — a human's, different from the agent's — has to sign. Below it, the canary runs alone.
calldata.mismatch
The transaction must encode exactly what the policy approved, byte for byte, including the minimum received. It is the last gate before the signature.
approve() — not implemented
There is no code path in this rail that emits one. The permission is a signature that expires, so there is nothing standing to revoke.
Agent wallet 0x6E598b1d…227aa3 · the key never leaves Privy's TEE, and this page never signs anything. New to x402? Start with the protocol guide.