Signing messages with Passport
Learn how to sign typed data messages using Immutable Passport in your Unreal game.
Overview
The ZkEvmSignTypedDataV4
method allows you to generate signatures for typed data objects using the EIP-712 standard. This is commonly used for:
- Message verification
- Off-chain authentication
- Gasless transactions
- Permit-style approvals
Prerequisites
📋Prerequisites
- User must be logged into Passport
- zkEVM provider must be initialised with
ConnectEvm
- User wallet must be connected with
ZkEvmRequestAccounts
Implementation
Use the UImmutablePassport::ZkEvmSignTypedDataV4
method to sign EIP-712 structured messages.
Parameters
RequestJsonString
: The EIP-712 structured data in JSON string formatResponseDelegate
: The response delegate to handle the callback
EIP-712 Standard
EIP-712 is a standard for hashing and signing typed structured data. It provides:
- Domain separation: Prevents signature reuse across different dApps
- Type safety: Ensures data integrity and structure
- Human readability: Makes signatures more understandable to users
Example Typed Data Structure
{
"types": {
"EIP712Domain": [
{"name": "name", "type": "string"},
{"name": "version", "type": "string"},
{"name": "chainId", "type": "uint256"},
{"name": "verifyingContract", "type": "address"}
],
"Person": [
{"name": "name", "type": "string"},
{"name": "wallet", "type": "address"}
]
},
"primaryType": "Person",
"domain": {
"name": "Example App",
"version": "1",
"chainId": 13473,
"verifyingContract": "0x1234567890123456789012345678901234567890"
},
"message": {
"name": "John Doe",
"wallet": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"
}
}
Security Considerations
💡Security
- Always validate the domain and verifying contract address
- Ensure the typed data structure matches your application's expectations
- Never sign data from untrusted sources
- Implement proper error handling for failed signatures
Use Cases
Message Verification
Sign messages to prove identity or ownership without spending gas:
// Verify user ownership of an account
// Sign a challenge message
// Validate signature on your backend
Gasless Transactions
Enable meta-transactions by signing transaction data off-chain:
// User signs transaction parameters
// Relayer submits transaction on behalf of user
// No ETH required from user for gas
Permit Approvals
Sign token approvals without separate transaction:
// Sign permit for token spending
// Include signature with main transaction
// Saves gas and improves UX
Error Handling
Common errors and solutions:
- User rejected signature: Handle gracefully, allow retry
- Invalid typed data: Validate JSON structure before signing
- Network errors: Implement retry logic with exponential backoff
Next Steps
After implementing typed data signing:
- Learn about transaction sending for on-chain operations
- Check the API Reference for additional methods
- Explore advanced Passport features in the TypeScript documentation