The short version
A seller creates a deposit by locking USDC in EscrowV2 on Base and listing the fiat payment method, currency, payout identifier, and rate. A buyer chooses that liquidity, starts an onchain intent, pays the seller in the selected payment app, and submits payment evidence.
The protocol does not ask either side to trust a chat screenshot. Payment evidence is checked offchain by the attestation service, and the resulting EIP-712 PaymentAttestation is verified onchain before the contract releases USDC.
The fill lifecycle
- 01Seller deposits native USDC on Base into EscrowV2 and declares accepted payment methods, currencies, and payee details.
- 02Buyer selects the deposit and signals an intent through OrchestratorV2. That intent reserves the specific amount while the buyer pays.
- 03Buyer pays the seller directly in the selected fiat app. USDCtoFiat never receives or holds the fiat transfer.
- 04Payment evidence is verified against the intent: amount, currency, recipient, timestamp, payment method, and route constraints.
- 05The attestation service signs a PaymentAttestation. The onchain verifier checks the signature, snapshot values, and nullifier, then OrchestratorV2 releases USDC.
Why the contract can release safely
| Primitive | What it does | Why it matters |
|---|---|---|
| EscrowV2 | Holds seller USDC on Base | Neither USDCtoFiat nor the buyer can move it without contract rules |
| Intent hash | Identifies one buyer order | Binds fiat payment proof to the exact fill |
| PaymentAttestation | EIP-712 signed verification result | Lets one verifier contract handle multiple payment methods |
| Nullifier | One-time marker for a payment | Prevents the same payment from being claimed twice |
| Payee details hash | Hash of the seller's payout identifier | Binds payment to the seller without publishing the handle onchain |
What is not onchain
Your Venmo username, Revtag, Wisetag, PayPal.me handle, Zelle email, account session, and detailed payment data are not posted to Base. The chain sees contract state, hashes, signatures, amounts, and release events, not the full private payment account history.
Your payout identifier is still visible to the counterparty who needs to pay you. That is unavoidable in any payment-app settlement flow: the buyer cannot send fiat without a destination.