{"version":3,"sources":["../../src/exact/v1/facilitator/scheme.ts","../../src/exact/facilitator/utils/ZeroGasTool.ts","../../src/exact/facilitator/utils/TokenSymbolUtil.ts"],"sourcesContent":["import {\n  PaymentPayload,\n  PaymentPayloadV1,\n  PaymentRequirements,\n  SchemeNetworkFacilitator,\n  SettleResponse,\n  VerifyResponse,\n} from \"@aeon-ai-pay/core/types\";\nimport { PaymentRequirementsV1 } from \"@aeon-ai-pay/core/types/v1\";\nimport {\n  encodeFunctionData,\n  getAddress,\n  Hex,\n  isAddressEqual,\n  parseErc6492Signature,\n  parseSignature,\n} from \"viem\";\nimport { authorizationTypes, eip3009ABI } from \"../../../constants\";\nimport { FacilitatorEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { getEvmChainId } from \"../../../utils\";\nimport { verifyTransferWithAuthorizationSupport } from \"../../../contractUtils\";\nimport console from \"node:console\";\nimport { ZeroGasTool } from \"../../facilitator/utils/ZeroGasTool\";\nimport {TokenSymbolUtil} from \"../../facilitator/utils/TokenSymbolUtil\";\nconst facilitatorId=1;\n\nexport interface ExactEvmSchemeV1Config {\n  /**\n   * If enabled, the facilitator will deploy ERC-4337 smart wallets\n   * via EIP-6492 when encountering undeployed contract signatures.\n   *\n   * @default false\n   */\n  deployERC4337WithEIP6492?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkFacilitator {\n  readonly scheme = \"exact\";\n  readonly caipFamily = \"eip155:*\";\n  private readonly config: Required<ExactEvmSchemeV1Config>;\n\n  /**\n   * Creates a new ExactEvmFacilitatorV1 instance.\n   *\n   * @param signer - The EVM signer for facilitator operations\n   * @param config - Optional configuration for the facilitator\n   */\n  constructor(\n    private readonly signer: FacilitatorEvmSigner,\n    config?: ExactEvmSchemeV1Config,\n  ) {\n    this.config = {\n      deployERC4337WithEIP6492: config?.deployERC4337WithEIP6492 ?? false,\n    };\n  }\n\n  /**\n   * Get mechanism-specific extra data for the supported kinds endpoint.\n   * For EVM, no extra data is needed.\n   *\n   * @param _ - The network identifier (unused for EVM)\n   * @returns undefined (EVM has no extra data)\n   */\n  getExtra(_: string): Record<string, unknown> | undefined {\n    return undefined;\n  }\n\n  /**\n   * Get signer addresses used by this facilitator.\n   * Returns all addresses this facilitator can use for signing/settling transactions.\n   *\n   * @param _ - The network identifier (unused for EVM, addresses are network-agnostic)\n   * @returns Array of facilitator wallet addresses\n   */\n  getSigners(_: string): string[] {\n    return [...this.signer.getAddresses()];\n  }\n  /**\n   * 获取代币的精度（decimals）\n   * 通过调用ERC20合约的decimals()函数来获取代币精度\n   *\n   * @param tokenAddress - 代币合约地址\n   * @returns Promise<number> - 代币精度（通常为6或18）\n   */\n  private async getAssetDecimals(tokenAddress: string): Promise<number> {\n    try {\n      // ERC20标准的decimals()函数ABI\n      const ERC20_DECIMALS_ABI = [\n        {\n          type: \"function\",\n          name: \"decimals\",\n          inputs: [],\n          outputs: [{ name: \"\", type: \"uint8\" }],\n          stateMutability: \"view\",\n        },\n      ] as const;\n\n      // 调用合约的decimals()函数\n      const decimals = (await this.signer.readContract({\n        address: getAddress(tokenAddress) as Hex,\n        abi: ERC20_DECIMALS_ABI,\n        functionName: \"decimals\",\n        args: [],\n      })) as number;\n\n      return decimals;\n    } catch (error) {\n      // 如果调用失败，记录错误并返回默认值（USDC通常是6）\n      console.warn(\n          `[WARN] Failed to get decimals for token ${tokenAddress}, using default 6:`,\n          error instanceof Error ? error.message : String(error),\n      );\n      return 6; // 默认返回6（USDC的精度）\n    }\n  }\n  /**\n   * Verifies a payment payload (V1).\n   *\n   * @param payload - The payment payload to verify\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to verification response\n   */\n  async verify(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n  ): Promise<VerifyResponse> {\n    const requirementsV1 = requirements as unknown as PaymentRequirementsV1;\n    const payloadV1 = payload as unknown as PaymentPayloadV1;\n    const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n\n    let aeonReq: boolean = false;\n    if (payloadV1.network == null) {\n      aeonReq = true;\n      payloadV1.network = payloadV1.networkId;\n    }\n    if (requirements.asset == null) {\n      requirements.asset = requirementsV1.tokenAddress;\n    }\n    if (requirements.payTo == null) {\n      requirements.payTo = requirementsV1.payToAddress;\n    }\n    if (requirementsV1.maxAmountRequired == null) {\n      requirementsV1.maxAmountRequired = BigInt(\n        Math.round(\n          Number(requirementsV1.amountRequired) * 10 ** Number(requirementsV1.tokenDecimals),\n        ),\n      ).toString();\n    }\n    // Verify scheme matches\n    if (payloadV1.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n      return {\n        isValid: false,\n        invalidReason: \"unsupported_scheme\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    // Get chain configuration\n    const chainId = getEvmChainId(payloadV1.network);\n\n    // if (!requirements.extra?.name || !requirements.extra?.version) {\n    //   return {\n    //     isValid: false,\n    //     invalidReason: \"missing_eip712_domain\",\n    //     payer: exactEvmPayload.authorization.from,\n    //   };\n    // }\n\n    // const { name, version } = requirements.extra;\n\n    const erc20Address = getAddress(requirements.asset);\n\n    // Verify network matches\n    if (payloadV1.network !== requirements.network) {\n      return {\n        isValid: false,\n        invalidReason: \"network_mismatch\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    // Build typed data for signature verification\n    // const permitTypedData = {\n    //   types: authorizationTypes,\n    //   primaryType: \"TransferWithAuthorization\" as const,\n    //   domain: {\n    //     name,\n    //     version,\n    //     chainId,\n    //     verifyingContract: erc20Address,\n    //   },\n    //   message: {\n    //     from: exactEvmPayload.authorization.from,\n    //     to: exactEvmPayload.authorization.to,\n    //     value: BigInt(exactEvmPayload.authorization.value),\n    //     validAfter: BigInt(exactEvmPayload.authorization.validAfter),\n    //     validBefore: BigInt(exactEvmPayload.authorization.validBefore),\n    //     nonce: exactEvmPayload.authorization.nonce,\n    //   },\n    // };\n    const supportEip3009 = await verifyTransferWithAuthorizationSupport(\n      this.signer,\n      requirements.asset,\n    );\n    console.log(\"[DEBUG] tokenAddress:\", requirements.asset);\n    console.log(\"[DEBUG] supportEip3009:\", supportEip3009);\n\n    const funData = {\n      abi: [\n        {\n          name: \"tokenTransferWithAuthorization\",\n          type: \"function\",\n          inputs: [\n            { name: \"token\", type: \"address\" },\n            { name: \"from\", type: \"address\" },\n            { name: \"to\", type: \"address\" },\n            { name: \"value\", type: \"uint256\" },\n            { name: \"validAfter\", type: \"uint256\" },\n            { name: \"validBefore\", type: \"uint256\" },\n            { name: \"nonce\", type: \"bytes32\" },\n            { name: \"needApprove\", type: \"bool\" },\n            { name: \"signature\", type: \"bytes\" },\n          ],\n          outputs: [],\n          stateMutability: \"nonpayable\",\n        },\n      ],\n      functionName: \"tokenTransferWithAuthorization\",\n      args: [\n        getAddress(requirements.asset),\n        getAddress(exactEvmPayload.authorization.from),\n        getAddress(exactEvmPayload.authorization.to),\n        BigInt(exactEvmPayload.authorization.value),\n        BigInt(exactEvmPayload.authorization.validAfter),\n        BigInt(exactEvmPayload.authorization.validBefore),\n        exactEvmPayload.authorization.nonce as Hex,\n        !supportEip3009,\n        exactEvmPayload.signature as Hex,\n      ],\n    };\n    // console.log(\"funData:\",funData);\n    const data = encodeFunctionData(funData);\n    const to = \"0x555e3311a9893c9B17444C1Ff0d88192a57Ef13e\";\n\n    // Verify signature\n    try {\n      const [account] = await this.signer.getAddresses();\n      await this.signer.estimateGas({\n        account,\n        to: to as Hex,\n        data,\n      });\n      // const recoveredAddress = await this.signer.verifyTypedData({\n      //   address: exactEvmPayload.authorization.from,\n      //   ...permitTypedData,\n      //   signature: exactEvmPayload.signature!,\n      // });\n      //\n      // if (!recoveredAddress) {\n      //   return {\n      //     isValid: false,\n      //     invalidReason: \"invalid_exact_evm_payload_signature\",\n      //     payer: exactEvmPayload.authorization.from,\n      //   };\n      // }\n    } catch (error) {\n      let errorMessage = \"\";\n      if (error instanceof Error) {\n        const errorStr = error.message;\n        // Check for specific revert reasons\n        if (errorStr.includes(\"0x13be252b\")) {\n          const ERC20_ABI = [\n            {\n              type: \"function\",\n              name: \"approve\",\n              inputs: [\n                { name: \"spender\", type: \"address\" },\n                { name: \"amount\", type: \"uint256\" },\n              ],\n              outputs: [{ name: \"success\", type: \"bool\" }],\n              stateMutability: \"nonpayable\",\n            },\n            {\n              type: \"function\",\n              name: \"allowance\",\n              inputs: [\n                { name: \"owner\", type: \"address\" },\n                { name: \"spender\", type: \"address\" },\n              ],\n              outputs: [{ name: \"remaining\", type: \"uint256\" }],\n              stateMutability: \"view\",\n            },\n          ] as const;\n          const from = getAddress(exactEvmPayload.authorization.from);\n          const facilitatorAddress = getAddress(\"0x555e3311a9893c9B17444C1Ff0d88192a57Ef13e\");\n\n          // Read current allowance and auto-approve if needed\n          const currentAllowance = (await this.signer.readContract({\n            address: getAddress(requirements.asset) as Hex,\n            abi: ERC20_ABI,\n            functionName: \"allowance\",\n            args: [from, facilitatorAddress],\n          })) as bigint;\n          console.log(\"currentAllowance:\", currentAllowance);\n\n          errorMessage =\n            \"Insufficient token allowance. Please approve the facilitator contract to spend your tokens before making the payment.\";\n        } else if (errorStr.includes(\"0xccea9e6f\")) {\n          errorMessage =\n            \"Invalid operator. The caller is not authorized to perform this operation.\";\n        } else if (errorStr.includes(\"0xdf8e4372\")) {\n          errorMessage =\n            \"Authorization not yet valid. The payment authorization is not yet active.\";\n        } else if (errorStr.includes(\"0x0f05f5bf\")) {\n          errorMessage = \"Authorization expired. The payment authorization has expired.\";\n        } else if (errorStr.includes(\"0x1f6d5aef\")) {\n          errorMessage = \"Nonce already used. This authorization has already been used.\";\n        } else if (errorStr.includes(\"0x8baa579f\")) {\n          errorMessage = \"Invalid signature. The payment authorization signature is invalid.\";\n        } else {\n          errorMessage = \"Failed to estimate gas: \" + errorStr;\n        }\n        return {\n          isValid: false,\n          invalidReason: errorMessage,\n          type: \"payload\",\n          payer: exactEvmPayload.authorization.from,\n        };\n      }\n      // Signature verification failed - could be an undeployed smart wallet\n      // Check if smart wallet is deployed\n      const signature = exactEvmPayload.signature!;\n      const signatureLength = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n      const isSmartWallet = signatureLength > 130; // 65 bytes = 130 hex chars for EOA\n\n      if (isSmartWallet) {\n        const payerAddress = exactEvmPayload.authorization.from;\n        const bytecode = await this.signer.getCode({ address: payerAddress });\n\n        if (!bytecode || bytecode === \"0x\") {\n          // Wallet is not deployed. Check if it's EIP-6492 with deployment info.\n          // EIP-6492 signatures contain factory address and calldata needed for deployment.\n          // Non-EIP-6492 undeployed wallets cannot succeed (no way to deploy them).\n          const erc6492Data = parseErc6492Signature(signature);\n          const hasDeploymentInfo =\n            erc6492Data.address &&\n            erc6492Data.data &&\n            !isAddressEqual(erc6492Data.address, \"0x0000000000000000000000000000000000000000\");\n\n          if (!hasDeploymentInfo) {\n            // Non-EIP-6492 undeployed smart wallet - will always fail at settlement\n            // since EIP-3009 requires on-chain EIP-1271 validation\n            return {\n              isValid: false,\n              type: \"payload\",\n              invalidReason: \"invalid_exact_evm_payload_undeployed_smart_wallet\",\n              payer: payerAddress,\n            };\n          }\n          // EIP-6492 signature with deployment info - allow through\n          // Facilitators with sponsored deployment support can handle this in settle()\n        } else {\n          // Wallet is deployed but signature still failed - invalid signature\n          return {\n            isValid: false,\n            type: \"payload\",\n            invalidReason: \"invalid_exact_evm_payload_signature\",\n            payer: exactEvmPayload.authorization.from,\n          };\n        }\n      } else {\n        // EOA signature failed\n        return {\n          isValid: false,\n          type: \"payload\",\n          invalidReason: \"invalid_exact_evm_payload_signature\",\n          payer: exactEvmPayload.authorization.from,\n        };\n      }\n    }\n\n    // Verify payment recipient matches\n    if (getAddress(exactEvmPayload.authorization.to) !== getAddress(requirements.payTo)) {\n      return {\n        isValid: false,\n        type: \"payload\",\n        invalidReason: \"invalid_exact_evm_payload_recipient_mismatch\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    // Verify validBefore is in the future (with 6 second buffer for block time)\n    const now = Math.floor(Date.now() / 1000);\n    if (BigInt(exactEvmPayload.authorization.validBefore) < BigInt(now + 6)) {\n      return {\n        isValid: false,\n        type: \"payload\",\n        invalidReason: \"invalid_exact_evm_payload_authorization_valid_before\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    // Verify validAfter is not in the future\n    if (BigInt(exactEvmPayload.authorization.validAfter) > BigInt(now)) {\n      return {\n        isValid: false,\n        type: \"payload\",\n        invalidReason: \"invalid_exact_evm_payload_authorization_valid_after\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    // Check balance\n    try {\n      const balance = (await this.signer.readContract({\n        address: erc20Address,\n        abi: eip3009ABI,\n        functionName: \"balanceOf\",\n        args: [exactEvmPayload.authorization.from],\n      })) as bigint;\n\n      if (BigInt(balance) < BigInt(requirementsV1.maxAmountRequired)) {\n        return {\n          isValid: false,\n          type: \"payload\",\n          invalidReason: \"insufficient_funds\",\n          payer: exactEvmPayload.authorization.from,\n        };\n      }\n    } catch {\n      // If we can't check balance, continue with other validations\n    }\n\n    // Verify amount is sufficient\n    if (BigInt(exactEvmPayload.authorization.value) < BigInt(requirementsV1.maxAmountRequired)) {\n      return {\n        isValid: false,\n        type: \"payload\",\n        invalidReason: \"invalid_exact_evm_payload_authorization_value\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    // if (aeonReq) {\n    //   return {\n    //     isValid: true,\n    //     type: \"payload\",\n    //     payer: exactEvmPayload.authorization.from,\n    //   };\n    // }\n\n    return {\n      isValid: true,\n      type: \"payload\",\n      invalidReason: undefined,\n      payer: exactEvmPayload.authorization.from,\n    };\n  }\n\n  /**\n   * Settles a payment by executing the transfer (V1).\n   *\n   * @param payload - The payment payload to settle\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to settlement response\n   */\n  async settle(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n  ): Promise<SettleResponse> {\n    const payloadV1 = payload as unknown as PaymentPayloadV1;\n    const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n\n    if (payloadV1.network == null) {\n      payloadV1.network = payloadV1.networkId;\n    }\n    // if (requirements.asset == null) {\n    //   requirements.asset = requirementsV1.tokenAddress;\n    // }\n    // if (requirements.payTo == null) {\n    //   requirements.payTo = requirementsV1.payToAddress;\n    // }\n    // if (requirementsV1.maxAmountRequired == null) {\n    //   requirementsV1.maxAmountRequired = (BigInt(Math.round(Number(requirementsV1.amountRequired) * (10 ** Number(requirementsV1.tokenDecimals))))).toString();\n    // }\n\n    // Re-verify before settling\n    const valid = await this.verify(payload, requirements);\n    if (!valid.isValid) {\n      return {\n        success: false,\n        network: payloadV1.network,\n        transaction: \"\",\n        errorReason: valid.invalidReason ?? \"invalid_scheme\",\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n    let tx;\n    try {\n      // Parse ERC-6492 signature if applicable\n      const parseResult = parseErc6492Signature(exactEvmPayload.signature!);\n      const { signature, address: factoryAddress, data: factoryCalldata } = parseResult;\n\n      // Deploy ERC-4337 smart wallet via EIP-6492 if configured and needed\n      if (\n        this.config.deployERC4337WithEIP6492 &&\n        factoryAddress &&\n        factoryCalldata &&\n        !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n      ) {\n        // Check if smart wallet is already deployed\n        const payerAddress = exactEvmPayload.authorization.from;\n        const bytecode = await this.signer.getCode({ address: payerAddress });\n\n        if (!bytecode || bytecode === \"0x\") {\n          // Wallet not deployed - attempt deployment\n          try {\n            console.log(`Deploying ERC-4337 smart wallet for ${payerAddress} via EIP-6492`);\n\n            // Send the factory calldata directly as a transaction\n            // The factoryCalldata already contains the complete encoded function call\n            const deployTx = await this.signer.sendTransaction({\n              to: factoryAddress as Hex,\n              data: factoryCalldata as Hex,\n            });\n\n            // Wait for deployment transaction\n            await this.signer.waitForTransactionReceipt({ hash: deployTx });\n            console.log(`Successfully deployed smart wallet for ${payerAddress}`);\n          } catch (deployError) {\n            console.error(\"Smart wallet deployment failed:\", deployError);\n            // Deployment failed - cannot proceed\n            throw deployError;\n          }\n        } else {\n          console.log(`Smart wallet for ${payerAddress} already deployed, skipping deployment`);\n        }\n      }\n\n      // Determine if this is an ECDSA signature (EOA) or smart wallet signature\n      // ECDSA signatures are exactly 65 bytes (130 hex chars without 0x)\n      const signatureLength = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n      const isECDSA = signatureLength === 130;\n\n      // let tx: Hex;\n      // if (isECDSA) {\n      //   // For EOA wallets, parse signature into v, r, s and use that overload\n      //   const parsedSig = parseSignature(signature);\n      //\n      //   tx = await this.signer.writeContract({\n      //     address: getAddress(requirements.asset),\n      //     abi: eip3009ABI,\n      //     functionName: \"transferWithAuthorization\",\n      //     args: [\n      //       getAddress(exactEvmPayload.authorization.from),\n      //       getAddress(exactEvmPayload.authorization.to),\n      //       BigInt(exactEvmPayload.authorization.value),\n      //       BigInt(exactEvmPayload.authorization.validAfter),\n      //       BigInt(exactEvmPayload.authorization.validBefore),\n      //       exactEvmPayload.authorization.nonce,\n      //       (parsedSig.v as number | undefined) || parsedSig.yParity,\n      //       parsedSig.r,\n      //       parsedSig.s,\n      //     ],\n      //   });\n      // } else {\n      //   // For smart wallets, use the bytes signature overload\n      //   // The signature contains WebAuthn/P256 or other ERC-1271 compatible signature data\n      //   tx = await this.signer.writeContract({\n      //     address: getAddress(requirements.asset),\n      //     abi: eip3009ABI,\n      //     functionName: \"transferWithAuthorization\",\n      //     args: [\n      //       getAddress(exactEvmPayload.authorization.from),\n      //       getAddress(exactEvmPayload.authorization.to),\n      //       BigInt(exactEvmPayload.authorization.value),\n      //       BigInt(exactEvmPayload.authorization.validAfter),\n      //       BigInt(exactEvmPayload.authorization.validBefore),\n      //       exactEvmPayload.authorization.nonce,\n      //       signature,\n      //     ],\n      //   });\n      // }\n\n      const supportEip3009 = await verifyTransferWithAuthorizationSupport(\n        this.signer,\n        requirements.asset,\n      );\n\n      const funData = {\n        abi: [\n          {\n            name: \"tokenTransferWithAuthorization\",\n            type: \"function\",\n            inputs: [\n              { name: \"token\", type: \"address\" },\n              { name: \"from\", type: \"address\" },\n              { name: \"to\", type: \"address\" },\n              { name: \"value\", type: \"uint256\" },\n              { name: \"validAfter\", type: \"uint256\" },\n              { name: \"validBefore\", type: \"uint256\" },\n              { name: \"nonce\", type: \"bytes32\" },\n              { name: \"needApprove\", type: \"bool\" },\n              { name: \"signature\", type: \"bytes\" },\n            ],\n            outputs: [],\n            stateMutability: \"nonpayable\",\n          },\n        ],\n        functionName: \"tokenTransferWithAuthorization\",\n        args: [\n          getAddress(requirements.asset),\n          getAddress(exactEvmPayload.authorization.from),\n          getAddress(exactEvmPayload.authorization.to),\n          BigInt(exactEvmPayload.authorization.value),\n          BigInt(exactEvmPayload.authorization.validAfter),\n          BigInt(exactEvmPayload.authorization.validBefore),\n          exactEvmPayload.authorization.nonce as Hex,\n          !supportEip3009,\n          exactEvmPayload.signature as Hex,\n        ],\n      };\n\n\n      const resource=new Map(Object.entries(JSON.parse(JSON.stringify(requirements)))).get(\"resource\");\n      const payToAddress = getAddress(exactEvmPayload.authorization.to);\n      const tokenAddress = getAddress(requirements.asset);\n      const tokenDecimals = await this.getAssetDecimals(requirements.asset);\n      const amountRequired = Number(requirements.amount);\n      const value = Number(exactEvmPayload.authorization.value);\n      const tokenSymbol = TokenSymbolUtil.getTokenSymbolByAddress(requirements.asset);\n\n      let next = true;\n      if (parseInt(requirements.network.split(\":\")[1]) == 56 || requirements.networkId === \"56\") {\n        console.log(\"使用 ZeroGasTool 代付\");\n        try {\n          // 创建 ZeroGasTool 实例\n          const tool = new ZeroGasTool();\n          const validateResult = await tool.validateGaslessWithdraw2(funData);\n\n          if (validateResult && validateResult.isValid) {\n            // 执行交易\n            tx = (await tool.executeGaslessWithdraw(validateResult.txConfig)) as `0x${string}`;\n            // 等待交易确认\n            const receipt = await this.signer.waitForTransactionReceipt({\n              hash: tx as Hex,\n            });\n\n            if (receipt.status === \"success\") {\n              console.log(\"使用 ZeroGasTool 代付成功\");\n              next = false;\n            } else {\n              // 如果校验结果不支持赞助，继续执行原有的普通交易流程\n              next = false;\n            }\n          }\n        } catch (zeroGasError) {\n          // 如果 ZeroGasTool 处理失败，静默失败并使用原有的普通交易流程\n          // 不抛出错误，确保不影响原有逻辑\n          console.warn(\n            \"[ZEROGAS] Error or not applicable, using original transaction flow:\",\n            zeroGasError instanceof Error ? zeroGasError.message : String(zeroGasError),\n          );\n        }\n      }\n\n      if (next) {\n        const data = encodeFunctionData(funData);\n        const to = \"0x555e3311a9893c9B17444C1Ff0d88192a57Ef13e\";\n        // Send settlement transaction (must assign tx hash for receipt waiting)\n        tx = await this.signer.sendTransaction({\n          to: to as Hex,\n          data,\n        });\n\n        // Wait for  transaction to be confirmed\n        const approvalReceipt = await this.signer.waitForTransactionReceipt({\n          hash: tx,\n        });\n\n        if (approvalReceipt.status !== \"success\") {\n          return {\n            success: false,\n            errorReason: \"invalid_transaction_state\",\n            transaction: tx,\n            network: payloadV1.network,\n            payer: exactEvmPayload.authorization.from,\n          };\n        }\n      }\n\n      // Wait for transaction confirmation\n      if (!tx) {\n        throw new Error(\"Settlement transaction was not created (missing tx hash)\");\n      }\n\n      // const resource = payload.resource.url;\n\n      console.log(\"resource:\", resource);\n      const txHash=tx;\n      const sendData = {\n        facilitatorId,\n        ...exactEvmPayload.authorization,\n        ...requirements,\n        payToAddress,\n        tokenAddress,\n        resource,\n        tokenDecimals,\n        txHash,\n        amountRequired,\n        value,\n        tokenSymbol,\n        time: new Date().toISOString(),\n      };\n      // Post settlement log asynchronously (fire and forget)\n      postSettleLog(sendData).catch(logErr => {\n        console.error(\"[ERROR] Settlement log failed:\", logErr);\n      });\n      return {\n        success: true,\n        transaction: tx,\n        network: payloadV1.network,\n        payer: exactEvmPayload.authorization.from,\n      };\n    } catch (error) {\n      console.error(\"Failed to settle transaction:\", error);\n      return {\n        success: false,\n        errorReason: \"transaction_failed\",\n        transaction: \"\",\n        network: payloadV1.network,\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n  }\n}\n\nasync function postSettleLog(dataToSend: any) {\n  try {\n    console.log(\"[DEBUG] Posting settlement log...\");\n    const resp = await fetch(\"https://x402-scan-api.aeon.xyz/api/scan/manager/createTransaction\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(dataToSend),\n    });\n    console.log(\"[DEBUG] Settlement log posted body:\", JSON.stringify(dataToSend));\n    if (!resp.ok) {\n      throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);\n    }\n\n    const logResp = await resp.text();\n    console.log(\"[DEBUG] Settlement log posted successfully:\", logResp);\n    return logResp;\n  } catch (logErr) {\n    console.error(\"[ERROR] Failed to post settlement log:\", logErr);\n    throw logErr; // Re-throw so the caller's .catch() can handle it\n  }\n}\n","import { ethers } from \"ethers\";\nimport { PaymasterClient } from \"megafuel-js-sdk\";\n\n/**\n * Gasless 提现工具类\n * 拆分验证和执行步骤，支持独立调用\n */\nexport class ZeroGasTool {\n  private sponsorUrl: string;\n  private policyUUID: string;\n  private evmPrivateKey: string;\n  private tokenContractAddress: string;\n  private wallet: ethers.Wallet;\n  private paymasterClient: PaymasterClient;\n  private pendingNonce: number | null = null; // 记录待执行的 nonce\n\n  /**\n   *\n   */\n  constructor() {\n    // 初始化配置\n    this.sponsorUrl =\n      \"https://open-platform-ap.nodereal.io/*******/megafuel/56\";\n    this.policyUUID = \"**************\";\n    this.evmPrivateKey = process.env.EVM_PRIVATE_KEY as string;\n    this.tokenContractAddress = \"0x555e3311a9893c9b17444c1ff0d88192a57ef13e\";\n\n    // 初始化钱包和Paymaster客户端\n    this.wallet = new ethers.Wallet(this.evmPrivateKey);\n    this.paymasterClient = PaymasterClient.newPrivatePaymaster(this.sponsorUrl, this.policyUUID);\n  }\n\n  /**\n   * 获取最新的 nonce，始终从链上获取\n   *\n   * @param usePending - 是否包含待处理的交易，默认为 true\n   */\n  private async getLatestNonce(usePending: boolean = true): Promise<number> {\n    const status = usePending ? \"pending\" : \"latest\";\n    const currentNonce = await this.paymasterClient.getTransactionCount(\n      this.wallet.address,\n      status,\n    );\n    console.log(`📊 获取链上最新 nonce (${status}): ${currentNonce}`);\n    return currentNonce;\n  }\n\n  /**\n   * 重置待执行的 nonce（验证失败时调用）\n   */\n  private resetPendingNonce(): void {\n    this.pendingNonce = null;\n    console.log(`🔄 重置待执行的 nonce`);\n  }\n\n  /**\n   * 设置待执行的 nonce\n   *\n   * @param nonce\n   */\n  private setPendingNonce(nonce: number): void {\n    this.pendingNonce = nonce;\n    console.log(`📌 设置待执行的 nonce: ${nonce}`);\n  }\n\n  /**\n   * 第一步：验证交易是否可赞助（独立对外方法）\n   *\n   * @param funData - 函数调用数据\n   * @param gasLimit - Gas限制\n   * @returns 可赞助信息\n   */\n  async validateGaslessWithdraw2(funData: any, gasLimit: number = 150000): Promise<any> {\n    try {\n      // 参数验证\n      if (!funData) throw new Error(\"funData参数不能为空\");\n      if (!funData.abi) throw new Error(\"ABI不能为空\");\n      if (!funData.functionName) throw new Error(\"functionName不能为空\");\n      if (!funData.args) throw new Error(\"args不能为空\");\n\n      // 获取网络信息\n      const network = await this.paymasterClient.getNetwork();\n\n      // 构建合约实例\n      const tokenContract = new ethers.Contract(\n        this.tokenContractAddress,\n        funData.abi,\n        this.wallet,\n      );\n\n      // 构建交易对象 - 直接使用 funData.args，因为它已经包含了正确的参数顺序\n      const transaction = await tokenContract[funData.functionName].populateTransaction(\n        ...funData.args,\n      );\n\n      // 获取最新的 nonce（仅用于验证，执行时会重新获取）\n      const nonce = await this.getLatestNonce();\n      // 记录验证时的 nonce（用于调试，执行时会重新获取）\n      this.setPendingNonce(nonce);\n\n      // 交易配置\n      const txConfig = {\n        ...transaction,\n        from: this.wallet.address,\n        nonce,\n        gasLimit,\n        chainId: network.chainId,\n        gasPrice: 0,\n      };\n\n      // 安全格式用于验证\n      const safeTransaction = {\n        ...txConfig,\n        gasLimit: txConfig.gasLimit.toString(),\n        chainId: txConfig.chainId.toString(),\n        gasPrice: txConfig.gasPrice.toString(),\n      };\n\n      // 核心验证：检查是否可赞助\n      console.log(\"🔍 验证交易可赞助性...\");\n      const sponsorableInfo = await this.paymasterClient.isSponsorable(safeTransaction);\n\n      // 使用动态 JSON 方式获取属性值，避免 TypeScript 类型限制\n      const sponsorableData = JSON.parse(JSON.stringify(sponsorableInfo || {}));\n      console.log(\"📊 validateGaslessWithdraw2 - sponsorableInfo:\", sponsorableData);\n      console.log(\"📊 validateGaslessWithdraw2 - 属性列表:\", Object.keys(sponsorableData));\n\n      // 尝试两种属性名\n      const isSponsorable = sponsorableData.sponsorable || sponsorableData.Sponsorable;\n      console.log(\"📊 validateGaslessWithdraw2 - 是否可赞助:\", isSponsorable);\n\n      if (!isSponsorable) {\n        // 验证失败，重置 nonce\n        this.resetPendingNonce();\n        throw new Error(\"交易不可被赞助\");\n      }\n\n      console.log(\"✅ 交易验证通过，可执行\");\n      return {\n        isValid: true,\n        sponsorableInfo,\n        txConfig, // 返回交易配置供执行步骤使用\n        nonce,\n      };\n    } catch (error) {\n      console.error(\"❌ 验证失败:\", error);\n      // 验证失败时重置 nonce\n      this.resetPendingNonce();\n      return {\n        isValid: false,\n        error: (error as Error).message,\n      };\n    }\n  }\n\n  /**\n   * 第二步：执行提现交易（独立对外方法）\n   *\n   * @param txConfig - 验证步骤返回的交易配置\n   * @param maxRetries - 最大重试次数，默认为 5\n   * @returns 交易哈希\n   */\n  async executeGaslessWithdraw(txConfig: any, maxRetries: number = 5): Promise<string> {\n    if (!txConfig) throw new Error(\"交易配置不能为空\");\n\n    let lastError: Error | null = null;\n    let lastUsedNonce: number | null = null;\n\n    // 重试机制：处理 nonce 冲突\n    for (let attempt = 0; attempt <= maxRetries; attempt++) {\n      try {\n        // 每次重试都获取最新的 nonce，避免使用已使用的 nonce\n        const latestNonce = await this.getLatestNonce(true);\n\n        // 如果是重试，说明之前的 nonce 可能已被使用\n        if (attempt > 0) {\n          console.log(`🔄 重试第 ${attempt} 次，获取最新 nonce: ${latestNonce}`);\n          if (lastUsedNonce !== null) {\n            console.log(`📊 上次使用的 nonce: ${lastUsedNonce}, 当前链上 nonce: ${latestNonce}`);\n          }\n        } else {\n          console.log(`📊 执行交易，使用 nonce: ${latestNonce}`);\n        }\n\n        const updatedTxConfig = {\n          ...txConfig,\n          nonce: latestNonce,\n        };\n        console.log(`✍️ 签名交易... (使用 nonce: ${latestNonce})`);\n        const signedTx = await this.wallet.signTransaction(updatedTxConfig);\n\n        // 发送交易\n        console.log(\"📤 发送交易...\");\n        const txHash = await this.paymasterClient.sendRawTransaction(signedTx);\n\n        // 交易发送成功后，重置待执行的 nonce\n        this.resetPendingNonce();\n\n        console.log(`🎉 交易发送成功: ${txHash}`);\n        return txHash;\n      } catch (error) {\n        lastError = error as Error;\n        const errorMessage = lastError.message.toLowerCase();\n\n        // 检查是否是 nonce 相关的错误\n        const isNonceTooLow =\n          errorMessage.includes(\"nonce too low\") ||\n          errorMessage.includes(\"nonce is too low\") ||\n          errorMessage.includes(\"nonce too small\");\n        const isNonceTooHigh =\n          errorMessage.includes(\"nonce too high\") ||\n          errorMessage.includes(\"nonce is too high\") ||\n          errorMessage.includes(\"nonce too large\");\n        const isNonceUsed =\n          errorMessage.includes(\"already been used\") || errorMessage.includes(\"nonce already used\");\n        const isNonceError =\n          isNonceTooLow || isNonceTooHigh || isNonceUsed || errorMessage.includes(\"nonce\");\n\n        if (isNonceError && attempt < maxRetries) {\n          // 记录当前使用的 nonce\n          const currentNonce = await this.getLatestNonce(true);\n          lastUsedNonce = currentNonce;\n\n          if (isNonceTooLow) {\n            // nonce too low: 说明链上的 nonce 已经增加了，需要等待并重新获取\n            console.log(\n              `⚠️ Nonce too low (当前: ${currentNonce})，等待链状态更新后重试... (${attempt + 1}/${maxRetries})`,\n            );\n            // 等待更长时间，让链状态更新\n            await new Promise(resolve => setTimeout(resolve, 2000 * (attempt + 1)));\n          } else if (isNonceTooHigh) {\n            // nonce too high: 说明跳过了某些 nonce，需要获取最新的 nonce\n            console.log(\n              `⚠️ Nonce too high (当前: ${currentNonce})，立即获取最新 nonce 重试... (${attempt + 1}/${maxRetries})`,\n            );\n            // 获取 latest 状态的 nonce（不包含 pending）\n            const latestNonce = await this.getLatestNonce(false);\n            console.log(`📊 Latest nonce (不包含 pending): ${latestNonce}`);\n            // 短暂等待后重试\n            await new Promise(resolve => setTimeout(resolve, 1000));\n          } else if (isNonceUsed) {\n            // nonce 已被使用: 需要等待并获取新的 nonce\n            console.log(`⚠️ Nonce 已被使用，等待后重试... (${attempt + 1}/${maxRetries})`);\n            await new Promise(resolve => setTimeout(resolve, 1500 * (attempt + 1)));\n          } else {\n            // 其他 nonce 错误\n            console.log(`⚠️ Nonce 错误，等待后重试... (${attempt + 1}/${maxRetries})`);\n            await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)));\n          }\n          continue;\n        } else {\n          // 如果不是 nonce 错误，或者已达到最大重试次数，抛出错误\n          console.error(`❌ 执行交易失败 (尝试 ${attempt + 1}/${maxRetries + 1}):`, lastError);\n          this.resetPendingNonce();\n          throw lastError;\n        }\n      }\n    }\n\n    // 如果所有重试都失败\n    this.resetPendingNonce();\n    throw lastError || new Error(\"执行交易失败：未知错误\");\n  }\n}\n\n","/**\n * 代币工具类：简化版 - getTokenSymbolByAddress 仅需传入合约地址（自动匹配多链）\n */\nexport class TokenSymbolUtil {\n    // 核心映射表：链ID -> 合约地址(小写) -> { symbol: 代币符号, name: 代币全称 }\n    private static readonly TOKEN_MAPPING: Record<string, Record<string, { symbol: string; name: string }>> = {\n        \"56\": {\n            \"0x55d398326f99059ff775485246999027b3197955\": { symbol: \"USDT\", name: \"Tether USD\" },\n            \"0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d\": { symbol: \"USDC\", name: \"USD Coin\" },\n            \"0x6e3bcf81d331fa7bd79ac2642486c70beae2600e\": { symbol: \"TESTU\", name: \"Test USDT\" }\n        },\n        \"2366\": {\n            \"0x7aB6f3ed87C42eF0aDb67Ed95090f8bF5240149e\": { symbol: \"USDC\", name: \"Bridged USDC (Kite AI)\" },\n        },\n        \"97\": {\n            \"0xA0f09D908279ddd28B5370c2b0612d1A10ee87cA\": { symbol: \"TESTU\", name: \"TESTU\" },\n        },\n        \"8453\": {\n            \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", name: \"USD Coin\" },\n            \"0xfde4c96c8593536e31f229ea8f37b2ada2699bb2\": { symbol: \"USDT\", name: \"Tether USD\" }\n        },\n        \"196\": {\n            \"0x779ded0c9e1022225f8e0630b35a9b54be713736\": { symbol: \"USDT\", name: \"Tether USD\" },\n            \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", name: \"USD Coin\" }\n        }\n    };\n\n    // 缓存：合约地址(小写) -> 代币符号（全局缓存，跨链）\n    private static readonly CACHE = new Map<string, string>();\n\n    /**\n     * 简化版核心方法：仅传入合约地址，自动匹配所有链的代币符号\n     * @param tokenAddress 代币合约地址（大小写不敏感）\n     * @returns 代币符号（如\"USDC\"/\"USDT\"），未匹配返回空字符串\n     */\n    public static getTokenSymbolByAddress(tokenAddress: string): string {\n        // 1. 参数标准化（空值/格式校验）\n        const normalizedAddress = tokenAddress?.trim().toLowerCase() || \"\";\n        if (!normalizedAddress || !normalizedAddress.startsWith(\"0x\")) {\n            return \"\";\n        }\n\n        // 2. 优先查缓存\n        if (this.CACHE.has(normalizedAddress)) {\n            return this.CACHE.get(normalizedAddress)!;\n        }\n\n        // 3. 遍历所有链，匹配地址\n        let tokenSymbol = \"\";\n        for (const chainId of Object.keys(this.TOKEN_MAPPING)) {\n            const chainMapping = this.TOKEN_MAPPING[chainId];\n            if (chainMapping[normalizedAddress]) {\n                tokenSymbol = chainMapping[normalizedAddress].symbol;\n                break; // 找到第一个匹配项即可（若地址跨链重复，取第一个匹配的）\n            }\n        }\n\n        // 4. 缓存结果（即使未匹配也缓存，避免重复遍历）\n        this.CACHE.set(normalizedAddress, tokenSymbol);\n\n        return tokenSymbol;\n    }\n\n    /**\n     * 简化版：仅传入合约地址，获取代币全称\n     * @param tokenAddress 合约地址\n     * @returns 代币全称，未匹配返回空字符串\n     */\n    public static getTokenNameByAddress(tokenAddress: string): string {\n        const normalizedAddress = tokenAddress?.trim().toLowerCase() || \"\";\n        if (!normalizedAddress || !normalizedAddress.startsWith(\"0x\")) {\n            return \"\";\n        }\n\n        // 遍历所有链匹配\n        for (const chainId of Object.keys(this.TOKEN_MAPPING)) {\n            const chainMapping = this.TOKEN_MAPPING[chainId];\n            if (chainMapping[normalizedAddress]) {\n                return chainMapping[normalizedAddress].name;\n            }\n        }\n        return \"\";\n    }\n\n    /**\n     * 扩展映射表（支持单地址多链，或新增地址）\n     * @param chainId 链ID\n     * @param tokenAddress 合约地址\n     * @param symbol 代币符号\n     * @param name 代币全称\n     */\n    public static extendTokenMapping(\n        chainId: number | string,\n        tokenAddress: string,\n        symbol: string,\n        name: string\n    ): void {\n        const normalizedChainId = String(chainId).trim();\n        const normalizedAddress = tokenAddress.trim().toLowerCase();\n        const normalizedSymbol = symbol.trim().toUpperCase();\n        const normalizedName = name.trim();\n\n        if (!normalizedChainId || !normalizedAddress || !normalizedSymbol || !normalizedName) return;\n\n        // 初始化链映射\n        if (!this.TOKEN_MAPPING[normalizedChainId]) {\n            this.TOKEN_MAPPING[normalizedChainId] = {};\n        }\n        this.TOKEN_MAPPING[normalizedChainId][normalizedAddress] = {\n            symbol: normalizedSymbol,\n            name: normalizedName\n        };\n\n        // 清空该地址的缓存\n        this.CACHE.delete(normalizedAddress);\n    }\n\n    /**\n     * 清空缓存\n     */\n    public static clearCache(): void {\n        this.CACHE.clear();\n    }\n}\n"],"mappings":"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","names":["console","console"]}