Protocol mechanics

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.

01

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.

02

The fill lifecycle

  1. 1Seller deposits native USDC on Base into EscrowV2 and declares accepted payment methods, currencies, and payee details.
  2. 2Buyer selects the deposit and signals an intent through OrchestratorV2. That intent reserves the specific amount while the buyer pays.
  3. 3Buyer pays the seller directly in the selected fiat app. USDCtoFiat never receives or holds the fiat transfer.
  4. 4Payment evidence is verified against the intent: amount, currency, recipient, timestamp, payment method, and route constraints.
  5. 5The attestation service signs a PaymentAttestation. The onchain verifier checks the signature, snapshot values, and nullifier, then OrchestratorV2 releases USDC.
03

Why the contract can release safely

PrimitiveWhat it doesWhy it matters
EscrowV2Holds seller USDC on BaseNeither USDCtoFiat nor the buyer can move it without contract rules
Intent hashIdentifies one buyer orderBinds fiat payment proof to the exact fill
PaymentAttestationEIP-712 signed verification resultLets one verifier contract handle multiple payment methods
NullifierOne-time marker for a paymentPrevents the same payment from being claimed twice
Payee details hashHash of the seller's payout identifierBinds payment to the seller without publishing the handle onchain
04

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.

V3 production path

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.

EscrowV20x777777779d229cdF3110e9de47943791c26300Efseller custody contract
OrchestratorV20x888888359E981B5225CA48fbCdCeff702FC3b888intent lifecycle
USDC0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913native Base token
VerifierUnifiedPaymentVerifierV2checks payment attestations

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.