@@ -2563,17 +2563,17 @@ pub fn generate_eip2612_permit_signature<S: Signer>(
2563
2563
signer : & S ,
2564
2564
) -> Result < Vec < u8 > , WalletError > {
2565
2565
use sha3:: { Digest , Keccak256 } ;
2566
-
2566
+
2567
2567
// EIP-712 Domain Separator
2568
2568
// keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
2569
2569
let domain_type_hash = Keccak256 :: digest (
2570
- b"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
2570
+ b"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ,
2571
2571
) ;
2572
-
2572
+
2573
2573
// USDC uses "USD Coin" and version "2"
2574
2574
let name_hash = Keccak256 :: digest ( b"USD Coin" ) ;
2575
2575
let version_hash = Keccak256 :: digest ( b"2" ) ;
2576
-
2576
+
2577
2577
// Build domain separator
2578
2578
let mut domain_data = Vec :: new ( ) ;
2579
2579
domain_data. extend_from_slice ( & domain_type_hash) ;
@@ -2582,13 +2582,13 @@ pub fn generate_eip2612_permit_signature<S: Signer>(
2582
2582
domain_data. extend_from_slice ( & U256 :: from ( chain_id) . to_be_bytes :: < 32 > ( ) ) ;
2583
2583
domain_data. extend_from_slice ( token_address. as_slice ( ) ) ;
2584
2584
let domain_separator = Keccak256 :: digest ( & domain_data) ;
2585
-
2585
+
2586
2586
// Permit type hash
2587
2587
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")
2588
2588
let permit_type_hash = Keccak256 :: digest (
2589
- b"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
2589
+ b"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ,
2590
2590
) ;
2591
-
2591
+
2592
2592
// Build permit struct hash
2593
2593
let mut permit_data_encoded = Vec :: new ( ) ;
2594
2594
permit_data_encoded. extend_from_slice ( & permit_type_hash) ;
@@ -2598,21 +2598,21 @@ pub fn generate_eip2612_permit_signature<S: Signer>(
2598
2598
permit_data_encoded. extend_from_slice ( & permit_data. nonce . to_be_bytes :: < 32 > ( ) ) ;
2599
2599
permit_data_encoded. extend_from_slice ( & permit_data. deadline . to_be_bytes :: < 32 > ( ) ) ;
2600
2600
let permit_struct_hash = Keccak256 :: digest ( & permit_data_encoded) ;
2601
-
2601
+
2602
2602
// Build final message hash for EIP-712
2603
2603
let mut message = Vec :: new ( ) ;
2604
2604
message. push ( 0x19 ) ;
2605
2605
message. push ( 0x01 ) ;
2606
2606
message. extend_from_slice ( & domain_separator) ;
2607
2607
message. extend_from_slice ( & permit_struct_hash) ;
2608
2608
let message_hash = Keccak256 :: digest ( & message) ;
2609
-
2609
+
2610
2610
// Sign the hash (raw signature without prefix)
2611
2611
// We need to sign the raw hash, not use sign_message which adds prefix
2612
2612
// For now, we'll use sign_message and strip the prefix behavior
2613
2613
// TODO: Add raw hash signing to Signer trait
2614
2614
let signature = signer. sign_message ( & message_hash) ?;
2615
-
2615
+
2616
2616
Ok ( signature)
2617
2617
}
2618
2618
@@ -2628,7 +2628,7 @@ pub fn get_usdc_permit_nonce(
2628
2628
call_data. extend_from_slice ( & hex:: decode ( "7ecebe00" ) . unwrap ( ) ) ;
2629
2629
call_data. extend_from_slice ( & [ 0u8 ; 12 ] ) ; // Pad address to 32 bytes
2630
2630
call_data. extend_from_slice ( owner. as_slice ( ) ) ;
2631
-
2631
+
2632
2632
let token = resolve_name ( token_address, provider. chain_id ) ?;
2633
2633
2634
2634
// Create a transaction request for the call
@@ -2645,7 +2645,9 @@ pub fn get_usdc_permit_nonce(
2645
2645
if result. len ( ) >= 32 {
2646
2646
Ok ( U256 :: from_be_slice ( & result[ ..32 ] ) )
2647
2647
} else {
2648
- Err ( WalletError :: TransactionError ( "Invalid nonce response" . to_string ( ) ) )
2648
+ Err ( WalletError :: TransactionError (
2649
+ "Invalid nonce response" . to_string ( ) ,
2650
+ ) )
2649
2651
}
2650
2652
}
2651
2653
@@ -2669,7 +2671,7 @@ pub fn encode_usdc_paymaster_data_with_permit<S: Signer>(
2669
2671
// - address: USDC token address
2670
2672
// - uint256: permit amount
2671
2673
// - bytes: permit signature
2672
-
2674
+
2673
2675
// Mode byte (0 for permit mode)
2674
2676
data. push ( 0u8 ) ;
2675
2677
@@ -2679,35 +2681,34 @@ pub fn encode_usdc_paymaster_data_with_permit<S: Signer>(
2679
2681
// Permit amount - use a reasonable amount for gas payment (10 USDC worth)
2680
2682
let permit_amount = U256 :: from ( 10_000_000u64 ) ; // 10 USDC (6 decimals)
2681
2683
data. extend_from_slice ( & permit_amount. to_be_bytes :: < 32 > ( ) ) ;
2682
-
2684
+
2683
2685
// Generate EIP-2612 permit signature
2684
2686
// Get current nonce from USDC contract
2685
2687
let nonce = get_usdc_permit_nonce ( & token_address. to_string ( ) , tba_address, provider) ?;
2686
-
2688
+
2687
2689
// Set deadline to 1 hour from now
2688
- let deadline = U256 :: from ( std:: time:: SystemTime :: now ( )
2689
- . duration_since ( std:: time:: UNIX_EPOCH )
2690
- . unwrap ( )
2691
- . as_secs ( ) + 3600 ) ;
2692
-
2690
+ let deadline = U256 :: from (
2691
+ std:: time:: SystemTime :: now ( )
2692
+ . duration_since ( std:: time:: UNIX_EPOCH )
2693
+ . unwrap ( )
2694
+ . as_secs ( )
2695
+ + 3600 ,
2696
+ ) ;
2697
+
2693
2698
let permit_data = PermitData {
2694
2699
owner : tba_address,
2695
2700
spender : paymaster,
2696
2701
value : permit_amount,
2697
2702
nonce,
2698
2703
deadline,
2699
2704
} ;
2700
-
2701
- let permit_signature = generate_eip2612_permit_signature (
2702
- & permit_data,
2703
- token_address,
2704
- provider. chain_id ,
2705
- signer
2706
- ) ?;
2707
-
2705
+
2706
+ let permit_signature =
2707
+ generate_eip2612_permit_signature ( & permit_data, token_address, provider. chain_id , signer) ?;
2708
+
2708
2709
// Append the permit signature
2709
2710
data. extend_from_slice ( & permit_signature) ;
2710
-
2711
+
2711
2712
Ok ( data)
2712
2713
}
2713
2714
@@ -2722,20 +2723,20 @@ pub fn encode_usdc_paymaster_data(
2722
2723
// The real implementation should use encode_usdc_paymaster_data_with_permit
2723
2724
let mut data = Vec :: new ( ) ;
2724
2725
data. extend_from_slice ( paymaster. as_slice ( ) ) ;
2725
-
2726
+
2726
2727
// Mode byte (0 for permit mode)
2727
2728
data. push ( 0u8 ) ;
2728
-
2729
+
2729
2730
// Token address (USDC)
2730
2731
data. extend_from_slice ( token_address. as_slice ( ) ) ;
2731
-
2732
+
2732
2733
// Permit amount
2733
2734
let permit_amount = U256 :: from ( 10_000_000u64 ) ; // 10 USDC
2734
2735
data. extend_from_slice ( & permit_amount. to_be_bytes :: < 32 > ( ) ) ;
2735
-
2736
+
2736
2737
// For testing, add a dummy 65-byte signature
2737
2738
// In production, this should be a real EIP-2612 permit signature
2738
2739
data. extend_from_slice ( & [ 0u8 ; 65 ] ) ;
2739
-
2740
+
2740
2741
data
2741
2742
}
0 commit comments