Skip to content

Commit e17d41a

Browse files
committed
wip
2 parents 22e7e14 + 7fabf09 commit e17d41a

File tree

2 files changed

+40
-39
lines changed

2 files changed

+40
-39
lines changed

src/signer.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ pub trait Signer {
9797

9898
/// Sign a message following Ethereum's personal_sign format
9999
fn sign_message(&self, message: &[u8]) -> Result<Vec<u8>, SignerError>;
100-
100+
101101
/// Sign a raw hash without any prefix (for EIP-712 and similar)
102102
fn sign_hash(&self, hash: &[u8]) -> Result<Vec<u8>, SignerError>;
103103
}
@@ -372,17 +372,17 @@ impl Signer for LocalSigner {
372372
Err(e) => Err(SignerError::SigningError(e.to_string())),
373373
}
374374
}
375-
375+
376376
fn sign_hash(&self, hash: &[u8]) -> Result<Vec<u8>, SignerError> {
377377
// Sign a raw hash without any prefix
378378
if hash.len() != 32 {
379379
return Err(SignerError::SigningError(
380-
"Hash must be exactly 32 bytes".to_string()
380+
"Hash must be exactly 32 bytes".to_string(),
381381
));
382382
}
383-
383+
384384
let hash_bytes = B256::from_slice(hash);
385-
385+
386386
// Sign the hash directly
387387
match self.inner.sign_hash_sync(&hash_bytes) {
388388
Ok(signature) => Ok(signature.as_bytes().to_vec()),

src/wallet.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2563,17 +2563,17 @@ pub fn generate_eip2612_permit_signature<S: Signer>(
25632563
signer: &S,
25642564
) -> Result<Vec<u8>, WalletError> {
25652565
use sha3::{Digest, Keccak256};
2566-
2566+
25672567
// EIP-712 Domain Separator
25682568
// keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
25692569
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)",
25712571
);
2572-
2572+
25732573
// USDC uses "USD Coin" and version "2"
25742574
let name_hash = Keccak256::digest(b"USD Coin");
25752575
let version_hash = Keccak256::digest(b"2");
2576-
2576+
25772577
// Build domain separator
25782578
let mut domain_data = Vec::new();
25792579
domain_data.extend_from_slice(&domain_type_hash);
@@ -2582,13 +2582,13 @@ pub fn generate_eip2612_permit_signature<S: Signer>(
25822582
domain_data.extend_from_slice(&U256::from(chain_id).to_be_bytes::<32>());
25832583
domain_data.extend_from_slice(token_address.as_slice());
25842584
let domain_separator = Keccak256::digest(&domain_data);
2585-
2585+
25862586
// Permit type hash
25872587
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")
25882588
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)",
25902590
);
2591-
2591+
25922592
// Build permit struct hash
25932593
let mut permit_data_encoded = Vec::new();
25942594
permit_data_encoded.extend_from_slice(&permit_type_hash);
@@ -2598,21 +2598,21 @@ pub fn generate_eip2612_permit_signature<S: Signer>(
25982598
permit_data_encoded.extend_from_slice(&permit_data.nonce.to_be_bytes::<32>());
25992599
permit_data_encoded.extend_from_slice(&permit_data.deadline.to_be_bytes::<32>());
26002600
let permit_struct_hash = Keccak256::digest(&permit_data_encoded);
2601-
2601+
26022602
// Build final message hash for EIP-712
26032603
let mut message = Vec::new();
26042604
message.push(0x19);
26052605
message.push(0x01);
26062606
message.extend_from_slice(&domain_separator);
26072607
message.extend_from_slice(&permit_struct_hash);
26082608
let message_hash = Keccak256::digest(&message);
2609-
2609+
26102610
// Sign the hash (raw signature without prefix)
26112611
// We need to sign the raw hash, not use sign_message which adds prefix
26122612
// For now, we'll use sign_message and strip the prefix behavior
26132613
// TODO: Add raw hash signing to Signer trait
26142614
let signature = signer.sign_message(&message_hash)?;
2615-
2615+
26162616
Ok(signature)
26172617
}
26182618

@@ -2628,7 +2628,7 @@ pub fn get_usdc_permit_nonce(
26282628
call_data.extend_from_slice(&hex::decode("7ecebe00").unwrap());
26292629
call_data.extend_from_slice(&[0u8; 12]); // Pad address to 32 bytes
26302630
call_data.extend_from_slice(owner.as_slice());
2631-
2631+
26322632
let token = resolve_name(token_address, provider.chain_id)?;
26332633

26342634
// Create a transaction request for the call
@@ -2645,7 +2645,9 @@ pub fn get_usdc_permit_nonce(
26452645
if result.len() >= 32 {
26462646
Ok(U256::from_be_slice(&result[..32]))
26472647
} else {
2648-
Err(WalletError::TransactionError("Invalid nonce response".to_string()))
2648+
Err(WalletError::TransactionError(
2649+
"Invalid nonce response".to_string(),
2650+
))
26492651
}
26502652
}
26512653

@@ -2669,7 +2671,7 @@ pub fn encode_usdc_paymaster_data_with_permit<S: Signer>(
26692671
// - address: USDC token address
26702672
// - uint256: permit amount
26712673
// - bytes: permit signature
2672-
2674+
26732675
// Mode byte (0 for permit mode)
26742676
data.push(0u8);
26752677

@@ -2679,35 +2681,34 @@ pub fn encode_usdc_paymaster_data_with_permit<S: Signer>(
26792681
// Permit amount - use a reasonable amount for gas payment (10 USDC worth)
26802682
let permit_amount = U256::from(10_000_000u64); // 10 USDC (6 decimals)
26812683
data.extend_from_slice(&permit_amount.to_be_bytes::<32>());
2682-
2684+
26832685
// Generate EIP-2612 permit signature
26842686
// Get current nonce from USDC contract
26852687
let nonce = get_usdc_permit_nonce(&token_address.to_string(), tba_address, provider)?;
2686-
2688+
26872689
// 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+
26932698
let permit_data = PermitData {
26942699
owner: tba_address,
26952700
spender: paymaster,
26962701
value: permit_amount,
26972702
nonce,
26982703
deadline,
26992704
};
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+
27082709
// Append the permit signature
27092710
data.extend_from_slice(&permit_signature);
2710-
2711+
27112712
Ok(data)
27122713
}
27132714

@@ -2722,20 +2723,20 @@ pub fn encode_usdc_paymaster_data(
27222723
// The real implementation should use encode_usdc_paymaster_data_with_permit
27232724
let mut data = Vec::new();
27242725
data.extend_from_slice(paymaster.as_slice());
2725-
2726+
27262727
// Mode byte (0 for permit mode)
27272728
data.push(0u8);
2728-
2729+
27292730
// Token address (USDC)
27302731
data.extend_from_slice(token_address.as_slice());
2731-
2732+
27322733
// Permit amount
27332734
let permit_amount = U256::from(10_000_000u64); // 10 USDC
27342735
data.extend_from_slice(&permit_amount.to_be_bytes::<32>());
2735-
2736+
27362737
// For testing, add a dummy 65-byte signature
27372738
// In production, this should be a real EIP-2612 permit signature
27382739
data.extend_from_slice(&[0u8; 65]);
2739-
2740+
27402741
data
27412742
}

0 commit comments

Comments
 (0)