{"version":3,"sources":["../src/clients/endUser.ts","../src/utils/roleData.ts","../src/errors/decoder.ts","../src/clients/operator.ts","../src/clients/community.ts","../src/clients/admin.ts","../src/clients/ExperimentClient.ts","../src/utils/keys.ts","../src/utils/funding.ts","../src/utils/userOp.ts","../src/utils/testScenarios.ts"],"names":["createClient","publicActions","walletActions","getCanonicalAddresses","describeSupportedChains","CORE_ADDRESSES","TOKEN_ADDRESSES","TEST_ACCOUNT_ADDRESSES","registryActions","sbtActions","superPaymasterActions","paymasterActions","encodeAbiParameters","RegistryABI","parseAbi","encodeFunctionData","concat","pad","keccak256","RequirementChecker","SimpleAccountFactoryABI","formatEther","stringToBytes","zeroAddress","decodeAbiParameters","decodeErrorResult","TEST_TOKEN_ADDRESSES","stakingActions","PaymasterFactoryABI","erc20Abi","SuperPaymasterABI","xPNTsTokenABI","dvtActions","xPNTsFactoryActions","aggregatorActions","generatePrivateKey","privateKeyToAccount","fs","http","createPublicClient","createWalletClient","parseEther","parseAbiParameters","toBytes","UserOpScenarioType"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createClient, type Client, type Transport, type Chain, type Account, publicActions, walletActions, type PublicActions, type WalletActions, type Address, type Hex, type Hash, parseAbi } from 'viem';\nimport { \n    registryActions, \n    sbtActions,\n    superPaymasterActions,\n    paymasterActions,\n    type RegistryActions, \n    type SBTActions, \n    type SuperPaymasterActions, \n    type PaymasterActions,\n    CORE_ADDRESSES,\n    TOKEN_ADDRESSES,\n    TEST_ACCOUNT_ADDRESSES,\n    getCanonicalAddresses,\n    describeSupportedChains,\n    RegistryABI\n} from '@aastar/core';\n\nexport type EndUserClient = Client<Transport, Chain, Account | undefined> & PublicActions<Transport, Chain, Account | undefined> & WalletActions<Chain, Account | undefined> & RegistryActions & SBTActions & SuperPaymasterActions & PaymasterActions & {\n    /**\n     * High-level API: Onboard user to community with automatic funding\n     */\n    onboard: (args: {\n        community: Address,\n        roleId: Hex,\n        roleData: Hex\n    }) => Promise<{ tx: Hash, sbtId: bigint }>\n    /**\n     * Orchestrates the user joining a community and activating gas credit flow:\n     * 1. Mint SBT for the community (Register ENDUSER role)\n     * 2. Verify Credit is active (Reputation check)\n     */\n    joinAndActivate: (args: {\n        community: Address,\n        roleId: Hex,\n        roleData?: Hex\n    }) => Promise<{ tx: Hash, sbtId: bigint, initialCredit: bigint }>\n    /**\n     * Executes a gasless transaction via SuperPaymaster.\n     */\n    executeGasless: (args: {\n        target: Address,\n        data: Hex,\n        value?: bigint,\n        operator: Address\n    }) => Promise<Hash>;\n    /**\n     * Check if the user meets the requirements to join a community (stake, sbt, etc.)\n     */\n    checkJoinRequirements: (address?: Address) => Promise<{\n        hasEnoughGToken: boolean;\n        hasSBT: boolean;\n        missingRequirements: string[];\n    }>;\n    /**\n     * Predict or deploy a SimpleAccount (ERC-4337)\n     */\n    deploySmartAccount: (params: {\n        owner: Address;\n        salt?: bigint;\n        fundWithETH?: bigint;\n    }) => Promise<{\n        accountAddress: Address;\n        deployTxHash: Hash;\n        isDeployed: boolean;\n    }>;\n    /**\n     * Predict the address of a SimpleAccount without deploying\n     */\n    createSmartAccount: (params: {\n        owner: Address;\n        salt?: bigint;\n    }) => Promise<{\n        accountAddress: Address;\n        initCode: Hex;\n        isDeployed: boolean;\n    }>;\n};\n\nexport function createEndUserClient({\n    chain,\n    transport,\n    account,\n    addresses\n}: {\n    chain: Chain,\n    transport: Transport,\n    account?: Account,\n    addresses?: { [key: string]: Address }\n}): EndUserClient {\n    const client = createClient({\n        chain,\n        transport,\n        account\n    })\n    .extend(publicActions)\n    .extend(walletActions);\n\n    // Auto-resolve the contract address book from `chain.id` (seamless multi-chain).\n    // Precedence: explicit `addresses` > canonical-by-chainId > static CORE_ADDRESSES fallback.\n    const chainDefaults = getCanonicalAddresses(chain.id);\n    if (!chainDefaults && !addresses) {\n        throw new Error(\n            `[createEndUserClient] No canonical addresses for chainId ${chain.id}. ` +\n            `Pass \\`addresses\\` explicitly, or use a supported chain: ${describeSupportedChains()}.`,\n        );\n    }\n    const usedAddresses = { ...CORE_ADDRESSES, ...TOKEN_ADDRESSES, ...TEST_ACCOUNT_ADDRESSES, ...chainDefaults, ...addresses };\n\n    const actions = {\n        ...registryActions(usedAddresses.registry)(client as any),\n        ...sbtActions(usedAddresses.mySBT)(client as any),\n        ...superPaymasterActions(usedAddresses.superPaymaster)(client as any),\n        ...paymasterActions(usedAddresses.paymasterV4)(client as any)\n    };\n\n    return Object.assign(client, actions, {\n        async onboard({ community, roleId, roleData }: {\n            community: Address,\n            roleId: Hex,\n            roleData: Hex\n        }) {\n            console.log('👤 Onboarding user to community...');\n            const result = await (this as any).joinAndActivate({ community, roleId, roleData });\n            console.log(`✅ User onboarded! SBT ID: ${result.sbtId}`);\n            return { tx: result.tx, sbtId: result.sbtId };\n        },\n        async joinAndActivate({ community, roleId, roleData }: { \n            community: Address, \n            roleId: Hex, \n            roleData?: Hex \n        }) {\n            const accountToUse = account;\n            if (!accountToUse) throw new Error(\"Account required for joinAndActivate\");\n\n            console.log(`   SDK: Joining community ${community}...`);\n            \n            // Registry.registerRoleSelf is now idempotent (modified contract)\n            // First call: Mints SBT + grants role\n            // Subsequent calls: Adds community membership\n            \n            // If roleData not provided, encode EndUserRoleData structure\n            let finalData: Hex;\n            if (roleData) {\n                finalData = roleData;\n            } else {\n                // Encode EndUserRoleData: (address account, address community, string avatarURI, string ensName, uint256 stakeAmount)\n                const { encodeAbiParameters } = await import('viem');\n                finalData = encodeAbiParameters(\n                    [\n                        { name: 'account', type: 'address' },\n                        { name: 'community', type: 'address' },\n                        { name: 'avatarURI', type: 'string' },\n                        { name: 'ensName', type: 'string' },\n                        { name: 'stakeAmount', type: 'uint256' }\n                    ],\n                    [accountToUse.address, community, '', '', 0n] // Use minimum stake (Registry will use roleConfig.minStake)\n                ) as Hex;\n            }\n            \n            const regTx = await (client as any).writeContract({\n                address: usedAddresses.registry,\n                abi: RegistryABI,\n                functionName: 'registerRoleSelf',\n                args: [roleId, finalData],\n                account: accountToUse,\n                chain\n            });\n            \n            await (client as any).waitForTransactionReceipt({ hash: regTx });\n\n            // 2. Fetch SBT ID\n            const sbtId = await actions.getUserSBT({ user: accountToUse.address });\n            console.log(`   SDK: User joined. SBT ID: ${sbtId}`);\n\n            // 3. Fetch Initial Credit for verification\n            let credit = 0n;\n            try {\n                const factoryAbi = parseAbi(['function communityToToken(address) view returns (address)']);\n                const tokenAddress = await (client as any).readContract({\n                    address: usedAddresses.xPNTsFactory,\n                    abi: factoryAbi,\n                    functionName: 'communityToToken',\n                    args: [community]\n                }) as Address;\n\n                credit = await actions.getAvailableCredit({\n                    user: (client as any).aaAddress || accountToUse.address,\n                    token: tokenAddress\n                });\n\n                console.log(`   SDK: Activation complete. Current Credit: ${credit} points.`);\n            } catch (error: any) {\n                console.log(`   SDK: Credit system not available (${error.message.split('\\n')[0]}). Continuing...`);\n            }\n\n            return {\n                tx: regTx,\n                sbtId,\n                initialCredit: credit\n            };\n        },\n        async executeGasless({ target, data, value = 0n, operator }: { \n            target: Address, \n            data: Hex, \n            value?: bigint, \n            operator: Address \n        }) {\n            const accountToUse = account;\n            if (!accountToUse) throw new Error(\"Wallet account required for gasless execution\");\n\n            // 1. Get AA Address (Predict if necessary)\n            const { accountAddress } = await (this as any).createSmartAccount({ owner: accountToUse.address });\n            console.log(`   SDK: Executing gasless via AA ${accountAddress} Sponsored by ${operator}`);\n\n            // 2. Fetch Nonce from EntryPoint (v0.7 standard)\n            // Note: In v0.7, nonce is managed by EntryPoint, not the account itself\n            let nonce = 0n;\n            try {\n                nonce = await (client as any).readContract({\n                    address: usedAddresses.entryPoint,\n                    abi: [{ \n                        type: 'function', \n                        name: 'getNonce', \n                        inputs: [{ type: 'address', name: 'sender' }, { type: 'uint192', name: 'key' }],\n                        outputs: [{ type: 'uint256' }], \n                        stateMutability: 'view' \n                    }],\n                    functionName: 'getNonce',\n                    args: [accountAddress, 0n] // 0 = default nonce key\n                }) as bigint;\n            } catch (e: any) {\n                console.warn(`   ⚠️  Failed to fetch nonce from EntryPoint, using default 0:`, e.message);\n                // For initial transactions, nonce is always 0\n                nonce = 0n;\n            }\n\n            // 3. Build CallData (execute(target, value, data))\n            const { encodeFunctionData, concat, pad, keccak256 } = await import('viem');\n            const executeData = encodeFunctionData({\n                abi: [{ type: 'function', name: 'execute', inputs: [{type: 'address'}, {type: 'uint256'}, {type: 'bytes'}] }],\n                functionName: 'execute',\n                args: [target, value, data]\n            });\n\n            // 4. Build Gas Limits & Fees (Benchmarked for experiments)\n            const accountGasLimits = concat([\n                pad(`0x${(100000).toString(16)}`, { dir: 'left', size: 16 }), // verification\n                pad(`0x${(100000).toString(16)}`, { dir: 'left', size: 16 })  // call\n            ]) as Hex;\n\n            const gasFees = concat([\n                pad(`0x${(2000000000).toString(16)}`, { dir: 'left', size: 16 }), // 2 gwei\n                pad(`0x${(2000000000).toString(16)}`, { dir: 'left', size: 16 })  // 2 gwei\n            ]) as Hex;\n\n            // 5. Build PaymasterAndData (v0.7 packed format)\n            const paymasterVerificationGas = 250000n;\n            const paymasterPostOpGas = 50000n;\n            const paymasterAndData = concat([\n                usedAddresses.superPaymaster,\n                pad(`0x${paymasterVerificationGas.toString(16)}`, { dir: 'left', size: 16 }),\n                pad(`0x${paymasterPostOpGas.toString(16)}`, { dir: 'left', size: 16 }),\n                operator\n            ]);\n\n            // 6. Construct UserOperation v0.7\n            const userOp = {\n                sender: accountAddress,\n                nonce,\n                initCode: '0x' as Hex,\n                callData: executeData,\n                accountGasLimits,\n                preVerificationGas: 50000n,\n                gasFees,\n                paymasterAndData,\n                signature: '0x' as Hex\n            };\n\n            // 7. Sign UserOp Hash\n            const entryPointAddress = usedAddresses.entryPoint || '0x0000000071727De22E5E9d8BAf0edAc6f37da032';\n            const userOpHash = await (client as any).readContract({\n                address: entryPointAddress,\n                abi: [{\n                    type: 'function',\n                    name: 'getUserOpHash',\n                    inputs: [{\n                        type: 'tuple',\n                        components: [\n                            {name: 'sender', type: 'address'},\n                            {name: 'nonce', type: 'uint256'},\n                            {name: 'initCode', type: 'bytes'},\n                            {name: 'callData', type: 'bytes'},\n                            {name: 'accountGasLimits', type: 'bytes32'},\n                            {name: 'preVerificationGas', type: 'uint256'},\n                            {name: 'gasFees', type: 'bytes32'},\n                            {name: 'paymasterAndData', type: 'bytes'},\n                            {name: 'signature', type: 'bytes'}\n                        ]\n                    }],\n                    outputs: [{type: 'bytes32'}],\n                    stateMutability: 'view'\n                }],\n                functionName: 'getUserOpHash',\n                args: [userOp]\n            }) as Hex;\n\n            const signature = await (accountToUse as any).signMessage({\n                message: { raw: userOpHash }\n            });\n            userOp.signature = signature;\n\n            // 8. Submit via handleOps\n            console.log(`   SDK: Submitting UserOp ${userOpHash}...`);\n            const tx = await (client as any).writeContract({\n                address: entryPointAddress,\n                abi: [{\n                    type: 'function',\n                    name: 'handleOps',\n                    inputs: [\n                        {\n                            type: 'tuple[]',\n                            components: [\n                                {name: 'sender', type: 'address'},\n                                {name: 'nonce', type: 'uint256'},\n                                {name: 'initCode', type: 'bytes'},\n                                {name: 'callData', type: 'bytes'},\n                                {name: 'accountGasLimits', type: 'bytes32'},\n                                {name: 'preVerificationGas', type: 'uint256'},\n                                {name: 'gasFees', type: 'bytes32'},\n                                {name: 'paymasterAndData', type: 'bytes'},\n                                {name: 'signature', type: 'bytes'}\n                            ]\n                        },\n                        {name: 'beneficiary', type: 'address'}\n                    ],\n                    outputs: [],\n                    stateMutability: 'nonpayable'\n                }],\n                functionName: 'handleOps',\n                args: [[userOp], accountToUse.address],\n                account,\n                chain\n            });\n\n            await (client as any).waitForTransactionReceipt({ hash: tx });\n            return tx;\n        },\n        async checkJoinRequirements(address?: Address) {\n            const accountToUse = address || account?.address;\n            if (!accountToUse) throw new Error(\"Account address required for requirement check\");\n            \n            const { RequirementChecker } = await import('@aastar/core');\n            const checker = new RequirementChecker(client as any, usedAddresses);\n            \n            // Default requirements for standard community joining\n            return await checker.checkRequirements({\n                address: accountToUse,\n                requiredGToken: 440000000000000000n, // 0.44 GT (stake + burn)\n                requireSBT: false\n            });\n        },\n        async createSmartAccount({ owner, salt = 0n }: { owner: Address, salt?: bigint }) {\n            const { SimpleAccountFactoryABI } = await import('@aastar/core');\n            const { encodeFunctionData, concat } = await import('viem');\n\n            let factoryAddress = (usedAddresses as any).simpleAccountFactory; \n            console.log(`   SDK: Using SimpleAccountFactory: ${factoryAddress} (Owner: ${owner}, Salt: ${salt})`);\n            \n            // Fallback to official v0.7 factory if not provided\n            if (!factoryAddress || factoryAddress === '0x0000000000000000000000000000000000000000') {\n                console.warn(\"   ⚠️  SimpleAccountFactory not found in configuration. Using default fallback.\");\n                factoryAddress = '0x9406Cc6185a346906296840746125a0E44976454';\n            }\n\n            const accountAddress = await (client as any).readContract({\n                address: factoryAddress,\n                abi: SimpleAccountFactoryABI,\n                functionName: 'getAddress',\n                args: [owner, salt]\n            }) as Address;\n\n            const createAccountData = encodeFunctionData({\n                abi: SimpleAccountFactoryABI,\n                functionName: 'createAccount',\n                args: [owner, salt]\n            });\n\n            const initCode = concat([factoryAddress, createAccountData]);\n            const byteCode = await (client as any).getBytecode({ address: accountAddress });\n            const isDeployed = byteCode !== undefined && byteCode !== '0x';\n\n            return { accountAddress, initCode, isDeployed };\n        },\n        async deploySmartAccount({ owner, salt = 0n, fundWithETH = 0n }: { owner: Address, salt?: bigint, fundWithETH?: bigint }) {\n            const { accountAddress, isDeployed } = await (this as any).createSmartAccount({ owner, salt });\n            const { formatEther } = await import('viem');\n\n            let deployHash: Hash = '0x0';\n\n            if (isDeployed) {\n                console.log(`   ℹ️ Account ${accountAddress} already deployed.`);\n            } else {\n                const { SimpleAccountFactoryABI } = await import('@aastar/core');\n                let factoryAddress = (usedAddresses as any).simpleAccountFactory;\n                if (!factoryAddress || factoryAddress === '0x0000000000000000000000000000000000000000') {\n                    factoryAddress = '0x9406Cc6185a346906296840746125a0E44976454';\n                }\n\n                console.log(`   🏭 Deploying Smart Account for ${owner}...`);\n                deployHash = await (client as any).writeContract({\n                    address: factoryAddress,\n                    abi: SimpleAccountFactoryABI,\n                    functionName: 'createAccount',\n                    args: [owner, salt],\n                    account,\n                    chain\n                }) as Hash;\n                await (client as any).waitForTransactionReceipt({ hash: deployHash });\n                console.log(`   ✅ Deployed at ${accountAddress}`);\n            }\n\n            if (fundWithETH > 0n) {\n                console.log(`   ⛽ Funding account with ${formatEther(fundWithETH)} ETH...`);\n                const tx = await (client as any).sendTransaction({\n                    to: accountAddress,\n                    value: fundWithETH,\n                    account,\n                    chain\n                });\n                await (client as any).waitForTransactionReceipt({ hash: tx });\n            }\n\n            return { accountAddress, deployTxHash: deployHash, isDeployed: true }; \n        }\n    }) as unknown as EndUserClient;\n}\n","import { keccak256, stringToBytes, encodeAbiParameters, decodeAbiParameters, parseAbiParameters, type Hex, type Address, zeroAddress } from 'viem';\n\nexport const RoleIds = {\n    PAYMASTER_SUPER: keccak256(stringToBytes('PAYMASTER_SUPER')),\n    DVT: keccak256(stringToBytes('DVT')), // Replaced PAYMASTER\n    PAYMASTER_AOA: keccak256(stringToBytes('PAYMASTER_AOA')),\n\n    KMS: keccak256(stringToBytes('KMS')),\n    COMMUNITY: keccak256(stringToBytes('COMMUNITY')),\n    ENDUSER: keccak256(stringToBytes('ENDUSER')),\n    ANODE: keccak256(stringToBytes('ANODE'))\n} as const;\n\nexport type RoleId = typeof RoleIds[keyof typeof RoleIds];\n\nexport const RoleDataFactory = {\n    /**\n     * Data for SuperPaymaster Operator (Empty)\n     */\n    paymasterSuper: (): Hex => '0x',\n\n\n    /**\n     * Data for Generic DVT Role (Empty)\n     */\n    dvt: (): Hex => '0x',\n\n\n\n    /**\n     * Data for Community Registration (matches Registry.sol CommunityRoleData)\n     * NOTE: Solidity's abi.encode(struct) adds a 32-byte offset prefix (0x20)\n     * which is required for abi.decode(struct) to work correctly.\n     * \n     * @param params.name Community Name (defaults to 'TestCommunity')\n     * @param params.ensName ENS name (optional)\n     * @param params.website Website URL (optional)\n     * @param params.description Community description (optional)\n     * @param params.logoURI Logo URI string (optional)\n     * @param params.stakeAmount Stake amount (defaults to 0)\n     */\n    community: (params?: { name?: string, ensName?: string, website?: string, description?: string, logoURI?: string, stakeAmount?: bigint }): Hex => {\n        return encodeAbiParameters(\n            [{\n                type: 'tuple',\n                components: [\n                    { name: 'name', type: 'string' },\n                    { name: 'ensName', type: 'string' },\n                    { name: 'website', type: 'string' },\n                    { name: 'description', type: 'string' },\n                    { name: 'logoURI', type: 'string' },\n                    { name: 'stakeAmount', type: 'uint256' }\n                ]\n            }],\n            [[\n                params?.name || 'TestCommunity',\n                params?.ensName || '',\n                params?.website || '',\n                params?.description || '',\n                params?.logoURI || '',\n                params?.stakeAmount || 0n\n            ] as any]\n        );\n    },\n\n    /**\n     * Data for EndUser (matches Registry.sol EndUserRoleData)\n     */\n    endUser: (params?: { account?: Address, community?: Address, avatarURI?: string, ensName?: string, stakeAmount?: bigint }): Hex => {\n        return encodeAbiParameters(\n            [{\n                type: 'tuple',\n                components: [\n                    { name: 'account', type: 'address' },\n                    { name: 'community', type: 'address' },\n                    { name: 'avatarURI', type: 'string' },\n                    { name: 'ensName', type: 'string' },\n                    { name: 'stakeAmount', type: 'uint256' }\n                ]\n            }],\n            [[\n                params?.account || zeroAddress,\n                params?.community || zeroAddress,\n                params?.avatarURI || '',\n                params?.ensName || '',\n                params?.stakeAmount || 0n\n            ] as any]\n        );\n    },\n\n    decodeCommunity: (data: Hex) => {\n        const decoded = decodeAbiParameters(\n            [{\n                type: 'tuple',\n                components: [\n                    { name: 'name', type: 'string' },\n                    { name: 'ensName', type: 'string' },\n                    { name: 'website', type: 'string' },\n                    { name: 'description', type: 'string' },\n                    { name: 'logoURI', type: 'string' },\n                    { name: 'stakeAmount', type: 'uint256' }\n                ]\n            }],\n            data\n        );\n        const result = decoded[0] as any;\n        // Check if result is array (iterable) or object\n        if (Array.isArray(result)) {\n             const [n, e, w, d, l, s] = result;\n             return { name: n, ensName: e, website: w, description: d, logoURI: l, stakeAmount: s };\n        } else {\n             return { \n                name: result.name, \n                ensName: result.ensName, \n                website: result.website, \n                description: result.description, \n                logoURI: result.logoURI, \n                stakeAmount: result.stakeAmount \n            };\n        }\n    },\n\n    decodeEndUser: (data: Hex) => {\n        const decoded = decodeAbiParameters(\n            [{\n                type: 'tuple',\n                components: [\n                    { name: 'account', type: 'address' },\n                    { name: 'community', type: 'address' },\n                    { name: 'avatarURI', type: 'string' },\n                    { name: 'ensName', type: 'string' },\n                    { name: 'stakeAmount', type: 'uint256' }\n                ]\n            }],\n            data\n        );\n        const result = decoded[0] as any;\n        if (Array.isArray(result)) {\n            const [a, c, av, en, s] = result;\n            return { account: a, community: c, avatarURI: av, ensName: en, stakeAmount: s };\n        } else {\n            return {\n                account: result.account,\n                community: result.community,\n                avatarURI: result.avatarURI,\n                ensName: result.ensName,\n                stakeAmount: result.stakeAmount\n            };\n        }\n    }\n};\n","import { decodeErrorResult, type Hex, type ContractFunctionExecutionError } from 'viem';\nimport { RegistryABI } from '../index.js'; // Assuming RegistryABI is exported\n\nexport const CustomErrors = {\n    RoleNotConfigured: 'RoleNotConfigured(bytes32,bool)',\n    RoleAlreadyGranted: 'RoleAlreadyGranted(bytes32,address)',\n    InsufficientStake: 'InsufficientStake(uint256,uint256)',\n} as const;\n\nexport function decodeContractError(error: any): string | null {\n    if (!error || typeof error !== 'object') return null;\n\n    // Check if it's a viem ContractFunctionExecutionError\n    if (error.name === 'ContractFunctionExecutionError' || error.walk) {\n        // Try to extract internal error data\n        const internalError = error.walk ? error.walk((e: any) => e.data) : error;\n        const data = internalError?.data;\n\n        if (data) {\n             try {\n                const decoded = decodeErrorResult({\n                    abi: RegistryABI,\n                    data: data as Hex\n                });\n                \n                if (decoded.errorName === 'RoleNotConfigured') {\n                    const [roleId, isActive] = decoded.args as [Hex, boolean];\n                    return `RoleNotConfigured: Role ${roleId} is ${isActive ? 'ACTIVE' : 'INACTIVE'} in Registry.`;\n                }\n                if (decoded.errorName === 'RoleAlreadyGranted') {\n                    const [roleId, user] = decoded.args as [Hex, string];\n                    return `RoleAlreadyGranted: User ${user} already has role ${roleId}.`;\n                }\n                if (decoded.errorName === 'InsufficientStake') {\n                     const [stake, minStake] = decoded.args as [bigint, bigint];\n                     // Viem returns bigints, format them?\n                     return `InsufficientStake: Provided ${stake}, Required ${minStake}.`;\n                }\n                \n                return `${decoded.errorName}: ${decoded.args}`;\n            } catch (e) {\n                // ABI mismatch or unknown error\n                return null;\n            }\n        }\n    }\n    return null;\n}\n","import { createClient, type Client, type Transport, type Chain, type Account, type Hash, type Hex, erc20Abi, publicActions, walletActions, type PublicActions, type WalletActions, type Address, keccak256, stringToBytes, zeroAddress } from 'viem';\n\nimport {\n    stakingActions,\n    registryActions,\n    RegistryABI,\n    superPaymasterActions,\n    SuperPaymasterABI,\n    paymasterActions,\n    PaymasterFactoryABI,\n    xPNTsTokenABI,\n    type StakingActions,\n    type RegistryActions,\n    type SuperPaymasterActions,\n    type PaymasterActions,\n    CORE_ADDRESSES,\n    TEST_TOKEN_ADDRESSES,\n    TEST_ACCOUNT_ADDRESSES,\n    getCanonicalAddresses,\n    describeSupportedChains\n} from '@aastar/core';\nimport { RoleDataFactory } from '../utils/roleData.js';\nimport { decodeContractError } from '../errors/decoder.js';\n\nexport type OperatorClient = Client<Transport, Chain, Account | undefined> & PublicActions<Transport, Chain, Account | undefined> & WalletActions<Chain, Account | undefined> & RegistryActions & SuperPaymasterActions & PaymasterActions & StakingActions & {\n    /**\n     * High-level API: Setup operator with automatic funding and onboarding\n     */\n    setup: (args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex, roleData?: Hex }) => Promise<{ txs: Hash[] }>;\n    deployPaymasterV4: (args?: { version?: string, initData?: Hex }) => Promise<Hash>;\n    /**\n     * Orchestrates the full onboarding flow:\n     * 1. Approve GToken (Stake)\n     * 2. Register Role (Stake Lock)\n     * 3. Approve aPNTs (Deposit)\n     * 4. Deposit aPNTs (SuperPaymaster)\n     */\n    onboardOperator: (args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex, roleData?: Hex }) => Promise<Hash[]>;\n    /** @deprecated Use onboardOperator */\n    onboardToSuperPaymaster: (args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex }) => Promise<Hash[]>\n    configureOperator: (args: { xPNTsToken: Address, treasury: Address, account?: Account | Address }) => Promise<Hash>\n    getOperatorStatus: (accountAddress: Address) => Promise<{\n        type: 'super' | 'v4' | null;\n        superPaymaster: {\n            hasRole: boolean;\n            isConfigured: boolean;\n            balance: bigint;\n            /** Exchange rate read from xPNTsToken.exchangeRate() — not from operators() */\n            exchangeRate: bigint;\n            treasury: Address;\n        } | null;\n        paymasterV4: {\n            address: Address;\n            balance: bigint;\n        } | null;\n    }>\n};\n\n\nexport function createOperatorClient({ \n    chain, \n    transport, \n    account,\n    addresses\n}: { \n    chain: Chain, \n    transport: Transport,\n    account?: Account,\n    addresses?: { [key: string]: Address }\n}): OperatorClient {\n    const client = createClient({ \n        chain, \n        transport,\n        account\n    })\n    .extend(publicActions)\n    .extend(walletActions);\n\n    // Auto-resolve the contract address book from `chain.id` (seamless multi-chain).\n    // Precedence: explicit `addresses` > canonical-by-chainId > static CORE_ADDRESSES fallback.\n    const chainDefaults = getCanonicalAddresses(chain.id);\n    if (!chainDefaults && !addresses) {\n        throw new Error(\n            `[createOperatorClient] No canonical addresses for chainId ${chain.id}. ` +\n            `Pass \\`addresses\\` explicitly, or use a supported chain: ${describeSupportedChains()}.`,\n        );\n    }\n    const usedAddresses = { ...CORE_ADDRESSES, ...TEST_TOKEN_ADDRESSES, ...TEST_ACCOUNT_ADDRESSES, ...chainDefaults, ...addresses };\n\n    const spActions = superPaymasterActions(usedAddresses.superPaymaster)(client as any);\n    const regActions = registryActions(usedAddresses.registry)(client as any);\n    const stkActions = stakingActions(usedAddresses.gTokenStaking)(client as any);\n    const pmV4Actions = paymasterActions(usedAddresses.paymasterV4)(client as any);\n\n    const actions = {\n        ...stkActions,\n        ...spActions,\n        ...pmV4Actions,\n        ...regActions,\n\n        async setup(args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex, roleData?: Hex }) {\n            console.log('⚙️ Setting up operator...');\n            const txs = await (this as any)._onboardOperator(args);\n            console.log(`✅ Operator setup complete! Transactions: ${txs.length}`);\n            return { txs };\n        },\n        async onboardOperator(args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex, roleData?: Hex }) {\n            return this.onboardFully(args);\n        },\n        async onboardFully(args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex, roleData?: Hex }) {\n            return (this as any)._onboardOperator(args);\n        },\n        async deployPaymasterV4({ version = 'v4.1', initData = '0x' }: { version?: string, initData?: Hex } = {}) {\n            console.log(`   SDK: Deploying Paymaster V4 (${version})...`);\n            const tx = await (client as any).writeContract({\n                address: usedAddresses.paymasterFactory,\n                abi: PaymasterFactoryABI,\n                functionName: 'deployPaymaster',\n                args: [version, initData],\n                account,\n                chain\n            });\n            await (client as any).waitForTransactionReceipt({ hash: tx });\n            return tx;\n        },\n        async _onboardOperator({ stakeAmount, depositAmount, roleId, roleData }: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex, roleData?: Hex }) {\n            const txs: Hash[] = [];\n            const accountToUse = account; \n            if (!accountToUse) throw new Error(\"Account required for onboarding\");\n\n            try {\n                // 1. Fetch Entry Burn & Approve GToken\n                console.log('   SDK: Fetching role config for entry burn...');\n                const roleConfig = await (client as any).readContract({\n                    address: usedAddresses.registry,\n                    abi: RegistryABI,\n                    functionName: 'roleConfigs',\n                    args: [roleId]\n                }) as any; \n\n                const entryBurn = roleConfig[1]; \n                const totalStakeNeeded = stakeAmount + entryBurn;\n\n                console.log(`   SDK: Approving GToken (Stake: ${stakeAmount}, Burn: ${entryBurn})...`);\n                const approveGToken = await (client as any).writeContract({\n                    address: usedAddresses.gToken,\n                    abi: erc20Abi,\n                    functionName: 'approve',\n                    args: [usedAddresses.gTokenStaking, totalStakeNeeded],\n                    account: accountToUse,\n                    chain\n                });\n                await (client as any).waitForTransactionReceipt({ hash: approveGToken });\n                txs.push(approveGToken);\n\n                // 2. Register Role\n                let data: Hex;\n                if (roleData && roleData !== '0x') {\n                    data = roleData;\n                } else {\n                    console.log(`   SDK: Auto-generating roleData for roleId ${roleId}...`);\n                    if (roleId === keccak256(stringToBytes('COMMUNITY'))) {\n                        data = RoleDataFactory.community();\n                    } else if (roleId === keccak256(stringToBytes('ENDUSER'))) {\n                        data = RoleDataFactory.endUser();\n                    } else if (roleId === keccak256(stringToBytes('PAYMASTER_SUPER'))) {\n                        data = RoleDataFactory.paymasterSuper();\n                    } else {\n                        data = RoleDataFactory.paymasterSuper();\n                    }\n                }\n                \n                console.log(`   SDK: Checking if role already granted...`);\n                const hasRoleResult = await (client as any).readContract({\n                    address: usedAddresses.registry,\n                    abi: RegistryABI,\n                    functionName: 'hasRole',\n                    args: [roleId, accountToUse!.address]\n                }) as boolean;\n\n                if (hasRoleResult) {\n                    console.log(`   ℹ️  Role already granted, skipping registration`);\n                } else {\n                    console.log(`   SDK: Registering role ${roleId}...`);\n                    const registerTx = await actions.registerRoleSelf({\n                        roleId,\n                        data, \n                        account: accountToUse\n                    });\n                    await (client as any).waitForTransactionReceipt({ hash: registerTx });\n                    txs.push(registerTx);\n                }\n\n                if (depositAmount > 0n) {\n                    console.log('   SDK: Depositing aPNTs via depositFor...');\n                    const depositTx = await (client as any).writeContract({\n                        address: usedAddresses.superPaymaster,\n                        abi: SuperPaymasterABI,\n                        functionName: 'depositFor',\n                        args: [accountToUse.address, depositAmount],\n                        account: accountToUse,\n                        chain\n                    });\n                    await (client as any).waitForTransactionReceipt({ hash: depositTx });\n                    txs.push(depositTx);\n                }\n\n                return txs;\n            } catch (error) {\n                const decodedMsg = decodeContractError(error);\n                throw decodedMsg ? new Error(`Onboarding Failed: ${decodedMsg}`) : error;\n            }\n        },\n        async onboardToSuperPaymaster(args: { stakeAmount: bigint, depositAmount: bigint, roleId: Hex }) {\n            return this.onboardOperator(args);\n        },\n        async configureOperator({ xPNTsToken, treasury, account: accountOverride }: { xPNTsToken: Address, treasury: Address, account?: Account | Address }) {\n            const tx = await spActions.configureOperator({\n                xPNTsToken,\n                opTreasury: treasury,\n                account: accountOverride || account\n            });\n            await (client as any).waitForTransactionReceipt({ hash: tx });\n            return tx;\n        },\n        async getOperatorStatus(accountAddress: Address) {\n            try {\n                const hasRole = await client.readContract({\n                    address: usedAddresses.registry,\n                    abi: RegistryABI,\n                    functionName: 'hasRole',\n                    args: [keccak256(stringToBytes('PAYMASTER_SUPER')), accountAddress]\n                }) as boolean;\n\n                let operatorType: 'super' | 'v4' | null = null;\n                let superPaymasterInfo = null;\n                let paymasterV4Info = null;\n\n                if (hasRole && usedAddresses.superPaymaster) {\n                    // v5.3.3: operators() is 9-field tuple (exchangeRate removed, minTxInterval added)\n                    // [0] aPNTsBalance, [1] isConfigured, [2] isPaused, [3] xPNTsToken,\n                    // [4] reputation, [5] minTxInterval, [6] treasury, [7] totalSpent, [8] totalTxSponsored\n                    const operatorData = await client.readContract({\n                        address: usedAddresses.superPaymaster!,\n                        abi: SuperPaymasterABI,\n                        functionName: 'operators',\n                        args: [accountAddress]\n                    }) as any;\n\n                    if (operatorData && operatorData[1]) { // isConfigured at index 1\n                        operatorType = 'super';\n                        // Exchange rate is now on the xPNTs token contract, not in operators()\n                        const xPNTsTokenAddr = operatorData[3] as Address;\n                        let exchangeRate = 0n;\n                        if (xPNTsTokenAddr && xPNTsTokenAddr !== zeroAddress) {\n                            try {\n                                exchangeRate = await client.readContract({\n                                    address: xPNTsTokenAddr,\n                                    abi: xPNTsTokenABI,\n                                    functionName: 'exchangeRate',\n                                }) as bigint;\n                            } catch (rateErr: unknown) {\n                                // ContractFunctionExecutionError = contract not deployed yet (expected, silent)\n                                // Anything else = RPC or decode failure (log warning)\n                                const msg = rateErr instanceof Error ? rateErr.message : String(rateErr);\n                                if (!msg.includes('ContractFunctionExecutionError') && !msg.includes('code: -32')) {\n                                    console.warn(`   ⚠️ Unexpected error reading exchangeRate from ${xPNTsTokenAddr}:`, msg);\n                                }\n                            }\n                        }\n                        superPaymasterInfo = {\n                            hasRole: true,\n                            isConfigured: true,\n                            balance: operatorData[0],\n                            exchangeRate,\n                            treasury: operatorData[6]\n                        };\n                    }\n                }\n                \n                // 检查 Paymaster V4 (Direct)\n                if (usedAddresses.paymasterFactory && usedAddresses.paymasterFactory !== zeroAddress) {\n                    try {\n                        const pmAddr = await client.readContract({\n                            address: usedAddresses.paymasterFactory,\n                            abi: PaymasterFactoryABI,\n                            functionName: 'getPaymasterByOperator',\n                            args: [accountAddress]\n                        }) as Address;\n            \n                        if (pmAddr !== zeroAddress) {\n                            operatorType = operatorType || 'v4';\n                            paymasterV4Info = {\n                                address: pmAddr,\n                                balance: await client.getBalance({ address: pmAddr })\n                            };\n                        }\n                    } catch (e) {\n                        console.warn(`   ⚠️ Failed to fetch V4 info from factory ${usedAddresses.paymasterFactory}:`, e);\n                    }\n                }\n\n                return { type: operatorType, superPaymaster: superPaymasterInfo, paymasterV4: paymasterV4Info };\n            } catch (error) {\n                console.error('Error in getOperatorStatus:', error);\n                return { type: null, superPaymaster: null, paymasterV4: null };\n            }\n        }\n    };\n\n    return Object.assign(client, actions) as unknown as OperatorClient;\n}\n","import { \n    createClient, \n    type Client, \n    type Transport, \n    type Chain, \n    type Account, \n    type Hash, \n    type Hex,\n    publicActions,\n    walletActions,\n    type PublicActions,\n    type WalletActions,\n    type Address,\n    keccak256,\n    stringToBytes,\n    erc20Abi\n} from 'viem';\n\nimport { \n    registryActions, \n    RegistryABI, \n    sbtActions,\n    type RegistryActions,\n    type SBTActions,\n    CORE_ADDRESSES,\n    TEST_TOKEN_ADDRESSES,\n    getCanonicalAddresses,\n    describeSupportedChains\n} from '@aastar/core';\nimport { RoleDataFactory, RoleIds } from '../utils/roleData.js';\n\nexport type CommunityClient = Client<Transport, Chain, Account | undefined> & PublicActions<Transport, Chain, Account | undefined> & WalletActions<Chain, Account | undefined> & RegistryActions & SBTActions & {\n    /**\n     * Query community registration status and token information\n     * Returns null if not registered, otherwise returns community details\n     */\n    getCommunityInfo: (accountAddress: Address) => Promise<{\n        hasRole: boolean;\n        tokenAddress: Address | null;\n        communityData: {\n            name: string;\n            ensName: string;\n            website: string;\n            description: string;\n        } | null;\n    }>;\n    /**\n     * High-level API to launch a community with automatic roleData generation\n     */\n    launch: (args: {\n        name: string;\n        tokenName: string;\n        tokenSymbol: string;\n        description?: string;\n        logoURI?: string;\n        website?: string;\n    }) => Promise<{ tokenAddress: Address; txs: Hex[] }>;\n};\n\nexport function createCommunityClient({ \n    chain, \n    transport, \n    account,\n    addresses\n}: { \n    chain: Chain, \n    transport: Transport,\n    account?: Account,\n    addresses?: { [key: string]: Address }\n}): CommunityClient {\n    const client = createClient({ \n        chain, \n        transport,\n        account\n    })\n    .extend(publicActions)\n    .extend(walletActions);\n\n    // Auto-resolve the contract address book from `chain.id` (seamless multi-chain).\n    // Precedence: explicit `addresses` > canonical-by-chainId > static CORE_ADDRESSES fallback.\n    const chainDefaults = getCanonicalAddresses(chain.id);\n    if (!chainDefaults && !addresses) {\n        throw new Error(\n            `[createCommunityClient] No canonical addresses for chainId ${chain.id}. ` +\n            `Pass \\`addresses\\` explicitly, or use a supported chain: ${describeSupportedChains()}.`,\n        );\n    }\n    const usedAddresses = { ...CORE_ADDRESSES, ...TEST_TOKEN_ADDRESSES, ...chainDefaults, ...addresses };\n\n    const registryActionsObj = registryActions(usedAddresses.registry)(client as any);\n    const sbtActionsObj = sbtActions(usedAddresses.mySBT)(client as any);\n\n    const launch = async (args: {\n        name: string;\n        tokenName: string;\n        tokenSymbol: string;\n        description?: string;\n        logoURI?: string;\n        website?: string;\n    }): Promise<{ tokenAddress: Address; txs: Hex[] }> => {\n        try {\n            console.log(`🚀 Launching community: ${args.name}`);\n            \n            if (!account) {\n                throw new Error('Account is required for launch()');\n            }\n\n            // Generate unique community name with timestamp\n            const uniqueName = `${args.name}_${Date.now()}`;\n            console.log(`   📝 Unique name: ${uniqueName}`);\n\n            // Generate roleData using RoleDataFactory\n            const roleData = RoleDataFactory.community({\n                name: uniqueName,\n                ensName: '',\n                website: args.website || '',\n                description: args.description || '',\n                logoURI: args.logoURI || '',\n                stakeAmount: 0n\n            });\n            console.log(`   ✅ RoleData generated:`, roleData);\n            console.log(`   📊 RoleData type:`, typeof roleData);\n            console.log(`   📏 RoleData length:`, roleData?.length);\n\n            // 1. Check if already has role\n            const hasRole = await client.readContract({\n                address: usedAddresses.registry,\n                abi: RegistryABI,\n                functionName: 'hasRole',\n                args: [RoleIds.COMMUNITY, account.address]\n            }) as boolean;\n\n            let registerTx: Hex | undefined;\n\n            if (hasRole) {\n                console.log(`   ℹ️  Account already has COMMUNITY role. Skipping registration.`);\n            } else {\n                // 2. Check GToken Allowance and Balance\n                if (usedAddresses.gToken && usedAddresses.gTokenStaking) {\n                    console.log(`   💰 Checking GToken allowance...`);\n                    const balance = await client.readContract({\n                        address: usedAddresses.gToken,\n                        abi: erc20Abi,\n                        functionName: 'balanceOf',\n                        args: [account.address]\n                    }) as bigint;\n\n                    if (balance < 50000000000000000000n) { // 50 GT assumption, should ideally check minStake\n                         console.warn(`   ⚠️ Warning: Low GToken balance (${balance}). Registration may fail if minStake > balance.`);\n                    }\n\n                    const allowance = await client.readContract({\n                        address: usedAddresses.gToken,\n                        abi: erc20Abi,\n                        functionName: 'allowance',\n                        args: [account.address, usedAddresses.gTokenStaking]\n                    }) as bigint;\n\n                    if (allowance < 50000000000000000000n) {\n                        console.log(`   🔓 Approving GToken for Staking...`);\n                        const approveTx = await client.writeContract({\n                            address: usedAddresses.gToken,\n                            abi: erc20Abi,\n                            functionName: 'approve',\n                            args: [usedAddresses.gTokenStaking, 115792089237316195423570985008687907853269984665640564039457584007913129639935n], // MaxUint256\n                            account: account\n                        });\n                        console.log(`   ✅ Approved: ${approveTx}`);\n                        await client.waitForTransactionReceipt({ hash: approveTx });\n                    }\n                }\n\n                // Register community role\n                console.log(`   📤 Registering community role...`);\n                try {\n                    registerTx = await registryActionsObj.registerRole({\n                        roleId: RoleIds.COMMUNITY,\n                        user: account.address,\n                        data: roleData,\n                        account: account\n                    });\n                    console.log(`   ✅ Community registered: ${registerTx}`);\n                } catch (e: any) {\n                     // Check for RoleAlreadyGranted (just in case hasRole returned false but race condition or cache)\n                     const isRoleError = e.message?.includes('RoleAlreadyGranted') || \n                                        (e.cause as any)?.data?.errorName === 'RoleAlreadyGranted' ||\n                                        (e as any).name === 'RoleAlreadyGranted' || \n                                        (e as any).name === 'RoleAlreadyGranted';\n\n                    if (isRoleError) {\n                        console.log(`   ℹ️  Role already granted (caught in tx). Skipping.`);\n                    } else {\n                        throw e;\n                    }\n                }\n            }\n\n            // Deploy xPNTs token if factory is available\n            let tokenAddress: Address = '0x0000000000000000000000000000000000000000' as Address;\n            const txs: Hex[] = [];\n            if (registerTx) txs.push(registerTx);\n\n            if (usedAddresses.xPNTsFactory) {\n                if (!client.account) {\n                    throw new Error(\"Client account is required for token deployment\");\n                }\n\n                // ABI from xPNTsFactory.sol\n                const factoryAbi = [\n                    {\n                        type: 'function',\n                        name: 'deployxPNTsToken',\n                        inputs: [\n                            { name: 'name', type: 'string' },\n                            { name: 'symbol', type: 'string' },\n                            { name: 'communityName', type: 'string' },\n                            { name: 'communityENS', type: 'string' },\n                            { name: 'exchangeRate', type: 'uint256' },\n                            { name: 'paymasterAOA', type: 'address' }\n                        ],\n                        outputs: [{ name: 'token', type: 'address' }],\n                        stateMutability: 'nonpayable'\n                    },\n                    {\n                        type: 'function',\n                        name: 'getTokenAddress',\n                        inputs: [{ name: 'community', type: 'address' }],\n                        outputs: [{ name: 'token', type: 'address' }],\n                        stateMutability: 'view'\n                    }\n                ] as const;\n\n                // 1. Check if token already exists\n                try {\n                    const existingToken = await client.readContract({\n                        address: usedAddresses.xPNTsFactory,\n                        abi: factoryAbi,\n                        functionName: 'getTokenAddress',\n                        args: [account.address]\n                    }) as Address;\n\n                    if (existingToken && existingToken !== '0x0000000000000000000000000000000000000000') {\n                        console.log(`   ℹ️  Found existing token at ${existingToken}`);\n                        tokenAddress = existingToken;\n                        // Return early or continue? Logic expects result.\n                        // If we found it, we don't need to deploy.\n                        return { tokenAddress, txs };\n                    }\n                } catch (e) {\n                    console.warn(`   ⚠️ Failed to check for existing token:`, e);\n                }\n\n                console.log(`   🏭 Deploying Token via Factory: ${usedAddresses.xPNTsFactory}`);\n                \n                try {\n                    // deployxPNTsToken(name, symbol, communityName, communityENS, exchangeRate, paymasterAOA)\n                    const { request } = await client.simulateContract({\n                        address: usedAddresses.xPNTsFactory,\n                        abi: factoryAbi,\n                        functionName: 'deployxPNTsToken',\n                        args: [\n                            args.tokenName, \n                            args.tokenSymbol, \n                            args.name, // communityName\n                            args.website || '', // communityENS (mapping website to ENS param for now)\n                            1000000000000000000n, // exchangeRate 1e18 (1:1)\n                            '0x0000000000000000000000000000000000000000' // paymasterAOA (optional)\n                        ],\n                        account: client.account\n                    } as any);\n\n                    const deployTx = await client.writeContract(request as any);\n                    console.log(`   📤 Deploy Token Tx: ${deployTx}`);\n                    txs.push(deployTx);\n                    \n                    const receipt = await client.waitForTransactionReceipt({ hash: deployTx });\n                    \n                    // After deployment, fetch the address again\n                    const newTokenAddress = await client.readContract({\n                        address: usedAddresses.xPNTsFactory,\n                        abi: factoryAbi,\n                        functionName: 'getTokenAddress',\n                        args: [account.address]\n                    }) as Address;\n                    \n                    if (newTokenAddress) {\n                        tokenAddress = newTokenAddress;\n                        console.log(`   🪙 Token Deployed: ${tokenAddress}`);\n                    }\n\n                } catch (deployError) {\n                    console.warn('   ⚠️ Failed to deploy token, but community registered:', deployError);\n                }\n            }\n\n            return { tokenAddress, txs };\n        } catch (error: any) {\n            console.error('❌ Error in launch():', error);\n            \n            // 检查是否是 RoleAlreadyGranted 错误\n            const errorMessage = error.message || '';\n            const errorData = error.data?.errorName || '';\n            const errorString = JSON.stringify(error);\n            \n            if (errorMessage.includes('RoleAlreadyGranted') || \n                errorData === 'RoleAlreadyGranted' ||\n                errorString.includes('RoleAlreadyGranted')) {\n                throw new Error(`Account ${account?.address || 'unknown'} already has COMMUNITY role. Please use a different account or exit the role first.`);\n            }\n            \n            // 检查其他常见错误\n            if (errorMessage.includes('InsufficientStake')) {\n                throw new Error('Insufficient stake. Please ensure you have enough GToken staked.');\n            }\n            \n            if (errorMessage.includes('RoleNotConfigured')) {\n                throw new Error('COMMUNITY role is not configured in the Registry contract.');\n            }\n            \n            // 重新抛出原始错误\n            throw error;\n        }\n    };\n\n    // State query method - check before operations\n    const getCommunityInfo = async (accountAddress: Address) => {\n        try {\n            // 1. Check if account has COMMUNITY role\n            const hasRole = await client.readContract({\n                address: usedAddresses.registry,\n                abi: RegistryABI,\n                functionName: 'hasRole',\n                args: [RoleIds.COMMUNITY, accountAddress]\n            }) as boolean;\n\n            if (!hasRole) {\n                return {\n                    hasRole: false,\n                    tokenAddress: null,\n                    communityData: null\n                };\n            }\n\n            // 2. Get token address from factory\n            const factoryAbi = [\n                {\n                    inputs: [{ name: 'community', type: 'address' }],\n                    name: 'getTokenAddress',\n                    outputs: [{ name: '', type: 'address' }],\n                    stateMutability: 'view',\n                    type: 'function'\n                }\n            ] as const;\n\n            const tokenAddress = await client.readContract({\n                address: usedAddresses.xPNTsFactory!,\n                abi: factoryAbi,\n                functionName: 'getTokenAddress',\n                args: [accountAddress]\n            }) as Address;\n\n            // 3. Get community metadata from Registry\n        const metadata = await client.readContract({\n            address: usedAddresses.registry,\n            abi: RegistryABI,\n            functionName: 'roleMetadata',\n            args: [RoleIds.COMMUNITY, accountAddress]\n        }) as Hex;\n\n        let communityData = {\n            name: 'Community',\n            ensName: '',\n            website: '',\n            description: '',\n            logoURI: ''\n        };\n\n        if (metadata && metadata !== '0x') {\n            try {\n                // RoleMetadata is encoded as CommunityRoleData struct:\n                // (string name, string ensName, string website, string description, string logoURI, uint256 stakeAmount)\n                const decoded = RoleDataFactory.decodeCommunity(metadata);\n                communityData = {\n                    name: decoded.name || 'Community',\n                    ensName: decoded.ensName || '',\n                    website: decoded.website || '',\n                    description: decoded.description || '',\n                    logoURI: decoded.logoURI || ''\n                };\n            } catch (e) {\n                console.warn('   ⚠️ Failed to decode community metadata:', e);\n            }\n        }\n\n        return {\n            hasRole: true,\n            tokenAddress: (tokenAddress && tokenAddress !== '0x0000000000000000000000000000000000000000') ? tokenAddress : null,\n            communityData: (metadata && metadata !== '0x') ? communityData : null\n        };\n    } catch (error) {\n            console.error('Error fetching community info:', error);\n            return {\n                hasRole: false,\n                tokenAddress: null,\n                communityData: null\n            };\n        }\n    };\n\n    return Object.assign(client, registryActionsObj, sbtActionsObj, { \n        launch,\n        getCommunityInfo\n    }) as unknown as CommunityClient;\n}\n","import { createClient, type Client, type Transport, type Chain, type Account, publicActions, walletActions, type PublicActions, type WalletActions, type Address } from 'viem';\nimport {\n    registryActions, \n    superPaymasterActions,\n    paymasterActions, \n    stakingActions,\n    sbtActions,\n    dvtActions,\n    xPNTsFactoryActions,\n    aggregatorActions,\n    type RegistryActions, \n    type SuperPaymasterActions,\n    type PaymasterActions, \n    type StakingActions, \n    type SBTActions,\n    type DVTActions,\n    type XPNTsFactoryActions,\n    type AggregatorActions,\n    CORE_ADDRESSES,\n    TOKEN_ADDRESSES,\n    getCanonicalAddresses,\n    describeSupportedChains\n} from '@aastar/core';\n\nconst ADDRESS_PLACEHOLDER: Address = '0x0000000000000000000000000000000000000000';\n\nexport type AdminClient = Client<Transport, Chain, Account | undefined> & PublicActions<Transport, Chain, Account | undefined> & WalletActions<Chain, Account | undefined> & RegistryActions & SuperPaymasterActions & PaymasterActions & StakingActions & SBTActions & DVTActions & XPNTsFactoryActions & AggregatorActions;\n\nexport function createAdminClient({ \n    chain, \n    transport, \n    account,\n    addresses\n}: { \n    chain: Chain, \n    transport: Transport,\n    account?: Account,\n    addresses?: { [key: string]: Address }\n}): AdminClient {\n    const baseClient = createClient({ chain, transport, account })\n        .extend(publicActions)\n        .extend(walletActions);\n        \n    // Auto-resolve the contract address book from `chain.id` (seamless multi-chain).\n    // Precedence: explicit `addresses` > canonical-by-chainId > static CORE_ADDRESSES fallback.\n    const chainDefaults = getCanonicalAddresses(chain.id);\n    if (!chainDefaults && !addresses) {\n        throw new Error(\n            `[createAdminClient] No canonical addresses for chainId ${chain.id}. ` +\n            `Pass \\`addresses\\` explicitly, or use a supported chain: ${describeSupportedChains()}.`,\n        );\n    }\n    const usedAddresses = { ...CORE_ADDRESSES, ...TOKEN_ADDRESSES, ...chainDefaults, ...addresses };\n\n    const actions = {\n        ...registryActions(usedAddresses.registry)(baseClient as any),\n        ...superPaymasterActions(usedAddresses.superPaymaster)(baseClient as any),\n        ...paymasterActions(usedAddresses.paymasterV4)(baseClient as any),\n        ...stakingActions(usedAddresses.gTokenStaking)(baseClient as any),\n        ...sbtActions(usedAddresses.mySBT)(baseClient as any),\n        ...dvtActions(ADDRESS_PLACEHOLDER)(baseClient as any),\n        ...xPNTsFactoryActions(usedAddresses.xPNTsFactory || '0x')(baseClient as any),\n        ...aggregatorActions(ADDRESS_PLACEHOLDER)(baseClient as any),\n    };\n\n    return Object.assign(baseClient, actions) as unknown as AdminClient;\n}\n","import { Hash, formatEther } from 'viem';\n\nexport interface ExperimentRecord {\n    id: string;\n    scenario: string;\n    group: 'EOA' | 'AA' | 'SuperPaymaster';\n    txHash: string;\n    gasUsed: bigint;\n    gasPrice: bigint;\n    costETH: string;\n    status: 'Success' | 'Failed';\n    timestamp: number;\n    meta?: any;\n}\n\n/**\n * ExperimentClient: Business-layer tool for measuring and recording execution metrics\n */\nexport class ExperimentClient {\n    private records: ExperimentRecord[] = [];\n    private scenarioId: string;\n    private group: 'EOA' | 'AA' | 'SuperPaymaster';\n\n    constructor(scenarioId: string, group: 'EOA' | 'AA' | 'SuperPaymaster') {\n        this.scenarioId = scenarioId;\n        this.group = group;\n    }\n\n    /**\n     * Record a transaction result\n     */\n    public recordTx(txHash: Hash, receipt: { gasUsed: any, effectiveGasPrice: any }, status: 'Success' | 'Failed', meta?: any) {\n        const gasUsed = BigInt(receipt.gasUsed || 0);\n        const gasPrice = BigInt(receipt.effectiveGasPrice || 0);\n        const costBN = gasUsed * gasPrice;\n        \n        const record: ExperimentRecord = {\n            id: `${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n            scenario: this.scenarioId,\n            group: this.group,\n            txHash: txHash,\n            gasUsed: gasUsed,\n            gasPrice: gasPrice,\n            costETH: formatEther(costBN),\n            status: status,\n            timestamp: Date.now(),\n            meta\n        };\n        \n        this.records.push(record);\n        return record;\n    }\n\n    /**\n     * Measure an async task (transaction) automatically\n     */\n    public async measureTx(taskName: string, txPromise: Promise<Hash>, publicClient: any): Promise<Hash> {\n        console.log(`[Experiment: ${this.group}] Executing: ${taskName}...`);\n        const start = Date.now();\n        try {\n            const hash = await txPromise;\n            const receipt = await publicClient.waitForTransactionReceipt({ hash });\n            \n            this.recordTx(hash, receipt, 'Success', { latency: Date.now() - start });\n            \n            const gasUsed = BigInt(receipt.gasUsed || 0);\n            const gasPrice = BigInt(receipt.effectiveGasPrice || 0);\n            \n            console.log(`   ✅ Success! Gas: ${gasUsed} | Cost: ${formatEther(gasUsed * gasPrice)} ETH`);\n            return hash;\n        } catch (e: any) {\n            console.error(`   ❌ Failed: ${taskName}`, e);\n            throw e;\n        }\n    }\n\n    public getRecords() {\n        return this.records;\n    }\n}\n","import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\nimport type { Hex, Address } from 'viem';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * 密钥对接口\n */\nexport interface KeyPair {\n    name: string;\n    privateKey: Hex;\n    address: Address;\n}\n\n/**\n * 密钥管理器\n * 提供密钥生成、存储、加载等工具函数\n */\nexport class KeyManager {\n    /**\n     * 生成单个密钥对\n     * @param name - 密钥名称（如 'Jason', 'Anni'）\n     */\n    static generateKeyPair(name: string): KeyPair {\n        const privateKey = generatePrivateKey();\n        const account = privateKeyToAccount(privateKey);\n        return {\n            name,\n            privateKey,\n            address: account.address\n        };\n    }\n\n    /**\n     * 批量生成密钥对\n     * @param names - 密钥名称数组\n     */\n    static generateKeyPairs(names: string[]): KeyPair[] {\n        return names.map(name => this.generateKeyPair(name));\n    }\n\n    /**\n     * 生成指定数量的密钥对（自动命名为 Operator_1, Operator_2, ...）\n     * @param count - 数量\n     * @param prefix - 名称前缀（默认 'Operator'）\n     */\n    static generateMultiple(count: number, prefix: string = 'Operator'): KeyPair[] {\n        const names = Array.from({ length: count }, (_, i) => `${prefix}_${i + 1}`);\n        return this.generateKeyPairs(names);\n    }\n\n    /**\n     * 保存密钥到 .env 文件\n     * @param filePath - 文件路径（绝对路径）\n     * @param keys - 密钥对数组\n     * @param overwrite - 是否覆盖已存在的文件（默认 false）\n     */\n    static saveToEnvFile(filePath: string, keys: KeyPair[], overwrite: boolean = false): void {\n        if (fs.existsSync(filePath) && !overwrite) {\n            throw new Error(`File already exists: ${filePath}. Set overwrite=true to replace.`);\n        }\n\n        const content = keys.map(k => \n            `${k.name.toUpperCase().replace(/\\s+/g, '_')}_PRIVATE_KEY=${k.privateKey}`\n        ).join('\\n') + '\\n';\n\n        fs.writeFileSync(filePath, content, { mode: 0o600 }); // 仅所有者可读写\n        console.log(`✅ Keys saved to ${filePath} (${keys.length} keys)`);\n    }\n\n    /**\n     * 从 .env 文件加载密钥\n     * @param filePath - 文件路径（绝对路径）\n     * @returns 密钥对数组\n     */\n    static loadFromEnvFile(filePath: string): KeyPair[] {\n        if (!fs.existsSync(filePath)) {\n            throw new Error(`File not found: ${filePath}`);\n        }\n\n        const content = fs.readFileSync(filePath, 'utf-8');\n        const lines = content.split('\\n').filter(line => line.trim() && !line.startsWith('#'));\n        \n        return lines.map(line => {\n            const [key, value] = line.split('=');\n            const name = key.replace(/_PRIVATE_KEY$/, '').toLowerCase().replace(/_/g, ' ');\n            const privateKey = value.trim() as Hex;\n            const account = privateKeyToAccount(privateKey);\n            \n            return {\n                name,\n                privateKey,\n                address: account.address\n            };\n        });\n    }\n\n    /**\n     * 保存密钥到 JSON 文件（包含地址信息）\n     * @param filePath - 文件路径（绝对路径）\n     * @param keys - 密钥对数组\n     * @param overwrite - 是否覆盖已存在的文件（默认 false）\n     */\n    static saveToJsonFile(filePath: string, keys: KeyPair[], overwrite: boolean = false): void {\n        if (fs.existsSync(filePath) && !overwrite) {\n            throw new Error(`File already exists: ${filePath}. Set overwrite=true to replace.`);\n        }\n\n        const data = {\n            generated: new Date().toISOString(),\n            keys: keys.map(k => ({\n                name: k.name,\n                privateKey: k.privateKey,\n                address: k.address\n            }))\n        };\n\n        fs.writeFileSync(filePath, JSON.stringify(data, null, 2), { mode: 0o600 });\n        console.log(`✅ Keys saved to ${filePath} (${keys.length} keys)`);\n    }\n\n    /**\n     * 从 JSON 文件加载密钥\n     * @param filePath - 文件路径（绝对路径）\n     */\n    static loadFromJsonFile(filePath: string): KeyPair[] {\n        if (!fs.existsSync(filePath)) {\n            throw new Error(`File not found: ${filePath}`);\n        }\n\n        const content = fs.readFileSync(filePath, 'utf-8');\n        const data = JSON.parse(content);\n        \n        return data.keys.map((k: any) => ({\n            name: k.name,\n            privateKey: k.privateKey as Hex,\n            address: k.address as Address\n        }));\n    }\n\n    /**\n     * 打印密钥信息（隐藏私钥）\n     * @param keys - 密钥对数组\n     */\n    static printKeys(keys: KeyPair[], showPrivateKey: boolean = false): void {\n        console.log('\\n🔑 Generated Keys:');\n        console.log('─'.repeat(80));\n        keys.forEach((k, i) => {\n            console.log(`${i + 1}. ${k.name}`);\n            console.log(`   Address: ${k.address}`);\n            if (showPrivateKey) {\n                console.log(`   Private Key: ${k.privateKey}`);\n            } else {\n                console.log(`   Private Key: ${k.privateKey.slice(0, 10)}...${k.privateKey.slice(-8)}`);\n            }\n        });\n        console.log('─'.repeat(80));\n    }\n}\n","import { createPublicClient, createWalletClient, http, parseEther, erc20Abi, type PublicClient, type WalletClient, type Hex, type Address, type Chain } from 'viem';\nimport { privateKeyToAccount, type PrivateKeyAccount } from 'viem/accounts';\n\n/**\n * 资金管理参数\n */\nexport interface FundingParams {\n    /** RPC URL */\n    rpcUrl: string;\n    /** 链配置 */\n    chain: Chain;\n    /** 资金提供者私钥 */\n    supplierKey: Hex;\n    /** 目标地址 */\n    targetAddress: Address;\n}\n\n/**\n * ETH 充值参数\n */\nexport interface FundETHParams extends FundingParams {\n    /** 充值金额（ETH，如 '0.1'） */\n    amount: string;\n}\n\n/**\n * ERC20 充值参数\n */\nexport interface FundTokenParams extends FundingParams {\n    /** Token 合约地址 */\n    tokenAddress: Address;\n    /** 充值金额（Token，如 '100'） */\n    amount: string;\n}\n\n/**\n * 智能充值参数\n */\nexport interface EnsureFundingParams extends FundingParams {\n    /** 最小 ETH 余额阈值 */\n    minETH?: string;\n    /** 目标 ETH 充值金额 */\n    targetETH?: string;\n    /** Token 配置（可选） */\n    token?: {\n        address: Address;\n        minBalance?: string;\n        targetAmount?: string;\n    };\n}\n\n/**\n * 充值结果\n */\nexport interface FundingResult {\n    success: boolean;\n    txHash?: Hex;\n    error?: string;\n}\n\n/**\n * 资金管理器\n * 提供 ETH 和 ERC20 Token 的充值、验证等工具函数\n */\nexport class FundingManager {\n    /**\n     * 创建 PublicClient 和 WalletClient\n     */\n    private static createClients(params: FundingParams): {\n        publicClient: PublicClient;\n        walletClient: WalletClient;\n        account: PrivateKeyAccount;\n    } {\n        const account = privateKeyToAccount(params.supplierKey);\n        const transport = http(params.rpcUrl);\n        \n        const publicClient = createPublicClient({\n            chain: params.chain,\n            transport\n        });\n\n        const walletClient = createWalletClient({\n            account,\n            chain: params.chain,\n            transport\n        });\n\n        return { publicClient, walletClient, account };\n    }\n\n    /**\n     * 充值 ETH 到目标地址\n     * @param params - 充值参数\n     * @returns 充值结果\n     */\n    static async fundWithETH(params: FundETHParams): Promise<FundingResult> {\n        try {\n            const { publicClient, walletClient } = this.createClients(params);\n            const amount = parseEther(params.amount);\n\n            console.log(`💸 Funding ${params.targetAddress} with ${params.amount} ETH...`);\n            \n            const hash = await walletClient.sendTransaction({\n                account: walletClient.account!,\n                chain: params.chain, \n                to: params.targetAddress,\n                value: amount\n            });\n\n            console.log(`   Transaction Sent: ${hash}`);\n            await publicClient.waitForTransactionReceipt({ hash });\n            console.log(`   ✅ ETH Funded.`);\n\n            return { success: true, txHash: hash };\n        } catch (error) {\n            console.error(`   ❌ ETH Funding Failed:`, error);\n            return { success: false, error: (error as Error).message };\n        }\n    }\n\n    /**\n     * 充值 ERC20 Token 到目标地址\n     * @param params - 充值参数\n     * @returns 充值结果\n     */\n    static async fundWithToken(params: FundTokenParams): Promise<FundingResult> {\n        try {\n            const { publicClient, walletClient, account } = this.createClients(params);\n            const amount = parseEther(params.amount);\n\n            console.log(`💸 Funding ${params.targetAddress} with ${params.amount} tokens...`);\n\n            const { request } = await publicClient.simulateContract({\n                account,\n                address: params.tokenAddress,\n                abi: erc20Abi,\n                functionName: 'transfer',\n                args: [params.targetAddress, amount]\n            });\n\n            const hash = await walletClient.writeContract(request);\n            console.log(`   Transaction Sent: ${hash}`);\n            await publicClient.waitForTransactionReceipt({ hash });\n            console.log(`   ✅ Token Funded.`);\n\n            return { success: true, txHash: hash };\n        } catch (error) {\n            console.error(`   ❌ Token Funding Failed:`, error);\n            return { success: false, error: (error as Error).message };\n        }\n    }\n\n    /**\n     * 检查 ETH 余额\n     * @param params - 基础参数\n     * @returns ETH 余额（wei）\n     */\n    static async getETHBalance(params: FundingParams): Promise<bigint> {\n        const { publicClient } = this.createClients(params);\n        return await publicClient.getBalance({ address: params.targetAddress });\n    }\n\n    /**\n     * 检查 ERC20 Token 余额\n     * @param params - 基础参数\n     * @param tokenAddress - Token 合约地址\n     * @returns Token 余额\n     */\n    static async getTokenBalance(params: FundingParams, tokenAddress: Address): Promise<bigint> {\n        const { publicClient } = this.createClients(params);\n        return await publicClient.readContract({\n            address: tokenAddress,\n            abi: erc20Abi,\n            functionName: 'balanceOf',\n            args: [params.targetAddress]\n        }) as bigint;\n    }\n\n    /**\n     * 智能充值：检查余额，不足时自动充值\n     * @param params - 充值参数\n     * @returns 充值结果数组\n     */\n    static async ensureFunding(params: EnsureFundingParams): Promise<FundingResult[]> {\n        const results: FundingResult[] = [];\n        const { publicClient } = this.createClients(params);\n\n        // 1. 检查并充值 ETH\n        if (params.minETH && params.targetETH) {\n            const ethBalance = await publicClient.getBalance({ address: params.targetAddress });\n            const minETH = parseEther(params.minETH);\n            const targetETH = parseEther(params.targetETH);\n\n            if (ethBalance < minETH) {\n                console.log(`⚠️  ETH balance (${Number(ethBalance) / 1e18}) below threshold (${params.minETH})`);\n                const result = await this.fundWithETH({\n                    ...params,\n                    amount: params.targetETH\n                });\n                results.push(result);\n            } else {\n                console.log(`✅ Sufficient ETH: ${Number(ethBalance) / 1e18} ETH`);\n                results.push({ success: true });\n            }\n        }\n\n        // 2. 检查并充值 Token\n        if (params.token) {\n            const tokenBalance = await this.getTokenBalance(params, params.token.address);\n            const minToken = params.token.minBalance ? parseEther(params.token.minBalance) : 0n;\n            const targetToken = params.token.targetAmount ? parseEther(params.token.targetAmount) : 0n;\n\n            if (tokenBalance < minToken && targetToken > 0n) {\n                console.log(`⚠️  Token balance (${Number(tokenBalance) / 1e18}) below threshold (${params.token.minBalance})`);\n                const result = await this.fundWithToken({\n                    ...params,\n                    tokenAddress: params.token.address,\n                    amount: params.token.targetAmount!\n                });\n                results.push(result);\n            } else {\n                console.log(`✅ Sufficient Token: ${Number(tokenBalance) / 1e18}`);\n                results.push({ success: true });\n            }\n        }\n\n        return results;\n    }\n\n    /**\n     * 批量充值 ETH\n     * @param params - 基础参数\n     * @param targets - 目标地址和金额数组\n     * @returns 充值结果数组\n     */\n    static async batchFundETH(\n        params: Omit<FundingParams, 'targetAddress'>,\n        targets: Array<{ address: Address; amount: string }>\n    ): Promise<FundingResult[]> {\n        const results: FundingResult[] = [];\n        \n        for (const target of targets) {\n            const result = await this.fundWithETH({\n                ...params,\n                targetAddress: target.address,\n                amount: target.amount\n            });\n            results.push(result);\n        }\n\n        return results;\n    }\n\n    /**\n     * 批量充值 Token\n     * @param params - 基础参数\n     * @param tokenAddress - Token 合约地址\n     * @param targets - 目标地址和金额数组\n     * @returns 充值结果数组\n     */\n    static async batchFundToken(\n        params: Omit<FundingParams, 'targetAddress'>,\n        tokenAddress: Address,\n        targets: Array<{ address: Address; amount: string }>\n    ): Promise<FundingResult[]> {\n        const results: FundingResult[] = [];\n        \n        for (const target of targets) {\n            const result = await this.fundWithToken({\n                ...params,\n                targetAddress: target.address,\n                tokenAddress,\n                amount: target.amount\n            });\n            results.push(result);\n        }\n\n        return results;\n    }\n}\n","import { type Address, type Hex, concat, pad, keccak256, encodeAbiParameters, parseAbiParameters, toBytes, type PublicClient } from 'viem';\n\n/**\n * ERC-4337 v0.7 Packed UserOperation structure.\n */\nexport interface PackedUserOperation {\n    sender: Address;\n    nonce: Hex;\n    initCode: Hex;\n    callData: Hex;\n    accountGasLimits: Hex; // bytes32 (packed verificationGasLimit and callGasLimit)\n    preVerificationGas: Hex;\n    gasFees: Hex; // bytes32 (packed maxPriorityFeePerGas and maxFeePerGas)\n    paymasterAndData: Hex;\n    signature: Hex;\n}\n\nexport interface UserOpGasParams {\n    verificationGasLimit: bigint;\n    callGasLimit: bigint;\n    preVerificationGas: bigint;\n    maxPriorityFeePerGas: bigint;\n    maxFeePerGas: bigint;\n}\n\nexport interface PaymasterGasParams {\n    paymasterGasLimit: bigint;\n    paymasterPostOpGasLimit: bigint;\n}\n\nexport class UserOperationBuilder {\n    /**\n     * Packs verificationGasLimit and callGasLimit into a bytes32 Hex string.\n     */\n    static packAccountGasLimits(verificationGasLimit: bigint, callGasLimit: bigint): Hex {\n        return concat([\n            pad(`0x${verificationGasLimit.toString(16)}`, { dir: 'left', size: 16 }),\n            pad(`0x${callGasLimit.toString(16)}`, { dir: 'left', size: 16 })\n        ]) as Hex;\n    }\n\n    /**\n     * Packs maxPriorityFeePerGas and maxFeePerGas into a bytes32 Hex string.\n     */\n    static packGasFees(maxPriorityFeePerGas: bigint, maxFeePerGas: bigint): Hex {\n        return concat([\n            pad(`0x${maxPriorityFeePerGas.toString(16)}`, { dir: 'left', size: 16 }),\n            pad(`0x${maxFeePerGas.toString(16)}`, { dir: 'left', size: 16 })\n        ]) as Hex;\n    }\n\n    static estimatePreVerificationGasV07(userOp: {\n        sender: Address;\n        nonce: bigint | Hex | number | string;\n        initCode: Hex;\n        callData: Hex;\n        accountGasLimits: Hex;\n        preVerificationGas: bigint | Hex | number | string;\n        gasFees: Hex;\n        paymasterAndData: Hex;\n        signature: Hex;\n    }): bigint {\n        const nonce =\n            typeof userOp.nonce === 'bigint'\n                ? userOp.nonce\n                : typeof userOp.nonce === 'number'\n                    ? BigInt(userOp.nonce)\n                    : BigInt(userOp.nonce);\n\n        const preVerificationGas =\n            typeof userOp.preVerificationGas === 'bigint'\n                ? userOp.preVerificationGas\n                : typeof userOp.preVerificationGas === 'number'\n                    ? BigInt(userOp.preVerificationGas)\n                    : BigInt(userOp.preVerificationGas);\n\n        const encoded = encodeAbiParameters(\n            parseAbiParameters('(address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)'),\n            [\n                [\n                    userOp.sender,\n                    nonce,\n                    userOp.initCode,\n                    userOp.callData,\n                    userOp.accountGasLimits,\n                    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     * Packs Paymaster parameters into the v0.7 paymasterAndData format.\n     */\n    static packPaymasterAndData(\n        paymaster: Address,\n        paymasterGasLimit: bigint,\n        paymasterPostOpGasLimit: bigint,\n        paymasterData: Hex = '0x'\n    ): Hex {\n        return concat([\n            paymaster,\n            pad(`0x${paymasterGasLimit.toString(16)}`, { dir: 'left', size: 16 }),\n            pad(`0x${paymasterPostOpGasLimit.toString(16)}`, { dir: 'left', size: 16 }),\n            paymasterData\n        ]) as Hex;\n    }\n\n    /**\n     * Pack PaymasterV4 Deposit-Only paymasterAndData\n     * \n     * v0.7 EntryPoint packs: [paymaster(20)][verificationGas(16)][postOpGas(16)][paymasterData]\n     * Contract extracts token at offset 52 = paymasterData[0:20]\n     * \n     * So paymasterData format must be: [token(20)][validUntil(6)][validAfter(6)]\n     * \n     * @param paymaster - Paymaster address (20 bytes)\n     * @param paymentToken - ERC20 token address (20 bytes, FIRST in paymasterData!)\n     * @param validUntil - Validity end timestamp (6 bytes)\n     * @param validAfter - Validity start timestamp (6 bytes)\n     */\n    static packPaymasterV4DepositData(\n        paymaster: Address,\n        paymasterVerificationGasLimit: bigint,\n        paymasterPostOpGasLimit: bigint,\n        paymentToken: Address,\n        validUntil: bigint,\n        validAfter: bigint\n    ): Hex {\n        return concat([\n            paymaster,\n            pad(`0x${paymasterVerificationGasLimit.toString(16)}`, { dir: 'left', size: 16 }),\n            pad(`0x${paymasterPostOpGasLimit.toString(16)}`, { dir: 'left', size: 16 }),\n            paymentToken,\n            pad(`0x${validUntil.toString(16)}`, { dir: 'left', size: 6 }),\n            pad(`0x${validAfter.toString(16)}`, { dir: 'left', size: 6 })\n        ]) as Hex;\n    }\n\n    /**\n     * Computes the UserOperation hash for signing.\n     */\n    static async getUserOpHash({\n        userOp,\n        entryPoint,\n        chainId,\n        publicClient\n    }: {\n        userOp: PackedUserOperation;\n        entryPoint: Address;\n        chainId: number;\n        publicClient: PublicClient;\n    }): Promise<Hex> {\n        return await (publicClient as any).readContract({\n            address: entryPoint,\n            abi: [{\n                type: 'function',\n                name: 'getUserOpHash',\n                inputs: [{\n                    type: 'tuple',\n                    components: [\n                        { name: 'sender', type: 'address' },\n                        { name: 'nonce', type: 'uint256' },\n                        { name: 'initCode', type: 'bytes' },\n                        { name: 'callData', type: 'bytes' },\n                        { name: 'accountGasLimits', type: 'bytes32' },\n                        { name: 'preVerificationGas', type: 'uint256' },\n                        { name: 'gasFees', type: 'bytes32' },\n                        { name: 'paymasterAndData', type: 'bytes' },\n                        { name: 'signature', type: 'bytes' }\n                    ]\n                }],\n                outputs: [{ type: 'bytes32' }],\n                stateMutability: 'view'\n            }],\n            functionName: 'getUserOpHash',\n            args: [userOp]\n        }) as Hex;\n    }\n\n    /**\n     * Formats a PackedUserOperation into a JSON-RPC compatible object with hex-encoded strings.\n     */\n    static jsonifyUserOp(userOp: any): any {\n        // Strict allowlist for ERC-4337 v0.7 PackedUserOperation\n        // Alchemy rejects requests with unknown fields.\n        const result: any = {\n            sender: userOp.sender,\n            nonce: userOp.nonce,\n            initCode: userOp.initCode,\n            callData: userOp.callData,\n            accountGasLimits: userOp.accountGasLimits,\n            preVerificationGas: userOp.preVerificationGas,\n            gasFees: userOp.gasFees,\n            paymasterAndData: userOp.paymasterAndData,\n            signature: userOp.signature\n        };\n\n        // Ensure all numeric fields are hex strings and padded\n        // Helper to ensure '0x' prefix and valid hex string\n        const toCompactHex = (val: bigint | string | number) => {\n             if (typeof val === 'bigint') return `0x${val.toString(16)}`;\n             if (typeof val === 'number') return `0x${val.toString(16)}`;\n             if (typeof val === 'string') {\n                 if (val === '0x') return '0x0';\n                 if (val === '0x0') return '0x0';\n                 return val.replace(/^0x0+(?!$)/, '0x'); \n             }\n             return val;\n        };\n\n        result.nonce = toCompactHex(result.nonce);\n        result.preVerificationGas = toCompactHex(result.preVerificationGas);\n\n        return result;\n    }\n\n    /**\n     * Converts a PackedUserOperation to the Alchemy-specific v0.7 JSON format.\n     * @param userOp - The packed UserOperation\n     * @param options - Optional configuration\n     * @param options.paymasterVerificationGasLimit - Gas limit for paymaster verification (default: 200000)\n     * @param options.paymasterPostOpGasLimit - Gas limit for paymaster postOp (default: 200000)\n     */\n    static toAlchemyUserOperation(userOp: any, options?: {\n        paymasterVerificationGasLimit?: bigint;\n        paymasterPostOpGasLimit?: bigint;\n    }): any {\n        const toHexStr = (val: any) => {\n            if (val === undefined || val === null) return undefined;\n            if (typeof val === 'bigint') return `0x${val.toString(16)}`;\n            if (typeof val === 'number') return `0x${val.toString(16)}`;\n            if (typeof val === 'string' && !val.startsWith('0x')) return `0x${val}`;\n            return val;\n        };\n\n        const result: any = {\n            sender: userOp.sender,\n            nonce: toHexStr(userOp.nonce),\n            callData: userOp.callData,\n            signature: userOp.signature\n        };\n\n        // 1. Unpack accountGasLimits: [verificationGasLimit(16)][callGasLimit(16)]\n        if (userOp.accountGasLimits && userOp.accountGasLimits !== '0x') {\n            const val = userOp.accountGasLimits.toString().startsWith('0x') ? userOp.accountGasLimits.slice(2) : userOp.accountGasLimits;\n            const padded = val.padStart(64, '0');\n            const verificationGasLimit = BigInt('0x' + padded.slice(0, 32));\n            const callGasLimit = BigInt('0x' + padded.slice(32, 64));\n            \n            result.verificationGasLimit = `0x${verificationGasLimit.toString(16)}`;\n            result.callGasLimit = `0x${callGasLimit.toString(16)}`;\n        }\n\n        // 2. Unpack gasFees: [maxPriorityFee(16)][maxFee(16)]\n        if (userOp.gasFees && userOp.gasFees !== '0x') {\n             const val = userOp.gasFees.toString().startsWith('0x') ? userOp.gasFees.slice(2) : userOp.gasFees;\n             const padded = val.padStart(64, '0');\n             const maxPriorityFeePerGas = BigInt('0x' + padded.slice(0, 32));\n             const maxFeePerGas = BigInt('0x' + padded.slice(32, 64));\n             \n             result.maxPriorityFeePerGas = `0x${maxPriorityFeePerGas.toString(16)}`;\n             result.maxFeePerGas = `0x${maxFeePerGas.toString(16)}`;\n        }\n        \n        // 3. PreVerificationGas (Direct copy but ensure hex)\n        if (userOp.preVerificationGas) {\n             result.preVerificationGas = `0x${BigInt(userOp.preVerificationGas).toString(16)}`;\n        }\n\n        // 4. Unpack initCode -> factory + factoryData\n        if (userOp.initCode && userOp.initCode !== '0x') {\n            const initCode = userOp.initCode.toString();\n            result.factory = initCode.slice(0, 42); // First 20 bytes\n            result.factoryData = '0x' + initCode.slice(42);\n        }\n\n        // 5. Unpack paymasterAndData -> paymaster + gas limits + paymasterData\n        // Full format: [paymaster(20)][verificationGas(16)][postOpGas(16)][paymasterData]\n        // paymasterData = [token(20)][validUntil(6)][validAfter(6)] = 32 bytes\n        if (userOp.paymasterAndData && userOp.paymasterAndData !== '0x') {\n            const pmd = userOp.paymasterAndData.toString().startsWith('0x') ? userOp.paymasterAndData.slice(2) : userOp.paymasterAndData;\n            \n            // Check if we have full format with gas limits (at least 20+16+16 = 52 bytes = 104 hex chars)\n            if (pmd.length >= 104) {\n                // Full v0.7 packed format\n                result.paymaster = '0x' + pmd.slice(0, 40); // bytes 0-19 (20 bytes)\n                const vGas = BigInt('0x' + pmd.slice(40, 72)); // bytes 20-35 (16 bytes)\n                const pGas = BigInt('0x' + pmd.slice(72, 104)); // bytes 36-51 (16 bytes)\n                result.paymasterVerificationGasLimit = `0x${vGas.toString(16)}`;\n                result.paymasterPostOpGasLimit = `0x${pGas.toString(16)}`;\n                result.paymasterData = '0x' + pmd.slice(104); // bytes 52+ (token + timestamps)\n            } else if (pmd.length >= 40) {\n                // Fallback: assume 52-byte format without gas limits (old format)\n                result.paymaster = '0x' + pmd.slice(0, 40);\n                result.paymasterData = '0x' + pmd.slice(40);\n                const defaultGasLimit = 200000n;\n                result.paymasterVerificationGasLimit = `0x${(options?.paymasterVerificationGasLimit || defaultGasLimit).toString(16)}`;\n                result.paymasterPostOpGasLimit = `0x${(options?.paymasterPostOpGasLimit || defaultGasLimit).toString(16)}`;\n            }\n        }\n\n        return result;\n    }\n}\n","import { type Address, type Hash, type Hex, type PublicClient, parseEther, encodeFunctionData } from 'viem';\nimport { UserOperationBuilder } from './userOp.js';\nimport { EntryPointVersion } from '@aastar/core';\n\nexport enum UserOpScenarioType {\n    NATIVE = 'NATIVE',             // Plain ERC-4337, user pays ETH\n    GASLESS_V4 = 'GASLESS_V4',     // Standard PaymasterV4\n    SUPER_BPNT = 'SUPER_BPNT',     // SuperPaymaster with bPNT internal payment\n    SUPER_CPNT = 'SUPER_CPNT',     // SuperPaymaster with cPNT internal payment\n    SUPER_CUSTOM = 'SUPER_CUSTOM'  // SuperPaymaster with custom token/operator\n}\n\nexport interface ScenarioParams {\n    sender: Address;\n    ownerAccount: any; // Account object for signing\n    recipient: Address;\n    tokenAddress: Address;\n    amount: bigint;\n    entryPoint: Address;\n    chainId: number;\n    publicClient: PublicClient;\n    paymaster?: Address;           // For PM_V4 or SuperPM\n    operator?: Address;            // For SuperPM\n    paymasterGasLimit?: bigint;\n    paymasterPostOpGasLimit?: bigint;\n    nonceKey?: bigint;\n    gasToken?: Address;            // Optional: Explicit Gas Token (if different from transfer token)\n}\n\nexport class UserOpScenarioBuilder {\n    /**\n     * Builds a signed PackedUserOperation for a token transfer based on the specified scenario.\n     */\n    static async buildTransferScenario(\n        type: UserOpScenarioType,\n        params: ScenarioParams\n    ): Promise<{ userOp: any, opHash: Hash }> {\n        const { \n            sender, ownerAccount, recipient, tokenAddress, amount, \n            entryPoint, chainId, publicClient, paymaster, operator,\n            paymasterGasLimit = 100000n,\n            paymasterPostOpGasLimit = 40000n,\n            nonceKey = 0n,\n            gasToken\n        } = params;\n\n        // 1. Build Token Transfer CallData\n        const transferData = encodeFunctionData({\n            abi: [{ name: 'transfer', type: 'function', inputs: [{ type: 'address', name: 'to' }, { type: 'uint256', name: 'amount' }], outputs: [{ type: 'bool' }] }],\n            functionName: 'transfer',\n            args: [recipient, amount]\n        });\n\n        // 2. Build AA Execute CallData (Assuming SimpleAccount execute)\n        const callData = encodeFunctionData({\n            abi: [{ name: 'execute', type: 'function', inputs: [{ type: 'address' }, { type: 'uint256' }, { type: 'bytes' }] }],\n            functionName: 'execute',\n            args: [tokenAddress, 0n, transferData]\n        });\n\n        // 3. Build Base UserOperation\n        const userOp: any = {\n            sender,\n            nonce: await publicClient.readContract({\n                address: entryPoint,\n                abi: [{ name: 'getNonce', type: 'function', inputs: [{ type: 'address' }, { type: 'uint192' }], outputs: [{ type: 'uint256' }] }],\n                functionName: 'getNonce',\n                args: [sender, nonceKey]\n            }),\n            initCode: '0x' as Hex,\n            callData,\n            accountGasLimits: UserOperationBuilder.packAccountGasLimits(type === UserOpScenarioType.NATIVE ? 75000n : 250000n, 150000n),\n            preVerificationGas: 80000n,\n            gasFees: UserOperationBuilder.packGasFees(2000000000n, 2000000000n), // 2 Gwei\n            paymasterAndData: '0x' as Hex,\n            signature: '0x' as Hex\n        };\n\n        // 4. Handle Paymaster and Data (PMD)\n        if (type === UserOpScenarioType.NATIVE) {\n            userOp.paymasterAndData = '0x';\n        } else if (type === UserOpScenarioType.GASLESS_V4) {\n             const pm = paymaster;\n             const token = gasToken || tokenAddress;\n             const validUntil = BigInt(Math.floor(Date.now() / 1000) + 3600);\n             const validAfter = BigInt(Math.floor(Date.now() / 1000) - 100);\n\n             if (!pm) throw new Error('paymaster address required for GASLESS_V4');\n             if (!token) throw new Error('gasToken or tokenAddress required for GASLESS_V4');\n\n             // PaymasterV4 Deposit-Only Model: includes payment token address\n             userOp.paymasterAndData = UserOperationBuilder.packPaymasterV4DepositData(\n                pm,\n                paymasterGasLimit, // paymasterVerificationGasLimit\n                paymasterPostOpGasLimit, // paymasterPostOpGasLimit\n                token, // Payment token\n                validUntil,\n                validAfter\n             );\n        } else if (type.startsWith('SUPER_')) {\n            if (!paymaster || !operator) throw new Error('Paymaster and Operator required for SuperPM scenarios');\n            userOp.paymasterAndData = UserOperationBuilder.packPaymasterAndData(\n                paymaster,\n                paymasterGasLimit,\n                paymasterPostOpGasLimit,\n                operator\n            );\n        }\n\n        // 5. Get Hash and Sign\n        const opHash = await UserOperationBuilder.getUserOpHash({\n            userOp,\n            entryPoint,\n            chainId,\n            publicClient\n        });\n\n        const signature = await ownerAccount.signMessage({\n            message: { raw: opHash }\n        });\n        userOp.signature = signature;\n\n        // 6. JSON-RPC Hex-Encoding Compliance\n        const jsonUserOp = UserOperationBuilder.jsonifyUserOp(userOp);\n\n        return { userOp: jsonUserOp, opHash };\n    }\n}\n"]}