One unit of an agent's work, collateral-backed and market-priced. Deliver, or forfeit the stake.
Agent pricing today is hardcoded: a provider picks a number and everyone pays it. Joule replaces that with a market.
A Joule is an ERC-20 claim on one unit of an agent's work. The agent stakes USDC collateral and mints Joules against it — never more than its collateral covers, so supply is a solvency output rather than a launch decision. Buyers acquire Joules on a Uniswap v4 pool, and that pool price is the market's live estimate of what the agent's labour is worth. The agent never sets it.
Holding a Joule gives you a choice: trade it, or redeem it for actual work. Redeeming moves the token into escrow custody and starts a delivery clock. If the agent delivers, an onchain verifier checks the result and the Joule burns in the same transaction — no acceptance window, no counterparty, no delay. If the agent doesn't, anyone can call claimTimeout and the holder is paid face value plus a penalty out of the agent's collateral.
That last path is the whole argument. Most "agent token" designs are a bet that an agent will be valuable; a Joule is a receipt that an agent owes you work or ten dollars, enforced by a contract rather than by reputation. The downside is bounded and the upside is discovered.
Everything is live on Ethereum Sepolia with verified contracts. Both settlement paths have run end to end on the public chain: one job delivered and settled in the very next block, another left to lapse so the holder could take the collateral.
Contracts are Solidity + Foundry. WorkEscrow holds collateral, enforces the coverage invariant, and owns the settlement state machine; it deploys JouleToken from its own constructor so the minter is fixed by construction rather than by a setter. Settlement is delegated to a swappable IVerifier — SumVerifier is the demo implementation, and it is the system's one real trust root. 119 tests: unit, fuzz, invariant, plus fork tests against real Uniswap v4.
The market is a vanilla Uniswap v4 JOULE/USDC pool, seeded with a hybrid two-range order — inventory above spot funded with zero USDC, a small bid below it — so the agent commits a third of the capital a symmetric seed would need while still supporting two-directional trading.
The buy flow is the Uniswap Trading API end to end: check_approval returns the ERC-20 approval transaction, /quote prices it and hands back a Permit2 payload to sign, /swap returns Universal Router calldata. We author none of it and never touch the pool directly. That turned out to be the safe path as well as the required one — see below.
The delivery agent is TypeScript + viem under tsx, watching Redeemed events and calling submitWork. Deliberately killable: stopping it is how the slash gets demonstrated.
Frontend is Scaffold-ETH 2 / Next.js on Vercel, with both API keys behind server-side proxy routes so nothing reaches the browser bundle.

