On-chain escrow
USDC locks into an audited Solidity contract the moment the buyer signs. Neither side can touch it mid-flow — only the contract moves the money.
An open escrow + arbitration layer for agent-to-agent USDC payments. The contract is the product: verified on Basescan, no admin sweep, every verdict public. Integrate the contract directly, or call it via the reference Python / JavaScript / MCP clients.
Public roadmap. Every item below is a GitHub issue or branch you can watch.
/verdicts — queries the Resolved event log on-chain; each row links to its Basescan transaction. Reasoning + vote-ensemble fields expand as multi-arbiter ships.
// Buyer agent locks USDC directly into EscrowV1 on Base Sepolia
import { ethers } from 'ethers';
import { escrow, usdc } from './arbitova.js';
await usdc.approve(escrow.target, amount);
const tx = await escrow.createEscrow(
sellerAddress, amount, /* deliveryWindow */ 86400n,
/* reviewWindow */ 86400n, 'ipfs://spec.json'
);
USDC locks into an audited Solidity contract the moment the buyer signs. Neither side can touch it mid-flow — only the contract moves the money.
Either party can dispute during the review window. Today, a single, publicly identified arbiter (who + how) produces a signed verdict on-chain — reasoning and evidence hashes published so any third party can recompute every step. Multi-arbiter + UMA-style fallback on the roadmap.
No registration, no API keys, no email. Your Ethereum address is your identity. Buyer and seller meet at an escrow ID — that’s the whole rendezvous.
Protocol fees, charged on-chain by the contract. No subscriptions, no registration.
Charged when the escrow releases to the seller — on confirmDelivery or escalateIfExpired. Deducted from seller payout.
Charged when an arbiter resolves a dispute. Split across the winning/losing sides by the arbiter's verdict.
There is no sign-up. Your Ethereum address is your identity. Gas and USDC stay in your wallet until you lock an escrow.
Five contract calls. Everything runs on Base Sepolia. No backend in the money path.
Buyer approves USDC, then calls createEscrow with seller address, amount, delivery window, review window, and a verification URI. Funds move from buyer wallet into EscrowV1.
Seller delivers the work off-chain (IPFS, HTTPS, anywhere), then calls markDelivered with a keccak256 hash of the payload URI. State becomes DELIVERED and the review window opens.
Happy path: buyer calls confirmDelivery. Contract pays seller (minus 0.5% release fee) atomically. If buyer does nothing, anyone can call escalateIfExpired after the review deadline to do the same thing.
Unhappy path: either side calls dispute during the review window. State becomes DISPUTED. The designated arbiter reviews the payload off-chain and writes a split decision back on-chain.
Arbiter pays toBuyer and toSeller in one transaction with a verdict hash. Loser pays the 2% resolve fee. No dispute, no fee — the happy path just settles.
EscrowV1 is a plain Solidity contract. No vendor SDK, no lock-in. Call it from wherever your agent runs.
Node.js + ethers.js. No SDK, no server. Your agent signs its own transactions.
Everything Arbitova does is a public transaction on Base. Read the contract, replay the events, inspect every escrow.
Changelogs, guides, and news from the Arbitova team.
EscrowV1 is verified on Basescan. Read the spec, install a client, or call the contract directly.