{"version":3,"sources":["../../src/utils/validation.ts","../../src/utils/formatting.ts","../../src/utils/crypto.ts","../../src/utils/constants.ts"],"names":["ethers","hours"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ethers } from 'ethers';\nimport type { Address, HexString, UserOperation } from '../types';\n\n/**\n * Validate if a string is a valid Ethereum address\n */\nexport function isValidAddress(address: string): address is Address {\n  // Must start with 0x and be exactly 42 characters\n  if (!address.startsWith('0x') || address.length !== 42) {\n    return false;\n  }\n  return ethers.isAddress(address);\n}\n\n/**\n * Validate if a string is a valid hex string\n */\nexport function isValidHexString(hex: string): hex is HexString {\n  return /^0x[a-fA-F0-9]*$/.test(hex);\n}\n\n/**\n * Validate if a hex string has the correct length for a specific type\n */\nexport function isValidHexLength(hex: string, expectedLength: number): boolean {\n  if (!isValidHexString(hex)) return false;\n  return hex.length === 2 + expectedLength * 2; // 2 for '0x' + 2 chars per byte\n}\n\n/**\n * Validate if a string is a valid transaction hash\n */\nexport function isValidTxHash(hash: string): boolean {\n  return isValidHexLength(hash, 32);\n}\n\n/**\n * Validate if a string is a valid signature\n */\nexport function isValidSignature(signature: string): boolean {\n  return isValidHexLength(signature, 65); // 65 bytes for ECDSA signature\n}\n\n/**\n * Validate if a UserOperation has all required fields\n */\nexport function isValidUserOperation(userOp: Partial<UserOperation>): userOp is UserOperation {\n  const requiredFields: (keyof UserOperation)[] = [\n    'sender',\n    'nonce',\n    'initCode',\n    'callData',\n    'callGasLimit',\n    'verificationGasLimit',\n    'preVerificationGas',\n    'maxFeePerGas',\n    'maxPriorityFeePerGas',\n    'paymasterAndData',\n    'signature',\n  ];\n\n  for (const field of requiredFields) {\n    if (userOp[field] === undefined || userOp[field] === null) {\n      return false;\n    }\n  }\n\n  // Validate specific field types\n  if (!isValidAddress(userOp.sender!)) return false;\n  if (typeof userOp.nonce !== 'bigint') return false;\n  if (!isValidHexString(userOp.initCode!)) return false;\n  if (!isValidHexString(userOp.callData!)) return false;\n  if (!isValidHexString(userOp.paymasterAndData!)) return false;\n  if (!isValidHexString(userOp.signature!)) return false;\n\n  // Validate gas values are positive\n  if (userOp.callGasLimit! < 0n) return false;\n  if (userOp.verificationGasLimit! < 0n) return false;\n  if (userOp.preVerificationGas! < 0n) return false;\n  if (userOp.maxFeePerGas! < 0n) return false;\n  if (userOp.maxPriorityFeePerGas! < 0n) return false;\n\n  return true;\n}\n\n/**\n * Validate if a chain ID is supported\n */\nexport function isSupportedChainId(chainId: number): boolean {\n  const supportedChains = [1, 11155111, 137, 80001, 42161, 421614, 10, 11155420];\n  return supportedChains.includes(chainId);\n}\n\n/**\n * Validate if a URL is valid\n */\nexport function isValidUrl(url: string): boolean {\n  try {\n    new URL(url);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Validate if a private key is valid\n */\nexport function isValidPrivateKey(privateKey: string): boolean {\n  // Must start with 0x and be exactly 66 characters (64 hex + 0x)\n  if (!privateKey.startsWith('0x') || privateKey.length !== 66) {\n    return false;\n  }\n  \n  // Must be valid hex\n  if (!/^0x[a-fA-F0-9]{64}$/.test(privateKey)) {\n    return false;\n  }\n  \n  try {\n    new ethers.Wallet(privateKey);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Validate if a mnemonic phrase is valid\n */\nexport function isValidMnemonic(mnemonic: string): boolean {\n  try {\n    ethers.Mnemonic.fromPhrase(mnemonic);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Validate if an amount is a valid positive number\n */\nexport function isValidAmount(amount: bigint): boolean {\n  return amount >= 0n;\n}\n\n/**\n * Validate if a gas limit is reasonable\n */\nexport function isValidGasLimit(gasLimit: bigint): boolean {\n  const MIN_GAS = 21000n;\n  const MAX_GAS = 30000000n; // 30M gas limit\n  return gasLimit >= MIN_GAS && gasLimit <= MAX_GAS;\n}\n\n/**\n * Validate if a gas price is reasonable\n */\nexport function isValidGasPrice(gasPrice: bigint): boolean {\n  const MIN_GAS_PRICE = 1n; // 1 wei\n  const MAX_GAS_PRICE = 1000000000000n; // 1000 gwei\n  return gasPrice >= MIN_GAS_PRICE && gasPrice <= MAX_GAS_PRICE;\n}\n\n/**\n * Validate if a threshold is valid for multi-sig\n */\nexport function isValidThreshold(threshold: number, totalSigners: number): boolean {\n  return threshold > 0 && threshold <= totalSigners;\n}\n\n/**\n * Validate if an array of addresses contains only unique valid addresses\n */\nexport function areValidUniqueAddresses(addresses: string[]): addresses is Address[] {\n  if (addresses.length === 0) return false;\n  \n  const uniqueAddresses = new Set(addresses.map(addr => addr.toLowerCase()));\n  if (uniqueAddresses.size !== addresses.length) return false; // Duplicates found\n  \n  return addresses.every(isValidAddress);\n}\n\n/**\n * Validate if a salt value is valid\n */\nexport function isValidSalt(salt: bigint): boolean {\n  return salt >= 0n;\n}\n\n/**\n * Comprehensive validation for account deployment parameters\n */\nexport function validateAccountDeployment(params: {\n  owner?: string;\n  owners?: string[];\n  threshold?: number;\n  salt?: bigint;\n}): { isValid: boolean; errors: string[] } {\n  const errors: string[] = [];\n\n  // Validate single owner (for simple accounts)\n  if (params.owner && !isValidAddress(params.owner)) {\n    errors.push('Invalid owner address');\n  }\n\n  // Validate multiple owners (for multi-sig accounts)\n  if (params.owners) {\n    if (!areValidUniqueAddresses(params.owners)) {\n      errors.push('Invalid or duplicate owner addresses');\n    }\n    \n    if (params.threshold && !isValidThreshold(params.threshold, params.owners.length)) {\n      errors.push('Invalid threshold for number of owners');\n    }\n  }\n\n  // Validate salt\n  if (params.salt !== undefined && !isValidSalt(params.salt)) {\n    errors.push('Invalid salt value');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n} ","import { ethers } from 'ethers';\nimport type { Address, HexString } from '../types';\n\n/**\n * Format an address for display (checksum format)\n */\nexport function formatAddress(address: string): Address {\n  return ethers.getAddress(address) as Address;\n}\n\n/**\n * Truncate an address for display (0x1234...5678)\n */\nexport function truncateAddress(address: string, startChars: number = 6, endChars: number = 4): string {\n  if (address.length <= startChars + endChars) {\n    return address;\n  }\n  return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Format a hex string to ensure proper 0x prefix\n */\nexport function formatHexString(hex: string): HexString {\n  if (!hex.startsWith('0x')) {\n    return `0x${hex}` as HexString;\n  }\n  return hex as HexString;\n}\n\n/**\n * Format wei amount to ether string\n */\nexport function formatEther(wei: bigint, decimals: number = 4): string {\n  return parseFloat(ethers.formatEther(wei)).toFixed(decimals);\n}\n\n/**\n * Format wei amount to gwei string\n */\nexport function formatGwei(wei: bigint, decimals: number = 2): string {\n  return parseFloat(ethers.formatUnits(wei, 'gwei')).toFixed(decimals);\n}\n\n/**\n * Parse ether string to wei\n */\nexport function parseEther(ether: string): bigint {\n  return ethers.parseEther(ether);\n}\n\n/**\n * Parse gwei string to wei\n */\nexport function parseGwei(gwei: string): bigint {\n  return ethers.parseUnits(gwei, 'gwei');\n}\n\n/**\n * Format a large number with appropriate units (K, M, B)\n */\nexport function formatLargeNumber(num: number): string {\n  if (num >= 1e9) {\n    return `${(num / 1e9).toFixed(2)}B`;\n  }\n  if (num >= 1e6) {\n    return `${(num / 1e6).toFixed(2)}M`;\n  }\n  if (num >= 1e3) {\n    return `${(num / 1e3).toFixed(2)}K`;\n  }\n  return num.toString();\n}\n\n/**\n * Format a timestamp to a readable date string\n */\nexport function formatTimestamp(timestamp: number): string {\n  return new Date(timestamp * 1000).toLocaleString();\n}\n\n/**\n * Format a duration in seconds to human readable format\n */\nexport function formatDuration(seconds: number): string {\n  if (seconds < 60) {\n    return `${seconds}s`;\n  }\n  if (seconds < 3600) {\n    return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n  }\n  if (seconds < 86400) {\n    const hours = Math.floor(seconds / 3600);\n    const minutes = Math.floor((seconds % 3600) / 60);\n    return `${hours}h ${minutes}m`;\n  }\n  const days = Math.floor(seconds / 86400);\n  const hours = Math.floor((seconds % 86400) / 3600);\n  return `${days}d ${hours}h`;\n}\n\n/**\n * Format gas amount with appropriate units\n */\nexport function formatGas(gas: bigint): string {\n  const gasNumber = Number(gas);\n  if (gasNumber >= 1e6) {\n    return `${(gasNumber / 1e6).toFixed(2)}M`;\n  }\n  if (gasNumber >= 1e3) {\n    return `${(gasNumber / 1e3).toFixed(2)}K`;\n  }\n  return gasNumber.toString();\n}\n\n/**\n * Format a percentage with specified decimal places\n */\nexport function formatPercentage(value: number, decimals: number = 2): string {\n  return `${(value * 100).toFixed(decimals)}%`;\n}\n\n/**\n * Format bytes to human readable format\n */\nexport function formatBytes(bytes: number): string {\n  if (bytes === 0) return '0 B';\n  \n  const k = 1024;\n  const sizes = ['B', 'KB', 'MB', 'GB'];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  \n  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n/**\n * Format a transaction hash for display\n */\nexport function formatTxHash(hash: string, startChars: number = 10, endChars: number = 8): string {\n  return truncateAddress(hash, startChars, endChars);\n}\n\n/**\n * Format a chain ID to network name\n */\nexport function formatChainId(chainId: number): string {\n  const networks: Record<number, string> = {\n    1: 'Ethereum Mainnet',\n    11155111: 'Ethereum Sepolia',\n    137: 'Polygon Mainnet',\n    80001: 'Polygon Mumbai',\n    42161: 'Arbitrum One',\n    421614: 'Arbitrum Sepolia',\n    10: 'Optimism Mainnet',\n    11155420: 'Optimism Sepolia',\n  };\n  \n  return networks[chainId] ?? `Chain ${chainId}`;\n}\n\n/**\n * Format a UserOperation for logging/display\n */\nexport function formatUserOperation(userOp: any): string {\n  return JSON.stringify({\n    sender: truncateAddress(userOp.sender),\n    nonce: userOp.nonce.toString(),\n    callData: truncateAddress(userOp.callData, 10, 10),\n    callGasLimit: formatGas(userOp.callGasLimit),\n    verificationGasLimit: formatGas(userOp.verificationGasLimit),\n    maxFeePerGas: formatGwei(userOp.maxFeePerGas),\n    signature: userOp.signature ? truncateAddress(userOp.signature, 10, 10) : 'none',\n  }, null, 2);\n}\n\n/**\n * Pad a hex string to a specific length\n */\nexport function padHex(hex: string, length: number): HexString {\n  const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n  const padded = cleanHex.padStart(length * 2, '0');\n  return `0x${padded}` as HexString;\n}\n\n/**\n * Convert a number to hex string\n */\nexport function numberToHex(num: number | bigint): HexString {\n  return `0x${num.toString(16)}` as HexString;\n}\n\n/**\n * Convert hex string to number\n */\nexport function hexToNumber(hex: string): number {\n  return parseInt(hex, 16);\n}\n\n/**\n * Format an error message for display\n */\nexport function formatError(error: unknown): string {\n  if (error instanceof Error) {\n    return error.message;\n  }\n  if (typeof error === 'string') {\n    return error;\n  }\n  return 'Unknown error occurred';\n} ","import { ethers } from 'ethers';\nimport { sha256 } from '@noble/hashes/sha256';\nimport type { Address, HexString } from '../types';\n\n/**\n * Generate a random private key\n */\nexport function generatePrivateKey(): string {\n  return ethers.Wallet.createRandom().privateKey;\n}\n\n/**\n * Generate a random mnemonic phrase\n */\nexport function generateMnemonic(): string {\n  return ethers.Wallet.createRandom().mnemonic?.phrase ?? '';\n}\n\n/**\n * Derive an address from a private key\n */\nexport function privateKeyToAddress(privateKey: string): Address {\n  const wallet = new ethers.Wallet(privateKey);\n  return wallet.address as Address;\n}\n\n/**\n * Derive an address from a public key\n */\nexport function publicKeyToAddress(publicKey: string): Address {\n  return ethers.computeAddress(publicKey) as Address;\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function signMessage(\n  message: string | Uint8Array,\n  privateKey: string\n): Promise<HexString> {\n  const wallet = new ethers.Wallet(privateKey);\n  return await wallet.signMessage(message) as HexString;\n}\n\n/**\n * Verify a signature against a message and address\n */\nexport function verifySignature(\n  message: string | Uint8Array,\n  signature: string,\n  address: string\n): boolean {\n  try {\n    const recoveredAddress = ethers.verifyMessage(message, signature);\n    return recoveredAddress.toLowerCase() === address.toLowerCase();\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Recover the address from a signature\n */\nexport function recoverAddress(\n  message: string | Uint8Array,\n  signature: string\n): Address {\n  return ethers.verifyMessage(message, signature) as Address;\n}\n\n/**\n * Hash data using SHA256\n */\nexport function hashSHA256(data: Uint8Array): Uint8Array {\n  return sha256(data);\n}\n\n/**\n * Hash data using Keccak256 (Ethereum's hash function)\n */\nexport function hashKeccak256(data: string | Uint8Array): HexString {\n  return ethers.keccak256(data) as HexString;\n}\n\n/**\n * Hash a string using Keccak256\n */\nexport function hashString(str: string): HexString {\n  return ethers.id(str) as HexString;\n}\n\n/**\n * Generate a deterministic salt from input data\n */\nexport function generateSalt(data: string): bigint {\n  const hash = hashString(data);\n  return BigInt(hash);\n}\n\n/**\n * Create a message hash for EIP-712 structured data\n */\nexport function hashTypedData(\n  domain: ethers.TypedDataDomain,\n  types: Record<string, ethers.TypedDataField[]>,\n  value: Record<string, unknown>\n): HexString {\n  return ethers.TypedDataEncoder.hash(domain, types, value) as HexString;\n}\n\n/**\n * Sign EIP-712 structured data\n */\nexport async function signTypedData(\n  privateKey: string,\n  domain: ethers.TypedDataDomain,\n  types: Record<string, ethers.TypedDataField[]>,\n  value: Record<string, unknown>\n): Promise<HexString> {\n  const wallet = new ethers.Wallet(privateKey);\n  return await wallet.signTypedData(domain, types, value) as HexString;\n}\n\n/**\n * Verify EIP-712 structured data signature\n */\nexport function verifyTypedData(\n  domain: ethers.TypedDataDomain,\n  types: Record<string, ethers.TypedDataField[]>,\n  value: Record<string, unknown>,\n  signature: string,\n  address: string\n): boolean {\n  try {\n    const recoveredAddress = ethers.verifyTypedData(domain, types, value, signature);\n    return recoveredAddress.toLowerCase() === address.toLowerCase();\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Generate a random nonce\n */\nexport function generateNonce(): bigint {\n  return BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER));\n}\n\n/**\n * Generate a secure random salt\n */\nexport function generateSecureSalt(): bigint {\n  const randomBytes = ethers.randomBytes(32);\n  return BigInt(ethers.hexlify(randomBytes));\n}\n\n/**\n * Derive a child private key from a master private key and path (simplified HD wallet)\n */\nexport function derivePrivateKey(masterKey: string, index: number): string {\n  // This is a simplified derivation - in production, use proper HD wallet derivation\n  const combined = `${masterKey}${index}`;\n  const hash = hashString(combined);\n  return hash;\n}\n\n/**\n * Create a wallet from mnemonic and derivation path\n */\nexport function createWalletFromMnemonic(\n  mnemonic: string,\n  path: string = \"m/44'/60'/0'/0/0\"\n): ethers.Wallet {\n  const hdNode = ethers.HDNodeWallet.fromPhrase(mnemonic, undefined, path);\n  return new ethers.Wallet(hdNode.privateKey);\n}\n\n/**\n * Encrypt a private key with a password\n */\nexport async function encryptPrivateKey(\n  privateKey: string,\n  password: string\n): Promise<string> {\n  const wallet = new ethers.Wallet(privateKey);\n  return await wallet.encrypt(password);\n}\n\n/**\n * Decrypt an encrypted private key with a password\n */\nexport async function decryptPrivateKey(\n  encryptedKey: string,\n  password: string\n): Promise<string> {\n  const wallet = await ethers.Wallet.fromEncryptedJson(encryptedKey, password);\n  return wallet.privateKey;\n}\n\n/**\n * Generate a deterministic address from multiple inputs\n */\nexport function generateDeterministicAddress(\n  factory: Address,\n  salt: bigint,\n  initCodeHash: HexString\n): Address {\n  const packed = ethers.solidityPacked(\n    ['bytes1', 'address', 'uint256', 'bytes32'],\n    ['0xff', factory, salt, initCodeHash]\n  );\n  const hash = hashKeccak256(packed);\n  return `0x${hash.slice(-40)}` as Address;\n}\n\n/**\n * Split a signature into r, s, v components\n */\nexport function splitSignature(signature: string): {\n  r: string;\n  s: string;\n  v: number;\n} {\n  return ethers.Signature.from(signature);\n}\n\n/**\n * Join signature components into a signature string\n */\nexport function joinSignature(r: string, s: string, v: number): HexString {\n  const signature = ethers.Signature.from({ r, s, v });\n  return signature.serialized as HexString;\n}\n\n/**\n * Generate a UserOperation hash for signing\n */\nexport function getUserOpHash(\n  userOp: any,\n  entryPoint: Address,\n  chainId: number\n): HexString {\n  // Simplified UserOperation hash calculation\n  // In production, this should match the EntryPoint contract's hash calculation\n  const packed = ethers.solidityPacked(\n    ['address', 'uint256', 'bytes32', 'bytes32', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes32'],\n    [\n      userOp.sender,\n      userOp.nonce,\n      hashKeccak256(userOp.initCode),\n      hashKeccak256(userOp.callData),\n      userOp.callGasLimit,\n      userOp.verificationGasLimit,\n      userOp.preVerificationGas,\n      userOp.maxFeePerGas,\n      userOp.maxPriorityFeePerGas,\n      hashKeccak256(userOp.paymasterAndData),\n    ]\n  );\n  \n  const opHash = hashKeccak256(packed);\n  \n  // Add entryPoint and chainId\n  const finalPacked = ethers.solidityPacked(\n    ['bytes32', 'address', 'uint256'],\n    [opHash, entryPoint, chainId]\n  );\n  \n  return hashKeccak256(finalPacked);\n} ","import type { Address } from '../types';\n\n// ============================================================================\n// Network Constants\n// ============================================================================\n\n/**\n * Supported blockchain networks\n */\nexport const SUPPORTED_NETWORKS = {\n  ETHEREUM_MAINNET: {\n    chainId: 1,\n    name: 'Ethereum Mainnet',\n    rpcUrl: 'https://mainnet.infura.io/v3/',\n    explorerUrl: 'https://etherscan.io',\n    currency: 'ETH',\n    isTestnet: false,\n  },\n  ETHEREUM_SEPOLIA: {\n    chainId: 11155111,\n    name: 'Ethereum Sepolia',\n    rpcUrl: 'https://sepolia.infura.io/v3/',\n    explorerUrl: 'https://sepolia.etherscan.io',\n    currency: 'ETH',\n    isTestnet: true,\n  },\n  POLYGON_MAINNET: {\n    chainId: 137,\n    name: 'Polygon Mainnet',\n    rpcUrl: 'https://polygon-rpc.com',\n    explorerUrl: 'https://polygonscan.com',\n    currency: 'MATIC',\n    isTestnet: false,\n  },\n  POLYGON_MUMBAI: {\n    chainId: 80001,\n    name: 'Polygon Mumbai',\n    rpcUrl: 'https://rpc-mumbai.maticvigil.com',\n    explorerUrl: 'https://mumbai.polygonscan.com',\n    currency: 'MATIC',\n    isTestnet: true,\n  },\n  ARBITRUM_ONE: {\n    chainId: 42161,\n    name: 'Arbitrum One',\n    rpcUrl: 'https://arb1.arbitrum.io/rpc',\n    explorerUrl: 'https://arbiscan.io',\n    currency: 'ETH',\n    isTestnet: false,\n  },\n  ARBITRUM_SEPOLIA: {\n    chainId: 421614,\n    name: 'Arbitrum Sepolia',\n    rpcUrl: 'https://sepolia-rollup.arbitrum.io/rpc',\n    explorerUrl: 'https://sepolia.arbiscan.io',\n    currency: 'ETH',\n    isTestnet: true,\n  },\n  OPTIMISM_MAINNET: {\n    chainId: 10,\n    name: 'Optimism Mainnet',\n    rpcUrl: 'https://mainnet.optimism.io',\n    explorerUrl: 'https://optimistic.etherscan.io',\n    currency: 'ETH',\n    isTestnet: false,\n  },\n  OPTIMISM_SEPOLIA: {\n    chainId: 11155420,\n    name: 'Optimism Sepolia',\n    rpcUrl: 'https://sepolia.optimism.io',\n    explorerUrl: 'https://sepolia-optimistic.etherscan.io',\n    currency: 'ETH',\n    isTestnet: true,\n  },\n} as const;\n\n// ============================================================================\n// Contract Constants\n// ============================================================================\n\n/**\n * Standard ERC-4337 EntryPoint address (v0.6)\n */\nexport const ENTRYPOINT_ADDRESS_V06: Address = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789';\n\n/**\n * Default gas limits for various operations\n */\nexport const GAS_LIMITS = {\n  ACCOUNT_DEPLOYMENT: 1000000n,\n  SIMPLE_EXECUTION: 35000n,\n  MULTI_SIG_EXECUTION: 100000n,\n  VERIFICATION_GAS: 70000n,\n  PRE_VERIFICATION_GAS: 21000n,\n  PAYMASTER_VERIFICATION: 50000n,\n} as const;\n\n/**\n * Gas price constants (in wei)\n */\nexport const GAS_PRICES = {\n  MIN_GAS_PRICE: 1000000000n, // 1 gwei\n  MAX_GAS_PRICE: 1000000000000n, // 1000 gwei\n  DEFAULT_GAS_PRICE: 20000000000n, // 20 gwei\n} as const;\n\n/**\n * Contract addresses for supported networks\n */\nexport const UTILS_CONTRACT_ADDRESSES: Record<number, {\n  entryPoint: Address;\n  accountFactory: Address;\n  multiSigFactory: Address;\n  verifyingPaymaster: Address;\n}> = {\n  // Ethereum Sepolia\n  [SUPPORTED_NETWORKS.ETHEREUM_SEPOLIA.chainId]: {\n    entryPoint: ENTRYPOINT_ADDRESS_V06,\n    accountFactory: '0x9406Cc6185a346906296840746125a0E44976454' as Address,\n    multiSigFactory: '0x000000000000000000000000000000000000dEaD' as Address,\n    verifyingPaymaster: '0x000000000000000000000000000000000000dEaD' as Address,\n  },\n  // Polygon Mumbai\n  [SUPPORTED_NETWORKS.POLYGON_MUMBAI.chainId]: {\n    entryPoint: ENTRYPOINT_ADDRESS_V06,\n    accountFactory: '0x000000000000000000000000000000000000dEaD' as Address,\n    multiSigFactory: '0x000000000000000000000000000000000000dEaD' as Address,\n    verifyingPaymaster: '0x000000000000000000000000000000000000dEaD' as Address,\n  },\n};\n\n// ============================================================================\n// ZK Proof Constants\n// ============================================================================\n\n/**\n * Zero-knowledge proof system parameters\n */\nexport const UTILS_ZK_CONSTANTS = {\n  DEFAULT_CIRCUIT_K: 14,\n  MIN_CIRCUIT_K: 10,\n  MAX_CIRCUIT_K: 20,\n  MAX_INPUT_SIZE: 1024 * 1024, // 1MB\n  SHA256_HASH_SIZE: 32,\n  TARGET_PROOF_TIME_MS: 500,\n  MAX_PROOF_TIME_MS: 30000,\n  PROOF_CACHE_TTL_MS: 24 * 60 * 60 * 1000, // 24 hours\n} as const;\n\n// ============================================================================\n// Validation Constants\n// ============================================================================\n\n/**\n * Address validation patterns\n */\nexport const VALIDATION_PATTERNS = {\n  ETH_ADDRESS: /^0x[a-fA-F0-9]{40}$/,\n  HEX_STRING: /^0x[a-fA-F0-9]*$/,\n  TX_HASH: /^0x[a-fA-F0-9]{64}$/,\n  PRIVATE_KEY: /^0x[a-fA-F0-9]{64}$/,\n} as const;\n\n/**\n * Limits for various operations\n */\nexport const LIMITS = {\n  MAX_TRANSACTION_SIZE: 128 * 1024, // 128KB\n  MAX_BATCH_SIZE: 100,\n  MAX_SIGNERS: 20,\n  MIN_THRESHOLD: 1,\n  MAX_NONCE: 2n ** 256n - 1n,\n} as const;\n\n// ============================================================================\n// Error Messages\n// ============================================================================\n\n/**\n * Standard error messages\n */\nexport const ERROR_MESSAGES = {\n  INVALID_ADDRESS: 'Invalid Ethereum address',\n  INVALID_SIGNATURE: 'Invalid signature format',\n  INVALID_AMOUNT: 'Amount must be positive',\n  INSUFFICIENT_BALANCE: 'Insufficient balance for operation',\n  NETWORK_NOT_SUPPORTED: 'Network not supported',\n  TRANSACTION_FAILED: 'Transaction execution failed',\n  TIMEOUT_EXCEEDED: 'Operation timeout exceeded',\n  INVALID_CONFIGURATION: 'Invalid configuration provided',\n} as const;\n\n// ============================================================================\n// Time Constants\n// ============================================================================\n\n/**\n * Time-related constants (in seconds)\n */\nexport const TIME = {\n  SECOND: 1,\n  MINUTE: 60,\n  HOUR: 3600,\n  DAY: 86400,\n  WEEK: 604800,\n  MONTH: 2592000, // 30 days\n  YEAR: 31536000, // 365 days\n} as const;\n\n/**\n * Default timeouts (in milliseconds)\n */\nexport const TIMEOUTS = {\n  NETWORK_REQUEST: 10000, // 10 seconds\n  TRANSACTION_CONFIRMATION: 60000, // 1 minute\n  PROOF_GENERATION: 30000, // 30 seconds\n  CONTRACT_DEPLOYMENT: 120000, // 2 minutes\n} as const;\n\n// ============================================================================\n// Feature Flags\n// ============================================================================\n\n/**\n * Feature flags for optional functionality\n */\nexport const FEATURE_FLAGS = {\n  ENABLE_ZK_PROOFS: true,\n  ENABLE_GASLESS_TRANSACTIONS: true,\n  ENABLE_MULTI_SIG: true,\n  ENABLE_SOCIAL_RECOVERY: false, // Future feature\n  ENABLE_BATCH_TRANSACTIONS: true,\n  ENABLE_CROSS_CHAIN: false, // Future feature\n} as const;\n\n// ============================================================================\n// Version Information\n// ============================================================================\n\n/**\n * SDK version and compatibility information\n */\nexport const VERSION_INFO = {\n  SDK_VERSION: '0.1.0',\n  ERC_4337_VERSION: '0.6.0',\n  SUPPORTED_SOLIDITY_VERSION: '^0.8.25',\n  MIN_NODE_VERSION: '18.0.0',\n} as const;\n\n// ============================================================================\n// Development Constants\n// ============================================================================\n\n/**\n * Constants for development and testing\n */\nexport const DEV_CONSTANTS = {\n  LOCAL_CHAIN_ID: 31337,\n  LOCAL_RPC_URL: 'http://127.0.0.1:8545',\n  TEST_PRIVATE_KEY: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n  TEST_MNEMONIC: 'test test test test test test test test test test test junk',\n} as const; "]}