Search projects, hackathons, sponsors and tech

    ← All projects

    Assay

    Assay verifies agent reputation before payment—and makes good reputation unfakeable.

    Demo

    About

    ERC-8004 gives AI agents on-chain identity and reviews so they can pick trustworthy counterparties. But reviews are free to write, so they're worthless: the #1 agent on Base by review count has 309,734 reviews — 95% from one wallet, every score identical, all inside one day, none backed by a payment. Independent research (arXiv:2606.26028) found 98.7–100% of all ERC-8004 feedback carries no proof of payment. Assay is a paid pre-flight for agent payments. Before your agent pays a counterparty, it asks Assay over x402: is this agent's reputation real? Assay reads the registries live through The Graph across six chains and returns VERIFIED, UNPROVEN or WASH_REPUTATION_DETECTED with the evidence, what would change the verdict, and the exact subgraph deployment and block it was read at. If the source can't prove where the data came from, Assay refuses to answer rather than guess. Confidence is earned only from reviews backed by real payments from independent addresses — eleven detectors catch both the obvious farm and the sybil farm that concentration analysis alone would pass. Then the write side: after an agent pays through Assay, it writes the one review that can't be faked — ERC-8004 feedback whose file carries the settlement as proofOfPayment. That's how a good agent earns its way to VERIFIED, and how a farm can't buy its way there for pocket change. Every UNPROVEN report ends with the priced path to VERIFIED. Live today: one 402 that settles on three rails — Hedera via Blocky402, Arc via Circle Gateway, Base Sepolia via x402.org — with every settlement leaving a receipt on Hedera Consensus Service (the only store; no database). Assay is itself registered as ERC-8004 agent #9200 on Base Sepolia, and its own first payment-backed review is on-chain. A Privy treasury wallet enforces the mandate's allowlist and spend cap, refusing anything else before it's signed; raising the cap needs a live human via World Selfie Check. Exposed as REST, OpenAPI 3.1, and an MCP server with paid tools so any Claude or Cursor agent can call it. Built on Next.js 16, deployed on Vercel.

    How it's made

    One repo, one deployable. A Next.js 16 App Router app on Vercel is the only server: the console UI, the paid REST API, the MCP endpoint and the World step-up page share one origin. Underneath is a framework-free TypeScript engine (src/engine) that never imports Next, so the same code runs in the CLI, the route handlers and the MCP tools. Node 24, strict TypeScript, node:test, no ORM, no database. Reading — The Graph. The engine queries the Agent0 ERC-8004 subgraphs on The Graph's decentralised network — Ethereum, Base, BSC, Polygon, Base Sepolia, BSC Chapel — through one shared schema, so adding a chain is a row in registry/chains.json. Every query carries _meta; a response without a pinned deployment hash and block number is refused, not returned. From up to 1,000 reviews it computes reviewer concentration and HHI, payment-proof coverage, self-issued feedback, distinct score values, the densest 24-hour window, validation-registry entries and registration completeness; eleven named detectors turn that into a verdict, and every report ends with what would change it. Concentration detectors only apply above a ten-review floor — a lesson learned when the engine called our own first review a farm. Selling — x402. Paid routes are wrapped per handler with @x402/next (never in middleware — Edge can't run the Hedera signer), which settles only after the handler succeeds, so nobody pays for an error. The resource server has three facilitators, so one 402 offers three rails: Hedera testnet through Blocky402 (@x402/hedera, HBAR, the facilitator pays the network fee), Arc testnet through Circle Gateway (@circle-fin/x402-batching, off-chain signatures batched, no gas), and Base Sepolia through x402.org (@x402/evm). Prices are metered by work: a six-chain corroboration costs four single reads. The MCP endpoint wraps the same tools with @x402/mcp, so the payment rides in the tool call's _meta. Remembering — Hedera Consensus Service. The deploy is serverless, so nothing lives in process memory. A settle hook writes a receipt for every paid call — rail, payer, amount, settlement tx, verdict, deployment, block — to one HCS topic, and human approvals go to the same topic. Everything is read back over the free mirror node, so the action trail is on a public ledger, not in our database. The handler and the settle hook never share a request object; the verdict crosses over keyed by the signed payment itself and is dropped once consumed. Writing — the receipt. The reference paying agent signs only; after a 200 it writes ERC-8004 feedback about the provider with viem on Base Sepolia. The feedback file — with proofOfPayment pointing at the Hedera settlement, chain id 296 — is pinned to The Graph's own IPFS node, because the Agent0 subgraph reads feedback only through file/ipfs data sources; an https URI would never be indexed. Assay registered itself as agent #9200 under the service key; the agent key writes the review, because the spec forbids an owner reviewing itself. The subgraph indexed the review in under a minute and the engine reads it back as 100% payment-proof coverage. Bounding — the mandate. mandate.json sets per-payment and run caps, allowed verdicts and a step-up line; the caps are enforced inside the x402 client's onBeforePaymentCreation hook and its spend controls, so an over-limit payment is aborted before it's signed. Privy's server SDK holds the other half: a treasury wallet bound to a policy (allowlisted recipients, value ceiling) owned by a P-256 key quorum, so raising the cap is a quorum-signed change. When the mandate says step-up, the agent prints an /escalate link and polls the ledger; a live human approves with a World Selfie Check (RP signature minted server-side, proof forwarded byte-for-byte to World's verifier), and the approval lands on HCS keyed by the nullifier. Around it. OpenAPI 3.1 at /api/openapi (Redocly-clean) feeds a Bazantic gateway; a second gateway fronts Sourcify for the "is the counterparty's contract verified?" step; a Uniswap Trading API quote prices the payment. A stdio MCP server runs on the judge's machine for Claude Desktop and Cursor. The Hedera Harness got a PR adding an x402-facilitator preflight to doctor — the check that would have saved us an afternoon. Hacky bits worth admitting. The Circle package inlines drifted core types, so its facilitator is cast at one boundary. Its default Gateway URL is mainnet-only and doesn't list Arc testnet; the testnet URL is set explicitly. Bazantic's CLI can't read a v2 402 (it wants x402Version in the body) and its gateway hosts 404 at Fly's edge — both reported. The landing page's glass blur over a patterned background stalled a low-end GPU once; the dot grid is now a tiled SVG and cards get their own compositing layer.