How ZKP2P turns a fiat payment into an onchain USDC release.
ZKP2P is the protocol underneath USDCtoFiat. Sellers lock USDC in a Base smart contract, buyers pay fiat through a normal payment app, and a signed payment attestation unlocks the USDC after the payment matches the order.
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
- 1Seller deposits native USDC on Base into EscrowV2 and declares accepted payment methods, currencies, and payee details.
- 2Buyer selects the deposit and signals an intent through OrchestratorV2. That intent reserves the specific amount while the buyer pays.
- 3Buyer pays the seller directly in the selected fiat app. USDCtoFiat never receives or holds the fiat transfer.
- 4Payment evidence is verified against the intent: amount, currency, recipient, timestamp, payment method, and route constraints.
- 5The 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.
Non-custodial escrow plus offchain payment attestation.
ZKP2P V3 moves payment parsing offchain and keeps final release rules onchain, which is why the seller UX can support more payment methods without a bespoke verifier contract for every rail.
The exact payment app flow can differ by method. Wise and PayPal seller setup require one-time extension registration.
Keep exploring
Common questions
What is USDCtoFiat?
USDCtoFiat lets you sell USDC on Base for money in Venmo, Cash App, Chime, Revolut, Wise, Zelle, PayPal, Monzo, N26, and Luxon. You keep control of your wallet, and trades settle through non-custodial ZKP2P smart contracts on Base.
Does USDCtoFiat hold my funds?
No. You sign every transaction from your own wallet. Your USDC is locked in a public Base contract and releases to the buyer only after their payment is proven. You can withdraw any unfilled deposit at any time.
What does it cost to sell?
Creating and managing a seller deposit is free, though Base gas applies to onchain actions. The offramp SDK is free to integrate. On delegated fills, Delegate's 0.10% manager fee comes from the USDC released to the buyer, not from your fiat proceeds or your quoted rate. Peerlytics analytics, webhooks, and API credits are priced separately.
Do I need a centralized exchange account?
No exchange account is required to use USDCtoFiat. You need a wallet holding USDC on Base and an account on the payment app you want to be paid in. The payment app's own account rules and limits still apply.
Do I need to complete KYC?
USDCtoFiat does not collect identity documents, hold your fiat, or hold your keys. The payment app you use still controls its own verification, limits, and account rules. USDC settlement happens through Base smart contracts, and we cannot change what Venmo, PayPal, Wise, Zelle, or your bank requires.
Is ZKP2P the same thing as USDCtoFiat?
No. ZKP2P is the underlying protocol and contract system. USDCtoFiat is a seller-focused product built on top of it for turning Base USDC into fiat through supported payment apps.
Can the same fiat payment release USDC twice?
No. Payment attestations include a nullifier, a one-time marker checked by the verifier to prevent replaying the same payment against multiple intents.
What happens if the buyer starts an intent but never pays?
That portion of the seller deposit is temporarily tied to the open intent until it expires or is cancelled. Unfilled liquidity remains withdrawable by the seller.