Search projects, hackathons, sponsors and tech

    ← All projects

    SpendVeto

    Governs what your AI agent can spend — before it pays, not after. Open source, x402-native.

    Demo

    About

    SpendVeto is an open-source spend-governance layer for AI agents that pay for things over x402/MCP — budgets, human-in-the-loop approvals above a threshold, a kill switch, tool/chain/payee scoping, and a tamper-evident hash-chained audit ledger, all enforced server-authoritatively before a single payment settles. Live at spendveto.com with 298 end-to-end verified assertions from a clean clone (npm run verify). For this Continuity Track build, we extended three real capabilities: governance for x402 v2's new upto scheme (variable-amount authorizations, where a buyer signs for a ceiling and the seller charges less later — held against the budget until it settles, so open ceilings can't silently exhaust an hourly cap); real on-chain settlement on Hedera testnet with a live governed payment (settled + a policy-refused case, both recorded); a migration to World ID 4.0's RP-based proof-of-personhood protocol gating human approvals; and ENS name resolution in payee allowlists, so an allowlist reads as vitalik.eth instead of raw hex, resolved against real Ethereum mainnet and cached for the hot policy-check path.

    How it's made

    Node.js/Express backend, viem for signature verification across seven signature families (secp256k1, ed25519, Move, Stellar, Hedera, Algorand, XRPL), a hash-chained JSON ledger for tamper-evident audit trails, and an MCP stdio server so any MCP client (Claude Desktop, Claude Code) sees governed tools natively. The x402 gate is server-authoritative — policy is re-checked at settlement, not just client-side, so a hand-rolled client can't bypass it. For the Continuity Track work: server/upto.js governs x402's upto scheme by holding the authorized ceiling against the hourly budget until settlement, releasing headroom afterward. server/worldid.js was rewritten against @worldcoin/idkit-server for World ID 4.0's signed rp_context handshake — verified end-to-end with a real device-scanned proof from the actual World App. client/ens.js resolves .eth names via viem's getEnsAddress against Ethereum mainnet, fails closed if a name won't resolve (never a wildcard match), and caches to keep checkPolicy (which runs on every governed call) fast. Hedera settlement was verified with a real $0.01 payment on testnet — tx 0.0.9185802-1788804271-756194533.