Skip to main content
ZKP2P supports multiple payment platforms across different regions, each with verified payment attestation capabilities. All payment methods use the UnifiedPaymentVerifier for secure verification.

Overview

The protocol uses a unified verification architecture where each payment method is registered with:
  • Payment Method Hash: Unique identifier for the payment platform
  • Supported Currencies: List of fiat currencies accepted
  • Verification Method: EIP-712 signed attestations from off-chain services
  • Timestamp Buffer: Maximum time allowance for L2 flexibility (up to 48 hours)

Supported Platforms

Venmo

Region: United States Supported Currencies:
  • USD
Payment Method Hash: 0x90262a3db0edd0be2369c6b28f9e8511ec0bac7136cefbada0880602f87e7268 Verification: Uses UnifiedPaymentVerifier with attestation from payment receipts Configuration: Defined in deployments/verifiers/venmo.ts

PayPal

Region: Global Supported Currencies:
  • USD
Payment Method Hash: See deployments/verifiers/paypal.ts Verification: Single payment details verification through UnifiedPaymentVerifier Configuration: Defined in deployments/verifiers/paypal.ts

Wise (TransferWise)

Region: Global Supported Currencies:
  • USD, EUR, GBP, CNY
  • AUD, NZD, CAD, CHF
  • AED, SGD, HKD, JPY
  • ZAR, ILS, PLN, TRY
  • IDR, KES, MYR, MXN
  • THB, VND, UGX, CZK
  • DKK, HUF, INR, NOK
  • PHP, RON, SEK
Payment Method Hash: 0x554a007c2217df766b977723b276671aee5ebb4adaea0edb6433c88b3e61dac5 Verification: Multi-currency support with comprehensive payment verification Configuration: Defined in deployments/verifiers/wise.ts
Wise offers the broadest currency support, making it ideal for international transactions.

Zelle

Region: United States Supported Banks:
  • Citibank (Zelle Citi)
  • Chase Bank (Zelle Chase)
  • Bank of America (Zelle BofA)
Supported Currencies:
  • USD (all variants)
Payment Method Hashes:
  • Zelle Citi: See deployments/verifiers/zelle.ts
  • Zelle Chase: See deployments/verifiers/zelle.ts
  • Zelle BofA: See deployments/verifiers/zelle.ts
Verification: Bank-specific verification paths with optional timestamp buffers Configuration: Defined in deployments/verifiers/zelle.ts
Zelle Chase and Zelle BofA use custom timestamp buffers. Ensure your attestation service accounts for this.

CashApp

Region: United States, United Kingdom Supported Currencies:
  • USD
Payment Method Hash: See deployments/verifiers/cashapp.ts Verification: CashApp returns up to 20 activities at a time for verification Configuration: Defined in deployments/verifiers/cashapp.ts

Revolut

Region: Global Supported Currencies:
  • USD, EUR, GBP, SGD
  • NZD, AUD, CAD, JPY
  • HKD, MXN, SAR, AED
  • THB, TRY, PLN, CHF
  • ZAR, CNY, CZK, DKK
  • HUF, NOK, RON, SEK
Payment Method Hash: 0x617f88ab82b5c1b014c539f7e75121427f0bb50a4c58b187a238531e7d58605d Verification: Multi-currency digital bank with comprehensive coverage Configuration: Defined in deployments/verifiers/revolut.ts
Revolut’s UnifiedPaymentVerifier handles decimal conversions automatically for currencies like JPY.

MercadoPago

Region: Latin America (Argentina, Brazil, Mexico, Chile, Colombia, Peru, Uruguay) Supported Currencies:
  • See deployments/verifiers/mercadopago.ts for supported currencies
Payment Method Hash: See deployments/verifiers/mercadopago.ts Verification: Regional payment platform verification Configuration: Defined in deployments/verifiers/mercadopago.ts

Monzo

Region: United Kingdom Supported Currencies:
  • GBP, EUR, USD
Payment Method Hash: See deployments/verifiers/monzo.ts Verification: Single transaction details verification Configuration: Defined in deployments/verifiers/monzo.ts

