Overview
Fulfilling an intent involves:- Obtaining a zkTLS attestation proving your off-chain payment
- Submitting the proof to the Orchestrator contract
- Automatic verification and fund transfer
- Optional post-intent hook execution
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: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