SingletonPaymasterV9 - EntryPoint V0.9 Support with Async Signatures#25
Open
0xkoiner wants to merge 4 commits intopimlicolabs:masterfrom
Open
SingletonPaymasterV9 - EntryPoint V0.9 Support with Async Signatures#250xkoiner wants to merge 4 commits intopimlicolabs:masterfrom
0xkoiner wants to merge 4 commits intopimlicolabs:masterfrom
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
SingletonPaymasterV9 - EntryPoint V0.9 Support with Async Signatures
Overview
SingletonPaymasterV9 extends the Pimlico Singleton Paymaster to support EntryPoint V0.9, introducing a critical new feature: asynchronous paymaster signatures. This implementation maintains full backward compatibility with V8 synchronous signatures while enabling parallel signing workflows.
Key Benefits
Technical Background
The Problem: Sequential Signing in V6/V7/V8
In EntryPoint V0.6, V0.7 and V0.8, the signing workflow was strictly sequential:
paymasterAndDatapaymasterAndDataThis sequential dependency creates latency bottlenecks in production systems.
The Solution: Async Signatures in V0.9
EntryPoint V0.9 introduces an optional async signature mechanism that allows:
paymasterAndDataincluding a magic suffixThe key insight: The user's signature hash excludes the paymaster's signature region, allowing it to be filled asynchronously.
Implementation Details
Core Changes in
SingletonPaymaster.sol1. Added UserOperationLib Extension (Line 18)
This enables calling
getPaymasterSignatureLength()onpaymasterAndDatabytes.2. Signature Length Detection (Line 130)
How it works:
getPaymasterSignatureLength()checks for the magic suffix0x22e325a2974396560if no suffix found (sync mode)3. Pass Signature Length to Validation Functions (Lines 144, 149)
4. Gas Optimization: Assembly Sender Extraction (Lines 372-379)
Replaced
_userOp.getSender()with_getSender(_userOp)throughout for gas savings.Core Changes in
BaseSingletonPaymaster.sol1. Modified
_parseVerifyingConfig()(Lines 350-383)2. Modified
_parseErc20Config()(Lines 244-339)Similar conditional logic added:
Signature Mode Comparison
Sync Mode (V6/V7/V8 Compatible)
paymasterAndData Structure:
Signing Flow:
Detection:
getPaymasterSignatureLength()returns0(no magic suffix)Async Mode (V9 New Feature)
paymasterAndData Structure:
Signing Flow:
Detection:
getPaymasterSignatureLength()returns signature length (magic suffix present)Constants and Magic Values
Code Examples
Example 1: Async Verifying Mode (from tests)
Example 2: Sync Verifying Mode (backward compatible)
Testing
Comprehensive test coverage in
test/SingletonPaymasterV9Test/unit/AsyncSignature.t.sol:Async Mode Tests
test_AsyncSiganture_VERIFYING_MODE()- Verifying mode with async signaturestest_AsyncSiganture_ERC20_MODE_combinedByteBasic()- ERC20 mode with async signaturesSync Mode Tests (Backward Compatibility)
test_SyncSiganture_VERIFYING_MODE()- Verifying mode with sync signaturestest_SyncSiganture_ERC20_MODE_combinedByteBasic()- ERC20 mode with sync signaturesAll tests validate:
Migration Guide
For Existing V7/V8 Users
Good news: No breaking changes! Your existing integration continues to work.
Adopting Async Signatures
To enable async signatures, simply append the suffix:
Performance Improvements
Gas Optimizations
Sender Extraction: ~800 gas saved per UserOp using assembly
_userOp.getSender()_getSender(_userOp)with assemblyEfficient Signature Detection: Single pass through paymasterAndData
getPaymasterSignatureLength()checks magic suffix in O(1)Latency Improvements
With async signatures:
Real-world impact:
Architecture Diagram
New Features