What has to be proven
For a fill to release, the payment evidence has to match the order. The important fields are amount, currency, recipient, payment method, timing, and the intent being fulfilled.
The verifier does not need to publish the whole payment history. It needs enough authenticated evidence to say that this payment, for this amount, to this payee, belongs to this intent.
Current verification model
ZKP2P V3 uses a TEE-hosted attestation service for supported payment flows. The service runs verification logic inside an AWS Nitro Enclave, checks payment data against typed platform schemas, and signs an EIP-712 PaymentAttestation after the payment matches.
This replaced the older buyer-heavy zkTLS model for many flows because browser-side proof generation was slow, extension-dependent, and fragile when payment platforms changed their web interfaces. The tradeoff is explicit: hardware-attested execution and reproducible enclave builds instead of asking every buyer to generate a local proof.
TEE-TLS vs legacy zkTLS
| Question | Legacy zkTLS | TEE-TLS |
|---|---|---|
| Where verification runs | Buyer browser or extension | Nitro Enclave attestation service |
| Buyer UX | Extension/proof generation can be heavy | Payment evidence is checked server-side inside the enclave |
| Verification logic | Provider templates and proof matching | Typed schemas and platform-specific transformers |
| Trust root | Proof system plus notary/proxy assumptions | Hardware attestation plus audited enclave code |
| Onchain result | Signed or verified release data | EIP-712 PaymentAttestation checked by verifier |
Privacy boundaries
- Personal payment data is not posted onchain.
- The counterparty sees the payout identifier needed to complete the payment.
- The chain sees hashes, nullifiers, signatures, amounts, contract addresses, and release events.
- USDCtoFiat does not hold your fiat account, does not custody your private keys, and cannot reverse a payment-app transfer.