
OneShot
Payment control plane for AI agents: One job. Many retries. One settlement.
Demo
About
OneShot is a safety-first settlement engine for autonomous business agents and paid tools. It makes Arc Testnet USDC payments resumable without allowing duplicate settlement: one stable business intent may have many attempts, but can produce at most one committed settlement. If a request times out, a worker crashes, a queue redelivers a job, or a response is lost after broadcast, OneShot never blindly retries. It moves the intent into a durable UNKNOWN state and reconciles it from authoritative provider and on-chain evidence. The product includes a non-custodial user-wallet flow, a Streamable HTTP MCP endpoint for agents, a resumable team-report job, and an operator cabinet with payment proof and recovery history. The goal is simple: resume the work, not the payment.
How it's made
OneShot is a TypeScript monorepo built as a set of explicit domain packages and adapters. The React 19/Vite frontend provides the public landing page, agent documentation, and authenticated operator cabinet. A Fastify API exposes the HTTP and MCP surfaces, while a PostgreSQL ledger stores business intents, attempts, settlements, evidence, versions, and transactional-outbox jobs. Dedicated Node.js workers claim work with atomic compare-and-set transitions; only READY → SUBMITTING grants submission ownership, and this transition is persisted before any external call. Privy supplies wallet authorization and policy checks, viem builds and verifies Arc Testnet USDC transactions, and exactly one matching ERC-20 Transfer log is required before COMMITTED. For uncertain outcomes, a deterministic reconciliation safety core checks provider/RPC data and validated The Graph observations. The optional LLM recovery agent can recommend actions but can never sign, retry, or change financial state. We also built failure-injection and restart tests for lost responses, crashes, redelivery, parallel workers, and ambiguous evidence, with Vitest and Playwright coverage.