Overview
Intent-based payments are the foundation of identiPay’s payment authorization model. Unlike traditional pull-based payment systems where merchants initiate transactions, identiPay uses a push-based intent model where buyers explicitly sign and authorize each payment.Intent signatures bind a buyer to a specific transaction proposal, providing cryptographic proof of authorization without revealing the buyer’s on-chain identity.
- Privacy: Buyers authorize payments without linking to their wallet address
- Replay protection: Each signed intent is unique and can only be executed once
- Semantic binding: Signatures cover the complete transaction context (amount, merchant, constraints)
- Non-repudiation: Cryptographic proof that the buyer authorized the specific transaction
How intent signatures work
Canonicalized proposal hashing
Before signing, the wallet must create a canonical representation of the payment proposal. This ensures that the signature semantically binds to the exact transaction terms.Proposal representation
The merchant creates a JSON-LD commerce proposal containing:
- Payment amount and currency
- Merchant address
- Expiry timestamp
- Optional eligibility constraints (e.g., age requirements)
- Receipt and warranty details
Canonicalization
The wallet canonicalizes the JSON-LD proposal using URDNA2015 normalization. This produces a deterministic byte representation regardless of JSON key ordering or whitespace.
Hash computation
The canonical bytes are hashed using SHA3-256 to produce the intent hash - a 32-byte identifier uniquely representing the proposal.
On-chain verification
When the transaction is submitted, thesettlement contract verifies the intent signature before processing the payment:
intent.move
The intent signature uses Ed25519 for efficient on-chain verification on the Sui blockchain. Ed25519 signatures are 64 bytes and public keys are 32 bytes.
Intent lifecycle
Replay protection
The settlement contract maintains a sharedSettlementState object that tracks all executed intent hashes:
settlement.move
settlement.move
Integration example
Here’s how the backend API resolves intent proposals:intents.ts
Why intent-based instead of pull-based?
Traditional payment systems use a pull model where merchants initiate transactions:Pull-based (traditional)
- Merchant initiates the transaction
- Buyer provides card number or authorizes ACH
- Merchant can charge at any time (subscription risk)
- Requires trust in merchant’s payment processor
- Limited transaction-specific context
Intent-based (identiPay)
- Buyer initiates and authorizes each transaction
- Signature semantically binds to exact proposal terms
- One-time authorization, no recurring risk
- On-chain verification, no trusted intermediary
- Complete transaction context in signature
Security considerations
Signature algorithm choice
Signature algorithm choice
identiPay uses Ed25519 (not ECDSA) for intent signatures because:
- Fast on-chain verification (critical for settlement gas costs)
- Deterministic signatures (no nonce reuse risk)
- Native support in Sui Move’s
sui::ed25519module - Widely supported by hardware security modules
Intent hash binding
Intent hash binding
The intent hash commits to all transaction parameters:
- Amount and currency type
- Merchant address
- Expiry timestamp
- Eligibility constraints
- Receipt and warranty terms
Expiry enforcement
Expiry enforcement
All proposals have an expiry timestamp that is checked during settlement:This limits the window for signature replay and ensures buyers can’t be charged for stale proposals.
Related concepts
Stealth addresses
Learn how buyers receive receipts at unlinkable addresses
Zero-knowledge proofs
Understand how eligibility constraints are verified privately
