Skip to main content
After signaling an intent and sending fiat payment, you must submit a payment proof to unlock your USDC. This guide covers the fulfillment process.

Overview

Fulfilling an intent involves:
  1. Obtaining a zkTLS attestation proving your off-chain payment
  2. Submitting the proof to the Orchestrator contract
  3. Automatic verification and fund transfer
  4. Optional post-intent hook execution
The Orchestrator coordinates verification through the UnifiedPaymentVerifier, which validates EIP-712 signed attestations.

Payment Proof Flow

Obtaining Payment Proofs

1

Complete the fiat payment

Send fiat through the payment method specified in your intent:
Make the payment through your Venmo/PayPal/etc. app to the maker’s account.
2

Request attestation

Submit your payment receipt to the attestation service:
3

Prepare verification data

Format the attestation for on-chain verification:

Fulfilling the Intent

Basic Fulfillment

Submit the payment proof to complete the trade:

Fulfillment with Post-Intent Hooks

If your intent specified a post-intent hook (e.g., for bridging), provide hook-specific data:
When using post-intent hooks, the USDC is transferred to the hook contract instead of directly to intent.to. The hook then executes custom logic (bridging, swapping, etc.).

Payment Verification

The UnifiedPaymentVerifier performs these checks:
1

Signature validation

Verifies the EIP-712 signature on the attestation:
  • Signature matches the attester’s public key
  • Attestation hasn’t been tampered with
2

Payment data validation

Checks the payment details:
  • Intent hash matches
  • Payment amount is correct
  • Payee details match the deposit
  • Currency matches
3

Nullifier check

Prevents double-spending:
  • Payment ID hasn’t been used before
  • Marks payment as consumed in NullifierRegistry
4

Timestamp validation

Ensures proof freshness:
  • Attestation timestamp is recent enough
  • Allows buffer time for L2 block delays

Fee Distribution

Fees are automatically deducted and distributed during fulfillment:

Manual Release by Depositor

In case of issues, the depositor can manually release funds to you:
Only the deposit owner can call releaseFundsToPayer. This is a safety mechanism for exceptional circumstances.

Reading Fulfillment Status

Handling Errors

Common Errors

Anyone Can Fulfill

Important: Anyone can submit a fulfillment transaction, not just the intent owner:

Best Practices

Verify Before Paying

Confirm your intent was signaled successfully before sending fiat.

Save Payment Receipt

Keep records of your fiat payment for attestation requests.

Act Before Expiry

Fulfill before the intent expires (typically 24 hours).

Monitor Events

Watch for IntentFulfilled event to confirm successful completion.

Next Steps

Using Hooks

Learn about post-intent hooks for advanced workflows

Testing

Test the full flow in a local environment