{"version":3,"sources":["../../paymaster/src/SuperPaymaster/index.ts","../../paymaster/src/V4/PaymasterUtils.ts","../../paymaster/src/V4/BundlerCompat.ts","../../paymaster/src/V4/PaymasterClient.ts","../../paymaster/src/V4/PaymasterOperator.ts","../../paymaster/src/V4/SuperPaymasterClient.ts","../../paymaster/src/PaymasterManager.ts"],"names":["concat","pad","toHex","SuperPaymasterABI","keccak256","encodeAbiParameters","toBytes","parseAbiParameters","parseAbi","chainId","isTestnet","encodeFunctionData"],"mappings":"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","file":"chunk-Z5CJJWP7.cjs","sourcesContent":["import { type Address, concat, pad, toHex } from 'viem';\nimport { type PublicClient, SuperPaymasterABI as SUPERPAYMASTER_ABI } from '@aastar/core';\n\nexport type PaymasterConfig = {\n    paymasterAddress: Address;\n    operator: Address;\n    maxRate?: bigint;\n    verificationGasLimit?: bigint;\n    postOpGasLimit?: bigint;\n};\n\nconst DEFAULT_VERIFICATION_GAS = 160000n;\nconst DEFAULT_POSTOP_GAS = 10000n;\n\n/**\n * Constructs the middleware for SuperPaymaster.\n * Returns the `paymasterAndData` hex string.\n */\nexport function getSuperPaymasterMiddleware(config: PaymasterConfig) {\n    return {\n        sponsorUserOperation: async (args: { userOperation: any }) => {\n            const verGas = config.verificationGasLimit ?? DEFAULT_VERIFICATION_GAS;\n            const postGas = config.postOpGasLimit ?? DEFAULT_POSTOP_GAS;\n            const maxRate = config.maxRate ?? 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;\n\n            // V3.2.1 Layout: [Paymaster(20)] [VerGas(16)] [PostOpGas(16)] [Operator(20)] [MaxRate(32)]\n            // Offset 72 starts MaxRate.\n            const paymasterAndData = concat([\n                config.paymasterAddress,\n                pad(toHex(verGas), { size: 16 }),\n                pad(toHex(postGas), { size: 16 }),\n                config.operator,\n                pad(toHex(maxRate), { size: 32 })\n            ]);\n\n            return {\n                paymasterAndData,\n                verificationGasLimit: verGas,\n                preVerificationGas: args.userOperation.preVerificationGas, \n            };\n        }\n    };\n}\n\n/**\n * Enhanced eligibility check for SuperPaymaster V3.\n * Validates that user has sufficient credit with the given operator.\n */\nexport async function checkEligibility(\n    client: any, \n    paymaster: Address, \n    user: Address, \n    operator: Address\n): Promise<{ eligible: boolean; credit?: bigint; token?: Address }> {\n    try {\n        // 1. Fetch operator's configured token\n        const operatorData = await client.readContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'operators',\n            args: [operator]\n        });\n        \n        // operatorData structure: [token, treasury, isConfigured, isPaused, exchangeRate, ...]\n        const token = operatorData[0] as Address;\n        const isConfigured = operatorData[2] as boolean;\n        const isPaused = operatorData[3] as boolean;\n        \n        if (!isConfigured || isPaused) {\n            return { eligible: false };\n        }\n        \n        // 2. Check available credit\n        const credit = await client.readContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'getAvailableCredit',\n            args: [user, token]\n        });\n        \n        return { \n            eligible: (credit as bigint) > 0n, \n            credit: credit as bigint,\n            token\n        };\n    } catch (e) {\n        console.warn('Eligibility check failed:', e);\n        return { eligible: false };\n    }\n}\n\n/**\n * Admin Client for SuperPaymaster V3\n */\nexport class SuperPaymasterAdminClient {\n    private client: any;\n    private paymasterAddress: Address;\n\n    constructor(client: any, paymasterAddress: Address) {\n        this.client = client;\n        this.paymasterAddress = paymasterAddress;\n    }\n\n    async getOperator(operator: Address) {\n        return this.client.readContract({\n            address: this.paymasterAddress,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'operators',\n            args: [operator]\n        });\n    }\n\n    static async configureOperator(\n        wallet: any,\n        paymaster: Address,\n        token: Address,\n        treasury: Address\n    ) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'configureOperator',\n            args: [token, treasury],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async setOperatorPaused(wallet: any, paymaster: Address, operator: Address, paused: boolean) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'setOperatorPaused',\n            args: [operator, paused],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async updateReputation(wallet: any, paymaster: Address, operator: Address, score: bigint) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'updateReputation',\n            args: [operator, score],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async setAPNTsToken(wallet: any, paymaster: Address, token: Address) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'setAPNTsToken',\n            args: [token],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async setXPNTsFactory(wallet: any, paymaster: Address, factory: Address) {\n        return wallet.writeContract({\n            address: paymaster,\n            abi: SUPERPAYMASTER_ABI,\n            functionName: 'setXPNTsFactory',\n            args: [factory],\n            chain: wallet.chain\n        } as any);\n    }\n}\n","import { type Address, concat, pad, toHex, keccak256, encodeAbiParameters, type Hex, toBytes } from 'viem';\n\nexport type PaymasterV4MiddlewareConfig = {\n    paymasterAddress: Address;\n    gasToken: Address;\n    verificationGasLimit?: bigint;\n    postOpGasLimit?: bigint;\n};\n\nexport type GaslessReadinessReport = {\n    isReady: boolean;\n    issues: string[];\n    details: {\n        paymasterStake: bigint;\n        paymasterDeposit: bigint;\n        ethUsdPrice: bigint;\n        tokenSupported: boolean;\n        tokenPrice: bigint;\n        userTokenBalance: bigint;\n        userPaymasterDeposit: bigint;\n    };\n};\n\nconst DEFAULT_VERIFICATION_GAS_V4 = 1500000n; // ~1.5M for safety\nconst DEFAULT_POSTOP_GAS_V4 = 300000n; // ~300k for postOp logic\n\n/**\n * Constructs the middleware for Paymaster V4.\n * Returns the `paymasterAndData` hex string.\n */\nexport function getPaymasterV4Middleware(config: PaymasterV4MiddlewareConfig) {\n    return {\n        sponsorUserOperation: async (args: { userOperation: any }) => {\n            const verGas = config.verificationGasLimit ?? DEFAULT_VERIFICATION_GAS_V4;\n            const postGas = config.postOpGasLimit ?? DEFAULT_POSTOP_GAS_V4;\n\n            // Layout: [Paymaster(20)] [VerGas(16)] [PostOpGas(16)] [Token(20)]\n            const paymasterAndData = concat([\n                config.paymasterAddress,\n                pad(toHex(verGas), { size: 16 }),\n                pad(toHex(postGas), { size: 16 }),\n                config.gasToken\n            ]);\n\n            return {\n                paymasterAndData,\n                verificationGasLimit: verGas,\n                preVerificationGas: args.userOperation.preVerificationGas\n            };\n        }\n    };\n}\n\n/**\n * Build paymasterAndData for gasless UserOperation.\n * Layout: [Paymaster(20)] [VerificationGasLimit(16)] [PostOpGasLimit(16)] [Token(20)] [ValidUntil(6)] [ValidAfter(6)]\n */\nexport function buildPaymasterData(\n    paymasterAddress: Address,\n    token: Address,\n    options?: {\n        validityWindow?: number;\n        verificationGasLimit?: bigint;\n        postOpGasLimit?: bigint;\n    }\n): `0x${string}` {\n    const validityWindow = options?.validityWindow ?? 3600;\n    const verGas = options?.verificationGasLimit ?? 200000n; // Increased for estimation\n    const postGas = options?.postOpGasLimit ?? 100000n;\n    \n    const now = Math.floor(Date.now() / 1000);\n    const validUntil = now + validityWindow;\n    const validAfter = now - 100; // 100 seconds grace period\n\n    return concat([\n        paymasterAddress,\n        pad(toHex(verGas), { size: 16 }),\n        pad(toHex(postGas), { size: 16 }),\n        token,\n        pad(toHex(validUntil), { size: 6 }),\n        pad(toHex(validAfter), { size: 6 })\n    ]);\n}\n\n/**\n * Build paymasterAndData for SuperPaymaster V3.\n * Layout: [Paymaster(20)] [verGas(16)] [postGas(16)] [operator(20)] [maxRate(32)]\n * Total: 104 bytes\n * \n * IMPORTANT: SuperPaymaster contract generates validUntil internally using:\n *   validUntil = cachedPrice.updatedAt + priceStalenessThreshold\n * Do NOT include validUntil/validAfter in paymasterAndData!\n */\nexport function buildSuperPaymasterData(\n    paymasterAddress: Address,\n    operator: Address,\n    options?: {\n        verificationGasLimit?: bigint;\n        postOpGasLimit?: bigint;\n        maxRate?: bigint;\n    }\n): `0x${string}` {\n    const verGas = options?.verificationGasLimit ?? 80000n;\n    const postGas = options?.postOpGasLimit ?? 100000n;\n    const maxRate = options?.maxRate ?? ((1n << 256n) - 1n); // Default: max uint256, no rate limit\n    \n    return concat([\n        paymasterAddress,\n        pad(toHex(verGas), { size: 16 }),\n        pad(toHex(postGas), { size: 16 }),\n        operator,\n        pad(toHex(maxRate), { size: 32 }) // Optional rate commitment (rug pull protection)\n    ]);\n}\n\n/**\n * Helper to format UserOp for Alchemy/Standard Bundlers (v0.7 Decomposed)\n */\nexport function formatUserOpV07(userOp: any) {\n    const result: any = {\n        sender: userOp.sender,\n        nonce: toHex(userOp.nonce),\n        callData: userOp.callData,\n        preVerificationGas: toHex(userOp.preVerificationGas),\n        signature: userOp.signature\n    };\n\n    // Only include factory/factoryData if account is NOT deployed (initCode not empty)\n    if (userOp.initCode && userOp.initCode !== '0x' && userOp.initCode.length > 2) {\n        result.initCode = userOp.initCode;\n        if (userOp.initCode.length > 42) {\n            result.factory = userOp.initCode.slice(0, 42);\n            result.factoryData = '0x' + userOp.initCode.slice(42);\n        } else {\n            result.factory = '0x0000000000000000000000000000000000000000';\n            result.factoryData = '0x';\n        }\n    }\n    // If account is deployed, don't include any factory fields at all\n\n    // Unpack accountGasLimits: [verificationGasLimit(16)][callGasLimit(16)]\n    if (userOp.accountGasLimits && userOp.accountGasLimits !== '0x') {\n        const packed = userOp.accountGasLimits.replace('0x', '').padStart(64, '0');\n        result.verificationGasLimit = '0x' + BigInt('0x' + packed.slice(0, 32)).toString(16);\n        result.callGasLimit = '0x' + BigInt('0x' + packed.slice(32, 64)).toString(16);\n    }\n\n    // Unpack gasFees: [maxPriorityFee(16)][maxFee(16)]\n    if (userOp.gasFees && userOp.gasFees !== '0x') {\n        const packed = userOp.gasFees.replace('0x', '').padStart(64, '0');\n        result.maxPriorityFeePerGas = '0x' + BigInt('0x' + packed.slice(0, 32)).toString(16);\n        result.maxFeePerGas = '0x' + BigInt('0x' + packed.slice(32, 64)).toString(16);\n    }\n\n    // Unpack paymasterAndData: [paymaster(20)][verificationGas(16)][postOpGas(16)][paymasterData]\n    if (userOp.paymasterAndData && userOp.paymasterAndData !== '0x') {\n        const packed = userOp.paymasterAndData.replace('0x', '');\n        if (packed.length >= 104) {\n            result.paymaster = '0x' + packed.slice(0, 40);\n            result.paymasterVerificationGasLimit = '0x' + BigInt('0x' + packed.slice(40, 72)).toString(16);\n            result.paymasterPostOpGasLimit = '0x' + BigInt('0x' + packed.slice(72, 104)).toString(16);\n            result.paymasterData = '0x' + packed.slice(104);\n        }\n    }\n\n    return result;\n}\n\nexport function getUserOpHashV07(userOp: any, entryPoint: Address, chainId: bigint): Hex {\n    const hashedUserOp = keccak256(encodeAbiParameters(\n        ['address', 'uint256', 'bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32', 'bytes32'].map(t => ({ type: t } as any)),\n        [\n            userOp.sender,\n            userOp.nonce,\n            keccak256(toBytes(userOp.initCode as Hex)),\n            keccak256(toBytes(userOp.callData as Hex)),\n            userOp.accountGasLimits as Hex,\n            toHex(userOp.preVerificationGas),\n            userOp.gasFees as Hex,\n            keccak256(toBytes(userOp.paymasterAndData as Hex))\n        ]\n    ));\n    return keccak256(encodeAbiParameters(\n        ['bytes32', 'address', 'uint256'].map(t => ({ type: t } as any)),\n        [hashedUserOp, entryPoint, chainId]\n    ));\n}\n\n/**\n * Tune gas limit using a dynamic nominal ceiling to satisfy Bundler efficiency (0.4)\n * Target: Actual / Limit >= targetEfficiency\n */\nexport function tuneGasLimit(estimate: bigint, nominalActual: bigint, targetEfficiency = 0.45): bigint {\n    if (estimate === 0n) return 0n;\n    // targetEfficiency = actual / ceiling => ceiling = actual / targetEfficiency\n    const ceiling = (nominalActual * 100n) / BigInt(Math.floor(targetEfficiency * 100));\n    // Return the more restrictive limit to ensure efficiency ratio is met\n    return estimate < ceiling ? estimate : ceiling;\n}\n","import { type Address, type PublicClient, type Transport, type Chain } from 'viem';\n\n/**\n * Bundler types we support\n */\nexport enum BundlerType {\n    ALCHEMY = 'alchemy',\n    PIMLICO = 'pimlico',\n    STACKUP = 'stackup',\n    CANDIDE = 'candide',\n    UNKNOWN = 'unknown'\n}\n\n/**\n * Detect bundler type from URL\n */\nexport function detectBundlerType(bundlerUrl: string): BundlerType {\n    const url = bundlerUrl.toLowerCase();\n    if (url.includes('alchemy.com')) return BundlerType.ALCHEMY;\n    if (url.includes('pimlico.io')) return BundlerType.PIMLICO;\n    if (url.includes('stackup')) return BundlerType.STACKUP;\n    if (url.includes('candide.dev')) return BundlerType.CANDIDE;\n    return BundlerType.UNKNOWN;\n}\n\n/**\n * Minimal interface to satisfy basic Pimlico/Bundler needs \n * without bringing in heavy permissionless types that might conflict\n */\nexport interface BundlerConfig {\n    type: BundlerType;\n    url: string;\n    entryPoint: Address;\n}\n\n/**\n * Create a bundler client config\n */\nexport function createBundlerClient(bundlerUrl: string, entryPoint: Address): BundlerConfig {\n    const bundlerType = detectBundlerType(bundlerUrl);\n    \n    return {\n        type: bundlerType,\n        url: bundlerUrl,\n        entryPoint\n    };\n}\n","import { type Address, type Hex, parseAbi, encodePacked, keccak256, toBytes, concat, pad, toHex, encodeFunctionData, encodeAbiParameters, parseAbiParameters } from 'viem';\nimport { type PublicClient } from '@aastar/core';\nimport { buildPaymasterData, buildSuperPaymasterData, formatUserOpV07, getUserOpHashV07, tuneGasLimit } from './PaymasterUtils.js';\nimport { detectBundlerType, BundlerType } from './BundlerCompat.js';\n\n/**\n * PaymasterClient\n * Focus: Integration, Funding, Interaction.\n */\nexport class PaymasterClient {\n    /**\n     * @private\n     * Static utility class, should not be instantiated.\n     */\n    private constructor() {}\n\n    /**\n     * Sign a UserOp hash for the EntryPoint.\n     *\n     * airaccount-contract v0.20.0 `_validateSignature` routes on `signature[0]` as an algId\n     * prefix BEFORE the raw-65-byte fallback. A raw 65-byte ECDSA sig whose first byte happens\n     * to equal an algId const (e.g. `0x02` = ALG_ECDSA) is misrouted → intermittent AA24.\n     * For v0.20.0 AirAccounts pass `airAccountSig: true` to emit the deterministic algId-prefixed\n     * `[0x02][r][s][v]` (66-byte) format (matches `auth/hardware/ledger.ts`). Default is the raw\n     * 65-byte form — unchanged for SimpleAccount and other account types.\n     */\n    private static async signUserOpHash(\n        wallet: any,\n        userOpHash: `0x${string}`,\n        airAccountSig?: boolean\n    ): Promise<`0x${string}`> {\n        const raw = (await wallet.account.signMessage({ message: { raw: userOpHash } })) as `0x${string}`;\n        return airAccountSig ? (`0x02${raw.slice(2)}` as `0x${string}`) : raw;\n    }\n\n    private static makePlaceholderSignature(byteLength: number): `0x${string}` {\n        const clamped = Math.max(0, Math.min(byteLength, 10_000));\n        return (`0x${'11'.repeat(clamped)}`) as `0x${string}`;\n    }\n\n    private static estimatePreVerificationGasV07(userOp: {\n        sender: Address;\n        nonce: bigint;\n        initCode: Hex;\n        callData: Hex;\n        accountGasLimits: Hex;\n        preVerificationGas: bigint;\n        gasFees: Hex;\n        paymasterAndData: Hex;\n        signature: Hex;\n    }): bigint {\n        const encoded = encodeAbiParameters(\n            parseAbiParameters('(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)'),\n            [\n                [\n                    userOp.sender,\n                    userOp.nonce,\n                    userOp.initCode,\n                    userOp.callData,\n                    userOp.accountGasLimits,\n                    userOp.preVerificationGas,\n                    userOp.gasFees,\n                    userOp.paymasterAndData,\n                    userOp.signature\n                ]\n            ]\n        );\n\n        const bytes = toBytes(encoded);\n        let calldataCost = 0n;\n        for (const b of bytes) calldataCost += b === 0 ? 4n : 16n;\n\n        return calldataCost + 26000n;\n    }\n    \n    /**\n     * Get user's deposited balance on the Paymaster.\n     */\n    static async getDepositedBalance(publicClient: any, address: Address, user: Address, token: Address): Promise<bigint> {\n        return publicClient.readContract({\n            address,\n            abi: [{\n                name: 'balances',\n                type: 'function',\n                inputs: [\n                    { name: 'user', type: 'address' },\n                    { name: 'token', type: 'address' }\n                ],\n                outputs: [{ name: '', type: 'uint256' }],\n                stateMutability: 'view'\n            }],\n            functionName: 'balances',\n            args: [user, token]\n        });\n    }\n\n    /**\n     * Deposit tokens to Paymaster for a user (enables gasless transactions).\n     */\n    static async depositFor(wallet: any, address: Address, user: Address, token: Address, amount: bigint) {\n        return wallet.writeContract({\n            address,\n            abi: parseAbi(['function depositFor(address user, address token, uint256 amount) external']),\n            functionName: 'depositFor',\n            args: [user, token, amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /**\n     * Approve the Paymaster (or any spender) to spend gas tokens.\n     */\n    static async approveGasToken(wallet: any, token: Address, spender: Address, amount: bigint) {\n        return wallet.writeContract({\n            address: token,\n            abi: parseAbi(['function approve(address spender, uint256 amount) external returns (bool)']),\n            functionName: 'approve',\n            args: [spender, amount],\n            chain: wallet.chain\n        } as any);\n    }\n\n    /**\n     * Estimate Gas for a UserOperation.\n     */\n    static async estimateUserOperationGas(\n        client: any,\n        wallet: any,\n        aaAddress: Address,\n        entryPoint: Address,\n        paymasterAddress: Address,\n        token: Address,\n        bundlerUrl: string,\n        callData: `0x${string}`,\n        options?: {\n            validityWindow?: number;\n            airAccountSig?: boolean; // v0.20.0 AirAccount: emit algId-prefixed [0x02] sig to avoid intermittent AA24\n            operator?: Address; // For SuperPaymaster\n            factory?: Address;\n            factoryData?: Hex;\n        }\n    ) {\n        // 0. Check cachedPrice (Critical for Paymaster V4)\n        if (!options?.operator) { // Only for Paymaster V4, not SuperPaymaster\n            try {\n                const cache = await client.readContract({\n                    address: paymasterAddress,\n                    abi: parseAbi(['function cachedPrice() view returns (uint208 price, uint48 updatedAt)']),\n                    functionName: 'cachedPrice'\n                }) as any;\n                \n                const cachedPrice: bigint = BigInt(cache?.price ?? cache?.[0] ?? 0);\n                const cachedUpdatedAt: bigint = BigInt(cache?.updatedAt ?? cache?.[1] ?? 0);\n                const now = BigInt(Math.floor(Date.now() / 1000));\n                let stalenessThreshold = 0n;\n\n                try {\n                    stalenessThreshold = await client.readContract({\n                        address: paymasterAddress,\n                        abi: parseAbi(['function priceStalenessThreshold() view returns (uint256)']),\n                        functionName: 'priceStalenessThreshold'\n                    }) as bigint;\n                } catch {}\n\n                const isStale =\n                    cachedPrice === 0n ||\n                    cachedUpdatedAt === 0n ||\n                    (stalenessThreshold > 0n && cachedUpdatedAt + stalenessThreshold < now);\n\n                if (isStale) {\n                    // Check if we're on testnet (chainId 11155111 = Sepolia, 11155420 = OP Sepolia)\n                    const chainId = client.chain?.id || await client.getChainId();\n                    const isTestnet = [11155111, 11155420, 31337].includes(chainId);\n\n                    if (isTestnet) {\n                        const updateHash = await wallet.writeContract({\n                            address: paymasterAddress,\n                            abi: parseAbi(['function updatePrice() external']),\n                            functionName: 'updatePrice'\n                        });\n                        await client.waitForTransactionReceipt({ hash: updateHash });\n                        console.log('[PaymasterClient] ✅ cachedPrice refreshed via updatePrice()');\n                    } else {\n                        throw new Error(\n                            `Paymaster cachedPrice is stale on Mainnet (chainId: ${chainId}). ` +\n                            `This requires Keeper to call updatePrice(). Please ensure Keeper is running.`\n                        );\n                    }\n                }\n            } catch (e: any) {\n                // If error is our mainnet check, re-throw\n                if (e.message?.includes('requires Keeper')) throw e;\n                // Otherwise log and continue (might be old Paymaster without cachedPrice)\n                console.log('[PaymasterClient] ⚠️  Failed to check cachedPrice:', e.message?.slice(0, 50));\n            }\n        }\n        \n        // 1. Construct a dummy UserOp for estimation\n        let paymasterAndData: Hex;\n        \n        if (options?.operator) {\n             paymasterAndData = buildSuperPaymasterData(paymasterAddress, options.operator, {\n                verificationGasLimit: 300000n,\n                postOpGasLimit: 300000n\n             });\n        } else {\n                     paymasterAndData = buildPaymasterData(paymasterAddress, token, {\n                validityWindow: options?.validityWindow,\n                verificationGasLimit: 250000n, \n                postOpGasLimit: 150000n        \n            });\n        }\n\n        // 1.5. Get gas fees from network\n        // Strategy: testnets use aggressive floor (bundlers require higher minimums);\n        //          mainnet uses dynamic estimation with 1.5x buffer for cost efficiency.\n        const chainId = client.chain?.id || await client.getChainId();\n        const isTestnet = [11155111, 11155420, 31337].includes(chainId);\n        const TESTNET_PRIORITY_FLOOR = 500_000_000n; // 0.5 Gwei — Alchemy bundler minimum on testnets\n\n        let maxFeePerGas = 0n;\n        let maxPriorityFeePerGas = 0n;\n        try {\n            const feeData = await client.estimateFeesPerGas();\n            maxFeePerGas = ((feeData.maxFeePerGas ?? 0n) * 115n) / 100n;\n            maxPriorityFeePerGas = ((feeData.maxPriorityFeePerGas ?? 0n) * 115n) / 100n;\n        } catch {}\n        if (!maxFeePerGas) {\n            try {\n                const gasPrice = await client.getGasPrice();\n                maxFeePerGas = (gasPrice * 120n) / 100n;\n            } catch {}\n        }\n        // Testnet floor: bundlers like Alchemy require higher priority than network reports\n        if (isTestnet) {\n            if (maxPriorityFeePerGas < TESTNET_PRIORITY_FLOOR) maxPriorityFeePerGas = TESTNET_PRIORITY_FLOOR;\n            if (maxFeePerGas < TESTNET_PRIORITY_FLOOR * 2n) maxFeePerGas = TESTNET_PRIORITY_FLOOR * 2n;\n        }\n        if (!maxFeePerGas) maxFeePerGas = 1n;\n        if (maxFeePerGas < maxPriorityFeePerGas) maxFeePerGas = maxPriorityFeePerGas + 1n;\n\n        const partialUserOp = {\n            sender: aaAddress,\n            nonce: 0n,\n            initCode: (options?.factory && options?.factoryData) \n                ? concat([options.factory, options.factoryData]) \n                : '0x' as Hex,\n            callData,\n            accountGasLimits: concat([pad(toHex(250000n), { size: 16 }), pad(toHex(500000n), { size: 16 })]), \n            preVerificationGas: 0n, \n            gasFees: concat([pad(toHex(maxPriorityFeePerGas), { size: 16 }), pad(toHex(maxFeePerGas), { size: 16 })]),\n            paymasterAndData,\n            signature: PaymasterClient.makePlaceholderSignature(65)\n        };\n\n        // Get actual nonce\n        try {\n            const nonce = await client.readContract({\n                address: aaAddress,\n                abi: parseAbi(['function getNonce() view returns (uint256)']),\n                functionName: 'getNonce'\n            });\n            partialUserOp.nonce = BigInt(nonce);\n        } catch (e) {}\n\n        partialUserOp.preVerificationGas = (PaymasterClient.estimatePreVerificationGasV07(partialUserOp) * 120n) / 100n + 5000n;\n\n        const userOpHash = getUserOpHashV07(partialUserOp, entryPoint, BigInt(client.chain.id));\n        partialUserOp.signature = await PaymasterClient.signUserOpHash(wallet, userOpHash, options?.airAccountSig);\n\n        const payload = {\n            jsonrpc: '2.0',\n            id: 1,\n            method: 'eth_estimateUserOperationGas',\n            params: [formatUserOpV07(partialUserOp), entryPoint]\n        };\n\n        const response = await fetch(bundlerUrl, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(payload, (_, v) => typeof v === 'bigint' ? '0x' + v.toString(16) : v)\n        });\n\n        const result = await response.json();\n        \n        // Debug logging for Candide\n        if (bundlerUrl.includes('candide')) {\n            console.log('[PaymasterClient] Candide Request:', JSON.stringify(payload.params[0], null, 2));\n            console.log('[PaymasterClient] Candide Response:', JSON.stringify(result, null, 2));\n        }\n\n        const data = result.result;\n\n        // Debug logging for estimation\n        console.log('[PaymasterClient] Gas Estimation Result:', JSON.stringify(data, null, 2));\n\n        // Anvil Fallback for Estimation\n        if (result.error && (result.error.code === -32601 || result.error.message?.includes('Method not found'))) {\n             console.log('[PaymasterClient] EstimateUserOp failed (Method not found). Using Anvil defaults.');\n             return {\n                 preVerificationGas: partialUserOp.preVerificationGas,\n                 verificationGasLimit: 1000000n, \n                 callGasLimit: 2000000n,\n                 paymasterVerificationGasLimit: 100000n,\n                 paymasterPostOpGasLimit: 100000n\n             };\n        }\n\n        if (result.error) throw new Error(`Estimation Error: ${JSON.stringify(result.error)}`);\n        \n        // Dynamic tuning: use estimated values directly to maintain efficiency\n        // Bundler efficiency check: actual_used / limit >= 0.4\n        const estVGL = BigInt(data.verificationGasLimit);\n        const estPMVGL = data.paymasterVerificationGasLimit ? BigInt(data.paymasterVerificationGasLimit) : 100000n;\n\n        return {\n            preVerificationGas: (BigInt(data.preVerificationGas) * 120n) / 100n + 5000n,\n            verificationGasLimit: tuneGasLimit(estVGL, 35_000n, 0.45), \n            callGasLimit: (BigInt(data.callGasLimit) * 110n) / 100n, // Small 1.1x buffer\n            paymasterVerificationGasLimit: tuneGasLimit(estPMVGL, 35_000n, 0.45),\n            paymasterPostOpGasLimit: data.paymasterPostOpGasLimit ? BigInt(data.paymasterPostOpGasLimit) : 100000n\n        };\n    }\n\n    /**\n     * High-level API to submit a gasless UserOperation.\n     * Automatically handles nonce fetching, gas estimation (if not provided), signing, and submission.\n     */\n    static async submitGaslessUserOperation(\n        client: any,\n        wallet: any,\n        aaAddress: Address,\n        entryPoint: Address,\n        paymasterAddress: Address,\n        token: Address,\n        bundlerUrl: string,\n        callData: `0x${string}`,\n        options?: {\n            validityWindow?: number;\n            airAccountSig?: boolean; // v0.20.0 AirAccount: emit algId-prefixed [0x02] sig to avoid intermittent AA24\n            verificationGasLimit?: bigint;\n            callGasLimit?: bigint;\n            preVerificationGas?: bigint;\n            maxFeePerGas?: bigint;\n            maxPriorityFeePerGas?: bigint;\n            autoEstimate?: boolean;\n            operator?: Address; // For SuperPaymaster\n            paymasterVerificationGasLimit?: bigint;\n            paymasterPostOpGasLimit?: bigint;\n            factory?: Address;\n            factoryData?: Hex;\n        }\n    ): Promise<`0x${string}`> {\n        // 0. Auto-Estimate if requested or if limits missing\n        let gasLimits = {\n            preVerificationGas: options?.preVerificationGas,\n            verificationGasLimit: options?.verificationGasLimit,\n            callGasLimit: options?.callGasLimit,\n            paymasterVerificationGasLimit: options?.paymasterVerificationGasLimit,\n            paymasterPostOpGasLimit: options?.paymasterPostOpGasLimit ?? 200_000n\n        };\n\n        if (options?.autoEstimate !== false && (!gasLimits.verificationGasLimit || !gasLimits.callGasLimit)) {\n            const est = await this.estimateUserOperationGas(\n                client, wallet, aaAddress, entryPoint, paymasterAddress, token, bundlerUrl, callData,\n                {\n                    validityWindow: options?.validityWindow,\n                    operator: options?.operator,\n                    factory: options?.factory,\n                    factoryData: options?.factoryData,\n                    airAccountSig: options?.airAccountSig // forward so internal estimate signs in the same format (#115 H-1)\n                }\n            );\n            gasLimits.preVerificationGas = options?.preVerificationGas ?? est.preVerificationGas;\n            gasLimits.verificationGasLimit = options?.verificationGasLimit ?? est.verificationGasLimit;\n            gasLimits.callGasLimit = options?.callGasLimit ?? est.callGasLimit;\n            gasLimits.paymasterVerificationGasLimit = options?.paymasterVerificationGasLimit ?? est.paymasterVerificationGasLimit;\n            // SuperPaymaster postOp calls burnFromWithOpHash (~40k) + storage writes.\n            // Apply 100k buffer with 200k floor. Pure BigInt to avoid Number precision loss.\n            if (!options?.paymasterPostOpGasLimit) {\n                const _base = est.paymasterPostOpGasLimit + 100_000n;\n                gasLimits.paymasterPostOpGasLimit = _base > 200_000n ? _base : 200_000n;\n            }\n        }\n\n        // 1. Get Nonce\n        const nonce = await client.readContract({\n            address: aaAddress,\n            abi: parseAbi(['function getNonce() view returns (uint256)']),\n            functionName: 'getNonce'\n        });\n\n        // 1.5 Get Gas Prices from Network if not provided\n        // Strategy: testnets use aggressive floor; mainnet uses dynamic + 1.5x buffer\n        const chainId = client.chain?.id || await client.getChainId();\n        const isTestnet = [11155111, 11155420, 31337].includes(chainId);\n        const TESTNET_PRIORITY_FLOOR = 500_000_000n; // 0.5 Gwei\n\n        let maxFeePerGas = options?.maxFeePerGas;\n        let maxPriorityFeePerGas = options?.maxPriorityFeePerGas;\n        \n        if (!maxFeePerGas || !maxPriorityFeePerGas) {\n            try {\n                const feeData = await client.estimateFeesPerGas();\n                maxFeePerGas = maxFeePerGas ?? ((feeData.maxFeePerGas ?? 0n) * 115n) / 100n;\n                maxPriorityFeePerGas = maxPriorityFeePerGas ?? ((feeData.maxPriorityFeePerGas ?? 0n) * 115n) / 100n;\n            } catch (e) {\n                maxFeePerGas = maxFeePerGas ?? undefined;\n                maxPriorityFeePerGas = maxPriorityFeePerGas ?? undefined;\n            }\n        }\n        if (!maxFeePerGas) {\n            try {\n                maxFeePerGas = (await client.getGasPrice()) * 150n / 100n;\n            } catch {}\n        }\n        // Testnet floor: bundlers like Alchemy require higher priority than network reports\n        if (isTestnet) {\n            maxPriorityFeePerGas = maxPriorityFeePerGas ?? TESTNET_PRIORITY_FLOOR;\n            if (maxPriorityFeePerGas < TESTNET_PRIORITY_FLOOR) maxPriorityFeePerGas = TESTNET_PRIORITY_FLOOR;\n            if (!maxFeePerGas || maxFeePerGas < TESTNET_PRIORITY_FLOOR * 2n) maxFeePerGas = TESTNET_PRIORITY_FLOOR * 2n;\n        }\n        maxFeePerGas = maxFeePerGas ?? 1n;\n        maxPriorityFeePerGas = maxPriorityFeePerGas ?? 0n;\n        if (maxFeePerGas < maxPriorityFeePerGas) maxFeePerGas = maxPriorityFeePerGas + 1n;\n        console.log(`[PaymasterClient] Gas Pricing: ${isTestnet ? 'TESTNET (0.5 Gwei floor)' : 'MAINNET (dynamic)'} | priority=${maxPriorityFeePerGas} maxFee=${maxFeePerGas}`);\n\n        // 2. Build paymasterAndData\n        let paymasterAndData: Hex;\n        if (options?.operator) {\n            paymasterAndData = buildSuperPaymasterData(paymasterAddress, options.operator, {\n                verificationGasLimit: gasLimits.paymasterVerificationGasLimit ?? gasLimits.verificationGasLimit ?? 150000n,\n                postOpGasLimit: gasLimits.paymasterPostOpGasLimit ?? 100000n\n            });\n        } else {\n            // MATH: Target Efficiency = PVG / (PVG + VGL + PMVGL) >= 0.4\n            // Since PVG is ~100k, (VGL + PMVGL) must be <= 150k.\n            // We set each to 75k to safely pass the 0.4 efficiency guard.\n            const pmVerGas = gasLimits.paymasterVerificationGasLimit ?? 75000n; \n            \n            paymasterAndData = buildPaymasterData(paymasterAddress, token, {\n                validityWindow: options?.validityWindow,\n                verificationGasLimit: pmVerGas,\n                postOpGasLimit: gasLimits.paymasterPostOpGasLimit ?? 100000n\n            });\n        }\n\n        // 3. Construct UserOp\n        const initCode = ((options?.factory && options?.factoryData) ? concat([options.factory, options.factoryData]) : '0x') as Hex;\n        const accountGasLimits = concat([\n            pad(toHex(gasLimits.verificationGasLimit ?? 75000n), { size: 16 }),\n            pad(toHex(gasLimits.callGasLimit ?? 500000n), { size: 16 })\n        ]) as Hex;\n        const gasFees = concat([\n            pad(toHex(maxPriorityFeePerGas), { size: 16 }),\n            pad(toHex(maxFeePerGas), { size: 16 })\n        ]) as Hex;\n        const preVerificationGas =\n            gasLimits.preVerificationGas ??\n            (PaymasterClient.estimatePreVerificationGasV07({\n                sender: aaAddress,\n                nonce: BigInt(nonce),\n                initCode,\n                callData,\n                accountGasLimits,\n                preVerificationGas: 0n,\n                gasFees,\n                paymasterAndData,\n                signature: PaymasterClient.makePlaceholderSignature(65)\n            }) * 120n) / 100n + 5000n;\n\n        const userOp = {\n            sender: aaAddress,\n            nonce: BigInt(nonce),\n            initCode,\n            callData,\n            accountGasLimits,\n            preVerificationGas,\n            gasFees,\n            paymasterAndData,\n            signature: '0x' as `0x${string}`\n        };\n        \n        // Debug logs (Commented out for production)\n        /*\n        console.log(\"DEBUG: UserOp Gas Limits:\", {\n            accountGasLimits: userOp.accountGasLimits,\n            preVerificationGas: userOp.preVerificationGas,\n            gasFees: userOp.gasFees,\n            paymasterAndData: userOp.paymasterAndData\n        });\n        */\n\n\n        // 4. Final Hashing and Signing\n        const userOpHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n        const signature = await PaymasterClient.signUserOpHash(wallet, userOpHash, options?.airAccountSig);\n        userOp.signature = signature;\n\n\n        // 6. Submit to Bundler (Unified JSON-RPC)\n        const bundlerType = detectBundlerType(bundlerUrl);\n        console.log(`[PaymasterClient] Using ${bundlerType} Bundler`);\n        \n        // Retry Loop: Up to 4 retries for compound errors (PVG + fee bump + replacement)\n        for (let attempt = 0; attempt < 5; attempt++) {\n            // Use standard JSON-RPC for all bundlers (Pimlico/Alchemy/Stackup/etc)\n            const response = await fetch(bundlerUrl, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/json' },\n                body: JSON.stringify({\n                    jsonrpc: '2.0',\n                    id: 1,\n                    method: 'eth_sendUserOperation',\n                    params: [formatUserOpV07(userOp), entryPoint]\n                }, (_, v) => typeof v === 'bigint' ? '0x' + v.toString(16) : v)\n            });\n\n            const result = await response.json();\n            \n            // 7. Error Handling & Retry Logic (Fee Bump)\n            if (result.error && attempt < 4) {\n                const msg = result.error.message || '';\n                const errData = result.error.data || {};\n                \n                // Case A: Replacement Underpriced (Nonce collision in mempool)\n                // e.g. {\"code\":-32602,\"message\":\"replacement underpriced\",\"data\":{\"currentMaxPriorityFee\":\"0x5f5e100\",\"currentMaxFee\":\"0xf6a44be\"}}\n                if (result.error.code === -32602 || msg.includes('replacement underpriced')) {\n                     console.log(`[PaymasterClient] ⚠️  Replacement Underpriced. Bumping fees to replace pending UserOp...`);\n                     let newMaxPriority = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(2, 34)) : 0n;\n                     let newMaxFee = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(34)) : 0n;\n\n                     // Extract from data if available (Alchemy/Pimlico standard)\n                     if (errData.currentMaxPriorityFee && errData.currentMaxFee) {\n                         const currentPriority = BigInt(errData.currentMaxPriorityFee);\n                         const currentMax = BigInt(errData.currentMaxFee);\n                         \n                         // Bump by 10% to ensure replacement (Geth/Alchemy minimum)\n                         newMaxPriority = (currentPriority * 110n) / 100n;\n                         newMaxFee = (currentMax * 110n) / 100n;\n                     } else {\n                         // Fallback: Bump current values by 15% if data missing\n                         newMaxPriority = (newMaxPriority * 115n) / 100n;\n                         newMaxFee = (newMaxFee * 115n) / 100n;\n                     }\n\n                     console.log(`   -> New Priority: ${newMaxPriority}, New MaxFee: ${newMaxFee}`);\n                     \n                     // Update UserOp\n                     userOp.gasFees = concat([\n                        pad(toHex(newMaxPriority), { size: 16 }),\n                        pad(toHex(newMaxFee), { size: 16 })\n                     ]) as Hex;\n\n                     // Re-Sign\n                     const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n                     userOp.signature = await PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);\n                     \n                     continue; // Retry\n                }\n\n                // Case B: Priority Fee too low\n                // e.g. \"maxPriorityFeePerGas ... is 1007884 but must be at least 100000000\"\n                const matchPriority = msg.match(/maxPriorityFeePerGas.*(?:at least|expected) (\\d+)/i) || msg.match(/priority fee.*(?:at least|expected) (\\d+)/i);\n                \n                // Case C: Max Fee too low (often happens after bumping priority)\n                // e.g. \"maxFeePerGas is 339637908 but must be at least 392531063\"\n                const matchMaxFee = msg.match(/maxFeePerGas.*(?:at least|expected) (\\d+)/i);\n\n                if (matchPriority || matchMaxFee) {\n                    console.log(`[PaymasterClient] ⚠️  Fee Error: ${msg}. Retrying with higher fees...`);\n                    \n                    let newMaxPriority = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(2, 34)) : 0n;\n                    let newMaxFee = userOp.gasFees ? BigInt('0x' + userOp.gasFees.slice(34)) : 0n;\n\n                    if (matchPriority && matchPriority[1]) {\n                        const required = BigInt(matchPriority[1]);\n                        if (required > newMaxPriority) {\n                            console.log(`   -> Bumping Priority Fee to ${required}`);\n                            // Bump maxFee by at least the delta\n                            const delta = required - newMaxPriority;\n                            newMaxPriority = required;\n                            newMaxFee += delta;\n                        }\n                    }\n\n                    if (matchMaxFee && matchMaxFee[1]) {\n                         const required = BigInt(matchMaxFee[1]);\n                         if (required > newMaxFee) {\n                            console.log(`   -> Bumping Max Fee to ${required}`);\n                            newMaxFee = required;\n                         }\n                    }\n\n                    // Double check maxFee >= maxPriority\n                    if (newMaxFee < newMaxPriority) newMaxFee = newMaxPriority + 1n; // Minimal bump\n\n                    // Update UserOp\n                    userOp.gasFees = concat([\n                        pad(toHex(newMaxPriority), { size: 16 }),\n                        pad(toHex(newMaxFee), { size: 16 })\n                    ]) as Hex;\n\n                    // Re-Sign\n                    const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n                    userOp.signature = await PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);\n                    \n                    continue; // Retry\n                }\n\n                // Case D: PreVerificationGas too low (common on L2s like Optimism)\n                // e.g. \"precheck failed: preVerificationGas is 57368 but must be at least 108901\"\n                const matchPVG = msg.match(/preVerificationGas.*(?:at least|expected) (\\d+)/i);\n                if (matchPVG && matchPVG[1]) {\n                    const requiredPVG = BigInt(matchPVG[1]);\n                    const currentPVG = BigInt(userOp.preVerificationGas);\n                    \n                    if (requiredPVG > currentPVG) {\n                        console.log(`[PaymasterClient] ⚠️  PVG Error: ${msg}. Updating preVerificationGas...`);\n                        \n                        // Add 5% buffer to avoid \"chasing\" the requirement on L2s\n                        const bufferedPVG = (requiredPVG * 105n) / 100n;\n                        console.log(`   -> Updating PVG from ${currentPVG} to ${bufferedPVG} (inc. buffer)`);\n                        \n                        // Update PVG and re-sign\n                        userOp.preVerificationGas = bufferedPVG;\n                        const newHash = getUserOpHashV07(userOp, entryPoint, BigInt(client.chain.id));\n                        userOp.signature = await PaymasterClient.signUserOpHash(wallet, newHash, options?.airAccountSig);\n                        \n                        continue; // Retry\n                    }\n                }\n            }\n\n            if (result.error && (result.error.code === -32601 || result.error.message?.includes('Method not found'))) {\n                 console.log('[PaymasterClient] SendUserOp failed (Method not found). Falling back to direct handleOps...');\n                 \n                 const caller = wallet.account?.address ? wallet.account.address : wallet.account;\n\n                 return await wallet.writeContract({\n                     address: entryPoint,\n                     abi: parseAbi(['function handleOps((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)[], address) external']),\n                     functionName: 'handleOps',\n                     args: [[userOp], caller],\n                     chain: wallet.chain,\n                     account: wallet.account\n                 });\n            }\n\n            if (result.error) throw new Error(`Bundler Error: ${JSON.stringify(result.error)}`);\n            console.log('[PaymasterClient] ✅ Submitted via', bundlerType, 'hash:', result.result);\n            return result.result;\n        }\n\n        throw new Error(\"Failed to submit UserOp after retries\");\n    }\n\n    /**\n     * Helper to extract the actual Gas Token fee from a UserOperation receipt.\n     * Looks for the 'PostOpProcessed' event emitted by the Paymaster.\n     */\n    static getFeeFromReceipt(receipt: any, paymasterAddress: Address): { tokenCost: bigint, actualGasCostWei: bigint } | null {\n        // Event Signature: PostOpProcessed(address indexed user, address indexed token, uint256 actualGasCostWei, uint256 tokenCost, uint256 protocolRevenue)\n        // Topic0: 0x62544d7f48b11c32334310ebd306b47224fca220163218d4a7264322c52ae073\n        const TOPIC_POST_OP = '0x62544d7f48b11c32334310ebd306b47224fca220163218d4a7264322c52ae073';\n\n        for (const log of receipt.logs) {\n            if (log.address.toLowerCase() === paymasterAddress.toLowerCase() && log.topics[0] === TOPIC_POST_OP) {\n                // Decode Data: actualGasCostWei, tokenCost, protocolRevenue (3x uint256)\n                // We manually decode or use viem's decodeEventLog if available.\n                // Here we use a lightweight manual decode for the data part (non-indexed).\n                // Data is 3 * 32 bytes.\n                const data = log.data.replace('0x', '');\n                if (data.length >= 192) { // 3 * 64 hex chars = 192\n                    const actualGasCostWei = BigInt('0x' + data.slice(0, 64));\n                    const tokenCost = BigInt('0x' + data.slice(64, 128));\n                    // const protocolRevenue = BigInt('0x' + data.slice(128, 192));\n                    return { tokenCost, actualGasCostWei };\n                }\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Get the fee for a specific transaction hash.\n     * Fetches the receipt (no scanning required) and decodes the log.\n     */\n    static async getTransactionFee(publicClient: any, txHash: `0x${string}`, paymasterAddress: Address) {\n        const receipt = await publicClient.getTransactionReceipt({ hash: txHash });\n        return this.getFeeFromReceipt(receipt, paymasterAddress);\n    }\n\n    // ===========================================\n    // 🛠️ Semantic CallData Builders (For DX)\n    // ===========================================\n\n    /**\n     * Helper: Encode a standardized ERC-20 Transfer.\n     * Returns the raw function data: `transfer(to, amount)`\n     */\n    static encodeTokenTransfer(recipient: Address, amount: bigint): `0x${string}` {\n        return encodeFunctionData({\n            abi: parseAbi(['function transfer(address to, uint256 amount) external returns (bool)']),\n            functionName: 'transfer',\n            args: [recipient, amount]\n        });\n    }\n\n    /**\n     * Helper: Encode a SimpleAccount execution.\n     * Wraps the inner call into: `execute(target, value, data)`\n     * This is the payload signed by the user.\n     */\n    static encodeExecution(target: Address, value: bigint, data: `0x${string}`): `0x${string}` {\n        return encodeFunctionData({\n            abi: parseAbi(['function execute(address dest, uint256 value, bytes func) external']),\n            functionName: 'execute',\n            args: [target, value, data]\n        });\n    }\n\n    /**\n     * More robust version of waitForUserOperationReceipt.\n     * Catches timeouts and returns a cleaner result.\n     */\n    static async waitForUserOperation(bundlerClient: any, hash: `0x${string}`, timeout = 180000) {\n        try {\n            return await bundlerClient.waitForUserOperationReceipt({ hash, timeout });\n        } catch (error: any) {\n            const errName = error.name || '';\n            const errMsg = error.message || '';\n            if (\n                errName === 'TimeoutError' || \n                errName === 'WaitForUserOperationReceiptTimeoutError' || \n                /timed? out/i.test(errMsg)\n            ) {\n                return { timeout: true, hash };\n            }\n            throw error;\n        }\n    }\n}\n","import { type Address, parseAbi } from 'viem';\nimport { type GaslessReadinessReport, type PaymasterV4MiddlewareConfig } from './PaymasterUtils';\n\n/**\n * PaymasterOperator\n * Focus: Deployment, Configuration, Maintenance, Keeper Bots.\n */\nexport class PaymasterOperator {\n\n    /**\n     * Update the cached ETH/USD price from Chainlink Oracle.\n     * Must be called if cachedPrice is 0 (uninitialized).\n     */\n    static async updatePrice(wallet: any, address: Address) {\n        return wallet.writeContract({\n            address,\n            abi: parseAbi(['function updatePrice() external']),\n            functionName: 'updatePrice',\n            chain: wallet.chain\n        } as any);\n    }\n\n    /**\n     * Set the token price (in 8 decimals, e.g., 1e8 = $1 USD).\n     */\n    static async setTokenPrice(wallet: any, address: Address, token: Address, priceUSD: bigint) {\n        return wallet.writeContract({\n            address,\n            abi: parseAbi(['function setTokenPrice(address token, uint256 price) external']),\n            functionName: 'setTokenPrice',\n            args: [token, priceUSD],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async getCachedPrice(publicClient: any, address: Address): Promise<{ price: bigint; updatedAt: bigint }> {\n        const result = await publicClient.readContract({\n            address,\n            abi: [{\n                name: 'cachedPrice',\n                type: 'function',\n                inputs: [],\n                outputs: [\n                    { name: 'price', type: 'uint208' },\n                    { name: 'updatedAt', type: 'uint48' }\n                ],\n                stateMutability: 'view'\n            }],\n            functionName: 'cachedPrice'\n        });\n        return { price: result[0], updatedAt: result[1] };\n    }\n\n    static async getTokenPrice(publicClient: any, address: Address, token: Address): Promise<bigint> {\n        return publicClient.readContract({\n            address,\n            abi: [{\n                name: 'tokenPrices',\n                type: 'function',\n                inputs: [{ name: 'token', type: 'address' }],\n                outputs: [{ name: '', type: 'uint256' }],\n                stateMutability: 'view'\n            }],\n            functionName: 'tokenPrices',\n            args: [token]\n        });\n    }\n\n    static async getDepositedBalance(publicClient: any, address: Address, user: Address, token: Address): Promise<bigint> {\n        return publicClient.readContract({\n            address,\n            abi: [{\n                name: 'balances',\n                type: 'function',\n                inputs: [\n                    { name: 'user', type: 'address' },\n                    { name: 'token', type: 'address' }\n                ],\n                outputs: [{ name: '', type: 'uint256' }],\n                stateMutability: 'view'\n            }],\n            functionName: 'balances',\n            args: [user, token]\n        });\n    }\n\n    static async ensurePriceInitialized(wallet: any, publicClient: any, address: Address): Promise<boolean> {\n        const { price } = await this.getCachedPrice(publicClient, address);\n        if (price === 0n) {\n            await this.updatePrice(wallet, address);\n            return true;\n        }\n        return false;\n    }\n\n    static async addStake(wallet: any, address: Address, amount: bigint, unstakeDelaySec: number) {\n        return wallet.writeContract({\n            address,\n            abi: parseAbi(['function addStake(uint32 unstakeDelaySec) external payable']),\n            functionName: 'addStake',\n            args: [unstakeDelaySec],\n            value: amount,\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async addDeposit(wallet: any, address: Address, amount: bigint) {\n        return wallet.writeContract({\n            address,\n            abi: parseAbi(['function addDeposit() external payable']),\n            functionName: 'addDeposit',\n            value: amount,\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async addGasToken(wallet: any, address: Address, token: Address) {\n        return wallet.writeContract({\n            address,\n            abi: ['function addGasToken(address token)'],\n            functionName: 'addGasToken',\n            args: [token],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async removeGasToken(wallet: any, address: Address, token: Address) {\n        return wallet.writeContract({\n            address,\n            abi: ['function removeGasToken(address token)'],\n            functionName: 'removeGasToken',\n            args: [token],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async setServiceFeeRate(wallet: any, address: Address, rate: bigint) {\n        return wallet.writeContract({\n            address,\n            abi: ['function setServiceFeeRate(uint256 rate)'],\n            functionName: 'setServiceFeeRate',\n            args: [rate],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async setMaxGasCostCap(wallet: any, address: Address, cap: bigint) {\n        return wallet.writeContract({\n            address,\n            abi: ['function setMaxGasCostCap(uint256 cap)'],\n            functionName: 'setMaxGasCostCap',\n            args: [cap],\n            chain: wallet.chain\n        } as any);\n    }\n\n    static async withdrawPNT(wallet: any, address: Address, to: Address, token: Address, amount: bigint) {\n        return wallet.writeContract({\n            address,\n            abi: ['function withdrawPNT(address to, address token, uint256 amount)'],\n            functionName: 'withdrawPNT',\n            args: [to, token, amount],\n            chain: wallet.chain\n        } as any);\n    }\n    \n    // --- Diagnostics & Automation ---\n\n    static async checkGaslessReadiness(\n        publicClient: any,\n        entryPoint: Address,\n        paymasterAddress: Address,\n        user: Address,\n        token: Address\n    ): Promise<GaslessReadinessReport> {\n        const issues: string[] = [];\n        \n        // 1. EntryPoint Stake/Deposit\n        const depositInfo = await publicClient.readContract({\n            address: entryPoint,\n            abi: parseAbi(['function getDepositInfo(address account) external view returns (uint256 deposit, bool staked, uint256 stake, uint32 unstakeDelaySec, uint48 withdrawTime)']),\n            functionName: 'getDepositInfo',\n            args: [paymasterAddress]\n        });\n\n        if (depositInfo[2] < 50000000000000000n) issues.push('Paymaster stake in EntryPoint is less than 0.05 ETH');\n        if (depositInfo[3] < 86400) issues.push('Paymaster unstake delay is less than 1 day');\n        if (depositInfo[0] < 100000000000000000n) issues.push('Paymaster deposit in EntryPoint is less than 0.1 ETH');\n\n        // 2. Oracle Price\n        const ethPrice = await publicClient.readContract({\n            address: paymasterAddress,\n            abi: parseAbi(['function cachedPrice() external view returns (uint208 price, uint48 updatedAt)']),\n            functionName: 'cachedPrice'\n        }).catch(() => [0n, 0n] as const);\n\n        if (ethPrice[0] === 0n) issues.push('Paymaster ETH/USD price not initialized');\n\n        // 3. Token Support & Price\n        const [tokenPrice, userTokenBal, userPMDeposit] = await Promise.all([\n            this.getTokenPrice(publicClient, paymasterAddress, token),\n            publicClient.readContract({\n                address: token,\n                abi: parseAbi(['function balanceOf(address account) external view returns (uint256)']),\n                functionName: 'balanceOf',\n                args: [user]\n            }),\n            this.getDepositedBalance(publicClient, paymasterAddress, user, token)\n        ]);\n\n        if (tokenPrice === 0n) issues.push('Token price not set in Paymaster');\n        if (userPMDeposit === 0n) issues.push('User has no deposit in Paymaster');\n\n        return {\n            isReady: issues.length === 0,\n            issues,\n            details: {\n                paymasterStake: depositInfo[2],\n                paymasterDeposit: depositInfo[0],\n                ethUsdPrice: ethPrice.price,\n                tokenSupported: true,\n                tokenPrice: tokenPrice,\n                userTokenBalance: userTokenBal,\n                userPaymasterDeposit: userPMDeposit\n            }\n        };\n    }\n\n    static async prepareGaslessEnvironment(\n        operatorWallet: any,\n        publicClient: any,\n        entryPoint: Address,\n        paymasterAddress: Address,\n        token: Address,\n        options: {\n            minStake?: bigint;\n            minDeposit?: bigint;\n            tokenPriceUSD?: bigint;\n        } = {}\n    ) {\n        const report = await this.checkGaslessReadiness(publicClient, entryPoint, paymasterAddress, operatorWallet.account.address, token);\n        const results: { step: string, hash?: string, status: string }[] = [];\n\n        // 1. Stake\n        if (report.details.paymasterStake < (options.minStake || 50000000000000000n)) {\n            const hash = await this.addStake(operatorWallet, paymasterAddress, options.minStake || 50000000000000000n, 86400);\n            await publicClient.waitForTransactionReceipt({ hash });\n            results.push({ step: 'Stake', hash, status: 'Confirmed' });\n        }\n\n        // 2. Deposit (EntryPoint)\n        if (report.details.paymasterDeposit < (options.minDeposit || 100000000000000000n)) {\n            const hash = await this.addDeposit(operatorWallet, paymasterAddress, options.minDeposit || 300000000000000000n);\n            await publicClient.waitForTransactionReceipt({ hash });\n            results.push({ step: 'Deposit', hash, status: 'Confirmed' });\n        }\n\n        // 3. Oracle Price\n        if (report.details.ethUsdPrice === 0n) {\n            const hash = await this.updatePrice(operatorWallet, paymasterAddress);\n            await publicClient.waitForTransactionReceipt({ hash });\n            results.push({ step: 'OraclePrice', hash, status: 'Confirmed' });\n        }\n\n        // 4. Token Support & Price\n        if (report.details.tokenPrice === 0n) {\n            try {\n                const hash = await this.addGasToken(operatorWallet, paymasterAddress, token);\n                await publicClient.waitForTransactionReceipt({ hash });\n                results.push({ step: 'AddGasToken', hash, status: 'Confirmed' });\n            } catch (e) {}\n\n            if (options.tokenPriceUSD) {\n                const hash = await this.setTokenPrice(operatorWallet, paymasterAddress, token, options.tokenPriceUSD);\n                await publicClient.waitForTransactionReceipt({ hash });\n                results.push({ step: 'TokenPrice', hash, status: 'Confirmed' });\n            }\n        }\n\n        return results;\n    }\n}\n","import { type Address, type Hex, concat, pad, toHex, encodeFunctionData, parseAbi } from 'viem';\nimport { type PublicClient } from '@aastar/core';\nimport { PaymasterClient } from './PaymasterClient';\nimport { buildSuperPaymasterData, formatUserOpV07, getUserOpHashV07, tuneGasLimit } from './PaymasterUtils';\n\nexport type GaslessTransactionConfig = {\n    token: Address;\n    recipient: Address;\n    amount: bigint;\n    operator: Address;\n    paymasterAddress: Address;\n    factory?: Address;\n    factoryData?: Hex;\n};\n\n/**\n * SuperPaymasterClient\n * High-level API for SuperPaymaster operations, including dynamic gas estimation.\n */\nexport class SuperPaymasterClient {\n    /**\n     * @private\n     * Static utility class, should not be instantiated.\n     */\n    private constructor() {}\n\n\n    /**\n     * Submit a gasless transaction using SuperPaymaster.\n     * Automatically handles gas estimation with a smart efficiency buffer.\n     */\n    static async submitGaslessTransaction(\n        client: any,\n        wallet: any,\n        aaAddress: Address,\n        entryPoint: Address,\n        bundlerUrl: string,\n        config: GaslessTransactionConfig\n    ): Promise<Hex> {\n        \n        // 1. Prepare Calldata (Standard ERC20 Transfer)\n        const callData = encodeFunctionData({\n            abi: parseAbi(['function execute(address dest, uint256 value, bytes func) external']),\n            functionName: 'execute',\n            args: [\n                config.token,\n                0n,\n                encodeFunctionData({\n                    abi: parseAbi(['function transfer(address to, uint256 amount) external returns (bool)']),\n                    functionName: 'transfer',\n                    args: [config.recipient, config.amount]\n                })\n            ]\n        });\n\n        // 2. Initial Gas Estimation (Bundler Query)\n        console.log(`[SuperPaymasterClient] 🎯 Target Info:`);\n        console.log(`   - Paymaster: ${config.paymasterAddress}`);\n        console.log(`   - Token: ${config.token}`);\n        console.log(`   - Operator: ${config.operator}`);\n\n        console.log('[SuperPaymasterClient] ☁️  Estimating Gas usage...');\n        const est = await PaymasterClient.estimateUserOperationGas(\n            client,\n            wallet,\n            aaAddress,\n            entryPoint,\n            config.paymasterAddress,\n            config.token,\n            bundlerUrl,\n            callData,\n            { \n                operator: config.operator,\n                factory: config.factory,\n                factoryData: config.factoryData\n            }\n        );\n\n        console.log('[SuperPaymasterClient] ☁️  Bundler Estimates:', est);\n\n        // 3. Apply Smart Buffer Strategy\n        // We need to ensure:\n        // A. verificationGasLimit >= est.verificationGasLimit (Bundler's minimum)\n        // B. verificationGasLimit >= SuperPaymaster's Actual Usage (~80k-100k)\n        // C. verificationGasLimit / PreVerificationGas > 0.4 (Efficiency Ratio) PRE-CHECK\n        //    Actually, the Bundler checks: (gas limits) / (actual gas used) > efficiency.\n        //    So we must NOT set limits WAY higher than actual usage. \n        //    Best strategy: Use Bundler's Estimate + Small Buffer (e.g. 10-20k).\n        \n        // SuperPaymaster Logic Cost: ~80,000 to 120,000 gas depending on cold storage\n        // Bundler Estimate usually returns the *actual execution path* gas.\n        \n\n\n        // CRITICAL FIX: Set paymasterVerificationGasLimit for optimal efficiency\n        // Bundler requires efficiency ratio >= 0.4 (actual_gas_used / gas_limit >= 0.4)\n        // SuperPaymaster validatePaymasterUserOp uses ~110-120k gas (measured)\n        // Analysis (Jan 19 Update-Final-Final):\n        //   Instead of fixed percentage, use \"Dynamic Nominal Gas Tuning\".\n        //   SuperPaymaster validation common case is ~58k-66k. Worst case (refresh) 115k.\n        //   Setting nominal benchmark to 60k gives Ceiling = 60k / 0.45 = 133,333.\n        //   This satisfies 0.4 efficiency (58/133=0.43) AND execution (115 < 133).\n        \n        // 1. Tune Account Verification Gas Limit (VGL)\n        // Bundler might return huge VGL (e.g. 250k) which kills efficiency if usage is low.\n        // We need to clamp VGL down closer to actual usage.\n        // Let's assume standard account validation + execution is ~35k.\n        // Target: 35k / 0.45 = 77k Limit.\n        const tunedVGL = tuneGasLimit(est.verificationGasLimit, 35_000n, 0.45);\n\n        // 2. Tune Paymaster Verification Gas Limit (PMVGL)\n        // Ensure bundler estimate is respected as floor for PMVGL\n        const bundlerEstimateVGL = est.paymasterVerificationGasLimit || 100000n;\n        const tunedPMVerificationGas = tuneGasLimit(bundlerEstimateVGL, 60_000n, 0.45);\n\n        // SuperPaymaster postOp calls burnFromWithOpHash (~40k gas) + storage writes.\n        // Add 100k buffer; floor at 200k to prevent OOG. Pure BigInt to avoid Number precision loss.\n        const _postOpBase = est.paymasterPostOpGasLimit + 100_000n;\n        const tunedPostOp = _postOpBase > 200_000n ? _postOpBase : 200_000n;\n\n        console.log(`[SuperPaymasterClient] 🔧 Tuned Limits: VGL=${tunedVGL}, PMVGL=${tunedPMVerificationGas}, PostOp=${tunedPostOp}`);\n\n        // 4. Submit with Tuned Limits\n        return PaymasterClient.submitGaslessUserOperation(\n            client,\n            wallet,\n            aaAddress,\n            entryPoint,\n            config.paymasterAddress,\n            config.token,\n            bundlerUrl,\n            callData,\n            {\n                operator: config.operator,\n                verificationGasLimit: tunedVGL,\n                callGasLimit: est.callGasLimit, \n                preVerificationGas: est.preVerificationGas,\n                paymasterVerificationGasLimit: tunedPMVerificationGas, // EXPLICIT PM LIMIT\n                paymasterPostOpGasLimit: tunedPostOp,\n                autoEstimate: false, // We did it ourselves\n                factory: config.factory,\n                factoryData: config.factoryData\n            }\n        );\n    }\n}\n","import { type Address, type Hex } from 'viem';\nimport {\n    buildPaymasterData as buildPaymasterDataV4,\n    buildSuperPaymasterData\n} from './V4/PaymasterUtils.js';\n\n/**\n * Supported paymaster types.\n * - 'v4'    → PaymasterV4 layout (84 bytes): [paymaster(20)][verGas(16)][postGas(16)][token(20)][validUntil(6)][validAfter(6)]\n * - 'super' → SuperPaymaster layout (104 bytes): [paymaster(20)][verGas(16)][postGas(16)][operator(20)][maxRate(32)]\n */\nexport type PaymasterType = 'v4' | 'super';\n\n/**\n * Unified parameters for building `paymasterAndData`.\n *\n * The byte layout differs by paymaster type; this shape carries the union of\n * both packers' inputs. `buildPaymasterData` validates that the fields required\n * for the resolved type are present, and dispatches to the correct existing\n * packer. Callers no longer need to know which format a given paymaster uses.\n */\nexport interface BuildPaymasterDataParams {\n    /**\n     * Explicit paymaster type. Preferred over address-based heuristics.\n     * If omitted, the type is resolved from `paymasterAddress` against the\n     * manager's registered known-paymaster map (throws if unresolved).\n     */\n    type?: PaymasterType;\n    /** Paymaster contract address (first 20 bytes of the layout). */\n    paymasterAddress: Address;\n    /** Paymaster verification gas limit (16-byte field, both layouts). */\n    verificationGasLimit?: bigint;\n    /** Paymaster postOp gas limit (16-byte field, both layouts). */\n    postOpGasLimit?: bigint;\n\n    // ── PaymasterV4-specific fields ──\n    /** Gas token address. Required for type 'v4'. */\n    token?: Address;\n    /** Validity window in seconds (used to compute validUntil/validAfter). 'v4' only. */\n    validityWindow?: number;\n\n    // ── SuperPaymaster-specific fields ──\n    /** Operator address. Required for type 'super'. */\n    operator?: Address;\n    /** Optional max rate commitment (rug-pull protection). 'super' only. */\n    maxRate?: bigint;\n}\n\n/**\n * PaymasterManager — unifies the per-type `paymasterAndData` packers behind a\n * single `buildPaymasterData` entry point that AUTO-SELECTS the correct byte\n * format by paymaster type.\n *\n * Type resolution order:\n *   1. Explicit `params.type` (preferred — no guessing).\n *   2. Address-based lookup against the registered known-paymaster map.\n *\n * The underlying packers (`buildPaymasterData` / `buildSuperPaymasterData` in\n * PaymasterUtils) remain exported and are reused verbatim here — this class\n * does NOT reimplement byte-packing.\n */\nexport class PaymasterManager {\n    private readonly knownPaymasters: Map<string, PaymasterType>;\n\n    constructor(opts?: { knownPaymasters?: Record<string, PaymasterType> }) {\n        this.knownPaymasters = new Map();\n        if (opts?.knownPaymasters) {\n            for (const [address, type] of Object.entries(opts.knownPaymasters)) {\n                this.setKnownPaymaster(address as Address, type);\n            }\n        }\n    }\n\n    /**\n     * Register a known paymaster address → type mapping so that callers can\n     * omit the explicit `type` and have it resolved from the address.\n     */\n    registerPaymaster(address: Address, type: PaymasterType): void {\n        this.setKnownPaymaster(address, type);\n    }\n\n    /**\n     * Record an address → type mapping, throwing on a CONFLICTING re-registration.\n     * Silently overwriting a v4 address with `super` (or vice-versa) would later\n     * pack the wrong-length paymasterData for a `type`-less call, so a conflicting\n     * re-registration is treated as a programmer error. Re-registering the SAME\n     * type (including a case-variant of the address) is an idempotent no-op.\n     */\n    private setKnownPaymaster(address: Address, type: PaymasterType): void {\n        const normalized = address.toLowerCase();\n        const existing = this.knownPaymasters.get(normalized);\n        if (existing && existing !== type) {\n            throw new Error(\n                `Paymaster ${address} is already registered as '${existing}'; ` +\n                `refusing to re-register as '${type}'`\n            );\n        }\n        this.knownPaymasters.set(normalized, type);\n    }\n\n    /**\n     * Resolve a paymaster's type from a registered address. Returns undefined\n     * if the address is not registered.\n     */\n    resolveType(address: Address): PaymasterType | undefined {\n        return this.knownPaymasters.get(address.toLowerCase());\n    }\n\n    /**\n     * Build `paymasterAndData`, auto-selecting the correct byte layout for the\n     * paymaster type. Dispatches to the existing per-type packers.\n     */\n    buildPaymasterData(params: BuildPaymasterDataParams): Hex {\n        const type = params.type ?? this.resolveType(params.paymasterAddress);\n        if (!type) {\n            throw new Error(\n                `PaymasterManager: cannot resolve paymaster type for ${params.paymasterAddress}. ` +\n                `Pass an explicit \\`type\\` ('v4' | 'super') or register the address via registerPaymaster().`\n            );\n        }\n        return PaymasterManager.dispatch(type, params);\n    }\n\n    /**\n     * Static helper: build `paymasterAndData` for an explicit type without an\n     * instance. Useful when the caller already knows the type.\n     */\n    static buildPaymasterData(type: PaymasterType, params: Omit<BuildPaymasterDataParams, 'type'>): Hex {\n        return PaymasterManager.dispatch(type, params);\n    }\n\n    private static dispatch(type: PaymasterType, params: BuildPaymasterDataParams): Hex {\n        switch (type) {\n            case 'v4': {\n                if (!params.token) {\n                    throw new Error(\"PaymasterManager: type 'v4' requires `token`.\");\n                }\n                return buildPaymasterDataV4(params.paymasterAddress, params.token, {\n                    validityWindow: params.validityWindow,\n                    verificationGasLimit: params.verificationGasLimit,\n                    postOpGasLimit: params.postOpGasLimit\n                });\n            }\n            case 'super': {\n                if (!params.operator) {\n                    throw new Error(\"PaymasterManager: type 'super' requires `operator`.\");\n                }\n                return buildSuperPaymasterData(params.paymasterAddress, params.operator, {\n                    verificationGasLimit: params.verificationGasLimit,\n                    postOpGasLimit: params.postOpGasLimit,\n                    maxRate: params.maxRate\n                });\n            }\n            default: {\n                // Exhaustiveness guard.\n                const _never: never = type;\n                throw new Error(`PaymasterManager: unsupported paymaster type '${_never}'.`);\n            }\n        }\n    }\n}\n"]}