{"version":3,"sources":["../../src/server/constants/entrypoint.ts","../../src/server/config.ts","../../src/server/interfaces/logger.ts","../../src/server/providers/ethereum-provider.ts","../../src/server/services/account-manager.ts","../../src/server/services/paymaster-manager.ts","../../src/core/erc4337/utils.ts","../../src/server/services/transfer-manager.ts","../../src/core/bls/bls.manager.ts","../../src/server/services/bls-signature-service.ts","../../src/server/services/token-service.ts","../../src/server/services/wallet-manager.ts","../../src/server/server-client.ts","../../src/server/services/module-manager.ts","../../src/server/services/session-key-service.ts","../../src/server/services/guard-state-reader.ts","../../src/server/utils/oapd.ts","../../src/core/tier/types.ts","../../src/core/tier/tier-router.ts","../../src/server/services/guard-checker.ts","../../src/server/services/kms-signer.ts","../../src/server/adapters/memory-storage.ts","../../src/server/adapters/local-wallet-signer.ts"],"names":["EntryPointVersion","ethers","axios","bls"],"mappings":"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","file":"index.cjs","sourcesContent":["export enum EntryPointVersion {\n  V0_6 = \"0.6\",\n  V0_7 = \"0.7\",\n  V0_8 = \"0.8\",\n}\n\nexport interface EntryPointConfig {\n  version: EntryPointVersion;\n  address: string;\n  factoryAddress: string;\n  validatorAddress: string;\n}\n\n/** Default EntryPoint addresses (same on Sepolia, Mainnet, and OP Mainnet). */\nexport const ENTRYPOINT_ADDRESSES = {\n  [EntryPointVersion.V0_6]: {\n    sepolia: \"0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789\",\n    mainnet: \"0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789\",\n    optimism: \"0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789\",\n  },\n  [EntryPointVersion.V0_7]: {\n    sepolia: \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\",\n    mainnet: \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\",\n    optimism: \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\",\n  },\n  [EntryPointVersion.V0_8]: {\n    sepolia: \"0x0576a174D229E3cFA37253523E645A78A0C91B57\",\n    mainnet: \"0x0576a174D229E3cFA37253523E645A78A0C91B57\",\n    optimism: \"0x0576a174D229E3cFA37253523E645A78A0C91B57\",\n  },\n};\n\nexport const ENTRYPOINT_ABI_V6 = [\n  \"function simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes) userOp) external\",\n  \"function getNonce(address sender, uint192 key) external view returns (uint256 nonce)\",\n  \"function getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes) userOp) external view returns (bytes32)\",\n  \"function handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[] ops, address payable beneficiary) external\",\n];\n\nexport const ENTRYPOINT_ABI_V7_V8 = [\n  \"function simulateValidation((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes) packedUserOp) external\",\n  \"function getNonce(address sender, uint192 key) external view returns (uint256 nonce)\",\n  \"function getUserOpHash((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes) packedUserOp) external view returns (bytes32)\",\n  \"function handleOps((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)[] ops, address payable beneficiary) external\",\n];\n\nexport const FACTORY_ABI_V6 = [\n  \"function getAddress(address creator, address signer, address validator, bool useAAStarValidator, uint256 salt) view returns (address)\",\n  \"function createAccountWithAAStarValidator(address creator, address signer, address aaStarValidator, bool useAAStarValidator, uint256 salt) returns (address)\",\n];\n\nexport const FACTORY_ABI_V7_V8 = [\n  \"function getAddress(address creator, address signer, address validator, bool useAAStarValidator, uint256 salt) view returns (address)\",\n  \"function createAccount(address creator, address signer, address aaStarValidator, bool useAAStarValidator, uint256 salt) returns (address)\",\n];\n\nexport const ACCOUNT_ABI = [\n  \"function execute(address dest, uint256 value, bytes calldata func) external\",\n];\n\nexport const VALIDATOR_ABI = [\n  \"function getGasEstimate(uint256 nodeCount) external pure returns (uint256 gasEstimate)\",\n];\n\n// ── AirAccount Contract Addresses (Sepolia) ──────────────────────\n\nexport const AIRACCOUNT_ADDRESSES = {\n  sepolia: {\n    // M4 factory (legacy — 3-field InitConfig)\n    factoryM4: \"0x914db0a849f55e68a726c72fd02b7114b1176d88\",\n    // M5 factory r5 — 6-field InitConfig, guardian acceptance sigs required\n    factoryM5: \"0xd72a236d84be6c388a8bc7deb64afd54704ae385\",\n    // M7 factory r5 (prev) — defaultCommunityGuardian was address(0), do not use for new accounts\n    factoryM7r5Prev: \"0xa0007c5db27548d8c1582773856db1d123107383\",\n    // M7 factory r6 — defaultCommunityGuardian = team Safe 0x51eD...E114 (deployed 2026-03-29)\n    // BREAKING CHANGE: `.factory` now points to r6. Accounts created here have a new CREATE2 address.\n    factory: \"0x42f82d77f9cf940686b6a64a369245cb563e0e85\",\n    // M7 factory alias — use this to be explicit about targeting M7\n    factoryM7: \"0x42f82d77f9cf940686b6a64a369245cb563e0e85\",\n    // M7 account implementation r6 (shared by all clone proxies)\n    accountImpl: \"0x2F1B4EB63143D338bE78d0AF878B806f075080c1\",\n    validatorRouter: \"0x730a162Ce3202b94cC5B74181B75b11eBB3045B1\",\n    blsAlgorithm: \"0xc2096E8D04beb3C337bb388F5352710d62De0287\",\n    blsAggregator: \"0x7700aec8a15a94db5697c581de8c88ecf83b59ff\",\n    superPaymaster: \"0x16cE0c7d846f9446bbBeb9C5a84A4D140fAeD94A\",\n    // M7 r5 ERC-7579 modules (pre-installed by factory on every new account)\n    compositeValidator: \"0x4135c539fec5e200fe9762b721f6829b2315cbe1\",\n    tierGuardHook: \"0x73572e9e6138fd53465ee243e2fb4842cf86a787\",\n    agentSessionKeyValidator: \"0xa3e52db4b6e0a9d7cd5dd1414a90eedcf950e029\",\n    // M6 继承合约（M7 factory 仍可配合使用）\n    sessionKeyValidator: \"0xcaba5a18e46f728b5330ea33bd099693a1b76217\",\n    calldataParserRegistry: \"0x7099eb39fbab795e66dd71fbeaace150edf1b3c3\",\n    uniswapV3Parser: \"0x5671810ac8aa1857397870e60232579cfc519515\",\n  },\n};\n\n// ── AirAccount ABIs ──────────────────────────────────────────────\n\nexport const AIRACCOUNT_ABI = [\n  // ── Core execution ──\n  \"function execute(address dest, uint256 value, bytes calldata func) external\",\n  \"function executeBatch(address[] calldata dest, uint256[] calldata value, bytes[] calldata func) external\",\n  // ── ERC-7579 Module Management (M7.2) ──\n  \"function installModule(uint256 moduleTypeId, address module, bytes calldata initData) external\",\n  \"function uninstallModule(uint256 moduleTypeId, address module, bytes calldata deInitData) external\",\n  \"function executeFromExecutor(bytes32 mode, bytes calldata executionCalldata) external returns (bytes[] memory returnData)\",\n  // ── ERC-7579 Introspection ──\n  \"function accountId() external pure returns (string memory)\",\n  \"function supportsModule(uint256 moduleTypeId) external pure returns (bool)\",\n  \"function isModuleInstalled(uint256 moduleTypeId, address module, bytes calldata additionalContext) external view returns (bool)\",\n  // ── ERC-1271 / ERC-165 ──\n  \"function isValidSignature(bytes32 hash, bytes calldata sig) external view returns (bytes4)\",\n  \"function validateCompositeSignature(bytes32 hash, bytes calldata sig) external returns (uint256)\",\n  \"function supportsInterface(bytes4 interfaceId) external pure returns (bool)\",\n  // ── State readers ──\n  \"function owner() external view returns (address)\",\n  \"function entryPoint() external view returns (address)\",\n  \"function validator() external view returns (address)\",\n  \"function guard() external view returns (address)\",\n  \"function guardianCount() external view returns (uint8)\",\n  \"function p256KeyX() external view returns (bytes32)\",\n  \"function p256KeyY() external view returns (bytes32)\",\n  \"function getConfigDescription() external view returns (tuple(address accountOwner, address guardAddress, uint256 dailyLimit, uint256 dailyRemaining, uint256 tier1Limit, uint256 tier2Limit, address[3] guardianAddresses, uint8 guardianCount, bool hasP256Key, bool hasValidator, bool hasAggregator, bool hasActiveRecovery))\",\n  // ── Owner / key management ──\n  \"function setValidator(address _validator) external\",\n  \"function setP256Key(bytes32 _x, bytes32 _y) external\",\n  \"function setTierLimits(uint256 _tier1, uint256 _tier2) external\",\n  // ── Events ──\n  \"event ModuleInstalled(uint256 indexed moduleTypeId, address indexed module)\",\n  \"event ModuleUninstalled(uint256 indexed moduleTypeId, address indexed module)\",\n  \"event OwnerChanged(address indexed oldOwner, address indexed newOwner)\",\n  \"event RecoveryProposed(address indexed newOwner, address indexed proposedBy)\",\n  \"event RecoveryExecuted(address indexed oldOwner, address indexed newOwner)\",\n];\n\n// M7 factory ABI — ERC-7579 modules pre-installed, ERC-7828 chain-qualified addresses\n// InitConfig: (address[3] guardians, uint256 dailyLimit, uint8[] approvedAlgIds, uint256 minDailyLimit, address[] initialTokens, (uint256 tier1Limit, uint256 tier2Limit, uint256 dailyLimit)[] initialTokenConfigs)\nexport const AIRACCOUNT_FACTORY_ABI = [\n  // Full config creation\n  \"function createAccount(address owner, uint256 salt, (address[3] guardians, uint256 dailyLimit, uint8[] approvedAlgIds, uint256 minDailyLimit, address[] initialTokens, (uint256 tier1Limit, uint256 tier2Limit, uint256 dailyLimit)[] initialTokenConfigs) config) external returns (address)\",\n  \"function getAddress(address owner, uint256 salt, (address[3] guardians, uint256 dailyLimit, uint8[] approvedAlgIds, uint256 minDailyLimit, address[] initialTokens, (uint256 tier1Limit, uint256 tier2Limit, uint256 dailyLimit)[] initialTokenConfigs) config) external view returns (address)\",\n  // Default guardian setup (requires guardian acceptance sigs — M5.3+)\n  \"function createAccountWithDefaults(address owner, uint256 salt, address guardian1, bytes guardian1Sig, address guardian2, bytes guardian2Sig, uint256 dailyLimit) external returns (address)\",\n  \"function getAddressWithDefaults(address owner, uint256 salt, address guardian1, address guardian2, uint256 dailyLimit) external view returns (address)\",\n  // M7 immutable state\n  \"function implementation() external view returns (address)\",\n  \"function entryPoint() external view returns (address)\",\n  \"function defaultCommunityGuardian() external view returns (address)\",\n  \"function defaultValidatorModule() external view returns (address)\",\n  \"function defaultHookModule() external view returns (address)\",\n  // M7.4 ERC-7828 chain-qualified address helpers\n  \"function getChainQualifiedAddress(address account) external view returns (bytes32)\",\n  \"function getAddressWithChainId(address owner, uint256 salt, (address[3] guardians, uint256 dailyLimit, uint8[] approvedAlgIds, uint256 minDailyLimit, address[] initialTokens, (uint256 tier1Limit, uint256 tier2Limit, uint256 dailyLimit)[] initialTokenConfigs) config) external view returns (address account, bytes32 chainQualified)\",\n  // Events\n  \"event AccountCreated(address indexed account, address indexed owner, uint256 salt)\",\n];\n\nexport const GLOBAL_GUARD_ABI = [\n  \"function remainingDailyAllowance() external view returns (uint256)\",\n  \"function dailyLimit() external view returns (uint256)\",\n  \"function approvedAlgorithms(uint8 algId) external view returns (bool)\",\n  \"function account() external view returns (address)\",\n];\n\nexport const ERC20_ABI = [\n  \"function name() view returns (string)\",\n  \"function symbol() view returns (string)\",\n  \"function decimals() view returns (uint8)\",\n  \"function totalSupply() view returns (uint256)\",\n  \"function balanceOf(address owner) view returns (uint256)\",\n  \"function transfer(address to, uint256 amount) returns (bool)\",\n  \"function allowance(address owner, address spender) view returns (uint256)\",\n  \"function approve(address spender, uint256 amount) returns (bool)\",\n];\n\n// ── M7 Module ABIs ───────────────────────────────────────────────\n\n// AgentSessionKeyValidator — ERC-7579 Validator module for AI agent capability delegation.\n// Supports velocity limits, selector allowlists, spend caps, and hierarchical delegation chains.\nexport const AGENT_SESSION_KEY_VALIDATOR_ABI = [\n  // ERC-7579 lifecycle\n  \"function onInstall(bytes calldata data) external\",\n  \"function onUninstall(bytes calldata data) external\",\n  \"function isInitialized(address smartAccount) external view returns (bool)\",\n  // Session management\n  \"function grantAgentSession(address sessionKey, (uint48 expiry, uint16 velocityLimit, uint32 velocityWindow, address spendToken, uint256 spendCap, bool revoked, address[] callTargets, bytes4[] selectorAllowlist) cfg) external\",\n  \"function delegateSession(address subKey, (uint48 expiry, uint16 velocityLimit, uint32 velocityWindow, address spendToken, uint256 spendCap, bool revoked, address[] callTargets, bytes4[] selectorAllowlist) subCfg) external\",\n  \"function revokeAgentSession(address sessionKey) external\",\n  // Validation\n  \"function validateUserOp((address sender, uint256 nonce, bytes initCode, bytes callData, bytes32 accountGasLimits, uint256 preVerificationGas, bytes32 gasFees, bytes paymasterAndData, bytes signature) userOp, bytes32 userOpHash) external returns (uint256 validationData)\",\n  \"function isValidSignatureWithSender(address sender, bytes32 hash, bytes calldata data) external pure returns (bytes4)\",\n  // Enforcement\n  \"function enforceSessionScope(address account, address sessionKey, address callTarget, bytes4 selector) external view\",\n  \"function recordSpend(address account, address sessionKey, uint256 amount) external\",\n  // State readers\n  \"function agentSessions(address account, address sessionKey) external view returns (uint48 expiry, uint16 velocityLimit, uint32 velocityWindow, address spendToken, uint256 spendCap, bool revoked, address[] memory callTargets, bytes4[] memory selectorAllowlist)\",\n  \"function sessionStates(address account, address sessionKey) external view returns (uint256 callCount, uint256 windowStart, uint256 totalSpent)\",\n  \"function sessionKeyOwner(address sessionKey) external view returns (address)\",\n  \"function delegatedBy(address account, address subKey) external view returns (address parentKey)\",\n  // Events\n  \"event AgentSessionGranted(address indexed account, address indexed sessionKey, uint48 expiry)\",\n  \"event AgentSessionRevoked(address indexed account, address indexed sessionKey)\",\n  \"event AgentSessionDelegated(address indexed parentAccount, address indexed parentKey, address indexed subKey, uint48 expiry)\",\n];\n\n// TierGuardHook — ERC-7579 Hook module wrapping tier-based spending enforcement.\n// Enforces per-execution ETH/token tier limits via preCheck/postCheck hooks.\nexport const TIER_GUARD_HOOK_ABI = [\n  // ERC-7579 lifecycle\n  \"function onInstall(bytes calldata data) external\",\n  \"function onUninstall(bytes calldata data) external\",\n  \"function isInitialized(address smartAccount) external view returns (bool)\",\n  // ERC-7579 Hook interface\n  \"function preCheck(address msgSender, uint256 msgValue, bytes calldata msgData) external returns (bytes memory hookData)\",\n  \"function postCheck(bytes calldata hookData) external\",\n  // State readers\n  \"function accountGuard(address account) external view returns (address)\",\n  \"function accountTier1(address account) external view returns (uint256)\",\n  \"function accountTier2(address account) external view returns (uint256)\",\n];\n\n// AirAccountCompositeValidator — ERC-7579 Validator merging weighted + cumulative T2/T3 signature schemes.\n// Routes validation to the account's built-in algId dispatch via nonce-key routing.\nexport const AIR_ACCOUNT_COMPOSITE_VALIDATOR_ABI = [\n  // ERC-7579 lifecycle\n  \"function onInstall(bytes calldata data) external\",\n  \"function onUninstall(bytes calldata data) external\",\n  \"function isInitialized(address smartAccount) external view returns (bool)\",\n  // ERC-7579 Validator interface\n  \"function validateUserOp((address sender, uint256 nonce, bytes initCode, bytes callData, bytes32 accountGasLimits, uint256 preVerificationGas, bytes32 gasFees, bytes paymasterAndData, bytes signature) userOp, bytes32 userOpHash) external returns (uint256 validationData)\",\n  \"function isValidSignatureWithSender(address sender, bytes32 hash, bytes calldata data) external view returns (bytes4 magicValue)\",\n];\n\n// ForceExitModule — ERC-7579 Executor module for guardian-gated L2→L1 emergency withdrawals.\n// Requires 2-of-3 guardian approvals before executing the force exit.\nexport const FORCE_EXIT_MODULE_ABI = [\n  // ERC-7579 lifecycle\n  \"function onInstall(bytes calldata data) external\",\n  \"function onUninstall(bytes calldata data) external\",\n  \"function isInitialized(address smartAccount) external view returns (bool)\",\n  // Force exit flow\n  \"function proposeForceExit(address target, uint256 value, bytes calldata data) external\",\n  \"function approveForceExit(address account, bytes calldata guardianSig) external\",\n  \"function executeForceExit(address account) external\",\n  \"function cancelForceExit(address account) external\",\n  // State readers\n  \"function accountL2Type(address account) external view returns (uint8)\",\n  \"function getPendingExit(address account) external view returns (address target, uint256 value, bytes memory data, uint256 proposedAt, uint256 approvalBitmap, address[3] memory guardians)\",\n  // Events\n  \"event ExitProposed(address indexed account, address indexed target, uint256 value)\",\n  \"event ExitApproved(address indexed account, address indexed guardian, uint256 bitmap)\",\n  \"event ExitExecuted(address indexed account, address indexed target, uint256 value)\",\n  \"event ExitCancelled(address indexed account)\",\n];\n\n// ERC-7579 Module type IDs\nexport const MODULE_TYPE = {\n  VALIDATOR: 1,\n  EXECUTOR: 2,\n  HOOK: 3,\n} as const;\n\n// AirAccount algorithm IDs (algId values for signature dispatch)\nexport const ALG_ID = {\n  BLS: 0x01,\n  ECDSA: 0x02,\n  P256: 0x03,\n  CUMULATIVE_T2: 0x04,  // P256 + BLS\n  CUMULATIVE_T3: 0x05,  // P256 + BLS + Guardian ECDSA\n  COMBINED_T1: 0x06,    // P256 AND ECDSA simultaneously\n  WEIGHTED: 0x07,       // Weighted multi-signature\n  SESSION_KEY: 0x08,    // Time-limited session key (SessionKeyValidator)\n  AGENT_SESSION_KEY: 0x09, // AI agent session key (AgentSessionKeyValidator)\n} as const;\n\n// ── M6 继承合约 ABIs ─────────────────────────────────────────────\n\n// SessionKeyValidator — M6 基础 session key（algId=0x08）\n// 支持 ECDSA + P256 两种 session key，带合约/selector 作用域限制\nexport const SESSION_KEY_VALIDATOR_ABI = [\n  // ECDSA session key\n  \"function grantSession(address account, address sessionKey, uint48 expiry, address contractScope, bytes4 selectorScope, bytes calldata ownerSig) external\",\n  \"function grantSessionDirect(address account, address sessionKey, uint48 expiry, address contractScope, bytes4 selectorScope) external\",\n  \"function revokeSession(address account, address sessionKey) external\",\n  \"function isSessionActive(address account, address sessionKey) external view returns (bool)\",\n  \"function sessions(address account, address sessionKey) external view returns (uint48 expiry, address contractScope, bytes4 selectorScope, bool revoked)\",\n  \"function buildGrantHash(address account, address sessionKey, uint48 expiry, address contractScope, bytes4 selectorScope) external pure returns (bytes32)\",\n  // P256 session key\n  \"function grantP256Session(address account, bytes32 p256KeyX, bytes32 p256KeyY, uint48 expiry, address contractScope, bytes4 selectorScope, bytes calldata ownerSig) external\",\n  \"function grantP256SessionDirect(address account, bytes32 p256KeyX, bytes32 p256KeyY, uint48 expiry, address contractScope, bytes4 selectorScope) external\",\n  \"function revokeP256Session(address account, bytes32 p256KeyX, bytes32 p256KeyY) external\",\n  \"function isP256SessionActive(address account, bytes32 p256KeyX, bytes32 p256KeyY) external view returns (bool)\",\n  \"function getP256Session(address account, bytes32 p256KeyHash) external view returns (uint48 expiry, address contractScope, bytes4 selectorScope, bool revoked)\",\n  \"function buildP256GrantHash(address account, bytes32 p256KeyX, bytes32 p256KeyY, uint48 expiry, address contractScope, bytes4 selectorScope) external pure returns (bytes32)\",\n  // Events\n  \"event SessionGranted(address indexed account, address indexed sessionKey, uint48 expiry, address contractScope, bytes4 selectorScope)\",\n  \"event SessionRevoked(address indexed account, address indexed sessionKey)\",\n  \"event P256SessionGranted(address indexed account, bytes32 indexed p256KeyHash, uint48 expiry)\",\n  \"event P256SessionRevoked(address indexed account, bytes32 indexed p256KeyHash)\",\n];\n\n// CalldataParserRegistry — DeFi 协议解析器注册表\n// 让 guard 能识别 Uniswap/Railgun 等协议的 calldata，精确核算 token 消费\nexport const CALLDATA_PARSER_REGISTRY_ABI = [\n  \"function registerParser(address dest, address parser) external\",\n  \"function getParser(address dest) external view returns (address)\",\n  \"function transferOwnership(address newOwner) external\",\n  \"function parserFor(address dest) external view returns (address)\",\n  \"event ParserRegistered(address indexed dest, address indexed parser)\",\n  \"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)\",\n];\n\n// AirAccountDelegate — EIP-7702 EOA 委托为 AirAccount（M7 新增）\n// EOA 通过 EIP-7702 授权后，调用 initialize() 即获得 AirAccount 能力\nexport const AIR_ACCOUNT_DELEGATE_ABI = [\n  // EIP-7702 初始化（仅限 EOA 自身调用）\n  \"function initialize(address guardian1, bytes calldata g1Sig, address guardian2, bytes calldata g2Sig, uint256 dailyLimit) external\",\n  // ERC-4337 执行\n  \"function validateUserOp((address sender, uint256 nonce, bytes initCode, bytes callData, bytes32 accountGasLimits, uint256 preVerificationGas, bytes32 gasFees, bytes paymasterAndData, bytes signature) userOp, bytes32 userOpHash, uint256 missingAccountFunds) external returns (uint256)\",\n  \"function execute(address dest, uint256 value, bytes calldata data) external\",\n  \"function executeBatch(address[] calldata dest, uint256[] calldata value, bytes[] calldata data) external\",\n  // 社会恢复（Rescue，EIP-7702 术语避免与 AirAccount Recovery 混淆）\n  \"function initiateRescue(address rescueTo) external\",\n  \"function approveRescue() external\",\n  \"function executeRescue() external\",\n  // Events\n  \"event DelegateInitialized(address indexed eoa, address guard, address g1, address g2)\",\n  \"event RescueInitiated(address indexed eoa, address rescueTo, address indexed initiator)\",\n  \"event RescueApproved(address indexed eoa, address indexed guardian, uint8 approvals)\",\n  \"event RescueExecuted(address indexed eoa, address rescueTo, uint256 ethAmount)\",\n  \"event RescueCancelled(address indexed eoa)\",\n];\n","import { IStorageAdapter } from \"./interfaces/storage-adapter\";\nimport { ISignerAdapter } from \"./interfaces/signer-adapter\";\nimport { ILogger } from \"./interfaces/logger\";\nimport { AIRACCOUNT_ADDRESSES, ENTRYPOINT_ADDRESSES, EntryPointVersion } from \"./constants/entrypoint\";\n\n/**\n * Per-version EntryPoint configuration.\n */\nexport interface EntryPointVersionConfig {\n  entryPointAddress: string;\n  factoryAddress: string;\n  validatorAddress: string;\n}\n\n/**\n * Server SDK configuration — replaces NestJS ConfigService.\n */\nexport interface ServerConfig {\n  /** Main network RPC URL. */\n  rpcUrl: string;\n  /** Bundler RPC URL (e.g. Pimlico, StackUp). */\n  bundlerRpcUrl: string;\n  /** Chain ID of the target network. */\n  chainId: number;\n\n  /** EntryPoint configurations — at least one version must be provided. */\n  entryPoints: {\n    v06?: EntryPointVersionConfig;\n    v07?: EntryPointVersionConfig;\n    v08?: EntryPointVersionConfig;\n  };\n\n  /** Default EntryPoint version to use when not specified. */\n  defaultVersion?: \"0.6\" | \"0.7\" | \"0.8\";\n\n  /** BLS signer seed nodes for gossip discovery. */\n  blsSeedNodes?: string[];\n  /** Timeout for BLS node discovery in ms. */\n  blsDiscoveryTimeout?: number;\n\n  /** KMS endpoint URL (optional, for KMS-based signing). */\n  kmsEndpoint?: string;\n  /** Whether KMS signing is enabled. */\n  kmsEnabled?: boolean;\n  /** KMS API key for authenticated requests. */\n  kmsApiKey?: string;\n\n  /** Storage adapter (required). */\n  storage: IStorageAdapter;\n  /** Signer adapter (required). */\n  signer: ISignerAdapter;\n  /** Logger (optional, defaults to ConsoleLogger). */\n  logger?: ILogger;\n}\n\n/** AirAccount contract version selection. */\nexport type AirAccountVersion = \"M5\" | \"M7\";\n\n/**\n * Build a pre-configured EntryPointVersionConfig for Sepolia using a known AirAccount deployment.\n * Eliminates the need to look up contract addresses manually.\n *\n * @example\n * // Use M7 (default)\n * const config = { entryPoints: { v07: sepoliaV07Config() }, ... };\n *\n * // Use M5 legacy\n * const config = { entryPoints: { v07: sepoliaV07Config(\"M5\") }, ... };\n */\nexport function sepoliaV07Config(version: AirAccountVersion = \"M7\"): EntryPointVersionConfig {\n  const factoryAddress =\n    version === \"M5\"\n      ? AIRACCOUNT_ADDRESSES.sepolia.factoryM5\n      : AIRACCOUNT_ADDRESSES.sepolia.factory;\n\n  return {\n    entryPointAddress: ENTRYPOINT_ADDRESSES[EntryPointVersion.V0_7].sepolia,\n    factoryAddress,\n    validatorAddress: AIRACCOUNT_ADDRESSES.sepolia.validatorRouter,\n  };\n}\n\n/**\n * Validate a ServerConfig and throw descriptive errors for missing fields.\n */\nexport function validateConfig(config: ServerConfig): void {\n  if (!config.rpcUrl) {\n    throw new Error(\"ServerConfig: rpcUrl is required\");\n  }\n  if (!config.bundlerRpcUrl) {\n    throw new Error(\"ServerConfig: bundlerRpcUrl is required\");\n  }\n  if (!config.chainId) {\n    throw new Error(\"ServerConfig: chainId is required\");\n  }\n\n  const { entryPoints } = config;\n  if (!entryPoints || (!entryPoints.v06 && !entryPoints.v07 && !entryPoints.v08)) {\n    throw new Error(\"ServerConfig: at least one entryPoint version must be configured\");\n  }\n\n  for (const [key, ep] of Object.entries(entryPoints)) {\n    if (ep) {\n      if (!ep.entryPointAddress) {\n        throw new Error(`ServerConfig: entryPoints.${key}.entryPointAddress is required`);\n      }\n      if (!ep.factoryAddress) {\n        throw new Error(`ServerConfig: entryPoints.${key}.factoryAddress is required`);\n      }\n      if (!ep.validatorAddress) {\n        throw new Error(`ServerConfig: entryPoints.${key}.validatorAddress is required`);\n      }\n    }\n  }\n\n  if (!config.storage) {\n    throw new Error(\"ServerConfig: storage adapter is required\");\n  }\n  if (!config.signer) {\n    throw new Error(\"ServerConfig: signer adapter is required\");\n  }\n}\n","/**\n * Optional logger interface for server SDK.\n * Implement this to integrate with your application's logging framework.\n */\nexport interface ILogger {\n  debug(message: string, ...args: unknown[]): void;\n  log(message: string, ...args: unknown[]): void;\n  warn(message: string, ...args: unknown[]): void;\n  error(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Default console logger used when no custom logger is provided.\n */\nexport class ConsoleLogger implements ILogger {\n  constructor(private readonly prefix: string = \"[YAAA]\") {}\n\n  debug(message: string, ...args: unknown[]): void {\n    console.debug(`${this.prefix} ${message}`, ...args);\n  }\n\n  log(message: string, ...args: unknown[]): void {\n    console.log(`${this.prefix} ${message}`, ...args);\n  }\n\n  warn(message: string, ...args: unknown[]): void {\n    console.warn(`${this.prefix} ${message}`, ...args);\n  }\n\n  error(message: string, ...args: unknown[]): void {\n    console.error(`${this.prefix} ${message}`, ...args);\n  }\n}\n\n/**\n * Silent logger that suppresses all output.\n */\nexport class SilentLogger implements ILogger {\n  debug(): void {}\n  log(): void {}\n  warn(): void {}\n  error(): void {}\n}\n","import { ethers } from \"ethers\";\nimport { ServerConfig, EntryPointVersionConfig } from \"../config\";\nimport {\n  EntryPointVersion,\n  ENTRYPOINT_ABI_V6,\n  ENTRYPOINT_ABI_V7_V8,\n  FACTORY_ABI_V6,\n  AIRACCOUNT_FACTORY_ABI,\n  ACCOUNT_ABI,\n  AIRACCOUNT_ABI,\n  VALIDATOR_ABI,\n  AGENT_SESSION_KEY_VALIDATOR_ABI,\n  TIER_GUARD_HOOK_ABI,\n  AIR_ACCOUNT_COMPOSITE_VALIDATOR_ABI,\n  FORCE_EXIT_MODULE_ABI,\n  AIRACCOUNT_ADDRESSES,\n} from \"../constants/entrypoint\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\nimport { UserOperation, PackedUserOperation } from \"../../core/types\";\n\n/**\n * Unified Ethereum provider — replaces NestJS EthereumService.\n * Manages RPC + Bundler providers and contract interactions.\n */\nexport class EthereumProvider {\n  private readonly provider: ethers.JsonRpcProvider;\n  private readonly bundlerProvider: ethers.JsonRpcProvider;\n  private readonly config: ServerConfig;\n  private readonly logger: ILogger;\n\n  constructor(config: ServerConfig) {\n    this.config = config;\n    this.logger = config.logger ?? new ConsoleLogger(\"[EthereumProvider]\");\n    this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n    this.bundlerProvider = new ethers.JsonRpcProvider(config.bundlerRpcUrl);\n  }\n\n  getProvider(): ethers.JsonRpcProvider {\n    return this.provider;\n  }\n\n  getBundlerProvider(): ethers.JsonRpcProvider {\n    return this.bundlerProvider;\n  }\n\n  // ── Config helpers ──────────────────────────────────────────────\n\n  private getVersionConfig(version: EntryPointVersion): EntryPointVersionConfig {\n    const map: Record<EntryPointVersion, EntryPointVersionConfig | undefined> = {\n      [EntryPointVersion.V0_6]: this.config.entryPoints.v06,\n      [EntryPointVersion.V0_7]: this.config.entryPoints.v07,\n      [EntryPointVersion.V0_8]: this.config.entryPoints.v08,\n    };\n    const versionConfig = map[version];\n    if (!versionConfig) {\n      throw new Error(`EntryPoint version ${version} is not configured`);\n    }\n    return versionConfig;\n  }\n\n  getEntryPointAddress(version: EntryPointVersion): string {\n    return this.getVersionConfig(version).entryPointAddress;\n  }\n\n  getFactoryAddress(version: EntryPointVersion): string {\n    return this.getVersionConfig(version).factoryAddress;\n  }\n\n  getValidatorAddress(version: EntryPointVersion): string {\n    return this.getVersionConfig(version).validatorAddress;\n  }\n\n  getDefaultVersion(): EntryPointVersion {\n    const v = this.config.defaultVersion;\n    if (v === \"0.7\") return EntryPointVersion.V0_7;\n    if (v === \"0.8\") return EntryPointVersion.V0_8;\n    return EntryPointVersion.V0_6;\n  }\n\n  // ── Contract factories ──────────────────────────────────────────\n\n  getFactoryContract(version: EntryPointVersion = EntryPointVersion.V0_6): ethers.Contract {\n    const address = this.getFactoryAddress(version);\n    const abi = version === EntryPointVersion.V0_6 ? FACTORY_ABI_V6 : AIRACCOUNT_FACTORY_ABI;\n    return new ethers.Contract(address, abi, this.provider);\n  }\n\n  getEntryPointContract(version: EntryPointVersion = EntryPointVersion.V0_6): ethers.Contract {\n    const address = this.getEntryPointAddress(version);\n    const abi = version === EntryPointVersion.V0_6 ? ENTRYPOINT_ABI_V6 : ENTRYPOINT_ABI_V7_V8;\n    return new ethers.Contract(address, abi, this.provider);\n  }\n\n  getValidatorContract(version: EntryPointVersion = EntryPointVersion.V0_6): ethers.Contract {\n    const address = this.getValidatorAddress(version);\n    return new ethers.Contract(address, VALIDATOR_ABI, this.provider);\n  }\n\n  getAccountContract(address: string): ethers.Contract {\n    return new ethers.Contract(address, AIRACCOUNT_ABI, this.provider);\n  }\n\n  // ── M7 Module contracts ─────────────────────────────────────────\n\n  getAgentSessionKeyValidatorContract(address: string = AIRACCOUNT_ADDRESSES.sepolia.agentSessionKeyValidator): ethers.Contract {\n    return new ethers.Contract(address, AGENT_SESSION_KEY_VALIDATOR_ABI, this.provider);\n  }\n\n  getTierGuardHookContract(address: string = AIRACCOUNT_ADDRESSES.sepolia.tierGuardHook): ethers.Contract {\n    return new ethers.Contract(address, TIER_GUARD_HOOK_ABI, this.provider);\n  }\n\n  getCompositeValidatorContract(address: string = AIRACCOUNT_ADDRESSES.sepolia.compositeValidator): ethers.Contract {\n    return new ethers.Contract(address, AIR_ACCOUNT_COMPOSITE_VALIDATOR_ABI, this.provider);\n  }\n\n  getForceExitModuleContract(address: string): ethers.Contract {\n    return new ethers.Contract(address, FORCE_EXIT_MODULE_ABI, this.provider);\n  }\n\n  // ── On-chain queries ────────────────────────────────────────────\n\n  async getBalance(address: string): Promise<string> {\n    const balance = await this.provider.getBalance(address);\n    return ethers.formatEther(balance);\n  }\n\n  async getNonce(\n    accountAddress: string,\n    key: number = 0,\n    version: EntryPointVersion = EntryPointVersion.V0_6\n  ): Promise<bigint> {\n    const entryPoint = this.getEntryPointContract(version);\n    return await entryPoint.getNonce(accountAddress, key);\n  }\n\n  async getUserOpHash(\n    userOp: UserOperation | PackedUserOperation,\n    version: EntryPointVersion = EntryPointVersion.V0_6\n  ): Promise<string> {\n    const entryPoint = this.getEntryPointContract(version);\n\n    if (version === EntryPointVersion.V0_6) {\n      const op = userOp as UserOperation;\n      const userOpArray = [\n        op.sender,\n        op.nonce,\n        op.initCode || \"0x\",\n        op.callData,\n        op.callGasLimit,\n        op.verificationGasLimit,\n        op.preVerificationGas,\n        op.maxFeePerGas,\n        op.maxPriorityFeePerGas,\n        op.paymasterAndData || \"0x\",\n        \"0x\", // Always use empty signature for hash calculation\n      ];\n      return await entryPoint.getUserOpHash(userOpArray);\n    } else {\n      const packedOp = userOp as PackedUserOperation;\n      const packedOpArray = [\n        packedOp.sender,\n        packedOp.nonce,\n        packedOp.initCode || \"0x\",\n        packedOp.callData,\n        packedOp.accountGasLimits,\n        packedOp.preVerificationGas,\n        packedOp.gasFees,\n        packedOp.paymasterAndData || \"0x\",\n        \"0x\",\n      ];\n      return await entryPoint.getUserOpHash(packedOpArray);\n    }\n  }\n\n  // ── Bundler RPC ─────────────────────────────────────────────────\n\n  async estimateUserOperationGas(\n    userOp: unknown,\n    version: EntryPointVersion = EntryPointVersion.V0_6\n  ): Promise<{ callGasLimit: string; verificationGasLimit: string; preVerificationGas: string }> {\n    try {\n      return await this.bundlerProvider.send(\"eth_estimateUserOperationGas\", [\n        userOp,\n        this.getEntryPointAddress(version),\n      ]);\n    } catch {\n      return {\n        callGasLimit: \"0x249f0\",\n        verificationGasLimit: \"0x3d0900\", // 4M — enough for M4 factory deployment + BLS verification\n        preVerificationGas: \"0x11170\",\n      };\n    }\n  }\n\n  async sendUserOperation(\n    userOp: unknown,\n    version: EntryPointVersion = EntryPointVersion.V0_6\n  ): Promise<string> {\n    return await this.bundlerProvider.send(\"eth_sendUserOperation\", [\n      userOp,\n      this.getEntryPointAddress(version),\n    ]);\n  }\n\n  async getUserOperationReceipt(userOpHash: string): Promise<unknown> {\n    return await this.bundlerProvider.send(\"eth_getUserOperationReceipt\", [userOpHash]);\n  }\n\n  async waitForUserOp(userOpHash: string, maxAttempts: number = 60): Promise<string> {\n    const pollInterval = 2000;\n\n    for (let attempt = 0; attempt < maxAttempts; attempt++) {\n      try {\n        const receipt = (await this.getUserOperationReceipt(userOpHash)) as Record<\n          string,\n          unknown\n        > | null;\n        if (receipt) {\n          const txHash =\n            (receipt.transactionHash as string) ||\n            ((receipt.receipt as Record<string, unknown>)?.transactionHash as string);\n          if (txHash) return txHash;\n        }\n      } catch {\n        // Continue polling\n      }\n      await new Promise(resolve => setTimeout(resolve, pollInterval));\n    }\n\n    throw new Error(`UserOp timeout: ${userOpHash}`);\n  }\n\n  async getUserOperationGasPrice(): Promise<{\n    maxFeePerGas: string;\n    maxPriorityFeePerGas: string;\n  }> {\n    try {\n      const gasPrice = await this.bundlerProvider.send(\"pimlico_getUserOperationGasPrice\", []);\n      return {\n        maxFeePerGas: gasPrice.fast.maxFeePerGas,\n        maxPriorityFeePerGas: gasPrice.fast.maxPriorityFeePerGas,\n      };\n    } catch {\n      try {\n        const feeData = await this.provider.getFeeData();\n        const baseFee = feeData.maxFeePerGas || ethers.parseUnits(\"20\", \"gwei\");\n        const priorityFee = feeData.maxPriorityFeePerGas || ethers.parseUnits(\"2\", \"gwei\");\n        const maxFeePerGas = (baseFee * 3n) / 2n;\n        const maxPriorityFeePerGas = (priorityFee * 3n) / 2n;\n        return {\n          maxFeePerGas: \"0x\" + maxFeePerGas.toString(16),\n          maxPriorityFeePerGas: \"0x\" + maxPriorityFeePerGas.toString(16),\n        };\n      } catch {\n        return {\n          maxFeePerGas: \"0x\" + ethers.parseUnits(\"3\", \"gwei\").toString(16),\n          maxPriorityFeePerGas: \"0x\" + ethers.parseUnits(\"1\", \"gwei\").toString(16),\n        };\n      }\n    }\n  }\n}\n","import { ethers } from \"ethers\";\nimport { EthereumProvider } from \"../providers/ethereum-provider\";\nimport { IStorageAdapter, AccountRecord } from \"../interfaces/storage-adapter\";\nimport { ISignerAdapter } from \"../interfaces/signer-adapter\";\nimport { EntryPointVersion, AIRACCOUNT_FACTORY_ABI } from \"../constants/entrypoint\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\n\n/**\n * Account manager — extracted from NestJS AccountService.\n * Creates and retrieves smart accounts without framework dependencies.\n */\nexport class AccountManager {\n  private readonly logger: ILogger;\n\n  constructor(\n    private readonly ethereum: EthereumProvider,\n    private readonly storage: IStorageAdapter,\n    private readonly signer: ISignerAdapter,\n    logger?: ILogger\n  ) {\n    this.logger = logger ?? new ConsoleLogger(\"[AccountManager]\");\n  }\n\n  async createAccount(\n    userId: string,\n    options?: {\n      entryPointVersion?: EntryPointVersion;\n      salt?: number;\n      /** Daily transfer limit in wei. When > 0 the account is created with on-chain guard enforcement. */\n      dailyLimit?: bigint;\n    }\n  ): Promise<AccountRecord> {\n    const version = options?.entryPointVersion ?? this.ethereum.getDefaultVersion();\n    const versionStr = version as string;\n\n    // Check for existing account with this version\n    const existingAccounts = await this.storage.getAccounts();\n    const existing = existingAccounts.find(\n      a => a.userId === userId && a.entryPointVersion === versionStr\n    );\n    if (existing) return existing;\n\n    const factory = this.ethereum.getFactoryContract(version);\n    const validatorAddress =\n      ((this.ethereum.getValidatorContract(version) as ethers.BaseContract).target as string) ||\n      this.ethereum.getValidatorAddress(version);\n\n    // Ensure signer wallet exists\n    const { address: signerAddress } = await this.signer.ensureSigner(userId);\n    const salt = options?.salt ?? Math.floor(Math.random() * 1000000);\n\n    // Predict account address using M5 factory (createAccount with minimal config).\n    // When dailyLimit > 0, write it into the config so the account is guard-enabled at deployment.\n    const dailyLimitValue = options?.dailyLimit ?? 0n;\n    const minimalConfig = [\n      [ethers.ZeroAddress, ethers.ZeroAddress, ethers.ZeroAddress], // guardians (address[3])\n      dailyLimitValue, // dailyLimit (0 = no guard)\n      [], // approvedAlgIds\n      0n, // minDailyLimit\n      [], // initialTokens\n      [], // initialTokenConfigs\n    ];\n    const accountAddress = await factory.getFunction(\"getAddress\")(signerAddress, salt, minimalConfig);\n\n    // Check deployment status\n    let deployed = false;\n    try {\n      const code = await this.ethereum.getProvider().getCode(accountAddress);\n      deployed = code !== \"0x\";\n    } catch {\n      // Assume not deployed\n    }\n\n    const account: AccountRecord = {\n      userId,\n      address: accountAddress,\n      signerAddress,\n      salt,\n      deployed,\n      deploymentTxHash: null,\n      validatorAddress,\n      entryPointVersion: versionStr,\n      factoryAddress: (factory.target as string) || this.ethereum.getFactoryAddress(version),\n      createdAt: new Date().toISOString(),\n      // Persist dailyLimit so buildUserOperation can reconstruct identical initCode at deploy time.\n      ...(dailyLimitValue > 0n ? { dailyLimit: dailyLimitValue.toString() } : {}),\n    };\n\n    await this.storage.saveAccount(account);\n    return account;\n  }\n\n  async getAccount(\n    userId: string\n  ): Promise<(AccountRecord & { balance: string; nonce: string }) | null> {\n    const account = await this.storage.findAccountByUserId(userId);\n    if (!account) return null;\n\n    let balance = \"0\";\n    try {\n      balance = await this.ethereum.getBalance(account.address);\n    } catch {\n      // Use default\n    }\n\n    const version = (account.entryPointVersion || \"0.6\") as unknown as EntryPointVersion;\n    const nonce = await this.ethereum.getNonce(account.address, 0, version);\n\n    return { ...account, balance, nonce: nonce.toString() };\n  }\n\n  async getAccountAddress(userId: string): Promise<string> {\n    const account = await this.storage.findAccountByUserId(userId);\n    if (!account) throw new Error(\"Account not found\");\n    return account.address;\n  }\n\n  async getAccountBalance(\n    userId: string\n  ): Promise<{ address: string; balance: string; balanceInWei: string }> {\n    const account = await this.storage.findAccountByUserId(userId);\n    if (!account) throw new Error(\"Account not found\");\n    const balance = await this.ethereum.getBalance(account.address);\n    return {\n      address: account.address,\n      balance,\n      balanceInWei: ethers.parseEther(balance).toString(),\n    };\n  }\n\n  async getAccountNonce(userId: string): Promise<{ address: string; nonce: string }> {\n    const account = await this.storage.findAccountByUserId(userId);\n    if (!account) throw new Error(\"Account not found\");\n    const nonce = await this.ethereum.getNonce(account.address);\n    return { address: account.address, nonce: nonce.toString() };\n  }\n\n  async getAccountByUserId(userId: string): Promise<AccountRecord | null> {\n    return this.storage.findAccountByUserId(userId);\n  }\n\n  /**\n   * Build the acceptance hash that guardian devices must sign before account creation.\n   *\n   * Encoding: keccak256(solidityPacked(\n   *   [\"string\",\"uint256\",\"address\",\"address\",\"uint256\"],\n   *   [\"ACCEPT_GUARDIAN\", chainId, factoryAddress, owner, salt]\n   * ))\n   * Total packed bytes: 13 + 32 + 20 + 20 + 32 = 117 bytes\n   *\n   * Returns the RAW keccak256 hash (no EIP-191 prefix).\n   * Guardians MUST sign via personal_sign / ethers.signMessage(ethers.getBytes(hash)).\n   * Do NOT use eth_sign — the EIP-191 \"\\x19Ethereum Signed Message:\\n32\" prefix\n   * is applied inside the contract (toEthSignedMessageHash) before ecrecover, not here.\n   *\n   * @returns raw hex keccak256 hash — encode this into the QR code shown to guardian devices\n   */\n  buildGuardianAcceptanceHash(\n    owner: string,\n    salt: number,\n    factoryAddress: string,\n    chainId: number\n  ): string {\n    return ethers.keccak256(\n      ethers.solidityPacked(\n        [\"string\", \"uint256\", \"address\", \"address\", \"uint256\"],\n        [\"ACCEPT_GUARDIAN\", chainId, factoryAddress, owner, salt]\n      )\n    );\n  }\n\n  /**\n   * Create an AirAccount with 3 on-chain guardians:\n   *   - guardian1 and guardian2: user's own devices (passkeys on phone 1 and phone 2)\n   *   - guardian3: team Safe multisig (defaultCommunityGuardian, set in factory at deploy time)\n   *\n   * Both guardian1 and guardian2 must sign the acceptance hash produced by\n   * buildGuardianAcceptanceHash() before this method is called.\n   *\n   * Recovery: any 2-of-3 guardians can initiate social recovery after a 48h timelock.\n   */\n  async createAccountWithGuardians(\n    userId: string,\n    params: {\n      guardian1: string;\n      guardian1Sig: string;\n      guardian2: string;\n      guardian2Sig: string;\n      dailyLimit: bigint;\n      salt?: number;\n      entryPointVersion?: EntryPointVersion;\n    }\n  ): Promise<AccountRecord> {\n    if (params.guardian1.toLowerCase() === params.guardian2.toLowerCase()) {\n      throw new Error(\"guardian1 and guardian2 must be different addresses\");\n    }\n    if (params.dailyLimit <= 0n) {\n      throw new Error(\"Guardian accounts require dailyLimit > 0 (on-chain enforcement)\");\n    }\n\n    const version = params.entryPointVersion ?? this.ethereum.getDefaultVersion();\n    if (version === EntryPointVersion.V0_6) {\n      throw new Error(\n        \"createAccountWithGuardians requires EntryPoint v0.7 or v0.8; \" +\n          \"v0.6 factory does not support getAddressWithDefaults\"\n      );\n    }\n    const versionStr = version as string;\n\n    const existingAccounts = await this.storage.getAccounts();\n    const existing = existingAccounts.find(\n      a => a.userId === userId && a.entryPointVersion === versionStr && a.guardian1\n    );\n    if (existing) return existing;\n\n    const { address: signerAddress } = await this.signer.ensureSigner(userId);\n    const salt = params.salt ?? Math.floor(Math.random() * 1000000);\n\n    const factory = this.ethereum.getFactoryContract(version);\n    const factoryAddress = (factory.target as string) ?? this.ethereum.getFactoryAddress(version);\n\n    const accountAddress = await factory.getFunction(\"getAddressWithDefaults\")(\n      signerAddress,\n      salt,\n      params.guardian1,\n      params.guardian2,\n      params.dailyLimit\n    );\n\n    let deployed = false;\n    try {\n      const code = await this.ethereum.getProvider().getCode(accountAddress);\n      deployed = code !== \"0x\";\n    } catch {\n      // Assume not deployed\n    }\n\n    const validatorAddress = this.ethereum.getValidatorAddress(version);\n    const account: AccountRecord = {\n      userId,\n      address: accountAddress,\n      signerAddress,\n      salt,\n      deployed,\n      deploymentTxHash: null,\n      validatorAddress,\n      entryPointVersion: versionStr,\n      factoryAddress,\n      createdAt: new Date().toISOString(),\n      // Persist dailyLimit so transfer-manager can reconstruct identical initCode at deploy time.\n      ...(params.dailyLimit > 0n ? { dailyLimit: params.dailyLimit.toString() } : {}),\n      // Persist guardian addresses and sigs so transfer-manager can use createAccountWithDefaults\n      // to reconstruct the correct initCode on first UserOp deployment.\n      guardian1: params.guardian1,\n      guardian1Sig: params.guardian1Sig,\n      guardian2: params.guardian2,\n      guardian2Sig: params.guardian2Sig,\n    };\n\n    await this.storage.saveAccount(account);\n    this.logger.log(`[AccountManager] account created with guardians: ${accountAddress}`);\n    return account;\n  }\n}\n","import { ethers } from \"ethers\";\nimport { EthereumProvider } from \"../providers/ethereum-provider\";\nimport { IStorageAdapter, PaymasterRecord } from \"../interfaces/storage-adapter\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\n\n/**\n * Thrown when a paymaster's on-chain price cache is stale.\n * Caller should invoke `paymasterManager.updatePrice(paymasterAddress)` before retrying.\n */\nexport class PaymasterPriceStalenessError extends Error {\n  constructor(\n    public readonly paymasterAddress: string,\n    public readonly ageSeconds: number,\n    public readonly thresholdSeconds: number\n  ) {\n    super(\n      `Paymaster ${paymasterAddress} price is stale ` +\n        `(age: ${Math.floor(ageSeconds / 60)}min, threshold: ${Math.floor(thresholdSeconds / 60)}min). ` +\n        `Call updatePrice() on the paymaster contract before retrying.`\n    );\n    this.name = \"PaymasterPriceStalenessError\";\n  }\n}\n\nconst PAYMASTER_PRICE_ABI = [\n  \"function token() view returns (address)\",\n  \"function cachedPriceTimestamp() view returns (uint256)\",\n  \"function priceStalenessThreshold() view returns (uint256)\",\n  \"function updatePrice() external\",\n];\n\n/**\n * Paymaster manager — extracted from NestJS PaymasterService.\n * Storage via IStorageAdapter instead of filesystem JSON files.\n */\nexport class PaymasterManager {\n  private readonly logger: ILogger;\n\n  constructor(\n    private readonly ethereum: EthereumProvider,\n    private readonly storage: IStorageAdapter,\n    logger?: ILogger\n  ) {\n    this.logger = logger ?? new ConsoleLogger(\"[PaymasterManager]\");\n  }\n\n  async getAvailablePaymasters(\n    userId: string\n  ): Promise<{ name: string; address: string; configured: boolean }[]> {\n    const paymasters = await this.storage.getPaymasters(userId);\n    return paymasters.map(config => ({\n      name: config.name,\n      address: config.address,\n      configured: !!config.address && config.address !== \"0x\",\n    }));\n  }\n\n  async addCustomPaymaster(\n    userId: string,\n    name: string,\n    address: string,\n    type: \"pimlico\" | \"stackup\" | \"alchemy\" | \"custom\" = \"custom\",\n    apiKey?: string,\n    endpoint?: string\n  ): Promise<void> {\n    const paymaster: PaymasterRecord = {\n      id: `${userId}-${name}-${Date.now()}`,\n      name,\n      address,\n      type,\n      apiKey,\n      endpoint,\n      createdAt: new Date().toISOString(),\n    };\n    await this.storage.savePaymaster(userId, paymaster);\n  }\n\n  async removeCustomPaymaster(userId: string, name: string): Promise<boolean> {\n    return this.storage.removePaymaster(userId, name);\n  }\n\n  /**\n   * Check whether a paymaster's on-chain price cache is still fresh.\n   * Returns `{ fresh, ageSeconds, thresholdSeconds }`.\n   * Throws if the contract does not implement `cachedPriceTimestamp()` / `priceStalenessThreshold()`.\n   */\n  async checkPriceFreshness(paymasterAddress: string): Promise<{\n    fresh: boolean;\n    ageSeconds: number;\n    thresholdSeconds: number;\n  }> {\n    const provider = this.ethereum.getProvider();\n    const contract = new ethers.Contract(paymasterAddress, PAYMASTER_PRICE_ABI, provider);\n    const [timestamp, threshold] = await Promise.all([\n      contract.cachedPriceTimestamp() as Promise<bigint>,\n      contract.priceStalenessThreshold() as Promise<bigint>,\n    ]);\n    const nowSeconds = Math.floor(Date.now() / 1000);\n    const ageSeconds = nowSeconds - Number(timestamp);\n    const thresholdSeconds = Number(threshold);\n    return {\n      fresh: ageSeconds <= thresholdSeconds,\n      ageSeconds,\n      thresholdSeconds,\n    };\n  }\n\n  /**\n   * Call `updatePrice()` on a paymaster contract (permissionless).\n   * Useful when `checkPriceFreshness()` reports stale price.\n   *\n   * @param signer - An ethers Signer that will send the transaction (must have gas).\n   */\n  async updatePrice(paymasterAddress: string, signer: ethers.Signer): Promise<string> {\n    const contract = new ethers.Contract(paymasterAddress, PAYMASTER_PRICE_ABI, signer);\n    const tx = await contract.updatePrice({ gasLimit: 300000 });\n    await tx.wait();\n    this.logger.log(`Paymaster ${paymasterAddress} price updated, tx: ${tx.hash}`);\n    return tx.hash as string;\n  }\n\n  async getPaymasterData(\n    userId: string,\n    paymasterName: string,\n    userOp: unknown,\n    entryPoint: string,\n    customAddress?: string,\n    options?: { tokenAddress?: string }\n  ): Promise<string> {\n    // Handle custom user-provided paymaster addresses\n    if (paymasterName === \"custom-user-provided\" && customAddress) {\n      const formattedAddress = customAddress.toLowerCase().startsWith(\"0x\")\n        ? customAddress\n        : `0x${customAddress}`;\n\n      if (!/^0x[a-fA-F0-9]{40}$/.test(formattedAddress)) {\n        throw new Error(`Invalid paymaster address format: ${customAddress}`);\n      }\n\n      const isV07OrV08 =\n        entryPoint.toLowerCase() === \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\".toLowerCase() ||\n        entryPoint.toLowerCase() === \"0x0576a174D229E3cFA37253523E645A78A0C91B57\".toLowerCase();\n\n      if (isV07OrV08) {\n        const provider = this.ethereum.getProvider();\n\n        // Detect SuperPaymaster vs PaymasterV4\n        let isSuperPaymaster = false;\n        let operatorAddress = \"0x\";\n        try {\n          const spContract = new ethers.Contract(\n            formattedAddress,\n            [\n              \"function owner() view returns (address)\",\n              \"function operators(address) view returns (bool,uint256,address,uint256)\",\n            ],\n            provider\n          );\n          const owner = await spContract.owner();\n          const opInfo = await spContract.operators(owner);\n          if (opInfo && opInfo[0] === true) {\n            isSuperPaymaster = true;\n            operatorAddress = owner;\n            this.logger.log(`SuperPaymaster detected, operator: ${operatorAddress}`);\n          }\n        } catch {\n          /* not SuperPaymaster */\n        }\n\n        if (isSuperPaymaster) {\n          const verGas = BigInt(80000);\n          const postGas = BigInt(100000);\n          const maxRate = (BigInt(1) << BigInt(256)) - BigInt(1);\n          return ethers.concat([\n            formattedAddress,\n            ethers.zeroPadValue(ethers.toBeHex(verGas), 16),\n            ethers.zeroPadValue(ethers.toBeHex(postGas), 16),\n            operatorAddress,\n            ethers.zeroPadValue(ethers.toBeHex(maxRate), 32),\n          ]);\n        }\n\n        // PaymasterV4 deposit model: paymasterData contains the ERC-20 token address\n        // that the user pays gas with (20 bytes appended after the gas limits).\n        // Auto-detect via token() on the contract; fall back to empty if not available.\n        const paymasterVerificationGasLimit = BigInt(0x30000);\n        const paymasterPostOpGasLimit = BigInt(0x30000);\n\n        let tokenAddress: string | null = options?.tokenAddress ?? null;\n        if (tokenAddress) {\n          this.logger.log(`PaymasterV4 token from options: ${tokenAddress}`);\n        } else {\n          try {\n            const pmContract = new ethers.Contract(\n              formattedAddress,\n              PAYMASTER_PRICE_ABI,\n              provider\n            );\n            tokenAddress = await pmContract.token();\n            if (tokenAddress === ethers.ZeroAddress) tokenAddress = null;\n            if (tokenAddress) {\n              this.logger.log(`PaymasterV4 token auto-detected: ${tokenAddress}`);\n            }\n          } catch {\n            this.logger.log(`PaymasterV4 token() not available, paymasterData will have no token`);\n          }\n        }\n\n        const parts: string[] = [\n          formattedAddress,\n          ethers.zeroPadValue(ethers.toBeHex(paymasterVerificationGasLimit), 16),\n          ethers.zeroPadValue(ethers.toBeHex(paymasterPostOpGasLimit), 16),\n        ];\n        if (tokenAddress) {\n          parts.push(tokenAddress);\n        }\n        return ethers.concat(parts);\n      }\n\n      return formattedAddress;\n    }\n\n    const paymasters = await this.storage.getPaymasters(userId);\n    const config = paymasters.find(p => p.name === paymasterName);\n    if (!config) {\n      throw new Error(`Paymaster ${paymasterName} not found`);\n    }\n\n    switch (config.type) {\n      case \"pimlico\":\n        if (!config.apiKey) return \"0x\";\n        return this.getPimlicoPaymasterData(config, userOp, entryPoint);\n      case \"stackup\":\n        if (!config.apiKey) return \"0x\";\n        return this.getStackUpPaymasterData(config, userOp, entryPoint);\n      case \"alchemy\":\n        if (!config.apiKey) return \"0x\";\n        return this.getAlchemyPaymasterData(config, userOp, entryPoint);\n      case \"custom\":\n        if (\n          config.address.toLowerCase() ===\n            \"0x0000000000325602a77416A16136FDafd04b299f\".toLowerCase() &&\n          config.apiKey\n        ) {\n          return this.getPimlicoPaymasterData(\n            { ...config, type: \"pimlico\", endpoint: \"https://api.pimlico.io/v2/11155111/rpc\" },\n            userOp,\n            entryPoint\n          );\n        }\n        return config.address;\n      default:\n        return \"0x\";\n    }\n  }\n\n  private async getPimlicoPaymasterData(\n    config: PaymasterRecord,\n    userOp: unknown,\n    entryPoint: string\n  ): Promise<string> {\n    const url = `${config.endpoint}?apikey=${config.apiKey}`;\n    const response = await globalThis.fetch(url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({\n        jsonrpc: \"2.0\",\n        method: \"pm_sponsorUserOperation\",\n        params: [userOp, entryPoint, {}],\n        id: 1,\n      }),\n    });\n\n    const result = (await response.json()) as {\n      error?: { message?: string };\n      result?: {\n        paymasterAndData?: string;\n        paymaster?: string;\n        paymasterVerificationGasLimit?: string;\n        paymasterPostOpGasLimit?: string;\n        paymasterData?: string;\n      };\n    };\n\n    if (result.error) {\n      throw new Error(\n        `Pimlico sponsorship failed: ${result.error.message || JSON.stringify(result.error)}`\n      );\n    }\n\n    if (result.result) {\n      if (result.result.paymasterAndData) {\n        return result.result.paymasterAndData;\n      }\n      if (result.result.paymaster) {\n        return ethers.concat([\n          result.result.paymaster,\n          ethers.zeroPadValue(\n            ethers.toBeHex(BigInt(result.result.paymasterVerificationGasLimit || \"0x30000\")),\n            16\n          ),\n          ethers.zeroPadValue(\n            ethers.toBeHex(BigInt(result.result.paymasterPostOpGasLimit || \"0x30000\")),\n            16\n          ),\n          result.result.paymasterData || \"0x\",\n        ]);\n      }\n    }\n\n    throw new Error(\"Pimlico API did not return valid paymaster data\");\n  }\n\n  private async getStackUpPaymasterData(\n    config: PaymasterRecord,\n    userOp: unknown,\n    entryPoint: string\n  ): Promise<string> {\n    try {\n      const response = await globalThis.fetch(`${config.endpoint}/${config.apiKey}`, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({\n          jsonrpc: \"2.0\",\n          method: \"pm_sponsorUserOperation\",\n          params: { userOperation: userOp, entryPoint, context: { type: \"payg\" } },\n          id: 1,\n        }),\n      });\n      const result = (await response.json()) as { error?: unknown; result?: string };\n      if (result.error) return \"0x\";\n      return result.result || \"0x\";\n    } catch {\n      return \"0x\";\n    }\n  }\n\n  private async getAlchemyPaymasterData(\n    config: PaymasterRecord,\n    userOp: unknown,\n    entryPoint: string\n  ): Promise<string> {\n    try {\n      const response = await globalThis.fetch(`${config.endpoint}/${config.apiKey}`, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({\n          jsonrpc: \"2.0\",\n          method: \"alchemy_requestGasAndPaymasterAndData\",\n          params: [{ policyId: \"default\", entryPoint, userOperation: userOp }],\n          id: 1,\n        }),\n      });\n      const result = (await response.json()) as {\n        error?: unknown;\n        result?: { paymasterAndData?: string };\n      };\n      if (result.error) return \"0x\";\n      return result.result?.paymasterAndData || \"0x\";\n    } catch {\n      return \"0x\";\n    }\n  }\n}\n","import type { PackedUserOperation } from \"../types\";\n\nexport class ERC4337Utils {\n  static packAccountGasLimits(\n    verificationGasLimit: bigint | string,\n    callGasLimit: bigint | string\n  ): string {\n    const vgl = BigInt(verificationGasLimit);\n    const cgl = BigInt(callGasLimit);\n    const packed = (vgl << 128n) | cgl;\n    return \"0x\" + packed.toString(16).padStart(64, \"0\");\n  }\n\n  static unpackAccountGasLimits(accountGasLimits: string): {\n    verificationGasLimit: bigint;\n    callGasLimit: bigint;\n  } {\n    const packed = BigInt(accountGasLimits);\n    return {\n      verificationGasLimit: packed >> 128n,\n      callGasLimit: packed & ((1n << 128n) - 1n),\n    };\n  }\n\n  static packGasFees(maxPriorityFeePerGas: bigint | string, maxFeePerGas: bigint | string): string {\n    const priority = BigInt(maxPriorityFeePerGas);\n    const max = BigInt(maxFeePerGas);\n    const packed = (priority << 128n) | max;\n    return \"0x\" + packed.toString(16).padStart(64, \"0\");\n  }\n\n  static unpackGasFees(gasFees: string): {\n    maxPriorityFeePerGas: bigint;\n    maxFeePerGas: bigint;\n  } {\n    const packed = BigInt(gasFees);\n    return {\n      maxPriorityFeePerGas: packed >> 128n,\n      maxFeePerGas: packed & ((1n << 128n) - 1n),\n    };\n  }\n\n  static packUserOperation(userOp: any): PackedUserOperation {\n    return {\n      sender: userOp.sender,\n      nonce: userOp.nonce,\n      initCode: userOp.initCode || \"0x\",\n      callData: userOp.callData,\n      accountGasLimits: ERC4337Utils.packAccountGasLimits(\n        userOp.verificationGasLimit,\n        userOp.callGasLimit\n      ),\n      preVerificationGas: userOp.preVerificationGas,\n      gasFees: ERC4337Utils.packGasFees(userOp.maxPriorityFeePerGas, userOp.maxFeePerGas),\n      paymasterAndData: userOp.paymasterAndData || \"0x\",\n      signature: userOp.signature || \"0x\",\n    };\n  }\n\n  static unpackUserOperation(packedOp: PackedUserOperation): any {\n    const gasLimits = ERC4337Utils.unpackAccountGasLimits(packedOp.accountGasLimits);\n    const gasFees = ERC4337Utils.unpackGasFees(packedOp.gasFees);\n\n    return {\n      sender: packedOp.sender,\n      nonce: packedOp.nonce,\n      initCode: packedOp.initCode,\n      callData: packedOp.callData,\n      callGasLimit: \"0x\" + gasLimits.callGasLimit.toString(16),\n      verificationGasLimit: \"0x\" + gasLimits.verificationGasLimit.toString(16),\n      preVerificationGas: packedOp.preVerificationGas,\n      maxFeePerGas: \"0x\" + gasFees.maxFeePerGas.toString(16),\n      maxPriorityFeePerGas: \"0x\" + gasFees.maxPriorityFeePerGas.toString(16),\n      paymasterAndData: packedOp.paymasterAndData,\n      signature: packedOp.signature,\n    };\n  }\n}\n","import { ethers } from \"ethers\";\nimport { EthereumProvider } from \"../providers/ethereum-provider\";\nimport { AccountManager } from \"./account-manager\";\nimport { BLSSignatureService } from \"./bls-signature-service\";\nimport { GuardChecker } from \"./guard-checker\";\nimport { PaymasterManager } from \"./paymaster-manager\";\nimport { TokenService } from \"./token-service\";\nimport { IStorageAdapter } from \"../interfaces/storage-adapter\";\nimport { ISignerAdapter, PasskeyAssertionContext } from \"../interfaces/signer-adapter\";\nimport { LegacyPasskeyAssertion } from \"./kms-signer\";\nimport { EntryPointVersion } from \"../constants/entrypoint\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\nimport { PaymasterPriceStalenessError } from \"./paymaster-manager\";\nimport { UserOperation, PackedUserOperation } from \"../../core/types\";\nimport { ERC4337Utils } from \"../../core/erc4337\";\nimport { TierLevel } from \"../../core/tier\";\n\n// ── Public DTOs ───────────────────────────────────────────────────\n\nexport interface ExecuteTransferParams {\n  to: string;\n  amount: string;\n  data?: string;\n  tokenAddress?: string;\n  usePaymaster?: boolean;\n  paymasterAddress?: string;\n  paymasterData?: string;\n  /** ERC-20 token address for deposit-pull paymasters (e.g. PMv4) that require\n   *  the gas token address appended to paymasterData. Used when the paymaster\n   *  contract does not expose a public token() getter for auto-detection. */\n  paymasterTokenAddress?: string;\n  passkeyAssertion?: LegacyPasskeyAssertion;\n  /** P256 passkey signature (64 bytes hex). Required for AirAccount Tier 2/3. */\n  p256Signature?: string;\n  /** Guardian ethers.Signer instance. Required for AirAccount Tier 3. */\n  guardianSigner?: ethers.Signer;\n  /** Enable AirAccount tiered signature routing. Default: false (legacy BLS-only). */\n  useAirAccountTiering?: boolean;\n}\n\nexport interface EstimateGasParams {\n  to: string;\n  amount: string;\n  data?: string;\n  tokenAddress?: string;\n}\n\nexport interface TransferResult {\n  success: boolean;\n  transferId: string;\n  userOpHash: string;\n  status: string;\n  message: string;\n  from: string;\n  to: string;\n  amount: string;\n}\n\n// ── Helper to generate UUID-like IDs without external dependency ──\n\nfunction generateId(): string {\n  const hex = () => Math.random().toString(16).slice(2, 10);\n  return `${hex()}${hex()}-${hex()}-${hex()}-${hex()}-${hex()}${hex()}${hex()}`;\n}\n\n/**\n * Transfer manager — extracted from NestJS TransferService.\n * No passkey verification: callers are responsible for their own auth.\n */\nexport class TransferManager {\n  private readonly logger: ILogger;\n\n  private readonly guardChecker: GuardChecker | null;\n\n  constructor(\n    private readonly ethereum: EthereumProvider,\n    private readonly accountManager: AccountManager,\n    private readonly blsService: BLSSignatureService,\n    private readonly paymasterManager: PaymasterManager,\n    private readonly tokenService: TokenService,\n    private readonly storage: IStorageAdapter,\n    private readonly signer: ISignerAdapter,\n    logger?: ILogger,\n    guardChecker?: GuardChecker\n  ) {\n    this.logger = logger ?? new ConsoleLogger(\"[TransferManager]\");\n    this.guardChecker = guardChecker ?? null;\n  }\n\n  async executeTransfer(userId: string, params: ExecuteTransferParams): Promise<TransferResult> {\n    // Get user's account\n    const account = await this.accountManager.getAccountByUserId(userId);\n    if (!account) throw new Error(\"User account not found\");\n\n    // Check deployment\n    const code = await this.ethereum.getProvider().getCode(account.address);\n    const needsDeployment = code === \"0x\";\n    if (needsDeployment) {\n      this.logger.log(\"Account needs deployment, will deploy with first transaction\");\n    }\n\n    // Balance validation\n    const smartAccountBalance = parseFloat(await this.ethereum.getBalance(account.address));\n    const isTokenTransfer = !!params.tokenAddress;\n    const transferAmount = isTokenTransfer ? 0 : parseFloat(params.amount);\n\n    if (!params.usePaymaster) {\n      const minRequiredBalance = 0.0002;\n      const totalNeeded = transferAmount + minRequiredBalance;\n      if (smartAccountBalance < totalNeeded) {\n        throw new Error(\n          `Insufficient balance: Account has ${smartAccountBalance} ETH but needs ${totalNeeded} ETH`\n        );\n      }\n    } else if (!isTokenTransfer && transferAmount > smartAccountBalance) {\n      throw new Error(\n        `Insufficient balance: Account has ${smartAccountBalance} ETH but trying to send ${transferAmount} ETH`\n      );\n    }\n\n    const version = (account.entryPointVersion || \"0.6\") as unknown as EntryPointVersion;\n\n    // Build UserOperation\n    const userOp = await this.buildUserOperation(\n      userId,\n      account.address,\n      params.to,\n      params.amount,\n      params.data || \"0x\",\n      params.usePaymaster,\n      params.paymasterAddress,\n      params.paymasterData,\n      params.tokenAddress,\n      version,\n      params.paymasterTokenAddress\n    );\n\n    // Get hash\n    const userOpHash = await this.ethereum.getUserOpHash(userOp, version);\n\n    // Ensure wallet exists\n    await this.signer.ensureSigner(userId);\n\n    // BLS signature (pass assertion context for KMS-backed signing)\n    const assertionCtx: PasskeyAssertionContext | undefined = params.passkeyAssertion\n      ? { assertion: params.passkeyAssertion }\n      : undefined;\n\n    // M4 accounts: check if validator is set; if not, use ECDSA instead of BLS\n    let useECDSA = false;\n    if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {\n      try {\n        const provider = this.ethereum.getProvider();\n        const accountCode = await provider.getCode(account.address);\n        if (accountCode === \"0x\") {\n          useECDSA = true;\n        } else {\n          const acc = new ethers.Contract(\n            account.address,\n            [\"function validator() view returns (address)\"],\n            provider\n          );\n          const v = await acc.validator();\n          if (v === ethers.ZeroAddress) useECDSA = true;\n        }\n      } catch {\n        useECDSA = true;\n      }\n    }\n\n    if (useECDSA) {\n      // M4 ECDSA path: raw 65-byte sig, no validator needed\n      this.logger.log(\"M4: using ECDSA signature (validator not set)\");\n      const signer = await this.signer.getSigner(userId, assertionCtx);\n      const ecdsaSig = await signer.signMessage(ethers.getBytes(userOpHash));\n      userOp.signature = ecdsaSig;\n    } else if (params.useAirAccountTiering && this.guardChecker) {\n      // AirAccount tiered signature routing\n      const transferValue = params.tokenAddress ? 0n : ethers.parseEther(params.amount);\n      const preCheck = await this.guardChecker.preCheck(account.address, transferValue);\n\n      if (!preCheck.ok) {\n        throw new Error(`Guard pre-check failed: ${preCheck.errors.join(\"; \")}`);\n      }\n\n      this.logger.log(\n        `Tier ${preCheck.tier} selected (algId=0x${preCheck.algId.toString(16).padStart(2, \"0\")})`\n      );\n\n      userOp.signature = await this.blsService.generateTieredSignature({\n        tier: preCheck.tier as TierLevel,\n        userId,\n        userOpHash,\n        p256Signature: params.p256Signature,\n        guardianSigner: params.guardianSigner,\n        ctx: assertionCtx,\n      });\n    } else {\n      // BLS triple signature with algId 0x01 prefix for M4 account routing\n      const blsData = await this.blsService.generateBLSSignature(userId, userOpHash, assertionCtx);\n      const packedBls = await this.blsService.packSignature(blsData);\n      // Prepend algId=0x01 byte for M4 _validateSignature routing\n      userOp.signature = \"0x01\" + packedBls.slice(2);\n    }\n\n    // Create transfer record\n    const transferId = generateId();\n    let tokenSymbol = \"ETH\";\n    if (params.tokenAddress) {\n      try {\n        const tokenInfo = await this.tokenService.getTokenInfo(params.tokenAddress);\n        tokenSymbol = tokenInfo.symbol;\n      } catch {\n        tokenSymbol = `${params.tokenAddress.slice(0, 6)}...${params.tokenAddress.slice(-4)}`;\n      }\n    }\n\n    await this.storage.saveTransfer({\n      id: transferId,\n      userId,\n      from: account.address,\n      to: params.to,\n      amount: params.amount,\n      data: params.data,\n      userOpHash,\n      status: \"pending\",\n      nodeIndices: [],\n      createdAt: new Date().toISOString(),\n      tokenAddress: params.tokenAddress,\n      tokenSymbol,\n    });\n\n    // Process asynchronously\n    this.processTransferAsync(transferId, userOp, account.address, version);\n\n    return {\n      success: true,\n      transferId,\n      userOpHash,\n      status: \"pending\",\n      message: \"Transfer submitted successfully. Use transferId to check status.\",\n      from: account.address,\n      to: params.to,\n      amount: params.amount,\n    };\n  }\n\n  private async processTransferAsync(\n    transferId: string,\n    userOp: UserOperation | PackedUserOperation,\n    from: string,\n    version: EntryPointVersion\n  ): Promise<void> {\n    try {\n      const formatted = this.formatUserOpForBundler(userOp, version);\n      const bundlerUserOpHash = await this.ethereum.sendUserOperation(formatted, version);\n\n      await this.storage.updateTransfer(transferId, {\n        bundlerUserOpHash,\n        status: \"submitted\",\n        submittedAt: new Date().toISOString(),\n      } as Partial<import(\"../interfaces/storage-adapter\").TransferRecord>);\n\n      const txHash = await this.ethereum.waitForUserOp(bundlerUserOpHash);\n\n      await this.storage.updateTransfer(transferId, {\n        transactionHash: txHash,\n        status: \"completed\",\n        completedAt: new Date().toISOString(),\n      } as Partial<import(\"../interfaces/storage-adapter\").TransferRecord>);\n\n      // Update deployment status if first tx\n      const code = await this.ethereum.getProvider().getCode(from);\n      if (code !== \"0x\") {\n        const account = (await this.storage.getAccounts()).find(a => a.address === from);\n        if (account && !account.deployed) {\n          await this.storage.updateAccount(account.userId, {\n            deployed: true,\n            deploymentTxHash: txHash,\n          });\n        }\n      }\n    } catch (error: unknown) {\n      let message = error instanceof Error ? error.message : String(error);\n\n      // Translate bundler \"expires too soon\" into a structured PaymasterPriceStalenessError\n      // so callers can detect and handle stale paymaster price without string-matching.\n      if (\n        message.includes(\"expires too soon\") ||\n        message.includes(\"AA32\") ||\n        message.includes(\"paymaster deposit not locked\")\n      ) {\n        const validUntilMatch = message.match(/validUntil=(\\d+)/);\n        const hint = validUntilMatch\n          ? ` (validUntil=${validUntilMatch[1]}, expired ${Math.floor(Date.now() / 1000) - Number(validUntilMatch[1])}s ago)`\n          : \"\";\n        message =\n          `Paymaster price is stale${hint}. ` +\n          `Call paymasterManager.checkPriceFreshness(paymasterAddress) to diagnose, ` +\n          `then paymasterManager.updatePrice(paymasterAddress, signer) to refresh. ` +\n          `Original error: ${message}`;\n        error = new PaymasterPriceStalenessError(\n          \"unknown\" /* paymasterAddress not available here */,\n          0,\n          0\n        );\n        (error as PaymasterPriceStalenessError & { message: string }).message = message;\n      }\n\n      await this.storage.updateTransfer(transferId, {\n        status: \"failed\",\n        error: message,\n        failedAt: new Date().toISOString(),\n      } as Partial<import(\"../interfaces/storage-adapter\").TransferRecord>);\n      this.logger.error(`Transfer ${transferId} failed: ${message}`);\n    }\n  }\n\n  async estimateGas(userId: string, params: EstimateGasParams) {\n    const account = await this.accountManager.getAccountByUserId(userId);\n    if (!account) throw new Error(\"User account not found\");\n\n    const version = (account.entryPointVersion || \"0.6\") as unknown as EntryPointVersion;\n\n    const userOp = await this.buildUserOperation(\n      userId,\n      account.address,\n      params.to,\n      params.amount,\n      params.data || \"0x\",\n      false,\n      undefined,\n      undefined,\n      params.tokenAddress,\n      version\n    );\n\n    const formatted = this.formatUserOpForBundler(userOp, version);\n    const gasEstimates = await this.ethereum.estimateUserOperationGas(formatted, version);\n    const gasPrices = await this.ethereum.getUserOperationGasPrice();\n\n    const validatorContract = this.ethereum.getValidatorContract(version);\n    const validatorGasEstimate = await validatorContract.getGasEstimate(3);\n\n    return {\n      callGasLimit: gasEstimates.callGasLimit,\n      verificationGasLimit: gasEstimates.verificationGasLimit,\n      preVerificationGas: gasEstimates.preVerificationGas,\n      validatorGasEstimate: validatorGasEstimate.toString(),\n      totalGasEstimate: (\n        BigInt(gasEstimates.callGasLimit) +\n        BigInt(gasEstimates.verificationGasLimit) +\n        BigInt(gasEstimates.preVerificationGas)\n      ).toString(),\n      maxFeePerGas: gasPrices.maxFeePerGas,\n      maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas,\n    };\n  }\n\n  async getTransferStatus(userId: string, transferId: string) {\n    const transfer = await this.storage.findTransferById(transferId);\n    if (!transfer || transfer.userId !== userId) {\n      throw new Error(\"Transfer not found\");\n    }\n\n    const response: Record<string, unknown> = { ...transfer };\n\n    if (transfer.status === \"pending\" || transfer.status === \"submitted\") {\n      const elapsed = Math.floor((Date.now() - new Date(transfer.createdAt).getTime()) / 1000);\n      response.elapsedSeconds = elapsed;\n    }\n\n    if (transfer.transactionHash) {\n      response.explorerUrl = `https://sepolia.etherscan.io/tx/${transfer.transactionHash}`;\n    }\n\n    const statusDescriptions: Record<string, string> = {\n      pending: \"Preparing transaction and generating signatures\",\n      submitted: \"Transaction submitted to bundler, waiting for confirmation\",\n      completed: \"Transaction confirmed on chain\",\n      failed: \"Transaction failed\",\n    };\n    response.statusDescription = statusDescriptions[transfer.status] || transfer.status;\n\n    return response;\n  }\n\n  async getTransferHistory(userId: string, page = 1, limit = 10) {\n    const transfers = await this.storage.findTransfersByUserId(userId);\n    if (!transfers || transfers.length === 0) {\n      return { transfers: [], total: 0, page, limit, totalPages: 0 };\n    }\n\n    transfers.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n    const start = (page - 1) * limit;\n    const paginated = transfers.slice(start, start + limit);\n\n    return {\n      transfers: paginated,\n      total: transfers.length,\n      page,\n      limit,\n      totalPages: Math.ceil(transfers.length / limit),\n    };\n  }\n\n  // ── Private helpers ─────────────────────────────────────────────\n\n  private async buildUserOperation(\n    userId: string,\n    sender: string,\n    to: string,\n    amount: string,\n    data: string,\n    usePaymaster?: boolean,\n    paymasterAddress?: string,\n    _paymasterData?: string,\n    tokenAddress?: string,\n    version: EntryPointVersion = EntryPointVersion.V0_6,\n    paymasterTokenAddress?: string\n  ): Promise<UserOperation | PackedUserOperation> {\n    const accountContract = this.ethereum.getAccountContract(sender);\n    const nonce = await this.ethereum.getNonce(sender, 0, version);\n\n    // initCode for deployment\n    const provider = this.ethereum.getProvider();\n    const code = await provider.getCode(sender);\n    const needsDeployment = code === \"0x\";\n\n    let initCode = \"0x\";\n    if (needsDeployment) {\n      const accounts = await this.storage.getAccounts();\n      const account = accounts.find(a => a.address === sender);\n      if (account) {\n        const factory = this.ethereum.getFactoryContract(version);\n        const factoryAddress = await factory.getAddress();\n\n        let deployCalldata: string;\n        if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {\n          const storedDailyLimit = account.dailyLimit ? BigInt(account.dailyLimit) : 0n;\n          if (account.guardian1 && account.guardian2 && account.guardian1Sig && account.guardian2Sig) {\n            // Guardian account: use createAccountWithDefaults so the factory-computed address\n            // matches the stored sender (which was predicted via getAddressWithDefaults).\n            // ethers.js v6: bytes params require 0x-prefixed hex — guard against missing prefix.\n            const sig1 = account.guardian1Sig.startsWith(\"0x\")\n              ? account.guardian1Sig\n              : `0x${account.guardian1Sig}`;\n            const sig2 = account.guardian2Sig.startsWith(\"0x\")\n              ? account.guardian2Sig\n              : `0x${account.guardian2Sig}`;\n            deployCalldata = factory.interface.encodeFunctionData(\"createAccountWithDefaults\", [\n              account.signerAddress,\n              account.salt,\n              account.guardian1,\n              sig1,\n              account.guardian2,\n              sig2,\n              storedDailyLimit,\n            ]);\n          } else {\n            // Standard account: createAccount with zero guardians and stored dailyLimit.\n            const minimalConfig = [\n              [ethers.ZeroAddress, ethers.ZeroAddress, ethers.ZeroAddress], // guardians (address[3])\n              storedDailyLimit,\n              [], // approvedAlgIds\n              0n, // minDailyLimit\n              [], // initialTokens\n              [], // initialTokenConfigs\n            ];\n            deployCalldata = factory.interface.encodeFunctionData(\"createAccount\", [\n              account.signerAddress,\n              account.salt,\n              minimalConfig,\n            ]);\n          }\n        } else {\n          deployCalldata = factory.interface.encodeFunctionData(\n            \"createAccountWithAAStarValidator\",\n            [\n              account.signerAddress,\n              account.signerAddress,\n              account.validatorAddress,\n              true,\n              account.salt,\n            ]\n          );\n        }\n\n        initCode = ethers.concat([factoryAddress, deployCalldata]);\n      }\n    }\n\n    // callData\n    let callData: string;\n    if (tokenAddress) {\n      const tokenInfo = await this.tokenService.getTokenInfo(tokenAddress);\n      const transferCalldata = this.tokenService.generateTransferCalldata(\n        to,\n        amount,\n        tokenInfo.decimals\n      );\n      callData = accountContract.interface.encodeFunctionData(\"execute\", [\n        tokenAddress,\n        0,\n        transferCalldata,\n      ]);\n    } else {\n      callData = accountContract.interface.encodeFunctionData(\"execute\", [\n        to,\n        ethers.parseEther(amount),\n        data,\n      ]);\n    }\n\n    const gasPrices = await this.ethereum.getUserOperationGasPrice();\n\n    const isV07 = version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8;\n\n    let baseUserOp: Record<string, unknown>;\n    if (isV07) {\n      // v0.7/v0.8: use factory/factoryData and separate paymaster fields\n      let factory: string | undefined;\n      let factoryData: string | undefined;\n      if (initCode && initCode !== \"0x\" && initCode.length > 2) {\n        factory = initCode.slice(0, 42);\n        factoryData = initCode.length > 42 ? \"0x\" + initCode.slice(42) : \"0x\";\n      }\n      baseUserOp = {\n        sender,\n        nonce: \"0x\" + nonce.toString(16),\n        ...(factory ? { factory, factoryData } : {}),\n        callData,\n        callGasLimit: \"0x0\",\n        verificationGasLimit: \"0x0\",\n        preVerificationGas: \"0x0\",\n        maxFeePerGas: gasPrices.maxFeePerGas,\n        maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas,\n        signature: \"0x\",\n      };\n    } else {\n      // v0.6: use initCode and paymasterAndData\n      baseUserOp = {\n        sender,\n        nonce: \"0x\" + nonce.toString(16),\n        initCode,\n        callData,\n        callGasLimit: \"0x0\",\n        verificationGasLimit: \"0x0\",\n        preVerificationGas: \"0x0\",\n        maxFeePerGas: gasPrices.maxFeePerGas,\n        maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas,\n        paymasterAndData: \"0x\",\n        signature: \"0x\",\n      };\n    }\n\n    // Paymaster\n    let paymasterAndData = \"0x\";\n    if (usePaymaster) {\n      if (paymasterAddress) {\n        const entryPoint = this.ethereum.getEntryPointAddress(version);\n        paymasterAndData = await this.paymasterManager.getPaymasterData(\n          userId,\n          \"custom-user-provided\",\n          baseUserOp,\n          entryPoint,\n          paymasterAddress,\n          paymasterTokenAddress ? { tokenAddress: paymasterTokenAddress } : undefined\n        );\n      } else {\n        const available = await this.paymasterManager.getAvailablePaymasters(userId);\n        const configured = available.find(pm => pm.configured);\n        if (configured) {\n          const entryPoint = this.ethereum.getEntryPointAddress(version);\n          paymasterAndData = await this.paymasterManager.getPaymasterData(\n            userId,\n            configured.name,\n            baseUserOp,\n            entryPoint\n          );\n        } else {\n          throw new Error(\"No paymaster configured and no paymaster address provided\");\n        }\n      }\n\n      if (!paymasterAndData || paymasterAndData === \"0x\") {\n        throw new Error(\n          `Paymaster failed to provide sponsorship data. The paymaster at ${paymasterAddress} may not be configured correctly.`\n        );\n      }\n\n      if (isV07) {\n        // For v0.7, split paymasterAndData into separate fields on the baseUserOp\n        baseUserOp.paymaster = paymasterAndData.slice(0, 42);\n        if (paymasterAndData.length >= 74) {\n          baseUserOp.paymasterVerificationGasLimit =\n            \"0x\" + BigInt(\"0x\" + paymasterAndData.slice(42, 74)).toString(16);\n        }\n        if (paymasterAndData.length >= 106) {\n          baseUserOp.paymasterPostOpGasLimit =\n            \"0x\" + BigInt(\"0x\" + paymasterAndData.slice(74, 106)).toString(16);\n        }\n        if (paymasterAndData.length > 106) {\n          baseUserOp.paymasterData = \"0x\" + paymasterAndData.slice(106);\n        }\n      } else {\n        baseUserOp.paymasterAndData = paymasterAndData;\n      }\n    }\n\n    // Gas estimation\n    const gasEstimates = await this.ethereum.estimateUserOperationGas(baseUserOp, version);\n\n    const standardUserOp: UserOperation = {\n      sender,\n      nonce,\n      initCode,\n      callData,\n      callGasLimit: BigInt(gasEstimates.callGasLimit),\n      verificationGasLimit: BigInt(gasEstimates.verificationGasLimit),\n      preVerificationGas: BigInt(gasEstimates.preVerificationGas),\n      maxFeePerGas: BigInt(gasPrices.maxFeePerGas),\n      maxPriorityFeePerGas: BigInt(gasPrices.maxPriorityFeePerGas),\n      paymasterAndData,\n      signature: \"0x\",\n    };\n\n    if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {\n      return ERC4337Utils.packUserOperation(standardUserOp);\n    }\n\n    return standardUserOp;\n  }\n\n  private formatUserOpForBundler(\n    userOp: UserOperation | PackedUserOperation,\n    version: EntryPointVersion = EntryPointVersion.V0_6\n  ): Record<string, unknown> {\n    if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {\n      const packedOp = userOp as PackedUserOperation;\n      const gasLimits = ERC4337Utils.unpackAccountGasLimits(packedOp.accountGasLimits);\n      const gasFees = ERC4337Utils.unpackGasFees(packedOp.gasFees);\n\n      let factory: string | undefined;\n      let factoryData: string | undefined;\n      if (packedOp.initCode && packedOp.initCode !== \"0x\" && packedOp.initCode.length > 2) {\n        factory = packedOp.initCode.slice(0, 42);\n        if (packedOp.initCode.length > 42) {\n          factoryData = \"0x\" + packedOp.initCode.slice(42);\n        }\n      }\n\n      let paymaster: string | undefined;\n      let paymasterVerificationGasLimit: string | undefined;\n      let paymasterPostOpGasLimit: string | undefined;\n      let paymasterData: string | undefined;\n\n      if (\n        packedOp.paymasterAndData &&\n        packedOp.paymasterAndData !== \"0x\" &&\n        packedOp.paymasterAndData.length > 2\n      ) {\n        paymaster = packedOp.paymasterAndData.slice(0, 42);\n        if (packedOp.paymasterAndData.length >= 74) {\n          paymasterVerificationGasLimit =\n            \"0x\" + BigInt(\"0x\" + packedOp.paymasterAndData.slice(42, 74)).toString(16);\n        }\n        if (packedOp.paymasterAndData.length >= 106) {\n          paymasterPostOpGasLimit =\n            \"0x\" + BigInt(\"0x\" + packedOp.paymasterAndData.slice(74, 106)).toString(16);\n        }\n        if (packedOp.paymasterAndData.length > 106) {\n          paymasterData = \"0x\" + packedOp.paymasterAndData.slice(106);\n        }\n      }\n\n      const result: Record<string, unknown> = {\n        sender: packedOp.sender,\n        nonce:\n          typeof packedOp.nonce === \"bigint\"\n            ? \"0x\" + packedOp.nonce.toString(16)\n            : packedOp.nonce.toString().startsWith(\"0x\")\n              ? packedOp.nonce.toString()\n              : \"0x\" + BigInt(packedOp.nonce).toString(16),\n        callData: packedOp.callData,\n        callGasLimit: \"0x\" + gasLimits.callGasLimit.toString(16),\n        verificationGasLimit: \"0x\" + gasLimits.verificationGasLimit.toString(16),\n        preVerificationGas:\n          typeof packedOp.preVerificationGas === \"bigint\"\n            ? \"0x\" + packedOp.preVerificationGas.toString(16)\n            : packedOp.preVerificationGas.toString().startsWith(\"0x\")\n              ? packedOp.preVerificationGas.toString()\n              : \"0x\" + BigInt(packedOp.preVerificationGas).toString(16),\n        maxFeePerGas: \"0x\" + gasFees.maxFeePerGas.toString(16),\n        maxPriorityFeePerGas: \"0x\" + gasFees.maxPriorityFeePerGas.toString(16),\n        signature: packedOp.signature || \"0x\",\n      };\n\n      if (factory) result.factory = factory;\n      if (factoryData) result.factoryData = factoryData;\n\n      if (paymaster) {\n        result.paymaster = paymaster;\n        result.paymasterVerificationGasLimit = paymasterVerificationGasLimit || \"0x30000\";\n        result.paymasterPostOpGasLimit = paymasterPostOpGasLimit || \"0x30000\";\n        if (paymasterData && paymasterData !== \"0x\") {\n          result.paymasterData = paymasterData;\n        }\n      }\n\n      return result;\n    }\n\n    // v0.6 format\n    const op = userOp as UserOperation;\n    return {\n      sender: op.sender,\n      nonce: \"0x\" + op.nonce.toString(16),\n      initCode: op.initCode,\n      callData: op.callData,\n      callGasLimit: \"0x\" + op.callGasLimit.toString(16),\n      verificationGasLimit: \"0x\" + op.verificationGasLimit.toString(16),\n      preVerificationGas: \"0x\" + op.preVerificationGas.toString(16),\n      maxFeePerGas: \"0x\" + op.maxFeePerGas.toString(16),\n      maxPriorityFeePerGas: \"0x\" + op.maxPriorityFeePerGas.toString(16),\n      paymasterAndData: op.paymasterAndData,\n      signature: op.signature,\n    };\n  }\n}\n","import axios from \"axios\";\nimport { ethers } from \"ethers\";\nimport { bls12_381 as bls } from \"@noble/curves/bls12-381.js\";\nimport {\n  BLSConfig,\n  BLSNode,\n  BLSSignatureData,\n  CumulativeT2SignatureData,\n  CumulativeT3SignatureData,\n} from \"./types\";\n\nexport class BLSManager {\n  private config: BLSConfig;\n\n  constructor(config: BLSConfig) {\n    this.config = config;\n  }\n\n  /**\n   * Discover available BLS nodes from seed nodes (Gossip network)\n   */\n  async getAvailableNodes(): Promise<BLSNode[]> {\n    const { seedNodes, discoveryTimeout = 5000 } = this.config;\n\n    for (const seedEndpoint of seedNodes) {\n      try {\n        // Try to get peers from gossip endpoint\n        const response = await axios.get(`${seedEndpoint}/gossip/peers`, {\n          timeout: discoveryTimeout,\n        });\n\n        const peers = response.data.peers || [];\n\n        // Filter active nodes with proper structure\n        const activeNodes: BLSNode[] = peers\n          .filter((p: any) => p.status === \"active\" && p.apiEndpoint && p.publicKey)\n          .map((p: any, index: number) => ({\n            index: index + 1, // 1-based index likely expected by contract if using bitmap\n            nodeId: p.nodeId,\n            nodeName: p.nodeName,\n            apiEndpoint: p.apiEndpoint,\n            status: \"active\",\n            publicKey: p.publicKey,\n          }));\n\n        if (activeNodes.length > 0) {\n          return activeNodes;\n        }\n      } catch {\n        // Try next seed node\n        continue;\n      }\n    }\n\n    return [];\n  }\n\n  /**\n   * Helper to pack the full signature for ERC-4337 UserOp\n   * Format: [nodeIdsLength][nodeIds...][blsSignature][messagePoint][aaSignature][messagePointSignature]\n   */\n  packSignature(data: BLSSignatureData): string {\n    if (!data.nodeIds || !data.aaSignature || !data.messagePointSignature) {\n      throw new Error(\"Missing required signature components\");\n    }\n\n    const nodeIdsLength = ethers.solidityPacked([\"uint256\"], [data.nodeIds.length]);\n    const nodeIdsBytes = ethers.solidityPacked(\n      Array(data.nodeIds.length).fill(\"bytes32\"),\n      data.nodeIds\n    );\n\n    return ethers.solidityPacked(\n      [\"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\"],\n      [\n        nodeIdsLength,\n        nodeIdsBytes,\n        data.signature,\n        data.messagePoint,\n        data.aaSignature,\n        data.messagePointSignature,\n      ]\n    );\n  }\n\n  /**\n   * Calculate the MessagePoint G2 point for a given message (UserOpHash)\n   */\n  async generateMessagePoint(message: string | Uint8Array): Promise<string> {\n    const messageBytes = typeof message === \"string\" ? ethers.getBytes(message) : message;\n    const DST = \"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_\";\n\n    const messagePointBLS = await bls.G2.hashToCurve(messageBytes, { DST });\n    const messageG2EIP = this.encodeG2Point(messagePointBLS);\n\n    return \"0x\" + Buffer.from(messageG2EIP).toString(\"hex\");\n  }\n\n  /**\n   * Encode G2 Point to bytes for EIP-2537 format\n   */\n  private encodeG2Point(point: any): Uint8Array {\n    const result = new Uint8Array(256);\n    const affine = point.toAffine();\n\n    const x0Bytes = this.hexToBytes(affine.x.c0.toString(16).padStart(96, \"0\"));\n    const x1Bytes = this.hexToBytes(affine.x.c1.toString(16).padStart(96, \"0\"));\n    const y0Bytes = this.hexToBytes(affine.y.c0.toString(16).padStart(96, \"0\"));\n    const y1Bytes = this.hexToBytes(affine.y.c1.toString(16).padStart(96, \"0\"));\n\n    result.set(x0Bytes, 16);\n    result.set(x1Bytes, 80);\n    result.set(y0Bytes, 144);\n    result.set(y1Bytes, 208);\n    return result;\n  }\n\n  private hexToBytes(hex: string): Uint8Array {\n    if (hex.startsWith(\"0x\")) hex = hex.slice(2);\n    const bytes = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < hex.length; i += 2) {\n      bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\n    }\n    return bytes;\n  }\n\n  /**\n   * Pack cumulative Tier 2 signature (algId 0x04): P256 + BLS.\n   *\n   * Format:\n   *   [algId=0x04 (1)] [P256 r (32)] [P256 s (32)]\n   *   [nodeIdsLength (32)] [nodeIds (N×32)]\n   *   [blsAggregateSig (256)] [messagePoint (256)]\n   *   [messagePointECDSA (65)]\n   */\n  packCumulativeT2Signature(data: CumulativeT2SignatureData): string {\n    const nodeIdsLength = ethers.solidityPacked([\"uint256\"], [data.nodeIds.length]);\n    const nodeIdsBytes = ethers.solidityPacked(\n      Array(data.nodeIds.length).fill(\"bytes32\"),\n      data.nodeIds\n    );\n\n    return ethers.solidityPacked(\n      [\"bytes1\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\"],\n      [\n        \"0x04\",\n        data.p256Signature,\n        nodeIdsLength,\n        nodeIdsBytes,\n        data.blsSignature,\n        data.messagePoint,\n        data.messagePointSignature,\n      ]\n    );\n  }\n\n  /**\n   * Pack cumulative Tier 3 signature (algId 0x05): P256 + BLS + Guardian.\n   *\n   * Format:\n   *   [algId=0x05 (1)] [P256 r (32)] [P256 s (32)]\n   *   [nodeIdsLength (32)] [nodeIds (N×32)]\n   *   [blsAggregateSig (256)] [messagePoint (256)]\n   *   [messagePointECDSA (65)] [guardianECDSA (65)]\n   */\n  packCumulativeT3Signature(data: CumulativeT3SignatureData): string {\n    const nodeIdsLength = ethers.solidityPacked([\"uint256\"], [data.nodeIds.length]);\n    const nodeIdsBytes = ethers.solidityPacked(\n      Array(data.nodeIds.length).fill(\"bytes32\"),\n      data.nodeIds\n    );\n\n    return ethers.solidityPacked(\n      [\"bytes1\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\"],\n      [\n        \"0x05\",\n        data.p256Signature,\n        nodeIdsLength,\n        nodeIdsBytes,\n        data.blsSignature,\n        data.messagePoint,\n        data.messagePointSignature,\n        data.guardianSignature,\n      ]\n    );\n  }\n\n  /**\n   * Request signature from a single node\n   */\n  async requestNodeSignature(\n    node: BLSNode,\n    message: string\n  ): Promise<{ signature: string; publicKey: string }> {\n    const response = await axios.post(`${node.apiEndpoint}/signature/sign`, {\n      message,\n    });\n\n    const signatureEIP = response.data.signature;\n    // Prefer compact if available, logic copied from legacy service\n    const signature = response.data.signatureCompact || signatureEIP;\n\n    return {\n      signature: signature.startsWith(\"0x\") ? signature : `0x${signature}`,\n      publicKey: response.data.publicKey,\n    };\n  }\n\n  /**\n   * Request aggregation from a node\n   */\n  async aggregateSignatures(node: BLSNode, signatures: string[]): Promise<string> {\n    const response = await axios.post(`${node.apiEndpoint}/signature/aggregate`, {\n      signatures,\n    });\n\n    const sig = response.data.signature;\n    return sig.startsWith(\"0x\") ? sig : `0x${sig}`;\n  }\n}\n","import { ethers } from \"ethers\";\nimport axios from \"axios\";\nimport {\n  BLSManager,\n  BLSSignatureData,\n  CumulativeT2SignatureData,\n  CumulativeT3SignatureData,\n} from \"../../core/bls\";\nimport { TierLevel } from \"../../core/tier\";\nimport { EthereumProvider } from \"../providers/ethereum-provider\";\nimport { IStorageAdapter } from \"../interfaces/storage-adapter\";\nimport { ISignerAdapter, PasskeyAssertionContext } from \"../interfaces/signer-adapter\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\nimport { ServerConfig } from \"../config\";\n\n/**\n * BLS signature service — extracted from NestJS BlsService.\n * Uses lazy initialization instead of onModuleInit.\n */\nexport class BLSSignatureService {\n  private blsManager: BLSManager | null = null;\n  private readonly logger: ILogger;\n\n  constructor(\n    private readonly config: ServerConfig,\n    private readonly ethereum: EthereumProvider,\n    private readonly storage: IStorageAdapter,\n    private readonly signer: ISignerAdapter,\n    logger?: ILogger\n  ) {\n    this.logger = logger ?? new ConsoleLogger(\"[BLSSignatureService]\");\n  }\n\n  /** Lazy-initialize BLSManager on first use. */\n  private async ensureInitialized(): Promise<BLSManager> {\n    if (this.blsManager) return this.blsManager;\n\n    const blsConfig = await this.storage.getBlsConfig();\n    const seedNodes =\n      this.config.blsSeedNodes ?? blsConfig?.discovery?.seedNodes?.map(n => n.endpoint) ?? [];\n\n    this.blsManager = new BLSManager({\n      seedNodes,\n      discoveryTimeout: this.config.blsDiscoveryTimeout ?? 10000,\n    });\n\n    return this.blsManager;\n  }\n\n  async getActiveSignerNodes(): Promise<unknown[]> {\n    const manager = await this.ensureInitialized();\n    const nodes = await manager.getAvailableNodes();\n\n    if (nodes.length > 0) {\n      try {\n        await this.storage.updateSignerNodesCache(nodes);\n      } catch {\n        // Non-critical\n      }\n    }\n\n    return nodes;\n  }\n\n  async generateBLSSignature(\n    userId: string,\n    userOpHash: string,\n    ctx?: PasskeyAssertionContext\n  ): Promise<BLSSignatureData> {\n    const manager = await this.ensureInitialized();\n\n    const activeNodes = await this.getActiveSignerNodes();\n    if (activeNodes.length < 1) {\n      throw new Error(\"No active BLS signer nodes available\");\n    }\n\n    const selectedNodes = activeNodes.slice(0, Math.min(3, activeNodes.length)) as Array<{\n      apiEndpoint: string;\n    }>;\n\n    const signerNodeSignatures: string[] = [];\n    const signerNodeIds: string[] = [];\n\n    for (const node of selectedNodes) {\n      try {\n        const response = await axios.post(`${node.apiEndpoint}/signature/sign`, {\n          message: userOpHash,\n        });\n\n        const signatureForAggregation = response.data.signatureCompact || response.data.signature;\n        const formatted = signatureForAggregation.startsWith(\"0x\")\n          ? signatureForAggregation\n          : `0x${signatureForAggregation}`;\n\n        signerNodeSignatures.push(formatted);\n        signerNodeIds.push(response.data.nodeId);\n      } catch {\n        // Continue with other nodes\n      }\n    }\n\n    if (signerNodeSignatures.length === 0) {\n      throw new Error(\"Failed to get signatures from any BLS signer nodes\");\n    }\n\n    let aggregatedSignature: string;\n    if (signerNodeSignatures.length > 1) {\n      const aggregateResponse = await axios.post(\n        `${selectedNodes[0].apiEndpoint}/signature/aggregate`,\n        { signatures: signerNodeSignatures }\n      );\n      aggregatedSignature = aggregateResponse.data.signature.startsWith(\"0x\")\n        ? aggregateResponse.data.signature\n        : `0x${aggregateResponse.data.signature}`;\n    } else {\n      // Single signature — re-request in EIP format\n      const singleSignResponse = await axios.post(\n        `${selectedNodes[0].apiEndpoint}/signature/sign`,\n        { message: userOpHash }\n      );\n      aggregatedSignature = singleSignResponse.data.signature.startsWith(\"0x\")\n        ? singleSignResponse.data.signature\n        : `0x${singleSignResponse.data.signature}`;\n    }\n\n    // Generate message point\n    const messagePoint = await manager.generateMessagePoint(userOpHash);\n\n    // Get user account and wallet for ECDSA signatures\n    const account = await this.storage.findAccountByUserId(userId);\n    if (!account) {\n      throw new Error(`User account not found for userId: ${userId}`);\n    }\n\n    const wallet = await this.signer.getSigner(userId, ctx);\n    const walletAddress = await wallet.getAddress();\n\n    if (walletAddress.toLowerCase() !== account.signerAddress.toLowerCase()) {\n      throw new Error(\n        `Wallet address mismatch! Wallet: ${walletAddress}, Expected: ${account.signerAddress}`\n      );\n    }\n\n    const aaSignature = await wallet.signMessage(ethers.getBytes(userOpHash));\n    const messagePointHash = ethers.keccak256(messagePoint);\n    const messagePointSignature = await wallet.signMessage(ethers.getBytes(messagePointHash));\n\n    return {\n      nodeIds: signerNodeIds,\n      signature: aggregatedSignature,\n      messagePoint,\n      aaAddress: account.signerAddress,\n      aaSignature,\n      messagePointSignature,\n    };\n  }\n\n  async packSignature(blsData: BLSSignatureData): Promise<string> {\n    const manager = await this.ensureInitialized();\n    return manager.packSignature(blsData);\n  }\n\n  // ── Tiered Signature Support (M4) ─────────────────────────────\n\n  /**\n   * Generate a tiered signature based on the required tier level.\n   *\n   * - Tier 1: raw 65-byte ECDSA (no algId prefix, backwards-compat)\n   * - Tier 2: algId 0x04 — P256 + BLS aggregate + messagePoint ECDSA\n   * - Tier 3: algId 0x05 — P256 + BLS + messagePoint ECDSA + Guardian ECDSA\n   *\n   * @param tier - Required tier level (1, 2, or 3)\n   * @param userId - User ID for account lookup\n   * @param userOpHash - The UserOp hash to sign\n   * @param p256Signature - P256 passkey signature (64 bytes, required for tier 2/3)\n   * @param guardianSigner - Guardian ethers.Signer (required for tier 3)\n   * @param ctx - Optional passkey assertion context for KMS signing\n   */\n  async generateTieredSignature(params: {\n    tier: TierLevel;\n    userId: string;\n    userOpHash: string;\n    p256Signature?: string;\n    guardianSigner?: ethers.Signer;\n    ctx?: PasskeyAssertionContext;\n  }): Promise<string> {\n    const { tier, userId, userOpHash, p256Signature, guardianSigner, ctx } = params;\n    const manager = await this.ensureInitialized();\n\n    if (tier === 1) {\n      // Tier 1: raw ECDSA signature (65 bytes, no algId prefix)\n      const account = await this.storage.findAccountByUserId(userId);\n      if (!account) throw new Error(`User account not found for userId: ${userId}`);\n\n      const wallet = await this.signer.getSigner(userId, ctx);\n      return wallet.signMessage(ethers.getBytes(userOpHash));\n    }\n\n    // Tier 2 and 3 both need BLS + P256\n    if (!p256Signature) {\n      throw new Error(`P256 signature required for Tier ${tier}`);\n    }\n\n    // Get BLS components (reuse existing generateBLSSignature for node signing + aggregation)\n    const blsData = await this.generateBLSSignature(userId, userOpHash, ctx);\n\n    if (tier === 2) {\n      const t2Data: CumulativeT2SignatureData = {\n        p256Signature,\n        nodeIds: blsData.nodeIds,\n        blsSignature: blsData.signature,\n        messagePoint: blsData.messagePoint,\n        messagePointSignature: blsData.messagePointSignature,\n      };\n      return manager.packCumulativeT2Signature(t2Data);\n    }\n\n    // Tier 3: also needs guardian signature\n    if (!guardianSigner) {\n      throw new Error(\"Guardian signer required for Tier 3\");\n    }\n\n    const guardianSignature = await guardianSigner.signMessage(ethers.getBytes(userOpHash));\n\n    const t3Data: CumulativeT3SignatureData = {\n      p256Signature,\n      nodeIds: blsData.nodeIds,\n      blsSignature: blsData.signature,\n      messagePoint: blsData.messagePoint,\n      messagePointSignature: blsData.messagePointSignature,\n      guardianSignature,\n    };\n    return manager.packCumulativeT3Signature(t3Data);\n  }\n}\n","import { ethers } from \"ethers\";\nimport { EthereumProvider } from \"../providers/ethereum-provider\";\nimport { ERC20_ABI } from \"../constants/entrypoint\";\n\nexport interface TokenInfo {\n  address: string;\n  symbol: string;\n  name: string;\n  decimals: number;\n}\n\nexport interface TokenBalance {\n  token: TokenInfo;\n  balance: string;\n  formattedBalance: string;\n}\n\n/**\n * Token service — extracted from NestJS TokenService.\n * Only on-chain queries and calldata generation (no preset token list).\n */\nexport class TokenService {\n  constructor(private readonly ethereum: EthereumProvider) {}\n\n  async getTokenInfo(tokenAddress: string): Promise<TokenInfo> {\n    const provider = this.ethereum.getProvider();\n    const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);\n\n    const [name, symbol, decimals] = await Promise.all([\n      contract.name(),\n      contract.symbol(),\n      contract.decimals(),\n    ]);\n\n    return {\n      address: tokenAddress.toLowerCase(),\n      name,\n      symbol,\n      decimals: Number(decimals),\n    };\n  }\n\n  async getTokenBalance(tokenAddress: string, walletAddress: string): Promise<string> {\n    const provider = this.ethereum.getProvider();\n    const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);\n\n    try {\n      const balance = await contract.balanceOf(walletAddress);\n      return balance.toString();\n    } catch {\n      return \"0\";\n    }\n  }\n\n  async getFormattedTokenBalance(\n    tokenAddress: string,\n    walletAddress: string\n  ): Promise<TokenBalance> {\n    const tokenInfo = await this.getTokenInfo(tokenAddress);\n    const rawBalance = await this.getTokenBalance(tokenAddress, walletAddress);\n    const formattedBalance = ethers.formatUnits(rawBalance, tokenInfo.decimals);\n    return { token: tokenInfo, balance: rawBalance, formattedBalance };\n  }\n\n  generateTransferCalldata(to: string, amount: string, decimals: number): string {\n    const contract = new ethers.Contract(ethers.ZeroAddress, ERC20_ABI);\n    const parsedAmount = ethers.parseUnits(amount, decimals);\n    return contract.interface.encodeFunctionData(\"transfer\", [to, parsedAmount]);\n  }\n\n  async validateToken(tokenAddress: string): Promise<{\n    isValid: boolean;\n    token?: TokenInfo;\n    error?: string;\n  }> {\n    try {\n      const provider = this.ethereum.getProvider();\n      const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);\n\n      const [name, symbol, decimals] = (await Promise.race([\n        Promise.all([contract.name(), contract.symbol(), contract.decimals()]),\n        new Promise((_, reject) => setTimeout(() => reject(new Error(\"Timeout\")), 10000)),\n      ])) as [string, string, bigint];\n\n      return {\n        isValid: true,\n        token: {\n          address: tokenAddress.toLowerCase(),\n          name,\n          symbol,\n          decimals: Number(decimals),\n        },\n      };\n    } catch (error: unknown) {\n      return {\n        isValid: false,\n        error: error instanceof Error ? error.message : \"Invalid ERC20 token\",\n      };\n    }\n  }\n}\n","import { ethers } from \"ethers\";\nimport { ISignerAdapter } from \"../interfaces/signer-adapter\";\n\n/**\n * Thin wrapper around ISignerAdapter for consistent wallet access.\n */\nexport class WalletManager {\n  constructor(private readonly signer: ISignerAdapter) {}\n\n  async getAddress(userId: string): Promise<string> {\n    return this.signer.getAddress(userId);\n  }\n\n  async getSigner(userId: string): Promise<ethers.Signer> {\n    return this.signer.getSigner(userId);\n  }\n\n  async ensureSigner(userId: string): Promise<{ signer: ethers.Signer; address: string }> {\n    return this.signer.ensureSigner(userId);\n  }\n}\n","import { ServerConfig, validateConfig } from \"./config\";\nimport { ConsoleLogger } from \"./interfaces/logger\";\nimport { EthereumProvider } from \"./providers/ethereum-provider\";\nimport { AccountManager } from \"./services/account-manager\";\nimport { TransferManager } from \"./services/transfer-manager\";\nimport { BLSSignatureService } from \"./services/bls-signature-service\";\nimport { PaymasterManager } from \"./services/paymaster-manager\";\nimport { TokenService } from \"./services/token-service\";\nimport { WalletManager } from \"./services/wallet-manager\";\n\n/**\n * Main facade for the YAAA Server SDK.\n * Wires all services together from a single config object.\n *\n * @example\n * ```ts\n * import { YAAAServerClient, MemoryStorage, LocalWalletSigner } from '@aastar/airaccount/server';\n *\n * const client = new YAAAServerClient({\n *   rpcUrl: 'https://sepolia.infura.io/v3/...',\n *   bundlerRpcUrl: 'https://api.pimlico.io/v2/11155111/rpc?apikey=...',\n *   chainId: 11155111,\n *   entryPoints: {\n *     v06: {\n *       entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n *       factoryAddress: '0x...',\n *       validatorAddress: '0x...',\n *     },\n *   },\n *   storage: new MemoryStorage(),\n *   signer: new LocalWalletSigner('0xPRIVATE_KEY'),\n * });\n *\n * const account = await client.accounts.createAccount('user-123');\n * ```\n */\nexport class YAAAServerClient {\n  readonly ethereum: EthereumProvider;\n  readonly accounts: AccountManager;\n  readonly transfers: TransferManager;\n  readonly bls: BLSSignatureService;\n  readonly paymaster: PaymasterManager;\n  readonly tokens: TokenService;\n  readonly wallets: WalletManager;\n\n  constructor(config: ServerConfig) {\n    validateConfig(config);\n\n    const logger = config.logger ?? new ConsoleLogger(\"[YAAA]\");\n\n    // Core provider\n    this.ethereum = new EthereumProvider(config);\n\n    // Service wiring (order matters: dependencies first)\n    this.wallets = new WalletManager(config.signer);\n    this.tokens = new TokenService(this.ethereum);\n    this.paymaster = new PaymasterManager(this.ethereum, config.storage, logger);\n    this.accounts = new AccountManager(this.ethereum, config.storage, config.signer, logger);\n    this.bls = new BLSSignatureService(\n      config,\n      this.ethereum,\n      config.storage,\n      config.signer,\n      logger\n    );\n    this.transfers = new TransferManager(\n      this.ethereum,\n      this.accounts,\n      this.bls,\n      this.paymaster,\n      this.tokens,\n      config.storage,\n      config.signer,\n      logger\n    );\n  }\n}\n","import { ethers } from \"ethers\";\nimport { MODULE_TYPE, AIRACCOUNT_ABI, AIRACCOUNT_ADDRESSES } from \"../constants/entrypoint\";\n\nexport type ModuleTypeId = 1 | 2 | 3; // VALIDATOR | EXECUTOR | HOOK\n\nexport interface InstallModuleParams {\n  /** The deployed AirAccount address */\n  account: string;\n  /** ERC-7579 module type: 1=Validator, 2=Executor, 3=Hook */\n  moduleTypeId: ModuleTypeId;\n  /** Module contract address to install */\n  module: string;\n  /**\n   * Guardian signatures + module init data, packed as:\n   *   bytes[0..65*sigsRequired] = guardian ECDSA sigs\n   *   bytes[65*sigsRequired..]  = module onInstall() init data\n   *\n   * Sig hash (per guardian, r5 format):\n   *   keccak256(\"INSTALL_MODULE\" ‖ chainId ‖ account ‖ moduleTypeId ‖ module ‖ keccak256(moduleInitData)).toEthSignedMessageHash()\n   *\n   * sigsRequired: 0 if threshold<=40, 1 if <=70, 2 if =100\n   */\n  guardianSigs?: string[]; // 65-byte hex sigs from guardians\n  /** Raw bytes passed to module.onInstall() after guardian sigs */\n  moduleInitData?: string;\n}\n\nexport interface UninstallModuleParams {\n  account: string;\n  moduleTypeId: ModuleTypeId;\n  module: string;\n  /** Always requires 2 guardian sigs for uninstall */\n  guardianSig1: string;\n  guardianSig2: string;\n  /** Passed to module.onUninstall() */\n  moduleDeInitData?: string;\n}\n\n/**\n * Build the EIP-191 install hash that guardians must sign.\n *\n * r5 format: includes keccak256(moduleInitData) to prevent config-swap attacks.\n *\n * @example\n * const hash = buildInstallModuleHash(chainId, account, 1, moduleAddress, moduleInitData);\n * const sig = await guardian.signMessage(ethers.getBytes(hash));\n */\nexport function buildInstallModuleHash(\n  chainId: number,\n  account: string,\n  moduleTypeId: ModuleTypeId,\n  module: string,\n  moduleInitData: string = \"0x\",\n): string {\n  const moduleInitDataHash = ethers.keccak256(moduleInitData);\n  const raw = ethers.keccak256(\n    ethers.solidityPacked(\n      [\"string\", \"uint256\", \"address\", \"uint256\", \"address\", \"bytes32\"],\n      [\"INSTALL_MODULE\", chainId, account, moduleTypeId, module, moduleInitDataHash],\n    ),\n  );\n  return ethers.hashMessage(ethers.getBytes(raw));\n}\n\n/**\n * Build the EIP-191 uninstall hash that guardians must sign.\n */\nexport function buildUninstallModuleHash(\n  chainId: number,\n  account: string,\n  moduleTypeId: ModuleTypeId,\n  module: string,\n): string {\n  const raw = ethers.keccak256(\n    ethers.solidityPacked(\n      [\"string\", \"uint256\", \"address\", \"uint256\", \"address\"],\n      [\"UNINSTALL_MODULE\", chainId, account, moduleTypeId, module],\n    ),\n  );\n  return ethers.hashMessage(ethers.getBytes(raw));\n}\n\n/**\n * ModuleManager — ERC-7579 module install/uninstall helpers.\n *\n * Handles the guardian-sig packing required by AAStarAirAccountV7:\n *   installModule(moduleTypeId, module, guardianSigs ‖ moduleInitData)\n *   uninstallModule(moduleTypeId, module, guardianSig1 ‖ guardianSig2 ‖ deInitData)\n */\nexport class ModuleManager {\n  private readonly provider: ethers.JsonRpcProvider;\n  private readonly chainId: number;\n\n  constructor(provider: ethers.JsonRpcProvider, chainId: number) {\n    this.provider = provider;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Encode calldata for installModule().\n   * Caller is responsible for submitting via UserOp (EntryPoint) or direct tx.\n   */\n  encodeInstall(params: InstallModuleParams): string {\n    const sigs = params.guardianSigs ?? [];\n    const initData = params.moduleInitData ?? \"0x\";\n\n    // Pack: guardian sigs (65 bytes each) concatenated with module init data\n    const packed =\n      sigs.length > 0\n        ? ethers.concat([...sigs.map((s) => ethers.getBytes(s)), ethers.getBytes(initData)])\n        : ethers.getBytes(initData);\n\n    const iface = new ethers.Interface(AIRACCOUNT_ABI);\n    return iface.encodeFunctionData(\"installModule\", [\n      params.moduleTypeId,\n      params.module,\n      packed,\n    ]);\n  }\n\n  /**\n   * Encode calldata for uninstallModule().\n   * Always requires 2 guardian signatures.\n   */\n  encodeUninstall(params: UninstallModuleParams): string {\n    const deInitData = params.moduleDeInitData ?? \"0x\";\n    const packed = ethers.concat([\n      ethers.getBytes(params.guardianSig1),\n      ethers.getBytes(params.guardianSig2),\n      ethers.getBytes(deInitData),\n    ]);\n\n    const iface = new ethers.Interface(AIRACCOUNT_ABI);\n    return iface.encodeFunctionData(\"uninstallModule\", [\n      params.moduleTypeId,\n      params.module,\n      packed,\n    ]);\n  }\n\n  /** Check if a module is currently installed on the account. */\n  async isInstalled(\n    account: string,\n    moduleTypeId: ModuleTypeId,\n    module: string,\n  ): Promise<boolean> {\n    const contract = new ethers.Contract(account, AIRACCOUNT_ABI, this.provider);\n    return contract.isModuleInstalled(moduleTypeId, module, \"0x\") as Promise<boolean>;\n  }\n\n  /** Return the install hash for a guardian to sign (r5 format, includes moduleInitData hash). */\n  installHash(account: string, moduleTypeId: ModuleTypeId, module: string, moduleInitData: string = \"0x\"): string {\n    return buildInstallModuleHash(this.chainId, account, moduleTypeId, module, moduleInitData);\n  }\n\n  /** Return the uninstall hash for guardians to sign. */\n  uninstallHash(account: string, moduleTypeId: ModuleTypeId, module: string): string {\n    return buildUninstallModuleHash(this.chainId, account, moduleTypeId, module);\n  }\n\n  /**\n   * Convenience: build install calldata for the standard M7 module set.\n   * Uses pre-deployed Sepolia addresses. No guardian sigs required when\n   * account threshold <= 40 (default for newly created accounts).\n   */\n  encodeInstallDefaultModules(account: string): {\n    compositeValidator: string;\n    tierGuardHook: string;\n  } {\n    const addresses = AIRACCOUNT_ADDRESSES.sepolia;\n    return {\n      compositeValidator: this.encodeInstall({\n        account,\n        moduleTypeId: MODULE_TYPE.VALIDATOR,\n        module: addresses.compositeValidator,\n      }),\n      tierGuardHook: this.encodeInstall({\n        account,\n        moduleTypeId: MODULE_TYPE.HOOK,\n        module: addresses.tierGuardHook,\n      }),\n    };\n  }\n}\n","import { ethers } from \"ethers\";\nimport {\n  SESSION_KEY_VALIDATOR_ABI,\n  AGENT_SESSION_KEY_VALIDATOR_ABI,\n} from \"../constants/entrypoint\";\n\n// ─── M6 SessionKeyValidator ──────────────────────────────────────\n\nexport interface GrantSessionParams {\n  /** Account that owns the session */\n  account: string;\n  /** The session key address (ephemeral EOA) */\n  sessionKey: string;\n  /** Expiry unix timestamp (max 7 days from now) */\n  expiry: number;\n  /** address(0) = any destination allowed */\n  contractScope?: string;\n  /** bytes4(0) = any selector allowed */\n  selectorScope?: string;\n  /** Owner signature over buildGrantHash() — omit if calling directly from account */\n  ownerSig?: string;\n}\n\nexport interface SessionInfo {\n  expiry: number;\n  contractScope: string;\n  selectorScope: string;\n  revoked: boolean;\n  active: boolean;\n}\n\n// ─── M7 AgentSessionKeyValidator ─────────────────────────────────\n\nexport interface AgentSessionConfig {\n  expiry: number;               // Unix timestamp\n  velocityLimit: number;        // Max calls per velocityWindow (0 = unlimited)\n  velocityWindow: number;       // Window in seconds\n  spendToken: string;           // address(0) = no spend cap\n  spendCap: bigint;             // 0 = no cap\n  callTargets: string[];        // Allowed dest addresses (empty = any)\n  selectorAllowlist: string[];  // Allowed selectors (empty = any)\n}\n\nexport interface AgentSessionInfo extends AgentSessionConfig {\n  revoked: boolean;\n  callCount: bigint;\n  windowStart: bigint;\n  totalSpent: bigint;\n}\n\n/**\n * SessionKeyService — manage M6 (basic) and M7 (agent) session keys.\n *\n * M6 SessionKeyValidator (algId=0x08):\n *   Simple time-limited ECDSA/P256 key with optional contract+selector scope.\n *   Used for standard delegated actions (hot wallet, automated tasks).\n *\n * M7 AgentSessionKeyValidator (algId=0x09):\n *   Rich session key for AI agents: velocity limits, spend caps, call allowlists,\n *   hierarchical delegation (parent → sub-agent with scope narrowing).\n */\nexport class SessionKeyService {\n  private readonly provider: ethers.JsonRpcProvider;\n  private readonly skValidator: ethers.Contract;\n  private readonly askValidator: ethers.Contract;\n\n  constructor(\n    provider: ethers.JsonRpcProvider,\n    sessionKeyValidatorAddress: string,\n    agentSessionKeyValidatorAddress: string,\n  ) {\n    this.provider = provider;\n    this.skValidator = new ethers.Contract(\n      sessionKeyValidatorAddress,\n      SESSION_KEY_VALIDATOR_ABI,\n      provider,\n    );\n    this.askValidator = new ethers.Contract(\n      agentSessionKeyValidatorAddress,\n      AGENT_SESSION_KEY_VALIDATOR_ABI,\n      provider,\n    );\n  }\n\n  // ── M6: Basic Session Keys ────────────────────────────────────\n\n  /**\n   * Build the hash that the account owner must sign to grant a session key.\n   * Use grantSession() with this sig, or grantSessionDirect() from the account itself.\n   */\n  async buildGrantHash(params: Omit<GrantSessionParams, \"ownerSig\">): Promise<string> {\n    return this.skValidator.buildGrantHash(\n      params.account,\n      params.sessionKey,\n      params.expiry,\n      params.contractScope ?? ethers.ZeroAddress,\n      params.selectorScope ?? \"0x00000000\",\n    ) as Promise<string>;\n  }\n\n  /** Query an ECDSA session key state. */\n  async getSession(account: string, sessionKey: string): Promise<SessionInfo> {\n    const [expiry, contractScope, selectorScope, revoked] =\n      await this.skValidator.sessions(account, sessionKey);\n    const now = Math.floor(Date.now() / 1000);\n    return {\n      expiry: Number(expiry),\n      contractScope,\n      selectorScope,\n      revoked,\n      active: Number(expiry) > now && !revoked,\n    };\n  }\n\n  /** Check if an ECDSA session is currently active. */\n  async isSessionActive(account: string, sessionKey: string): Promise<boolean> {\n    return this.skValidator.isSessionActive(account, sessionKey) as Promise<boolean>;\n  }\n\n  /**\n   * Encode calldata for grantSession() — submit via UserOp from the account.\n   * ownerSig is the account owner's signature over buildGrantHash().\n   */\n  encodeGrantSession(params: GrantSessionParams): string {\n    const iface = new ethers.Interface(SESSION_KEY_VALIDATOR_ABI);\n    if (params.ownerSig) {\n      return iface.encodeFunctionData(\"grantSession\", [\n        params.account,\n        params.sessionKey,\n        params.expiry,\n        params.contractScope ?? ethers.ZeroAddress,\n        params.selectorScope ?? \"0x00000000\",\n        params.ownerSig,\n      ]);\n    }\n    return iface.encodeFunctionData(\"grantSessionDirect\", [\n      params.account,\n      params.sessionKey,\n      params.expiry,\n      params.contractScope ?? ethers.ZeroAddress,\n      params.selectorScope ?? \"0x00000000\",\n    ]);\n  }\n\n  /** Encode calldata for revokeSession(). */\n  encodeRevokeSession(account: string, sessionKey: string): string {\n    const iface = new ethers.Interface(SESSION_KEY_VALIDATOR_ABI);\n    return iface.encodeFunctionData(\"revokeSession\", [account, sessionKey]);\n  }\n\n  // ── M7: Agent Session Keys ────────────────────────────────────\n\n  /**\n   * Encode calldata for grantAgentSession().\n   * Must be called from the account (via UserOp or direct execute).\n   * The contract uses msg.sender as the account — no account param needed.\n   */\n  encodeGrantAgentSession(sessionKey: string, cfg: AgentSessionConfig): string {\n    const iface = new ethers.Interface(AGENT_SESSION_KEY_VALIDATOR_ABI);\n    return iface.encodeFunctionData(\"grantAgentSession\", [\n      sessionKey,\n      {\n        expiry: cfg.expiry,\n        velocityLimit: cfg.velocityLimit,\n        velocityWindow: cfg.velocityWindow,\n        spendToken: cfg.spendToken,\n        spendCap: cfg.spendCap,\n        revoked: false,\n        callTargets: cfg.callTargets,\n        selectorAllowlist: cfg.selectorAllowlist,\n      },\n    ]);\n  }\n\n  /**\n   * Encode calldata for delegateSession() — sub-agent delegation.\n   * The sub-agent config must be a strict subset of the parent session's scope.\n   * Called by the parent session key (not the account owner).\n   */\n  encodeDelegateSession(subKey: string, subCfg: AgentSessionConfig): string {\n    const iface = new ethers.Interface(AGENT_SESSION_KEY_VALIDATOR_ABI);\n    return iface.encodeFunctionData(\"delegateSession\", [\n      subKey,\n      {\n        expiry: subCfg.expiry,\n        velocityLimit: subCfg.velocityLimit,\n        velocityWindow: subCfg.velocityWindow,\n        spendToken: subCfg.spendToken,\n        spendCap: subCfg.spendCap,\n        revoked: false,\n        callTargets: subCfg.callTargets,\n        selectorAllowlist: subCfg.selectorAllowlist,\n      },\n    ]);\n  }\n\n  /** Encode calldata for revokeAgentSession(). */\n  encodeRevokeAgentSession(sessionKey: string): string {\n    const iface = new ethers.Interface(AGENT_SESSION_KEY_VALIDATOR_ABI);\n    return iface.encodeFunctionData(\"revokeAgentSession\", [sessionKey]);\n  }\n\n  /** Query agent session config + runtime state. */\n  async getAgentSession(account: string, sessionKey: string): Promise<AgentSessionInfo> {\n    const [expiry, velocityLimit, velocityWindow, spendToken, spendCap, revoked, callTargets, selectorAllowlist] =\n      await this.askValidator.agentSessions(account, sessionKey);\n    const [callCount, windowStart, totalSpent] =\n      await this.askValidator.sessionStates(account, sessionKey);\n    return {\n      expiry: Number(expiry),\n      velocityLimit: Number(velocityLimit),\n      velocityWindow: Number(velocityWindow),\n      spendToken,\n      spendCap: BigInt(spendCap),\n      callTargets,\n      selectorAllowlist,\n      revoked,\n      callCount: BigInt(callCount),\n      windowStart: BigInt(windowStart),\n      totalSpent: BigInt(totalSpent),\n    };\n  }\n\n  /** Check if an agent session is active (not expired, not revoked). */\n  async isAgentSessionActive(account: string, sessionKey: string): Promise<boolean> {\n    const session = await this.getAgentSession(account, sessionKey);\n    return session.expiry > Math.floor(Date.now() / 1000) && !session.revoked;\n  }\n\n  /** Return the parent account of a delegated session key. */\n  async getSessionKeyOwner(sessionKey: string): Promise<string> {\n    return this.askValidator.sessionKeyOwner(sessionKey) as Promise<string>;\n  }\n\n  /** Return the parent key that delegated to subKey, or ZeroAddress if not delegated. */\n  async getDelegatedBy(account: string, subKey: string): Promise<string> {\n    return this.askValidator.delegatedBy(account, subKey) as Promise<string>;\n  }\n}\n","import { ethers } from \"ethers\";\nimport { AIRACCOUNT_ABI, GLOBAL_GUARD_ABI } from \"../constants/entrypoint\";\n\nconst EXTENDED_GUARD_ABI = [\n  ...GLOBAL_GUARD_ABI,\n  \"function todaySpent() external view returns (uint256)\",\n  \"function tokenTodaySpent(address token) external view returns (uint256)\",\n  \"function approvedAlgorithms(uint8 algId) external view returns (bool)\",\n  \"function tier1Limit() external view returns (uint256)\",\n  \"function tier2Limit() external view returns (uint256)\",\n  \"function minDailyLimit() external view returns (uint256)\",\n];\n\nexport type TierLevel = 1 | 2 | 3;\n\nexport interface GuardState {\n  /** ETH daily limit in wei */\n  dailyLimit: bigint;\n  /** ETH already spent today in wei */\n  todaySpent: bigint;\n  /** ETH remaining for today in wei */\n  remaining: bigint;\n  /** Current tier based on spent amount */\n  currentTier: TierLevel;\n  /** Tier 1 max spend threshold in wei (single sig) */\n  tier1Limit: bigint;\n  /** Tier 2 max spend threshold in wei (dual sig) */\n  tier2Limit: bigint;\n  /** Minimum daily limit floor (cannot decrease below this) */\n  minDailyLimit: bigint;\n  /** Guard contract address */\n  guardAddress: string;\n}\n\nexport interface TokenGuardState {\n  token: string;\n  todaySpent: bigint;\n  dailyLimit: bigint;\n  remaining: bigint;\n  currentTier: TierLevel;\n  tier1Limit: bigint;\n  tier2Limit: bigint;\n}\n\n/**\n * GuardStateReader — F6: read AAStarGlobalGuard spending state.\n *\n * Enables UI components to show:\n *   - Daily spend progress bar\n *   - Current required tier (T1/T2/T3) for next transaction\n *   - Per-token limits and remaining allowances\n */\nexport class GuardStateReader {\n  private readonly provider: ethers.JsonRpcProvider;\n\n  constructor(provider: ethers.JsonRpcProvider) {\n    this.provider = provider;\n  }\n\n  /**\n   * Read the full ETH guard state for an account.\n   * Returns null if the account has no guard (dailyLimit=0).\n   */\n  async getGuardState(accountAddress: string): Promise<GuardState | null> {\n    const account = new ethers.Contract(accountAddress, AIRACCOUNT_ABI, this.provider);\n    const guardAddress: string = await account.guard();\n    if (guardAddress === ethers.ZeroAddress) return null;\n\n    const guard = new ethers.Contract(guardAddress, EXTENDED_GUARD_ABI, this.provider);\n    const [dailyLimit, remaining, todaySpent, tier1Limit, tier2Limit, minDailyLimit] =\n      await Promise.all([\n        guard.dailyLimit(),\n        guard.remainingDailyAllowance(),\n        guard.todaySpent(),\n        guard.tier1Limit().catch(() => 0n),\n        guard.tier2Limit().catch(() => 0n),\n        guard.minDailyLimit().catch(() => 0n),\n      ]);\n\n    return {\n      dailyLimit: BigInt(dailyLimit),\n      todaySpent: BigInt(todaySpent),\n      remaining: BigInt(remaining),\n      currentTier: resolveTierFromSpend(BigInt(todaySpent), BigInt(tier1Limit), BigInt(tier2Limit)),\n      tier1Limit: BigInt(tier1Limit),\n      tier2Limit: BigInt(tier2Limit),\n      minDailyLimit: BigInt(minDailyLimit),\n      guardAddress,\n    };\n  }\n\n  /**\n   * Read per-token guard state.\n   * Returns null if the token is not configured on the guard.\n   */\n  async getTokenGuardState(\n    accountAddress: string,\n    token: string,\n  ): Promise<TokenGuardState | null> {\n    const account = new ethers.Contract(accountAddress, AIRACCOUNT_ABI, this.provider);\n    const guardAddress: string = await account.guard();\n    if (guardAddress === ethers.ZeroAddress) return null;\n\n    const guard = new ethers.Contract(guardAddress, EXTENDED_GUARD_ABI, this.provider);\n    try {\n      const todaySpent = await guard.tokenTodaySpent(token);\n      // TokenConfig is not directly readable on-chain per token; limits are not fully implemented.\n      return {\n        token,\n        todaySpent: BigInt(todaySpent),\n        dailyLimit: 0n, // token daily limit not directly exposed\n        remaining: 0n,\n        currentTier: 1 as TierLevel,\n        tier1Limit: 0n,\n        tier2Limit: 0n,\n      };\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Determine the minimum tier required to send a given ETH amount.\n   * Useful for showing \"this transfer needs 2 signatures\" before submission.\n   */\n  async requiredTierForAmount(\n    accountAddress: string,\n    amountWei: bigint,\n  ): Promise<TierLevel> {\n    const state = await this.getGuardState(accountAddress);\n    if (!state) return 1; // No guard = no tier restriction\n\n    const projectedSpend = state.todaySpent + amountWei;\n    return resolveTierFromSpend(projectedSpend, state.tier1Limit, state.tier2Limit);\n  }\n\n  /**\n   * Check if a given algorithm ID is approved on the guard.\n   */\n  async isAlgorithmApproved(accountAddress: string, algId: number): Promise<boolean> {\n    const account = new ethers.Contract(accountAddress, AIRACCOUNT_ABI, this.provider);\n    const guardAddress: string = await account.guard();\n    if (guardAddress === ethers.ZeroAddress) return true;\n\n    const guard = new ethers.Contract(guardAddress, EXTENDED_GUARD_ABI, this.provider);\n    return guard.approvedAlgorithms(algId) as Promise<boolean>;\n  }\n}\n\n/**\n * Resolve required tier from cumulative spend vs tier thresholds.\n *\n * tier1Limit=0 means no Tier-1 cap (everything is Tier 1).\n * tier2Limit=0 means no Tier-2 cap (anything above tier1 is Tier 2).\n */\nfunction resolveTierFromSpend(\n  spent: bigint,\n  tier1Limit: bigint,\n  tier2Limit: bigint,\n): TierLevel {\n  if (tier1Limit === 0n) return 1;\n  if (spent < tier1Limit) return 1;\n  if (tier2Limit === 0n || spent < tier2Limit) return 2;\n  return 3;\n}\n","import { ethers } from \"ethers\";\nimport { AIRACCOUNT_ADDRESSES, AIRACCOUNT_FACTORY_ABI } from \"../constants/entrypoint\";\n\n/**\n * OAPD — One Account Per DApp address derivation (F7).\n *\n * Each DApp gets a unique counterfactual AirAccount address derived from:\n *   salt = keccak256(owner ‖ dappId)\n *\n * This prevents DApps from correlating user activity across sites while\n * sharing the same underlying owner key and guardians.\n *\n * The OAPD address is a standard AirAccount clone — it has its own guard,\n * its own daily limits, and can be funded independently.\n */\n\nexport interface OapdConfig {\n  /** Account owner address */\n  owner: string;\n  /** DApp identifier — use the DApp's domain or contract address */\n  dappId: string;\n  /** Factory address (defaults to M7 Sepolia) */\n  factoryAddress?: string;\n  /**\n   * InitConfig for the OAPD account.\n   * Typically lower daily limits than the main account.\n   */\n  initConfig: {\n    guardians: [string, string, string];\n    dailyLimit: bigint;\n    approvedAlgIds: number[];\n    minDailyLimit: bigint;\n    initialTokens: string[];\n    initialTokenConfigs: Array<{\n      tier1Limit: bigint;\n      tier2Limit: bigint;\n      dailyLimit: bigint;\n    }>;\n  };\n}\n\n/**\n * Compute the numeric salt for an OAPD address.\n * salt = uint256(keccak256(abi.encodePacked(owner, dappId)))\n */\nexport function computeOapdSalt(owner: string, dappId: string): bigint {\n  const packed = ethers.solidityPacked([\"address\", \"string\"], [owner, dappId]);\n  return BigInt(ethers.keccak256(packed));\n}\n\n/**\n * Predict the counterfactual OAPD address without deploying.\n * Uses the factory's getAddress() view function.\n */\nexport async function getOapdAddress(\n  provider: ethers.JsonRpcProvider,\n  config: OapdConfig,\n): Promise<string> {\n  const factoryAddress = config.factoryAddress ?? AIRACCOUNT_ADDRESSES.sepolia.factory;\n  const factory = new ethers.Contract(factoryAddress, AIRACCOUNT_FACTORY_ABI, provider);\n  const salt = computeOapdSalt(config.owner, config.dappId);\n\n  return factory.getFunction(\"getAddress\")(config.owner, salt, config.initConfig) as Promise<string>;\n}\n\n/**\n * Get the OAPD address and its ERC-7828 chain-qualified identifier.\n */\nexport async function getOapdAddressWithChainId(\n  provider: ethers.JsonRpcProvider,\n  config: OapdConfig,\n): Promise<{ address: string; chainQualified: string }> {\n  const factoryAddress = config.factoryAddress ?? AIRACCOUNT_ADDRESSES.sepolia.factory;\n  const factory = new ethers.Contract(factoryAddress, AIRACCOUNT_FACTORY_ABI, provider);\n  const salt = computeOapdSalt(config.owner, config.dappId);\n\n  const result = await factory.getFunction(\"getAddressWithChainId\")(\n    config.owner,\n    salt,\n    config.initConfig,\n  );\n  return { address: result[0] as string, chainQualified: result[1] as string };\n}\n\n/**\n * Check if an OAPD account has been deployed yet.\n */\nexport async function isOapdDeployed(\n  provider: ethers.JsonRpcProvider,\n  config: OapdConfig,\n): Promise<boolean> {\n  const address = await getOapdAddress(provider, config);\n  const code = await provider.getCode(address);\n  return code !== \"0x\";\n}\n","// ─── Algorithm IDs (matches AAStarAirAccountBase constants) ─────\n\nexport const ALG_BLS = 0x01;\nexport const ALG_ECDSA = 0x02;\nexport const ALG_P256 = 0x03;\nexport const ALG_CUMULATIVE_T2 = 0x04; // P256 + BLS\nexport const ALG_CUMULATIVE_T3 = 0x05; // P256 + BLS + Guardian ECDSA\n\nexport type AlgId =\n  | typeof ALG_BLS\n  | typeof ALG_ECDSA\n  | typeof ALG_P256\n  | typeof ALG_CUMULATIVE_T2\n  | typeof ALG_CUMULATIVE_T3;\n\n// ─── Tier Levels ───────────────────────────────────────────────\n\nexport type TierLevel = 1 | 2 | 3;\n\nexport interface TierConfig {\n  /** Max value for Tier 1 (single ECDSA/Passkey). 0 = no enforcement. */\n  tier1Limit: bigint;\n  /** Max value for Tier 2 (P256 + BLS). 0 = no enforcement. */\n  tier2Limit: bigint;\n}\n\n// ─── Guard Status ──────────────────────────────────────────────\n\nexport interface GuardStatus {\n  hasGuard: boolean;\n  guardAddress: string;\n  dailyLimit: bigint;\n  dailyRemaining: bigint;\n}\n\n// ─── Pre-check result ──────────────────────────────────────────\n\nexport interface PreCheckResult {\n  ok: boolean;\n  errors: string[];\n  tier: TierLevel;\n  algId: AlgId;\n}\n","import {\n  TierLevel,\n  TierConfig,\n  AlgId,\n  ALG_ECDSA,\n  ALG_CUMULATIVE_T2,\n  ALG_CUMULATIVE_T3,\n} from \"./types\";\n\n/**\n * Determine the required tier for a given transaction value.\n *\n * - Tier 1: value <= tier1Limit — single ECDSA or P256 passkey\n * - Tier 2: tier1Limit < value <= tier2Limit — P256 + BLS aggregate\n * - Tier 3: value > tier2Limit — P256 + BLS + Guardian ECDSA\n *\n * If both limits are 0 (no enforcement), always returns Tier 1.\n */\nexport function resolveTier(value: bigint, config: TierConfig): TierLevel {\n  if (config.tier1Limit === 0n && config.tier2Limit === 0n) return 1;\n  if (config.tier1Limit > 0n && value <= config.tier1Limit) return 1;\n  if (config.tier2Limit > 0n && value <= config.tier2Limit) return 2;\n  return 3;\n}\n\n/**\n * Get the algorithm ID to use for a given tier.\n *\n * - Tier 1: ALG_ECDSA (0x02) — raw 65-byte ECDSA, no prefix needed\n * - Tier 2: ALG_CUMULATIVE_T2 (0x04) — P256 + BLS\n * - Tier 3: ALG_CUMULATIVE_T3 (0x05) — P256 + BLS + Guardian\n */\nexport function algIdForTier(tier: TierLevel): AlgId {\n  switch (tier) {\n    case 1:\n      return ALG_ECDSA;\n    case 2:\n      return ALG_CUMULATIVE_T2;\n    case 3:\n      return ALG_CUMULATIVE_T3;\n  }\n}\n","import { ethers } from \"ethers\";\nimport { EthereumProvider } from \"../providers/ethereum-provider\";\nimport { AIRACCOUNT_ABI, GLOBAL_GUARD_ABI } from \"../constants/entrypoint\";\nimport {\n  TierConfig,\n  GuardStatus,\n  PreCheckResult,\n  ALG_ECDSA,\n  ALG_P256,\n  ALG_BLS,\n  ALG_CUMULATIVE_T2,\n  ALG_CUMULATIVE_T3,\n} from \"../../core/tier\";\nimport { resolveTier, algIdForTier } from \"../../core/tier\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\n\nconst ALG_NAMES: Record<number, string> = {\n  [ALG_BLS]: \"BLS (0x01)\",\n  [ALG_ECDSA]: \"ECDSA (0x02)\",\n  [ALG_P256]: \"P256 (0x03)\",\n  [ALG_CUMULATIVE_T2]: \"Cumulative T2 (0x04)\",\n  [ALG_CUMULATIVE_T3]: \"Cumulative T3 (0x05)\",\n};\n\n/**\n * Pre-checks transactions against GlobalGuard before submitting on-chain.\n * Avoids wasted gas from predictable reverts.\n */\nexport class GuardChecker {\n  private readonly logger: ILogger;\n\n  constructor(\n    private readonly ethereum: EthereumProvider,\n    logger?: ILogger\n  ) {\n    this.logger = logger ?? new ConsoleLogger(\"[GuardChecker]\");\n  }\n\n  /**\n   * Fetch tier limits from an AirAccount contract.\n   */\n  async fetchTierConfig(accountAddress: string): Promise<TierConfig> {\n    const provider = this.ethereum.getProvider();\n    const account = new ethers.Contract(accountAddress, AIRACCOUNT_ABI, provider);\n\n    const [tier1Limit, tier2Limit] = await Promise.all([\n      account.tier1Limit(),\n      account.tier2Limit(),\n    ]);\n\n    return {\n      tier1Limit: BigInt(tier1Limit),\n      tier2Limit: BigInt(tier2Limit),\n    };\n  }\n\n  /**\n   * Fetch guard status from the account's GlobalGuard.\n   */\n  async fetchGuardStatus(accountAddress: string): Promise<GuardStatus> {\n    const provider = this.ethereum.getProvider();\n    const account = new ethers.Contract(accountAddress, AIRACCOUNT_ABI, provider);\n\n    const config = await account.getConfigDescription();\n    const guardAddress = config.guardAddress;\n\n    if (guardAddress === ethers.ZeroAddress) {\n      return {\n        hasGuard: false,\n        guardAddress: ethers.ZeroAddress,\n        dailyLimit: 0n,\n        dailyRemaining: 0n,\n      };\n    }\n\n    const guard = new ethers.Contract(guardAddress, GLOBAL_GUARD_ABI, provider);\n    const [dailyLimit, dailyRemaining] = await Promise.all([\n      guard.dailyLimit(),\n      guard.remainingDailyAllowance(),\n    ]);\n\n    return {\n      hasGuard: true,\n      guardAddress,\n      dailyLimit: BigInt(dailyLimit),\n      dailyRemaining: BigInt(dailyRemaining),\n    };\n  }\n\n  /**\n   * Pre-check a transaction: determine tier, check guard limits and algorithm approval.\n   * Returns errors array (empty = OK to proceed).\n   */\n  async preCheck(accountAddress: string, value: bigint): Promise<PreCheckResult> {\n    const errors: string[] = [];\n\n    // Fetch tier config → resolve tier → get algId\n    const tierConfig = await this.fetchTierConfig(accountAddress);\n    const tier = resolveTier(value, tierConfig);\n    const algId = algIdForTier(tier);\n\n    // Fetch guard status\n    const guard = await this.fetchGuardStatus(accountAddress);\n\n    if (!guard.hasGuard) {\n      return { ok: true, errors: [], tier, algId };\n    }\n\n    // Check daily allowance\n    if (guard.dailyLimit > 0n && value > guard.dailyRemaining) {\n      errors.push(\n        `Daily limit exceeded: requesting ${value} wei but only ${guard.dailyRemaining} remaining (limit: ${guard.dailyLimit})`\n      );\n    }\n\n    // Check algorithm approval\n    const provider = this.ethereum.getProvider();\n    const guardContract = new ethers.Contract(guard.guardAddress, GLOBAL_GUARD_ABI, provider);\n    const isApproved = await guardContract.approvedAlgorithms(algId);\n\n    if (!isApproved) {\n      errors.push(\n        `Algorithm ${ALG_NAMES[algId] ?? `0x${algId.toString(16)}`} is not approved by the guard`\n      );\n    }\n\n    if (errors.length > 0) {\n      this.logger.warn(`Pre-check failed for ${accountAddress}: ${errors.join(\"; \")}`);\n    }\n\n    return { ok: errors.length === 0, errors, tier, algId };\n  }\n}\n","import { ethers } from \"ethers\";\nimport axios, { AxiosInstance } from \"axios\";\nimport { ILogger, ConsoleLogger } from \"../interfaces/logger\";\n\n// ── Legacy Passkey Assertion (reusable for BLS dual-signing) ─────\n\nexport interface LegacyPasskeyAssertion {\n  AuthenticatorData: string; // \"0x...\"\n  ClientDataHash: string; // \"0x...\"\n  Signature: string; // \"0x...\"\n}\n\n// ── CreateKey ────────────────────────────────────────────────────\n\nexport interface KmsCreateKeyRequest {\n  Description: string;\n  KeyUsage?: string;\n  KeySpec?: string;\n  Origin?: string;\n  PasskeyPublicKey: string; // P-256 public key hex (required for new KMS)\n}\n\nexport interface KmsCreateKeyResponse {\n  KeyMetadata: {\n    KeyId: string;\n    Arn: string;\n    CreationDate: string;\n    Enabled: boolean;\n    Description: string;\n    KeyUsage: string;\n    KeySpec: string;\n    Origin: string;\n    Address?: string;\n  };\n  Mnemonic: string;\n  Address?: string;\n  Status?: string; // \"deriving\" — address is derived asynchronously\n}\n\n// ── SignHash ─────────────────────────────────────────────────────\n\nexport interface KmsSignHashResponse {\n  Signature: string;\n}\n\n// ── WebAuthn Registration ────────────────────────────────────────\n\nexport interface KmsBeginRegistrationRequest {\n  Description?: string;\n  UserName?: string;\n  UserDisplayName?: string;\n}\n\nexport interface KmsBeginRegistrationResponse {\n  ChallengeId: string;\n  Options: PublicKeyCredentialCreationOptions;\n}\n\nexport interface KmsCompleteRegistrationRequest {\n  ChallengeId: string;\n  Credential: unknown; // RegistrationResponseJSON from @simplewebauthn/browser\n  Description?: string;\n}\n\nexport interface KmsCompleteRegistrationResponse {\n  KeyId: string;\n  CredentialId: string;\n  Status: string;\n}\n\n// ── WebAuthn Authentication ──────────────────────────────────────\n\nexport interface KmsBeginAuthenticationRequest {\n  Address?: string;\n  KeyId?: string;\n}\n\nexport interface KmsBeginAuthenticationResponse {\n  ChallengeId: string;\n  Options: PublicKeyCredentialRequestOptions;\n}\n\n// ── Key Status ───────────────────────────────────────────────────\n\nexport interface KmsKeyStatusResponse {\n  KeyId: string;\n  Status: \"creating\" | \"deriving\" | \"ready\" | \"error\";\n  Address?: string;\n  PublicKey?: string;\n  DerivationPath?: string;\n  Error?: string;\n}\n\n// ── Describe Key ─────────────────────────────────────────────────\n\nexport interface KmsDescribeKeyResponse {\n  KeyMetadata: {\n    KeyId: string;\n    Address?: string;\n    PublicKey?: string;\n    DerivationPath?: string;\n    PasskeyPublicKey?: string;\n    Arn?: string;\n    CreationDate?: string;\n    Enabled?: boolean;\n    Description?: string;\n    KeyUsage?: string;\n    KeySpec?: string;\n    Origin?: string;\n  };\n}\n\n/**\n * KMS service for remote key management with WebAuthn/Passkey integration.\n *\n * The new STM32 KMS (kms1.aastar.io) natively integrates WebAuthn, so\n * registration/authentication ceremonies are handled by the KMS directly.\n * Signing operations require a Passkey assertion (Legacy hex or WebAuthn ceremony).\n */\nexport class KmsManager {\n  private readonly kmsEndpoint: string;\n  private readonly isEnabled: boolean;\n  private readonly apiKey?: string;\n  private readonly logger: ILogger;\n  private readonly http: AxiosInstance;\n\n  constructor(options: {\n    kmsEndpoint?: string;\n    kmsEnabled?: boolean;\n    kmsApiKey?: string;\n    logger?: ILogger;\n  }) {\n    this.kmsEndpoint = options.kmsEndpoint ?? \"https://kms1.aastar.io\";\n    this.isEnabled = options.kmsEnabled === true;\n    this.apiKey = options.kmsApiKey;\n    this.logger = options.logger ?? new ConsoleLogger(\"[KmsManager]\");\n\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n    };\n    if (this.apiKey) {\n      headers[\"x-api-key\"] = this.apiKey;\n    }\n\n    this.http = axios.create({\n      baseURL: this.kmsEndpoint,\n      headers,\n    });\n  }\n\n  isKmsEnabled(): boolean {\n    return this.isEnabled;\n  }\n\n  private ensureEnabled(): void {\n    if (!this.isEnabled) {\n      throw new Error(\"KMS service is not enabled\");\n    }\n  }\n\n  /** POST with x-amz-target header (required for wallet/signing operations). */\n  private async amzPost<T>(path: string, target: string, body: unknown): Promise<T> {\n    const response = await this.http.post(path, body, {\n      headers: {\n        \"Content-Type\": \"application/x-amz-json-1.1\",\n        \"x-amz-target\": target,\n      },\n    });\n    return response.data as T;\n  }\n\n  // ── Key Management ──────────────────────────────────────────────\n\n  async createKey(description: string, passkeyPublicKey: string): Promise<KmsCreateKeyResponse> {\n    this.ensureEnabled();\n\n    return this.amzPost(\"/CreateKey\", \"TrentService.CreateKey\", {\n      Description: description,\n      KeyUsage: \"SIGN_VERIFY\",\n      KeySpec: \"ECC_SECG_P256K1\",\n      Origin: \"EXTERNAL_KMS\",\n      PasskeyPublicKey: passkeyPublicKey,\n    });\n  }\n\n  async getKeyStatus(keyId: string): Promise<KmsKeyStatusResponse> {\n    this.ensureEnabled();\n\n    const response = await this.http.get(\"/KeyStatus\", {\n      params: { KeyId: keyId },\n    });\n    return response.data as KmsKeyStatusResponse;\n  }\n\n  async describeKey(keyId: string): Promise<KmsDescribeKeyResponse> {\n    this.ensureEnabled();\n\n    return this.amzPost(\"/DescribeKey\", \"TrentService.DescribeKey\", { KeyId: keyId });\n  }\n\n  /**\n   * Poll KeyStatus until the key is ready (address derived) or timeout.\n   * STM32 key derivation takes 60-75 seconds on first creation.\n   */\n  async pollUntilReady(\n    keyId: string,\n    timeoutMs: number = 120_000,\n    intervalMs: number = 3_000\n  ): Promise<KmsKeyStatusResponse> {\n    this.ensureEnabled();\n\n    const deadline = Date.now() + timeoutMs;\n\n    while (Date.now() < deadline) {\n      const status = await this.getKeyStatus(keyId);\n      this.logger.debug(`Key ${keyId} status: ${status.Status}`);\n\n      if (status.Status === \"ready\") {\n        return status;\n      }\n      if (status.Status === \"error\") {\n        throw new Error(`KMS key derivation failed: ${status.Error ?? \"unknown error\"}`);\n      }\n\n      await new Promise(resolve => setTimeout(resolve, intervalMs));\n    }\n\n    throw new Error(`KMS key derivation timed out after ${timeoutMs}ms`);\n  }\n\n  // ── Signing ─────────────────────────────────────────────────────\n\n  /**\n   * Sign a hash using Legacy Passkey assertion (reusable for BLS dual-signing).\n   */\n  async signHash(\n    hash: string,\n    assertion: LegacyPasskeyAssertion,\n    target: { Address?: string; KeyId?: string }\n  ): Promise<KmsSignHashResponse> {\n    this.ensureEnabled();\n\n    const formattedHash = hash.startsWith(\"0x\") ? hash : `0x${hash}`;\n\n    const body: Record<string, unknown> = {\n      Hash: formattedHash,\n      Passkey: assertion,\n    };\n\n    if (target.Address) {\n      body.Address = target.Address;\n    }\n    if (target.KeyId) {\n      body.KeyId = target.KeyId;\n    }\n\n    return this.amzPost(\"/SignHash\", \"TrentService.SignHash\", body);\n  }\n\n  /**\n   * Sign a hash using a WebAuthn ceremony assertion (one-time use).\n   */\n  async signHashWithWebAuthn(\n    hash: string,\n    challengeId: string,\n    credential: unknown,\n    target: { Address?: string; KeyId?: string }\n  ): Promise<KmsSignHashResponse> {\n    this.ensureEnabled();\n\n    const formattedHash = hash.startsWith(\"0x\") ? hash : `0x${hash}`;\n\n    const body: Record<string, unknown> = {\n      Hash: formattedHash,\n      WebAuthn: { ChallengeId: challengeId, Credential: credential },\n    };\n\n    if (target.Address) {\n      body.Address = target.Address;\n    }\n    if (target.KeyId) {\n      body.KeyId = target.KeyId;\n    }\n\n    return this.amzPost(\"/SignHash\", \"TrentService.SignHash\", body);\n  }\n\n  // ── WebAuthn Ceremonies ─────────────────────────────────────────\n\n  async beginRegistration(\n    params: KmsBeginRegistrationRequest\n  ): Promise<KmsBeginRegistrationResponse> {\n    this.ensureEnabled();\n\n    const response = await this.http.post(\"/BeginRegistration\", params);\n    return response.data as KmsBeginRegistrationResponse;\n  }\n\n  async completeRegistration(\n    params: KmsCompleteRegistrationRequest\n  ): Promise<KmsCompleteRegistrationResponse> {\n    this.ensureEnabled();\n\n    const response = await this.http.post(\"/CompleteRegistration\", params);\n    return response.data as KmsCompleteRegistrationResponse;\n  }\n\n  async beginAuthentication(\n    params: KmsBeginAuthenticationRequest\n  ): Promise<KmsBeginAuthenticationResponse> {\n    this.ensureEnabled();\n\n    const response = await this.http.post(\"/BeginAuthentication\", params);\n    return response.data as KmsBeginAuthenticationResponse;\n  }\n\n  // ── Factory ─────────────────────────────────────────────────────\n\n  createKmsSigner(\n    keyId: string,\n    address: string,\n    assertionProvider: () => Promise<LegacyPasskeyAssertion>,\n    provider?: ethers.Provider\n  ): KmsSigner {\n    this.ensureEnabled();\n    return new KmsSigner(keyId, address, this, assertionProvider, provider);\n  }\n}\n\n/**\n * ethers.AbstractSigner backed by KMS with Passkey assertion.\n *\n * Each signing operation calls the `assertionProvider` to obtain a Legacy\n * Passkey assertion, which is then passed to KMS SignHash. The Legacy format\n * is reusable (no challenge consumption), enabling BLS dual-signing.\n */\nexport class KmsSigner extends ethers.AbstractSigner {\n  constructor(\n    private readonly keyId: string,\n    private readonly _address: string,\n    private readonly kmsManager: KmsManager,\n    private readonly assertionProvider: () => Promise<LegacyPasskeyAssertion>,\n    provider?: ethers.Provider\n  ) {\n    super(provider);\n  }\n\n  async getAddress(): Promise<string> {\n    return this._address;\n  }\n\n  async signMessage(message: string | Uint8Array): Promise<string> {\n    const messageBytes = typeof message === \"string\" ? ethers.toUtf8Bytes(message) : message;\n    const messageHash = ethers.hashMessage(messageBytes);\n    const assertion = await this.assertionProvider();\n    const signResponse = await this.kmsManager.signHash(messageHash, assertion, {\n      Address: this._address,\n    });\n    return \"0x\" + signResponse.Signature;\n  }\n\n  async signTransaction(tx: ethers.TransactionRequest): Promise<string> {\n    if (!this.provider) {\n      throw new Error(\"Provider is required for signing transactions\");\n    }\n    const populated = await this.populateTransaction(tx);\n    const unsignedTx = ethers.Transaction.from(populated);\n    const txHash = unsignedTx.hash;\n    if (!txHash) {\n      throw new Error(\"Failed to compute transaction hash\");\n    }\n    const assertion = await this.assertionProvider();\n    const signResponse = await this.kmsManager.signHash(txHash, assertion, {\n      Address: this._address,\n    });\n    const sig = ethers.Signature.from(\"0x\" + signResponse.Signature);\n    unsignedTx.signature = sig;\n    return unsignedTx.serialized;\n  }\n\n  async signTypedData(\n    domain: ethers.TypedDataDomain,\n    types: Record<string, ethers.TypedDataField[]>,\n    value: Record<string, unknown>\n  ): Promise<string> {\n    const hash = ethers.TypedDataEncoder.hash(domain, types, value);\n    const assertion = await this.assertionProvider();\n    const signResponse = await this.kmsManager.signHash(hash, assertion, {\n      Address: this._address,\n    });\n    return \"0x\" + signResponse.Signature;\n  }\n\n  connect(provider: ethers.Provider): KmsSigner {\n    return new KmsSigner(\n      this.keyId,\n      this._address,\n      this.kmsManager,\n      this.assertionProvider,\n      provider\n    );\n  }\n}\n","import {\n  IStorageAdapter,\n  AccountRecord,\n  TransferRecord,\n  PaymasterRecord,\n  BlsConfigRecord,\n} from \"../interfaces/storage-adapter\";\n\n/**\n * In-memory storage adapter — useful for testing and demos.\n * All data is lost when the process exits.\n */\nexport class MemoryStorage implements IStorageAdapter {\n  private accounts: AccountRecord[] = [];\n  private transfers: TransferRecord[] = [];\n  private paymasters: Map<string, PaymasterRecord[]> = new Map();\n  private blsConfig: BlsConfigRecord | null = null;\n\n  // ── Accounts ─────────────────────────────────────────────────\n\n  async getAccounts(): Promise<AccountRecord[]> {\n    return [...this.accounts];\n  }\n\n  async saveAccount(account: AccountRecord): Promise<void> {\n    this.accounts.push({ ...account });\n  }\n\n  async findAccountByUserId(userId: string): Promise<AccountRecord | null> {\n    return this.accounts.find(a => a.userId === userId) ?? null;\n  }\n\n  async updateAccount(userId: string, updates: Partial<AccountRecord>): Promise<void> {\n    const index = this.accounts.findIndex(a => a.userId === userId);\n    if (index >= 0) {\n      this.accounts[index] = { ...this.accounts[index], ...updates };\n    }\n  }\n\n  // ── Transfers ────────────────────────────────────────────────\n\n  async saveTransfer(transfer: TransferRecord): Promise<void> {\n    this.transfers.push({ ...transfer });\n  }\n\n  async findTransfersByUserId(userId: string): Promise<TransferRecord[]> {\n    return this.transfers.filter(t => t.userId === userId);\n  }\n\n  async findTransferById(id: string): Promise<TransferRecord | null> {\n    return this.transfers.find(t => t.id === id) ?? null;\n  }\n\n  async updateTransfer(id: string, updates: Partial<TransferRecord>): Promise<void> {\n    const index = this.transfers.findIndex(t => t.id === id);\n    if (index >= 0) {\n      this.transfers[index] = { ...this.transfers[index], ...updates };\n    }\n  }\n\n  // ── Paymasters ───────────────────────────────────────────────\n\n  async getPaymasters(userId: string): Promise<PaymasterRecord[]> {\n    return this.paymasters.get(userId) ?? [];\n  }\n\n  async savePaymaster(userId: string, paymaster: PaymasterRecord): Promise<void> {\n    const list = this.paymasters.get(userId) ?? [];\n    const existingIndex = list.findIndex(p => p.name === paymaster.name);\n    if (existingIndex >= 0) {\n      list[existingIndex] = { ...paymaster };\n    } else {\n      list.push({ ...paymaster });\n    }\n    this.paymasters.set(userId, list);\n  }\n\n  async removePaymaster(userId: string, name: string): Promise<boolean> {\n    const list = this.paymasters.get(userId) ?? [];\n    const filtered = list.filter(p => p.name !== name);\n    if (filtered.length < list.length) {\n      this.paymasters.set(userId, filtered);\n      return true;\n    }\n    return false;\n  }\n\n  // ── BLS Config ───────────────────────────────────────────────\n\n  async getBlsConfig(): Promise<BlsConfigRecord | null> {\n    return this.blsConfig;\n  }\n\n  async updateSignerNodesCache(nodes: unknown[]): Promise<void> {\n    this.blsConfig = {\n      ...this.blsConfig,\n      signerNodes: {\n        nodes: nodes as BlsConfigRecord[\"signerNodes\"] extends { nodes: infer N } ? N : never,\n      },\n    } as BlsConfigRecord;\n  }\n}\n","import { ethers } from \"ethers\";\nimport { ISignerAdapter, PasskeyAssertionContext } from \"../interfaces/signer-adapter\";\n\n/**\n * Local wallet signer — backs all users with a single private key.\n * Suitable for testing, demos, and single-tenant server setups.\n *\n * For multi-tenant production use, implement ISignerAdapter with\n * per-user key management (e.g., KMS, HSM, or encrypted database).\n */\nexport class LocalWalletSigner implements ISignerAdapter {\n  private readonly wallet: ethers.Wallet;\n\n  constructor(privateKey: string, provider?: ethers.Provider) {\n    this.wallet = new ethers.Wallet(privateKey, provider);\n  }\n\n  async getAddress(_userId: string): Promise<string> {\n    return this.wallet.address;\n  }\n\n  async getSigner(_userId: string, _ctx?: PasskeyAssertionContext): Promise<ethers.Signer> {\n    return this.wallet;\n  }\n\n  async ensureSigner(_userId: string): Promise<{ signer: ethers.Signer; address: string }> {\n    return { signer: this.wallet, address: this.wallet.address };\n  }\n}\n"]}