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. 01Seller deposits native USDC on Base into EscrowV2 and declares accepted payment methods, currencies, and payee details.
  2. 02Buyer selects the deposit and signals an intent through OrchestratorV2. That intent reserves the specific amount while the buyer pays.
  3. 03Buyer pays the seller directly in the selected fiat app. USDCtoFiat never receives or holds the fiat transfer.
  4. 04Payment evidence is verified against the intent: amount, currency, recipient, timestamp, payment method, and route constraints.
  5. 05The 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 differs by method. Extension registration does not override provider policy: Wise prohibits P2P crypto-sale receipts, and PayPal may require preapproval.

EscrowV2
0x777777779d229cdF3110e9de47943791c26300Efseller custody contract
OrchestratorV2
0x888888359E981B5225CA48fbCdCeff702FC3b888intent lifecycle
USDC
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913native Base token
Verifier
UnifiedPaymentVerifierV2checks payment attestations

Common questions

What is USDCtoFiat?

USDCtoFiat coordinates non-custodial sales of native Base USDC for USD, EUR, or GBP through ZKP2P smart contracts. Payment-provider eligibility and account policies still apply; technical route support is not permission to use an external account, and Wise currently prohibits P2P crypto-sale receipts.

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 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.