System Overview
ZKP2P v2.1 implements a modular, intent-based architecture for trustless peer-to-peer fiat-to-crypto exchanges. The system consists of five main components that work together to facilitate secure, verifiable trades:- Escrow Contract - Liquidity management and deposit custody
- Orchestrator Contract - Intent lifecycle coordination
- Unified Payment Verifier - Multi-platform payment validation
- Registry System - Permission and configuration management
- Protocol Viewer - Read-only state aggregation
The v2.1 architecture introduces a unified verification system that consolidates multiple payment method verifiers into a single, configurable contract, significantly reducing deployment complexity.
Architecture Diagram
Core Components
Escrow Contract
The Escrow contract manages liquidity deposits from makers (liquidity providers) and handles secure fund custody.Deposit Management
Creates, updates, and closes liquidity deposits with configurable parameters
Payment Method Config
Supports multiple payment methods per deposit with currency-specific rates
Intent Locking
Temporarily locks funds when takers signal intent to trade
Liquidity Reclaim
Automatically reclaims liquidity from expired intents
Key Responsibilities
Deposit Lifecycle Management
Deposit Lifecycle Management
Makers can create deposits with specific parameters:Each deposit includes:
Escrow.sol (line 139)
- Token type (USDC)
- Amount range for individual intents (min/max)
- Supported payment methods and currencies
- Optional delegate for deposit management
- Optional intent guardian for expiry extensions
Multi-Currency Support
Multi-Currency Support
Each deposit can accept multiple payment methods, and each method can support multiple currencies:This flexibility allows makers to:
- Accept payments from multiple platforms
- Support international currencies
- Set custom conversion rates per currency
- Update rates dynamically based on market conditions
Intent Fund Locking
Intent Fund Locking
When a taker signals intent, the Orchestrator calls This ensures:
lockFunds:Escrow.sol (line 557)
- Liquidity is reserved for the specific intent
- Intents expire after a configurable period
- Expired intents are pruned to reclaim liquidity
Dust Collection & Deposit Closure
Dust Collection & Deposit Closure
To prevent small leftover balances:
Escrow.sol (line 989)
- Dust threshold prevents tiny balances from remaining
retainOnEmptyflag allows makers to keep deposit config- Protocol collects dust to avoid locked funds
Orchestrator Contract
The Orchestrator coordinates the entire intent lifecycle from creation to settlement.Intent Coordination
Manages intent creation, cancellation, and fulfillment
Payment Verification
Routes verification requests to appropriate verifiers
Fee Collection
Distributes protocol fees and referrer commissions
Hook Execution
Executes optional post-intent hooks for custom logic
Intent Lifecycle
Off-Chain Payment
Taker sends fiat payment through the specified payment platform (Venmo, PayPal, etc.) to the maker’s payee details.
This step happens entirely off-chain. The protocol does not control or monitor the payment itself.
Intent Gating
Orchestrator supports optional signature-based gating:Orchestrator.sol (line 428)
Gating allows makers to restrict who can take their liquidity, enabling compliance, KYC requirements, or whitelist-based access.
Unified Payment Verifier
The Unified Payment Verifier consolidates verification logic for all payment methods into a single contract.Architecture Benefits
Reduced Complexity
One contract instead of 8+ separate verifiers
Consistent Interface
Standardized verification across all payment methods
Easy Configuration
Per-method settings without deploying new contracts
Lower Gas Costs
Shared logic and optimized verification flow
Verification Flow
UnifiedPaymentVerifier.sol
Registry System
The registry system provides modular permission management:Payment Verifier Registry
Payment Verifier Registry
Maps payment methods to verifier contracts and supported currencies:Supported payment methods:
- Venmo (USD)
- PayPal (USD, EUR, GBP)
- Wise (USD, EUR, GBP, SGD, etc.)
- Zelle (USD)
- CashApp (USD)
- Revolut (USD, EUR, GBP)
- MercadoPago (BRL, ARS)
- Monzo (GBP)
Escrow Registry
Escrow Registry
Whitelists valid escrow implementations:This allows protocol upgrades without migrating all deposits.
Nullifier Registry
Nullifier Registry
Globally tracks used payment proofs:Prevents double-spending across all deposits and orchestrators.
Post Intent Hook Registry
Post Intent Hook Registry
Manages approved post-fulfillment hooks:Example hooks:
- Across Bridge Hook - Automatically bridge USDC to another chain
- Swap Hook - Convert USDC to another token
- Multi-recipient Hook - Split payment among multiple addresses
Relayer Registry
Relayer Registry
Authorizes relayers for gasless transactions:Relayers can signal multiple intents simultaneously for better UX.
Protocol Viewer
A read-only contract for efficient state aggregation:Complete User Flow
Here’s the end-to-end flow with all components:Step-by-Step Breakdown
Maker Deposits Liquidity
Maker calls
Escrow.createDeposit() with:- 1000 USDC
- Accepted payment methods (Venmo, PayPal)
- Min/max intent amounts (10-500 USDC)
- Supported currencies and rates
depositId.Taker Signals Intent
Taker calls
Orchestrator.signalIntent() with:- Target deposit and amount (100 USDC)
- Payment method (Venmo)
- Currency (USD) and rate (1:1)
- Recipient address
- Validates all parameters
- Generates unique intent hash
- Calls
Escrow.lockFunds()to reserve liquidity - Stores intent parameters for verification
Taker Sends Fiat Payment
Taker sends $100 via Venmo to maker’s payee details.
This is a standard Venmo payment - no special protocol interaction required.
Payment Proof Generation
Taker obtains payment receipt and sends to attestation service:
- Attestation service verifies payment via zkTLS
- Extracts payment details (amount, currency, payee, timestamp)
- Creates EIP-712 typed data structure
- Signs with trusted witness keys
- Returns attestation to taker
Taker Fulfills Intent
Taker (or relayer) calls
Orchestrator.fulfillIntent() with attestation.Orchestrator:- Retrieves intent parameters
- Gets verifier from payment registry
- Calls
UnifiedPaymentVerifier.verifyPayment()
- Validates EIP-712 signatures
- Checks payment details match intent
- Verifies timestamp within buffer
- Nullifies payment ID
- Returns verification result
Settlement & Distribution
If verification succeeds:
- Orchestrator calls
Escrow.unlockAndTransfer() - Escrow transfers 100 USDC to Orchestrator
- Orchestrator deducts 1% protocol fee (1 USDC)
- Orchestrator transfers 99 USDC to taker
- Intent is pruned from both contracts
- Funds go to hook contract instead
- Hook executes custom logic (bridge, swap, etc.)
Security Considerations
Reentrancy Protection
All state-changing functions use OpenZeppelin’s
ReentrancyGuardPausable Contracts
Emergency pause functionality preserves fund recovery options
Access Control
Role-based permissions via Ownable and custom modifiers
Signature Validation
EIP-712 typed data and EIP-1271 contract signatures
Nullifier System
Global prevention of double-spending payment proofs
Intent Expiration
Time-bounded locks prevent indefinite liquidity freezing
Pausable Functionality
Both Escrow and Orchestrator implement careful pause logic:Gas Optimization
The architecture includes several gas optimizations:Compiler Settings
Compiler Settings
Storage Packing
Storage Packing
Batch Operations
Batch Operations
Functions support array parameters to batch operations:
View Functions for State Aggregation
View Functions for State Aggregation
Protocol Viewer aggregates multiple reads:
Upgrade Path
The modular architecture supports upgrades without full migration:Gradual Migration
- Old deposits remain on old Escrow
- New deposits use new Escrow
- Both can coexist using registry pattern
The registry pattern allows multiple versions to coexist, enabling gradual migration without disrupting active trades.
Extension Points
The architecture provides several extension points:Post Intent Hooks
Custom logic executed after intent fulfillment:Custom Verifiers
New payment methods viaIPaymentVerifier interface:
Delegate Management
Deposits can have delegates for automated management:Next Steps
Contract API Reference
Detailed documentation for all contract interfaces
Integration Guide
Learn how to integrate ZKP2P into your application
Smart Contracts
Review core contract documentation and implementation details
Testing Guide
Code examples and testing patterns for integration