@aastar/sdk 0.20.1 → 0.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dapp.js +279 -3
- package/dist/dapp.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-6JCYPTSH.js +0 -281
- package/dist/chunk-6JCYPTSH.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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":["encodeAbiParameters","encodeFunctionData","concat","pad","keccak256","RequirementChecker","SimpleAccountFactoryABI","formatEther","createClient","publicActions","walletActions","stringToBytes","zeroAddress","erc20Abi","privateKeyToAccount","parseAbiParameters","UserOpScenarioType"],"mappings":"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","file":"index.js","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 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 const usedAddresses = { ...CORE_ADDRESSES, ...TOKEN_ADDRESSES, ...TEST_ACCOUNT_ADDRESSES, ...addresses };\n console.log(' SDK Debug: simpleAccountFactory from usedAddresses:', (usedAddresses as any).simpleAccountFactory);\n console.log(' SDK Debug: process.env.SIMPLE_ACCOUNT_FACTORY:', process.env.SIMPLE_ACCOUNT_FACTORY);\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} 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 const usedAddresses = { ...CORE_ADDRESSES, ...TEST_TOKEN_ADDRESSES, ...TEST_ACCOUNT_ADDRESSES, ...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} 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 const usedAddresses = { ...CORE_ADDRESSES, ...TEST_TOKEN_ADDRESSES, ...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} 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 const usedAddresses = { ...CORE_ADDRESSES, ...TOKEN_ADDRESSES, ...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"]}
|
|
1
|
+
{"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":["encodeAbiParameters","encodeFunctionData","concat","pad","keccak256","RequirementChecker","SimpleAccountFactoryABI","formatEther","createClient","publicActions","walletActions","stringToBytes","zeroAddress","erc20Abi","privateKeyToAccount","parseAbiParameters","UserOpScenarioType"],"mappings":"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","file":"index.js","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 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 const usedAddresses = { ...CORE_ADDRESSES, ...TOKEN_ADDRESSES, ...TEST_ACCOUNT_ADDRESSES, ...addresses };\n console.log(' SDK Debug: simpleAccountFactory from usedAddresses:', (usedAddresses as any).simpleAccountFactory);\n console.log(' SDK Debug: process.env.SIMPLE_ACCOUNT_FACTORY:', process.env.SIMPLE_ACCOUNT_FACTORY);\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} 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 const usedAddresses = { ...CORE_ADDRESSES, ...TEST_TOKEN_ADDRESSES, ...TEST_ACCOUNT_ADDRESSES, ...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} 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 const usedAddresses = { ...CORE_ADDRESSES, ...TEST_TOKEN_ADDRESSES, ...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} 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 const usedAddresses = { ...CORE_ADDRESSES, ...TOKEN_ADDRESSES, ...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"]}
|