New capabilities
- Pay in euros. Circle's real EURC is now a second input token on both doors. No mock was added for it, and
MockXSGDis still the only mocked token in the system. - One URL serves both doors.
GET /pay/<handle>?sgd=answers a browser with the payment page and answers a machine with HTTP 402 and an x402 challenge. - Machine-readable discovery.
GET /discovery/resourceslists every registered shop as a payable resource, so an agent can find a merchant rather than be told one. The whole loop now runs with no human in it. - Open onboarding. Registering a shop is live for anyone, bounded by rate ceilings rather than by anyone's approval.
- Passkey payout wallets. Onboarding can mint a smart account from whatever unlocks the merchant's phone, so a hawker never has to paste a hex string.
- Both merchant writes are authenticated by the shop's payout key. The contract checks a payout rotation directly; a profile edit is checked as an EIP-712 signature, with an ERC-1271 tier for contract accounts.
Proof you don't have to take on trust
verify:denial. Re-derives any refusal from public chain state at that block and compares it to the reason we published, including acontradictedverdict if we ever publish one the chain doesn't support. It proves the wallet would have refused, never that the agent asked, and it prints that limit on every run.- Measured gas and latency, from real receipts rather than projections. The custodial
exacthop costs 47% more gas than the direct policy-wallet path, and all three doors settle within about 1% of each other. - Five on-chain artifacts written up with what each one proves and, more usefully, what it does not.
Engineering quality
- Policy invariants. Four properties held over any call sequence, with a guard that fails any run where nothing was ever successfully spent. Every one of them is satisfiable by a wallet that refuses everything, which the first version of the handler quietly was.
- Flake hunted and killed. Measured at 5 red suites in 20 runs, fixed in the handler's bounds rather than in the guard, re-measured at 0 in 100.
- Slither gating CI, with all 25 findings triaged in the repo and every exclusion answered in writing.
- The agent refuses rather than pays when it is misconfigured, when the gateway is dead, or when a model talks without ever calling a tool. That last one would otherwise have narrated a purchase it never made.
- The model was picked by benchmark, not by reputation.
qwen-flashon AIsa's gateway, driven against the real tool schemas. The bench caught one candidate paying S$13.50 for a S$4.50 basket, reproducibly. - 550+ tests across four suites, up from 446.
Surfaces
- A refusal now has a way out. A declined receipt re-checks the same payment against today's policy and opens the rule that stopped it, already ticked, for the owner to sign.
- Agent policies show what they turn away, not only what they allow.
- Merchant totals are summed on the server, so no headline figure depends on how much history the browser happened to have loaded.
- App copy cut back hard. When there is a lot to read, nobody reads anything, and the honest labels are the first thing that gets skipped.
Log in or sign up for Devpost to join the conversation.