Additional Payment Methods

The following payment methods are also available in the deployment scripts:
  • N26: European mobile bank
  • Alipay: Chinese payment platform
  • Luxon: Regional payment service
  • Chime: US mobile banking
Refer to the deploy/ directory for complete configuration details of these additional methods.

Verification Architecture

UnifiedPaymentVerifier

All payment methods use the UnifiedPaymentVerifier contract (contracts/unifiedVerifier/UnifiedPaymentVerifier.sol), which:
  1. Validates EIP-712 Attestations: Verifies cryptographically signed payment attestations
  2. Checks Intent Snapshots: Ensures payment details match the on-chain intent
  3. Prevents Double-Spending: Nullifies payment IDs in the NullifierRegistry
  4. Enforces Timestamp Buffers: Allows flexibility for L2 transaction timing (max 48 hours)
  5. Emits Payment Events: Records verified payment details for off-chain reconciliation

Payment Attestation Structure

Each payment proof contains:
struct PaymentAttestation {
    bytes32 intentHash;       // Binds payment to on-chain intent
    uint256 releaseAmount;    // Final token amount after FX conversion
    bytes32 dataHash;         // Hash of payment details for integrity
    bytes[] signatures;       // Witness signatures
    bytes data;               // Encoded payment and intent data
    bytes metadata;           // Additional unsigned metadata
}

Payment Details

struct PaymentDetails {
    bytes32 method;           // Payment method hash (e.g., "venmo")
    bytes32 payeeId;          // Hashed recipient ID (privacy-preserving)
    uint256 amount;           // Amount in smallest currency unit (cents)
    bytes32 currency;         // Currency hash (e.g., "USD")
    uint256 timestamp;        // Payment timestamp (UTC milliseconds)
    bytes32 paymentId;        // Hashed payment identifier
}

Adding New Payment Methods

To add a new payment method:
  1. Create Verifier Configuration: Add a new file in deployments/verifiers/
  2. Define Payment Method Hash: Use calculatePaymentMethodHash("method-name")
  3. Specify Supported Currencies: List all supported Currency enum values
  4. Create Deployment Script: Add script in deploy/ directory
  5. Register with UnifiedVerifier: Call addPaymentMethod() on UnifiedPaymentVerifier
  6. Register with PaymentVerifierRegistry: Call addPaymentMethod() with currencies
Example from deployments/verifiers/venmo.ts:
import { calculatePaymentMethodHash, Currency } from "@utils/protocolUtils";

export const VENMO_PAYMENT_METHOD_HASH = calculatePaymentMethodHash("venmo");

export const VENMO_CURRENCIES: any = [
  Currency.USD,
];

export const VENMO_PROVIDER_CONFIG = {
  paymentMethodHash: VENMO_PAYMENT_METHOD_HASH,
  currencies: VENMO_CURRENCIES
};

Payment Method Registry

The PaymentVerifierRegistry contract maintains:
  • Mapping of payment method hashes to verifier contracts
  • Supported currencies for each payment method
  • Active/inactive status for each method
Query available payment methods:
const verifier = await paymentVerifierRegistry.getVerifier(paymentMethodHash);
const currencies = await paymentVerifierRegistry.getCurrencies(paymentMethodHash);

Security Considerations

Nullifier Registry: All verified payments are nullified to prevent double-spending. The nullifier combines payment method and payment ID:
bytes32 nullifier = keccak256(abi.encodePacked(paymentMethod, paymentId));
Timestamp Buffers: While timestamp buffers provide L2 flexibility, they also create a window where payment timing can vary. Maximum buffer is 48 hours.
Privacy: Payment IDs and payee details are hashed on-chain to preserve user privacy while still preventing double-spending.

Network Deployment Status

NetworkPayment Methods Deployed
BaseAll supported methods
Base SepoliaAll supported methods (testnet)
Base StagingAll supported methods (staging)
View specific contract addresses in the deployments/ directory for each network.

Build docs developers (and LLMs) love