{"version":3,"sources":["../../src/client/BatchEvmScheme.ts","../../src/constants.ts","../../src/detection.ts","../../src/hooks.ts","../../src/client/CompositeEvmScheme.ts","../../src/client/register.ts","../../src/client/GatewayClient.ts"],"sourcesContent":["import type { Address, Hex } from 'viem';\nimport { getAddress } from 'viem';\nimport {\n  CIRCLE_BATCHING_NAME,\n  CIRCLE_BATCHING_VERSION,\n  CIRCLE_BATCHING_SCHEME,\n  GATEWAY_AUTH_VALIDITY_WINDOW_SECONDS,\n} from '../constants';\nimport { supportsBatching, getVerifyingContract } from '../detection';\nimport type { BatchEvmSigner, BatchPayload } from '../types';\nimport {\n  warnHookFailure,\n  type BeforePaymentCreationHook,\n  type AfterPaymentCreationHook,\n  type OnPaymentCreationFailureHook,\n  type OnPaymentResponseHook,\n  type PaymentCreationContext,\n  type PaymentCreatedContext,\n  type PaymentCreationFailureContext,\n  type PaymentResponseContext,\n  type HookPaymentRequired,\n  type HookPaymentRequirements,\n  type HookPaymentPayload,\n} from '../hooks';\n\n/**\n * EIP-712 types for TransferWithAuthorization.\n */\nconst authorizationTypes: Record<string, Array<{ name: string; type: string }>> = {\n  TransferWithAuthorization: [\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  ],\n};\n\n/**\n * Generate a random 32-byte nonce for EIP-3009.\n */\nfunction createNonce(): Hex {\n  const bytes = new Uint8Array(32);\n  crypto.getRandomValues(bytes);\n  return `0x${Array.from(bytes)\n    .map((b) => b.toString(16).padStart(2, '0'))\n    .join('')}` as Hex;\n}\n\n/**\n * PaymentRequirements interface (minimal subset needed).\n */\ninterface PaymentRequirements {\n  scheme: string;\n  network: string;\n  asset: string;\n  amount: string;\n  payTo: string;\n  maxTimeoutSeconds: number;\n  extra?: Record<string, unknown>;\n}\n\n/**\n * PaymentPayload interface (minimal subset needed).\n */\ninterface PaymentPayload {\n  x402Version: number;\n  payload: BatchPayload;\n}\n\n/**\n * SchemeNetworkClient interface from @x402/core.\n */\ninterface SchemeNetworkClient {\n  readonly scheme: string;\n  createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>>;\n}\n\n/**\n * Circle Batching EVM Scheme Client.\n *\n * A SchemeNetworkClient implementation for Circle Gateway batched payments.\n * Signs EIP-3009 TransferWithAuthorization against the GatewayWallet contract\n * (from `extra.verifyingContract`) instead of the USDC token contract.\n *\n * Lifecycle hooks (`onBeforePaymentCreation`, `onAfterPaymentCreation`,\n * `onPaymentCreationFailure`, `onPaymentResponse`) mirror the standard SDK's\n * `x402Client` semantics — see https://docs.x402.org/advanced-concepts/lifecycle-hooks.\n *\n * Hooks fire inside `createPaymentPayload` so that this scheme can be used\n * standalone (without `x402Client`). When wrapped by an `x402Client`, register\n * hooks at that level instead — running them in both places would double-fire.\n *\n * @example\n * ```typescript\n * import { BatchEvmScheme } from \"@circle-fin/x402-batching/client\";\n *\n * const scheme = new BatchEvmScheme(evmSigner)\n *   .onBeforePaymentCreation(async (ctx) => {\n *     if (BigInt(ctx.selectedRequirements.amount) > 10_000_000n) {\n *       return { abort: true, reason: \"Payment exceeds spending limit\" };\n *     }\n *   })\n *   .onAfterPaymentCreation(async (ctx) => {\n *     console.log(\"Signed payment\", ctx.paymentPayload);\n *   });\n * ```\n */\nexport class BatchEvmScheme implements SchemeNetworkClient {\n  readonly scheme = CIRCLE_BATCHING_SCHEME;\n\n  private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n  private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n  private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n  private paymentResponseHooks: OnPaymentResponseHook[] = [];\n\n  /**\n   * Creates a new BatchEvmScheme.\n   *\n   * @param signer - The EVM signer for signing payment authorizations\n   */\n  constructor(private readonly signer: BatchEvmSigner) {}\n\n  /**\n   * Register a hook that runs before payment payload creation. Returning\n   * `{ abort: true, reason }` causes `createPaymentPayload` to throw\n   * `Error(\"Payment creation aborted: <reason>\")`.\n   */\n  onBeforePaymentCreation(hook: BeforePaymentCreationHook): this {\n    this.beforePaymentCreationHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook that runs after a successful payment payload creation.\n   */\n  onAfterPaymentCreation(hook: AfterPaymentCreationHook): this {\n    this.afterPaymentCreationHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook that runs when payload creation throws. Return\n   * `{ recovered: true, payload }` to swallow the error and use the\n   * provided payload as the result instead.\n   */\n  onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): this {\n    this.onPaymentCreationFailureHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook that runs after the buyer's paid HTTP request completes.\n   * Hooks fire when {@link dispatchPaymentResponse} is called by the\n   * transport. Return `{ recovered: true }` to instruct the transport to\n   * retry with a fresh payload.\n   */\n  onPaymentResponse(hook: OnPaymentResponseHook): this {\n    this.paymentResponseHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Fire all registered `onPaymentResponse` hooks in order. Returns\n   * `{ recovered: true }` if any hook signals recovery (first wins).\n   *\n   * Transport wrappers should call this after the paid HTTP request settles\n   * — see `x402HTTPClient.processPaymentResult` in the standard SDK.\n   */\n  async dispatchPaymentResponse(\n    context: PaymentResponseContext,\n  ): Promise<{ recovered: true } | undefined> {\n    for (const [index, hook] of this.paymentResponseHooks.entries()) {\n      try {\n        const result = await hook(context);\n        if (result && 'recovered' in result && result.recovered) {\n          return { recovered: true };\n        }\n      } catch (err) {\n        warnHookFailure(\n          'BatchEvmScheme',\n          'onPaymentResponse',\n          `manual hook #${index}`,\n          err,\n        );\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Creates a payment payload for Circle batching.\n   *\n   * @param x402Version - The x402 protocol version\n   * @param paymentRequirements - The payment requirements (must be a Circle batching option)\n   * @returns Promise resolving to the payment payload\n   * @throws Error if requirements are not a Circle batching option\n   */\n  async createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>> {\n    // Build the hook context once.\n    const context: PaymentCreationContext = {\n      paymentRequired: this.synthesizePaymentRequired(x402Version, paymentRequirements),\n      selectedRequirements: paymentRequirements as HookPaymentRequirements,\n    };\n\n    // beforePaymentCreation: any hook may abort.\n    for (const hook of this.beforePaymentCreationHooks) {\n      const result = await hook(context);\n      if (result && 'abort' in result && result.abort) {\n        throw new Error(`Payment creation aborted: ${result.reason}`);\n      }\n    }\n\n    try {\n      // Validate this is a Circle batching option\n      if (!supportsBatching(paymentRequirements)) {\n        throw new Error(\n          `BatchEvmScheme can only handle Circle batching options. ` +\n            `Expected extra.name=\"${CIRCLE_BATCHING_NAME}\" and extra.version=\"${CIRCLE_BATCHING_VERSION}\"`,\n        );\n      }\n\n      const verifyingContract = getVerifyingContract(paymentRequirements);\n      if (!verifyingContract) {\n        throw new Error(\n          'Circle batching option missing extra.verifyingContract (GatewayWallet address)',\n        );\n      }\n\n      const nonce = createNonce();\n      const now = Math.floor(Date.now() / 1000);\n      const validityWindowSeconds = Math.max(\n        paymentRequirements.maxTimeoutSeconds,\n        GATEWAY_AUTH_VALIDITY_WINDOW_SECONDS,\n      );\n\n      const authorization: BatchPayload['authorization'] = {\n        from: this.signer.address,\n        to: getAddress(paymentRequirements.payTo) as Address,\n        value: paymentRequirements.amount,\n        validAfter: (now - 600).toString(), // 10 minutes before\n        // Clamp seller-published timeouts so the signed authorization is always\n        // valid long enough for Gateway batching.\n        validBefore: (now + validityWindowSeconds).toString(),\n        nonce,\n      };\n\n      // Sign against GatewayWallet contract (not USDC)\n      const signature = await this.signAuthorization(\n        authorization,\n        paymentRequirements,\n        verifyingContract,\n      );\n\n      const payload: BatchPayload = {\n        authorization,\n        signature,\n      };\n\n      const partial = {\n        x402Version,\n        payload,\n      };\n\n      // afterPaymentCreation: synthesize a \"wrapped\" PaymentPayload to match\n      // the shape the standard SDK passes to its hooks.\n      const created: HookPaymentPayload = {\n        x402Version,\n        payload: payload as unknown as Record<string, unknown>,\n      };\n      const createdContext: PaymentCreatedContext = {\n        ...context,\n        paymentPayload: created,\n      };\n      for (const [index, hook] of this.afterPaymentCreationHooks.entries()) {\n        try {\n          await hook(createdContext);\n        } catch (err) {\n          warnHookFailure(\n            'BatchEvmScheme',\n            'afterPaymentCreation',\n            `manual hook #${index}`,\n            err,\n          );\n        }\n      }\n\n      return partial;\n    } catch (error) {\n      const failureContext: PaymentCreationFailureContext = {\n        ...context,\n        error: error as Error,\n      };\n      for (const hook of this.onPaymentCreationFailureHooks) {\n        const result = await hook(failureContext);\n        if (result && 'recovered' in result && result.recovered) {\n          return {\n            x402Version: result.payload.x402Version,\n            payload: result.payload.payload as unknown as BatchPayload,\n          };\n        }\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Sign the EIP-3009 authorization using EIP-712.\n   * Uses the GatewayWallet contract as verifyingContract instead of USDC.\n   */\n  private async signAuthorization(\n    authorization: BatchPayload['authorization'],\n    requirements: PaymentRequirements,\n    verifyingContract: string,\n  ): Promise<Hex> {\n    if (!requirements.network.startsWith('eip155:')) {\n      throw new Error(\n        `BatchEvmScheme: unsupported network format \"${requirements.network}\". Expected \"eip155:<chainId>\"`,\n      );\n    }\n    const chainId = parseInt(requirements.network.split(':')[1]);\n\n    const domain = {\n      name: CIRCLE_BATCHING_NAME,\n      version: CIRCLE_BATCHING_VERSION,\n      chainId,\n      verifyingContract: getAddress(verifyingContract) as Address,\n    };\n\n    const message = {\n      from: getAddress(authorization.from),\n      to: getAddress(authorization.to),\n      value: BigInt(authorization.value),\n      validAfter: BigInt(authorization.validAfter),\n      validBefore: BigInt(authorization.validBefore),\n      nonce: authorization.nonce,\n    };\n\n    return await this.signer.signTypedData({\n      domain,\n      types: authorizationTypes,\n      primaryType: 'TransferWithAuthorization',\n      message,\n    });\n  }\n\n  /**\n   * When `createPaymentPayload` is called directly (not through an x402Client),\n   * we don't have a real PaymentRequired response. Synthesize a minimal one\n   * so the hook context still carries the standard SDK's shape.\n   */\n  private synthesizePaymentRequired(\n    x402Version: number,\n    requirements: PaymentRequirements,\n  ): HookPaymentRequired {\n    return {\n      x402Version,\n      accepts: [requirements as HookPaymentRequirements],\n    };\n  }\n}\n","/**\n * EIP-712 domain name for Circle Gateway batched payments.\n * Used in the `extra.name` field of PaymentRequirements to identify Circle batching options.\n */\nexport const CIRCLE_BATCHING_NAME = 'GatewayWalletBatched';\n\n/**\n * EIP-712 domain version for Circle Gateway batched payments.\n * Used in the `extra.version` field of PaymentRequirements.\n */\nexport const CIRCLE_BATCHING_VERSION = '1';\n\n/**\n * The payment scheme used for Circle batching (same as standard x402 exact scheme).\n */\nexport const CIRCLE_BATCHING_SCHEME = 'exact';\n\n/**\n * Minimum authorization validity window required by Gateway batching.\n */\nexport const GATEWAY_MIN_AUTH_VALIDITY_SECONDS = 7 * 24 * 60 * 60;\n\n/**\n * Extra validity window so authorizations still satisfy Gateway's minimum\n * after client/server clock differences and request latency.\n */\nexport const GATEWAY_AUTH_VALIDITY_BUFFER_SECONDS = 100;\n\n/**\n * Authorization validity window the SDK should publish and sign with.\n */\nexport const GATEWAY_AUTH_VALIDITY_WINDOW_SECONDS =\n  GATEWAY_MIN_AUTH_VALIDITY_SECONDS + GATEWAY_AUTH_VALIDITY_BUFFER_SECONDS;\n","import { CIRCLE_BATCHING_NAME, CIRCLE_BATCHING_VERSION } from './constants';\n\n/**\n * PaymentRequirements-like structure for detection.\n * We only need the `extra` field to detect batching options.\n */\ninterface PaymentRequirementsLike {\n  extra?: Record<string, unknown>;\n}\n\n/**\n * Check if a PaymentRequirements object supports batched settlement.\n *\n * Batching options are identified by:\n * - `extra.name === \"GatewayWalletBatched\"`\n * - `extra.version === \"1\"`\n *\n * @param requirements - The payment requirements to check\n * @returns true if this supports batched settlement\n *\n * @example\n * ```typescript\n * import { supportsBatching } from \"@circle-fin/x402-batching\";\n *\n * if (supportsBatching(paymentRequirements)) {\n *   // This option uses batched settlement (gas-free for users!)\n * }\n * ```\n */\nexport function supportsBatching(requirements: PaymentRequirementsLike): boolean {\n  const extra = requirements.extra;\n  if (!extra) {\n    return false;\n  }\n\n  return extra.name === CIRCLE_BATCHING_NAME && extra.version === CIRCLE_BATCHING_VERSION;\n}\n\n/**\n * Check if a PaymentRequirements object is a batched payment.\n *\n * This is an alias for `supportsBatching`, intended for server-side/facilitator use.\n * Use this to route payments to the appropriate handler.\n *\n * @param requirements - The payment requirements to check\n * @returns true if this is a batched payment\n *\n * @example\n * ```typescript\n * import { isBatchPayment, BatchFacilitatorClient } from \"@circle-fin/x402-batching/server\";\n *\n * const gateway = new BatchFacilitatorClient();\n *\n * // In your facilitator's verify/settle handler:\n * if (isBatchPayment(requirements)) {\n *   return gateway.verify(payload, requirements);\n * }\n * // else: handle with existing on-chain logic\n * ```\n */\nexport const isBatchPayment = supportsBatching;\n\n/**\n * Get the verifyingContract address from batching requirements.\n *\n * @param requirements - The payment requirements\n * @returns The batch wallet contract address, or undefined if not a batching option\n */\nexport function getVerifyingContract(\n  requirements: PaymentRequirementsLike,\n): string | undefined {\n  if (!supportsBatching(requirements)) {\n    return undefined;\n  }\n\n  const verifyingContract = requirements.extra?.verifyingContract;\n  if (typeof verifyingContract === 'string') {\n    return verifyingContract;\n  }\n\n  return undefined;\n}\n","/**\n * Lifecycle hook types for the Circle Gateway batching SDK.\n *\n * These mirror the lifecycle hooks defined in the standard `@x402/core` SDK.\n * See https://docs.x402.org/advanced-concepts/lifecycle-hooks for the full\n * reference. The semantics implemented here match that documentation: hooks\n * receive a read-only context, drive control flow via `abort` / `skip` /\n * `recovered` return values, and a thrown hook is logged but does not break\n * the surrounding payment flow (the next hook still runs).\n */\n\n/**\n * Minimal `PaymentPayload` shape (subset used by hook contexts).\n */\nexport interface HookPaymentPayload {\n  x402Version: number;\n  payload: Record<string, unknown>;\n  resource?: { url: string; description: string; mimeType: string };\n  accepted?: Record<string, unknown>;\n  extensions?: Record<string, unknown>;\n}\n\n/**\n * Minimal `PaymentRequirements` shape (subset used by hook contexts).\n */\nexport interface HookPaymentRequirements {\n  scheme: string;\n  network: string;\n  asset: string;\n  amount: string;\n  payTo: string;\n  maxTimeoutSeconds: number;\n  extra?: Record<string, unknown>;\n}\n\n/**\n * Minimal `VerifyResponse` shape (subset used by hook contexts).\n */\nexport interface HookVerifyResponse {\n  isValid: boolean;\n  invalidReason?: string;\n  payer?: string;\n}\n\n/**\n * Minimal `SettleResponse` shape (subset used by hook contexts).\n */\nexport interface HookSettleResponse {\n  success: boolean;\n  errorReason?: string;\n  payer?: string;\n  transaction: string;\n  network: string;\n}\n\n// ============================================================================\n// Verify / Settle hook contexts (resource server + facilitator)\n// ============================================================================\n\nexport interface VerifyContext {\n  paymentPayload: HookPaymentPayload;\n  requirements: HookPaymentRequirements;\n}\n\nexport interface VerifyResultContext extends VerifyContext {\n  result: HookVerifyResponse;\n}\n\nexport interface VerifyFailureContext extends VerifyContext {\n  error: Error;\n}\n\nexport interface SettleContext {\n  paymentPayload: HookPaymentPayload;\n  requirements: HookPaymentRequirements;\n}\n\nexport interface SettleResultContext extends SettleContext {\n  result: HookSettleResponse;\n}\n\nexport interface SettleFailureContext extends SettleContext {\n  error: Error;\n}\n\n/**\n * Reason a verified payment never reached settlement. `handler_threw` matches\n * the standard SDK's reason for \"the protected handler errored\".\n */\nexport type VerifiedPaymentCancellationReason = 'handler_threw' | 'handler_failed';\n\nexport interface VerifiedPaymentCanceledContext extends SettleContext {\n  reason: VerifiedPaymentCancellationReason;\n  error?: unknown;\n  responseStatus?: number;\n}\n\n// ============================================================================\n// Verify / Settle hook signatures (resource server flavor)\n// ============================================================================\n\nexport type BeforeVerifyHook = (\n  context: VerifyContext,\n) => Promise<\n  | void\n  | { abort: true; reason: string; message?: string }\n  | { skip: true; result: HookVerifyResponse }\n>;\n\nexport type AfterVerifyHook = (context: VerifyResultContext) => Promise<void | {\n  skipHandler: true;\n  response?: { contentType?: string; body?: unknown };\n}>;\n\nexport type OnVerifyFailureHook = (\n  context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: HookVerifyResponse }>;\n\nexport type BeforeSettleHook = (\n  context: SettleContext,\n) => Promise<\n  | void\n  | { abort: true; reason: string; message?: string }\n  | { skip: true; result: HookSettleResponse }\n>;\n\nexport type AfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type OnSettleFailureHook = (\n  context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: HookSettleResponse }>;\n\nexport type OnVerifiedPaymentCanceledHook = (\n  context: VerifiedPaymentCanceledContext,\n) => Promise<void>;\n\n// ============================================================================\n// Facilitator hook signatures\n// (mirror x402Facilitator: no skip/skipHandler/cancellation, no `message`)\n// ============================================================================\n\nexport type FacilitatorBeforeVerifyHook = (\n  context: VerifyContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterVerifyHook = (context: VerifyResultContext) => Promise<void>;\n\nexport type FacilitatorOnVerifyFailureHook = (\n  context: VerifyFailureContext,\n) => Promise<void | { recovered: true; result: HookVerifyResponse }>;\n\nexport type FacilitatorBeforeSettleHook = (\n  context: SettleContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterSettleHook = (context: SettleResultContext) => Promise<void>;\n\nexport type FacilitatorOnSettleFailureHook = (\n  context: SettleFailureContext,\n) => Promise<void | { recovered: true; result: HookSettleResponse }>;\n\n// ============================================================================\n// HTTP resource-server hook (`onProtectedRequest`)\n// ============================================================================\n\n/**\n * Minimal HTTP request descriptor passed to `onProtectedRequest`. Mirrors the\n * shape standard x402 uses, but reduced to the bits the gateway middleware\n * actually has access to.\n */\nexport interface ProtectedRequestContext {\n  /** The HTTP method (uppercase, e.g. \"GET\"). */\n  method: string;\n  /** The request path (no query string). */\n  path: string;\n  /** Full URL as advertised in the 402 response (may equal `path`). */\n  url: string;\n  /**\n   * Case-insensitive header lookup. Returns `undefined` for unknown headers.\n   */\n  getHeader(name: string): string | undefined;\n}\n\nexport interface ProtectedRouteConfig {\n  /** Price string passed to `gateway.require(...)`. */\n  price: string;\n}\n\nexport type ProtectedRequestHook = (\n  context: ProtectedRequestContext,\n  routeConfig: ProtectedRouteConfig,\n) => Promise<void | { grantAccess: true } | { abort: true; reason: string }>;\n\n// ============================================================================\n// Client (payment payload creation) hook contexts and signatures\n// ============================================================================\n\n/**\n * Minimal `PaymentRequired` shape passed to client hook contexts.\n */\nexport interface HookPaymentRequired {\n  x402Version: number;\n  resource?: { url: string; description: string; mimeType: string };\n  accepts: HookPaymentRequirements[];\n  extensions?: Record<string, unknown>;\n  error?: string;\n}\n\nexport interface PaymentCreationContext {\n  paymentRequired: HookPaymentRequired;\n  selectedRequirements: HookPaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n  paymentPayload: HookPaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n  error: Error;\n}\n\nexport interface PaymentResponseContext {\n  paymentPayload: HookPaymentPayload;\n  requirements: HookPaymentRequirements;\n  settleResponse?: HookSettleResponse;\n  paymentRequired?: HookPaymentRequired;\n  error?: Error;\n}\n\nexport type BeforePaymentCreationHook = (\n  context: PaymentCreationContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type AfterPaymentCreationHook = (context: PaymentCreatedContext) => Promise<void>;\n\nexport type OnPaymentCreationFailureHook = (\n  context: PaymentCreationFailureContext,\n) => Promise<void | { recovered: true; payload: HookPaymentPayload }>;\n\nexport type OnPaymentResponseHook = (\n  context: PaymentResponseContext,\n) => Promise<void | { recovered: true }>;\n\n// ============================================================================\n// Internal helpers (shared between facilitator / middleware / scheme)\n// ============================================================================\n\n/**\n * Logs a warning when a hook throws. Mirrors the standard SDK's\n * `warnResourceServerHookFailure` log line so log-grepping continues to work.\n */\nexport function warnHookFailure(\n  component: string,\n  phase: string,\n  label: string,\n  error: unknown,\n): void {\n  const detail = error instanceof Error ? error.message : String(error);\n  console.warn(`[x402] ${component} ${phase} hook threw (${label}): ${detail}`);\n}\n","import { CIRCLE_BATCHING_SCHEME } from '../constants';\nimport { supportsBatching } from '../detection';\nimport type { BatchEvmScheme } from './BatchEvmScheme';\n\n/**\n * PaymentRequirements interface (minimal subset needed).\n */\ninterface PaymentRequirements {\n  scheme: string;\n  network: string;\n  asset: string;\n  amount: string;\n  payTo: string;\n  maxTimeoutSeconds: number;\n  extra?: Record<string, unknown>;\n}\n\n/**\n * PaymentPayload interface (minimal subset needed).\n */\ninterface PaymentPayload {\n  x402Version: number;\n  payload: unknown;\n}\n\n/**\n * SchemeNetworkClient interface from @x402/core.\n */\ninterface SchemeNetworkClient {\n  readonly scheme: string;\n  createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>>;\n}\n\n/**\n * Composite EVM Scheme that dispatches between BatchEvmScheme and a fallback.\n *\n * When both BatchEvmScheme and ExactEvmScheme register for the same `scheme`\n * (\"exact\") on the same network wildcard (\"eip155:*\"), x402Client uses\n * first-registered-wins. This means one scheme always shadows the other.\n *\n * CompositeEvmScheme solves this by registering once and dispatching at\n * runtime: if the payment requirements include batching metadata\n * (`supportsBatching()`), it delegates to BatchEvmScheme; otherwise it\n * delegates to the fallback (typically ExactEvmScheme).\n *\n * @example\n * ```typescript\n * import { CompositeEvmScheme, BatchEvmScheme } from \"@circle-fin/x402-batching/client\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n *\n * const composite = new CompositeEvmScheme(\n *   new BatchEvmScheme(signer),\n *   new ExactEvmScheme(signer),\n * );\n * client.register(\"eip155:*\", composite);\n * ```\n */\nexport class CompositeEvmScheme implements SchemeNetworkClient {\n  readonly scheme = CIRCLE_BATCHING_SCHEME;\n\n  constructor(\n    private readonly batchScheme: BatchEvmScheme,\n    private readonly fallbackScheme: SchemeNetworkClient,\n  ) {\n    if (fallbackScheme.scheme !== CIRCLE_BATCHING_SCHEME) {\n      throw new Error(\n        `CompositeEvmScheme: fallbackScheme.scheme must be \"${CIRCLE_BATCHING_SCHEME}\", ` +\n          `got \"${fallbackScheme.scheme}\"`,\n      );\n    }\n  }\n\n  async createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>> {\n    if (supportsBatching(paymentRequirements)) {\n      return this.batchScheme.createPaymentPayload(x402Version, paymentRequirements);\n    }\n    return this.fallbackScheme.createPaymentPayload(x402Version, paymentRequirements);\n  }\n}\n","import { BatchEvmScheme } from './BatchEvmScheme';\nimport { CompositeEvmScheme } from './CompositeEvmScheme';\nimport type { BatchEvmSigner } from '../types';\n\n/**\n * x402Client-like interface (minimal subset needed for registration).\n */\ninterface X402ClientLike {\n  register(network: string, client: { readonly scheme: string }): unknown;\n}\n\n/**\n * SchemeNetworkClient-like interface (minimal subset for fallback).\n */\ninterface SchemeNetworkClientLike {\n  readonly scheme: string;\n  createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: {\n      scheme: string;\n      network: string;\n      asset: string;\n      amount: string;\n      payTo: string;\n      maxTimeoutSeconds: number;\n      extra?: Record<string, unknown>;\n    },\n  ): Promise<{ x402Version: number; payload: unknown }>;\n}\n\n/**\n * Configuration for registering batch scheme.\n */\nexport interface RegisterBatchSchemeConfig {\n  /** The EVM signer for signing payment authorizations */\n  signer: BatchEvmSigner;\n  /** Networks to register for (default: all EVM networks via wildcard) */\n  networks?: string[];\n  /**\n   * Optional fallback SchemeNetworkClient for non-batching \"exact\" payments.\n   *\n   * When provided, a CompositeEvmScheme is registered that dispatches to\n   * BatchEvmScheme for Gateway payments and to the fallback for standard\n   * on-chain payments. This avoids the scheme collision where x402Client's\n   * first-registered-wins policy causes one scheme to shadow the other.\n   *\n   * @example\n   * ```typescript\n   * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n   *\n   * registerBatchScheme(client, {\n   *   signer: evmSigner,\n   *   fallbackScheme: new ExactEvmScheme(evmSigner),\n   * });\n   * ```\n   */\n  fallbackScheme?: SchemeNetworkClientLike;\n}\n\n/**\n * Register batch scheme with an x402Client.\n *\n * This registers a BatchEvmScheme that can handle payment requirements\n * with `extra.name === \"GatewayWalletBatched\"`. The scheme signs EIP-3009\n * authorizations against the batch wallet contract instead of USDC.\n *\n * When `fallbackScheme` is provided, a CompositeEvmScheme is registered\n * instead, which handles both batch and standard payments in a single\n * registration — no need to separately register ExactEvmScheme.\n *\n * @param client - The x402Client to register with\n * @param config - Configuration including the EVM signer\n * @returns The registered scheme instance\n *\n * @example\n * ```typescript\n * import { x402Client } from \"@x402/core/client\";\n * import { registerBatchScheme } from \"@circle-fin/x402-batching/client\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n *\n * // Handles both batch and standard EVM payments:\n * registerBatchScheme(client, {\n *   signer: account,\n *   fallbackScheme: new ExactEvmScheme(account),\n * });\n * ```\n */\nexport function registerBatchScheme(\n  client: X402ClientLike,\n  config: RegisterBatchSchemeConfig & { fallbackScheme: SchemeNetworkClientLike },\n): CompositeEvmScheme;\nexport function registerBatchScheme(\n  client: X402ClientLike,\n  config: Omit<RegisterBatchSchemeConfig, 'fallbackScheme'>,\n): BatchEvmScheme;\nexport function registerBatchScheme(\n  client: X402ClientLike,\n  config: RegisterBatchSchemeConfig,\n): BatchEvmScheme | CompositeEvmScheme;\nexport function registerBatchScheme(\n  client: X402ClientLike,\n  config: RegisterBatchSchemeConfig,\n): BatchEvmScheme | CompositeEvmScheme {\n  const batchScheme = new BatchEvmScheme(config.signer);\n\n  const schemeToRegister = config.fallbackScheme\n    ? new CompositeEvmScheme(batchScheme, config.fallbackScheme)\n    : batchScheme;\n\n  // Register for specified networks or use wildcard for all EVM networks\n  const networks = config.networks ?? ['eip155:*'];\n  for (const network of networks) {\n    client.register(network, schemeToRegister);\n  }\n\n  return schemeToRegister;\n}\n","import {\n  createPublicClient,\n  createWalletClient,\n  http,\n  parseUnits,\n  formatUnits,\n  pad,\n  zeroAddress,\n  maxUint256,\n  type Address,\n  type Hex,\n  type Chain,\n  type PublicClient,\n  type WalletClient,\n  type Transport,\n  type Account,\n  defineChain,\n  erc20Abi,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport * as chains from 'viem/chains';\nimport { randomBytes } from 'crypto';\nimport { BatchEvmScheme } from './BatchEvmScheme';\nimport type { BatchEvmSigner } from '../types';\nimport type {\n  BeforePaymentCreationHook,\n  AfterPaymentCreationHook,\n  OnPaymentCreationFailureHook,\n  OnPaymentResponseHook,\n  PaymentResponseContext,\n} from '../hooks';\n\n// Arc chains: prefer viem's chain export (added in viem ~2.52), fall back to a\n// local definition for consumers pinned to older viem versions. viem's `arc`\n// export still ships an empty RPC list, so CHAIN_CONFIGS.arc.rpcUrl (and this\n// fallback) supply Circle's public mainnet RPC.\nconst ARC_MAINNET_RPC_URL = 'https://rpc.mainnet.arc.io';\n\nconst arcMainnet =\n  (chains as Record<string, Chain>).arc ??\n  defineChain({\n    id: 5042,\n    name: 'Arc',\n    nativeCurrency: { decimals: 18, name: 'USDC', symbol: 'USDC' },\n    rpcUrls: {\n      default: { http: [ARC_MAINNET_RPC_URL] },\n    },\n  });\n\nconst arcTestnetChain =\n  chains.arcTestnet ??\n  defineChain({\n    id: 5042002,\n    name: 'Arc Testnet',\n    nativeCurrency: { decimals: 18, name: 'USDC', symbol: 'USDC' },\n    rpcUrls: {\n      default: { http: ['https://rpc.testnet.arc.network'] },\n    },\n    testnet: true,\n  });\n\n// viem's sonicTestnet uses the old testnet.  This uses the new one.\nconst sonicTestnet = defineChain({\n  id: 14601,\n  name: 'Sonic Testnet',\n  nativeCurrency: { decimals: 18, name: 'Sonic', symbol: 'S' },\n  rpcUrls: {\n    default: { http: ['https://rpc.testnet.soniclabs.com'] },\n  },\n  blockExplorers: {\n    default: { name: 'Sonic Testnet Explorer', url: 'https://testnet.soniclabs.com/' },\n  },\n  testnet: true,\n});\n\n// ============================================================================\n// CONTRACT ABIS\n// ============================================================================\n\n// Gateway API URL\nconst GATEWAY_API_TESTNET = 'https://gateway-api-testnet.circle.com/v1';\nconst GATEWAY_API_MAINNET = 'https://gateway-api.circle.com/v1';\n\nconst GATEWAY_MINTER_ABI = [\n  {\n    name: 'gatewayMint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'attestationPayload', type: 'bytes' },\n      { name: 'signature', type: 'bytes' },\n    ],\n    outputs: [],\n  },\n] as const;\n\nconst GATEWAY_WALLET_ABI = [\n  {\n    name: 'deposit',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'value', type: 'uint256' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'depositFor',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'depositor', type: 'address' },\n      { name: 'value', type: 'uint256' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'totalBalance',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'depositor', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'availableBalance',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'depositor', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'withdrawingBalance',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'depositor', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'withdrawableBalance',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'depositor', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'withdrawalDelay',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'withdrawalBlock',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'depositor', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n  },\n  {\n    name: 'initiateWithdrawal',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'token', type: 'address' },\n      { name: 'value', type: 'uint256' },\n    ],\n    outputs: [],\n  },\n  {\n    name: 'withdraw',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ name: 'token', type: 'address' }],\n    outputs: [],\n  },\n] as const;\n\n// ============================================================================\n// CHAIN CONFIGURATIONS\n// ============================================================================\n\n/**\n * Gateway domain identifiers for supported chains.\n * See: https://developers.circle.com/gateway/gateway-supported-blockchains\n */\nexport const GATEWAY_DOMAINS = {\n  // Testnet\n  arbitrumSepolia: 3,\n  arcTestnet: 26,\n  avalancheFuji: 1,\n  baseSepolia: 6,\n  sepolia: 0,\n  hyperEvmTestnet: 19,\n  optimismSepolia: 2,\n  polygonAmoy: 7,\n  seiAtlantic: 16,\n  sonicTestnet: 13,\n  unichainSepolia: 10,\n  worldChainSepolia: 14,\n  // Mainnet\n  arbitrum: 3,\n  avalanche: 1,\n  base: 6,\n  ethereum: 0,\n  hyperEvm: 19,\n  optimism: 2,\n  polygon: 7,\n  sei: 16,\n  sonic: 13,\n  unichain: 10,\n  worldChain: 14,\n  arc: 26,\n} as const;\n\n/**\n * Supported chain names type.\n */\nexport type SupportedChainName = keyof typeof GATEWAY_DOMAINS;\n\n/**\n * Chain configuration with contract addresses.\n */\nexport interface ChainConfig {\n  chain: Chain;\n  domain: number;\n  usdc: Address;\n  gatewayWallet: Address;\n  gatewayMinter: Address;\n  rpcUrl?: string;\n}\n\n// Testnet GatewayWallet and GatewayMinter addresses (same across all testnet chains)\nconst TESTNET_GATEWAY_WALLET = '0x0077777d7EBA4688BDeF3E311b846F25870A19B9' as Address;\nconst TESTNET_GATEWAY_MINTER = '0x0022222ABE238Cc2C7Bb1f21003F0a260052475B' as Address;\n\n// Mainnet GatewayWallet and GatewayMinter addresses (same across all mainnet chains)\nconst MAINNET_GATEWAY_WALLET = '0x77777777Dcc4d5A8B6E418Fd04D8997ef11000eE' as Address;\nconst MAINNET_GATEWAY_MINTER = '0x2222222d7164433c4C09B0b0D809a9b52C04C205' as Address;\n\n/**\n * Chain configurations for supported chains.\n */\nexport const CHAIN_CONFIGS: Record<SupportedChainName, ChainConfig> = {\n  // Testnet chains\n  arbitrumSepolia: {\n    chain: chains.arbitrumSepolia,\n    domain: GATEWAY_DOMAINS.arbitrumSepolia,\n    usdc: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  arcTestnet: {\n    chain: arcTestnetChain,\n    domain: GATEWAY_DOMAINS.arcTestnet,\n    usdc: '0x3600000000000000000000000000000000000000' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n    rpcUrl: 'https://rpc.testnet.arc.network',\n  },\n  avalancheFuji: {\n    chain: chains.avalancheFuji,\n    domain: GATEWAY_DOMAINS.avalancheFuji,\n    usdc: '0x5425890298aed601595a70AB815c96711a31Bc65' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  baseSepolia: {\n    chain: chains.baseSepolia,\n    domain: GATEWAY_DOMAINS.baseSepolia,\n    usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n    rpcUrl: 'https://sepolia-preconf.base.org',\n  },\n  sepolia: {\n    chain: chains.sepolia,\n    domain: GATEWAY_DOMAINS.sepolia,\n    usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  hyperEvmTestnet: {\n    chain: chains.hyperliquidEvmTestnet,\n    domain: GATEWAY_DOMAINS.hyperEvmTestnet,\n    usdc: '0x2B3370eE501B4a559b57D449569354196457D8Ab' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  optimismSepolia: {\n    chain: chains.optimismSepolia,\n    domain: GATEWAY_DOMAINS.optimismSepolia,\n    usdc: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  polygonAmoy: {\n    chain: chains.polygonAmoy,\n    domain: GATEWAY_DOMAINS.polygonAmoy,\n    usdc: '0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  seiAtlantic: {\n    chain: chains.seiTestnet,\n    domain: GATEWAY_DOMAINS.seiAtlantic,\n    usdc: '0x4fCF1784B31630811181f670Aea7A7bEF803eaED' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  sonicTestnet: {\n    chain: sonicTestnet,\n    domain: GATEWAY_DOMAINS.sonicTestnet,\n    usdc: '0x0BA304580ee7c9a980CF72e55f5Ed2E9fd30Bc51' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  unichainSepolia: {\n    chain: chains.unichainSepolia,\n    domain: GATEWAY_DOMAINS.unichainSepolia,\n    usdc: '0x31d0220469e10c4E71834a79b1f276d740d3768F' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  worldChainSepolia: {\n    chain: chains.worldchainSepolia,\n    domain: GATEWAY_DOMAINS.worldChainSepolia,\n    usdc: '0x66145f38cBAC35Ca6F1Dfb4914dF98F1614aeA88' as Address,\n    gatewayWallet: TESTNET_GATEWAY_WALLET,\n    gatewayMinter: TESTNET_GATEWAY_MINTER,\n  },\n  // Mainnet chains\n  arbitrum: {\n    chain: chains.arbitrum,\n    domain: GATEWAY_DOMAINS.arbitrum,\n    usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  avalanche: {\n    chain: chains.avalanche,\n    domain: GATEWAY_DOMAINS.avalanche,\n    usdc: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  base: {\n    chain: chains.base,\n    domain: GATEWAY_DOMAINS.base,\n    usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  ethereum: {\n    chain: chains.mainnet,\n    domain: GATEWAY_DOMAINS.ethereum,\n    usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n    rpcUrl: 'https://ethereum-rpc.publicnode.com',\n  },\n  hyperEvm: {\n    chain: chains.hyperEvm,\n    domain: GATEWAY_DOMAINS.hyperEvm,\n    usdc: '0xb88339CB7199b77E23DB6E890353E22632Ba630f' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  optimism: {\n    chain: chains.optimism,\n    domain: GATEWAY_DOMAINS.optimism,\n    usdc: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  polygon: {\n    chain: chains.polygon,\n    domain: GATEWAY_DOMAINS.polygon,\n    usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n    rpcUrl: 'https://poly.api.pocket.network',\n  },\n  sei: {\n    chain: chains.sei,\n    domain: GATEWAY_DOMAINS.sei,\n    usdc: '0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n    rpcUrl: 'https://sei.api.pocket.network',\n  },\n  sonic: {\n    chain: chains.sonic,\n    domain: GATEWAY_DOMAINS.sonic,\n    usdc: '0x29219dd400f2Bf60E5a23d13Be72B486D4038894' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  unichain: {\n    chain: chains.unichain,\n    domain: GATEWAY_DOMAINS.unichain,\n    usdc: '0x078D782b760474a361dDA0AF3839290b0EF57AD6' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  worldChain: {\n    chain: chains.worldchain,\n    domain: GATEWAY_DOMAINS.worldChain,\n    usdc: '0x79A02482A880bCE3F13e09Da970dC34db4CD24d1' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n  },\n  arc: {\n    chain: arcMainnet,\n    domain: GATEWAY_DOMAINS.arc,\n    usdc: '0x3600000000000000000000000000000000000000' as Address,\n    gatewayWallet: MAINNET_GATEWAY_WALLET,\n    gatewayMinter: MAINNET_GATEWAY_MINTER,\n    rpcUrl: ARC_MAINNET_RPC_URL,\n  },\n};\n\n// ============================================================================\n// GATEWAY CLIENT TYPES\n// ============================================================================\n\n/**\n * Configuration for creating a GatewayClient.\n */\nexport interface GatewayClientConfig {\n  /** The chain to connect to */\n  chain: SupportedChainName;\n  /** Private key for signing transactions */\n  privateKey: Hex;\n  /**\n   * Custom RPC URL. Optional for all chains (a public default is used).\n   */\n  rpcUrl?: string;\n  /** Additional headers merged into every outbound Gateway API request. */\n  headers?: Record<string, string>;\n}\n\n/**\n * Result of a deposit operation.\n */\nexport interface DepositResult {\n  /** Transaction hash of the approval (if needed) */\n  approvalTxHash?: Hex;\n  /** Transaction hash of the deposit */\n  depositTxHash: Hex;\n  /** Amount deposited in USDC atomic units */\n  amount: bigint;\n  /** Formatted amount deposited */\n  formattedAmount: string;\n  /** Depositor address */\n  depositor: Address;\n}\n\n/**\n * Result of a withdraw operation (instant transfer).\n */\nexport interface WithdrawResult {\n  /** Transaction hash of the mint on destination chain */\n  mintTxHash: Hex;\n  /** Amount withdrawn in USDC atomic units */\n  amount: bigint;\n  /** Formatted amount withdrawn */\n  formattedAmount: string;\n  /** Source chain name */\n  sourceChain: string;\n  /** Destination chain name */\n  destinationChain: string;\n  /** Recipient address */\n  recipient: Address;\n}\n\n/**\n * Result of a pay operation.\n */\nexport interface PayResult<T = unknown> {\n  /** The response data from the resource */\n  data: T;\n  /** Amount paid in USDC atomic units */\n  amount: bigint;\n  /** Formatted amount paid */\n  formattedAmount: string;\n  /** Transaction hash from settlement */\n  transaction: string;\n  /** HTTP status code */\n  status: number;\n}\n\n/**\n * All balances in one object.\n */\nexport interface Balances {\n  /** Regular wallet USDC balance */\n  wallet: {\n    balance: bigint;\n    formatted: string;\n  };\n  /** Gateway balances */\n  gateway: {\n    total: bigint;\n    available: bigint;\n    withdrawing: bigint;\n    withdrawable: bigint;\n    formattedTotal: string;\n    formattedAvailable: string;\n    formattedWithdrawing: string;\n    formattedWithdrawable: string;\n  };\n}\n\n/**\n * Result of checking if a URL supports batching.\n */\nexport interface SupportsResult {\n  /** Whether the URL supports Gateway batching */\n  supported: boolean;\n  /** Payment requirements if supported */\n  requirements?: Record<string, unknown>;\n  /** Error message if not supported */\n  error?: string;\n}\n\n/**\n * Result of a trustless withdrawal initiation.\n *\n * NOTE: Trustless withdrawals are for emergency use only when Circle's API is unavailable.\n * For normal withdrawals, use `transfer()` with the same source and destination chain.\n */\nexport interface TrustlessWithdrawalInitResult {\n  /** Transaction hash */\n  txHash: Hex;\n  /** Amount being withdrawn in USDC atomic units */\n  amount: bigint;\n  /** Formatted amount being withdrawn */\n  formattedAmount: string;\n  /** Block number at which withdrawal becomes available (~7 days) */\n  withdrawalBlock: bigint;\n}\n\n/**\n * Result of a trustless withdrawal completion.\n *\n * NOTE: Trustless withdrawals are for emergency use only when Circle's API is unavailable.\n */\nexport interface TrustlessWithdrawalResult {\n  /** Transaction hash */\n  txHash: Hex;\n  /** Amount withdrawn in USDC atomic units */\n  amount: bigint;\n  /** Formatted amount withdrawn */\n  formattedAmount: string;\n}\n\n/**\n * Gateway balance information.\n */\nexport interface GatewayBalance {\n  /** Total balance in Gateway */\n  total: bigint;\n  /** Available balance (can be used) */\n  available: bigint;\n  /** Balance in withdrawal process */\n  withdrawing: bigint;\n  /** Balance ready to be withdrawn */\n  withdrawable: bigint;\n  /** Formatted total balance */\n  formattedTotal: string;\n  /** Formatted available balance */\n  formattedAvailable: string;\n  /** Formatted withdrawing balance */\n  formattedWithdrawing: string;\n  /** Formatted withdrawable balance */\n  formattedWithdrawable: string;\n}\n\n// ============================================================================\n// TRANSFER TYPES\n// ============================================================================\n\nexport type TransferStatus =\n  | 'received'\n  | 'batched'\n  | 'confirmed'\n  | 'completed'\n  | 'failed';\n\n/**\n * Shape may evolve; preserve all fields as returned by the API.\n */\nexport interface TransferResponse {\n  id: string;\n  status: TransferStatus;\n  token: 'USDC';\n  sendingNetwork: string;\n  recipientNetwork: string;\n  fromAddress: string;\n  toAddress: string;\n  amount: string;\n  createdAt: string;\n  updatedAt: string;\n  [key: string]: unknown;\n}\n\nexport interface SearchTransfersParams {\n  from?: Hex;\n  to?: Hex;\n  nonce?: Hex;\n  network?: string;\n  status?: TransferStatus;\n  token?: 'USDC';\n  startDate?: string;\n  endDate?: string;\n  pageSize?: number;\n  pageAfter?: string;\n  pageBefore?: string;\n}\n\nexport interface CursorPagination {\n  self?: string;\n  first?: string;\n  prev?: string;\n  next?: string;\n  pageAfter?: string;\n  pageBefore?: string;\n}\n\nexport interface SearchTransfersResponse {\n  transfers: TransferResponse[];\n  pagination?: CursorPagination;\n}\n\n// ============================================================================\n// GATEWAY CLIENT\n// ============================================================================\n\n/**\n * Gateway Client for gasless payments and cross-chain USDC via Circle Gateway.\n *\n * This client provides a simple interface for buyers to:\n * - **Deposit**: Move USDC into Gateway for gasless payments\n * - **Pay**: Pay for x402-protected resources (handles 402 automatically)\n * - **Withdraw**: Get USDC back (same-chain or cross-chain, instant)\n * - **GetBalances**: Check all balances in one call\n *\n * ## Typical Flow\n * ```typescript\n * const gateway = new GatewayClient({ chain: 'arcTestnet', privateKey });\n *\n * // 1. Deposit (one-time setup)\n * await gateway.deposit('100');\n *\n * // 2. Pay for resources (many times, gasless!)\n * const { data } = await gateway.pay('https://api.example.com/resource');\n *\n * // 3. Check balances\n * const balances = await gateway.getBalances();\n *\n * // 4. Withdraw when done\n * await gateway.withdraw('50');\n * // Or withdraw to a different chain (requires gas on destination)\n * await gateway.withdraw('25', { chain: 'baseSepolia' });\n * ```\n *\n * ## Emergency Flow (when Circle's API is down)\n * Use `initiateTrustlessWithdrawal()` and `completeTrustlessWithdrawal()` (7-day delay).\n */\nexport class GatewayClient {\n  readonly chainConfig: ChainConfig;\n  readonly account: ReturnType<typeof privateKeyToAccount>;\n  readonly publicClient: PublicClient<Transport, Chain>;\n  readonly walletClient: WalletClient<Transport, Chain, Account>;\n  private readonly _headers: Record<string, string>;\n\n  /**\n   * The scheme that builds and signs the batched payment payload. `pay()`\n   * delegates to this so the buyer flow runs the same lifecycle hooks as the\n   * standalone `BatchEvmScheme` / `x402Client` paths.\n   */\n  private readonly batchScheme: BatchEvmScheme;\n\n  /**\n   * Creates a new GatewayClient.\n   *\n   * @param config - Configuration including chain and private key\n   */\n  constructor(config: GatewayClientConfig) {\n    const chainConfig = CHAIN_CONFIGS[config.chain];\n    if (!chainConfig) {\n      throw new Error(`Unsupported chain: ${config.chain}`);\n    }\n\n    this.chainConfig = chainConfig;\n    this._headers = config.headers ?? {};\n    this.account = privateKeyToAccount(config.privateKey);\n\n    const rpcUrl = config.rpcUrl ?? chainConfig.rpcUrl;\n    const transport = rpcUrl ? http(rpcUrl) : http();\n\n    this.publicClient = createPublicClient({\n      chain: chainConfig.chain,\n      transport,\n    }) as PublicClient<Transport, Chain>;\n\n    this.walletClient = createWalletClient({\n      account: this.account,\n      chain: chainConfig.chain,\n      transport,\n    }) as WalletClient<Transport, Chain, Account>;\n\n    // The viem account satisfies BatchEvmSigner (address + signTypedData).\n    const signer: BatchEvmSigner = {\n      address: this.account.address,\n      signTypedData: (params) => this.account.signTypedData(params),\n    };\n    this.batchScheme = new BatchEvmScheme(signer);\n  }\n\n  // ============================================================================\n  // PAYMENT LIFECYCLE HOOKS\n  // ============================================================================\n  //\n  // These delegate to the underlying BatchEvmScheme so that the `pay()` buyer\n  // flow runs the same lifecycle hooks as the standalone scheme / x402Client\n  // paths — see https://docs.x402.org/advanced-concepts/lifecycle-hooks.\n\n  /**\n   * Register a hook that runs before the payment payload is created. Returning\n   * `{ abort: true, reason }` causes `pay()` to throw before signing.\n   */\n  onBeforePaymentCreation(hook: BeforePaymentCreationHook): this {\n    this.batchScheme.onBeforePaymentCreation(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook that runs after the payment payload is successfully created.\n   */\n  onAfterPaymentCreation(hook: AfterPaymentCreationHook): this {\n    this.batchScheme.onAfterPaymentCreation(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook that runs when payload creation throws. Return\n   * `{ recovered: true, payload }` to recover with the provided payload.\n   */\n  onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): this {\n    this.batchScheme.onPaymentCreationFailure(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook that runs after the buyer's paid HTTP request completes.\n   * Return `{ recovered: true }` to have `pay()` retry once with a fresh payload.\n   */\n  onPaymentResponse(hook: OnPaymentResponseHook): this {\n    this.batchScheme.onPaymentResponse(hook);\n    return this;\n  }\n\n  /**\n   * Get the account address.\n   */\n  get address(): Address {\n    return this.account.address;\n  }\n\n  /**\n   * Get the chain name.\n   */\n  get chainName(): string {\n    return this.chainConfig.chain.name;\n  }\n\n  /**\n   * Get the Gateway domain for this chain.\n   */\n  get domain(): number {\n    return this.chainConfig.domain;\n  }\n\n  /**\n   * Get the chain name key for this client.\n   */\n  getChainName(): SupportedChainName {\n    // Find the key in CHAIN_CONFIGS that matches our domain\n    for (const [name, config] of Object.entries(CHAIN_CONFIGS)) {\n      if (\n        config.domain === this.chainConfig.domain &&\n        config.chain.id === this.chainConfig.chain.id\n      ) {\n        return name as SupportedChainName;\n      }\n    }\n    throw new Error('Unknown chain configuration');\n  }\n\n  /**\n   * Get the USDC balance of the account (not in Gateway).\n   *\n   * @param address - Optional address to check (defaults to account address)\n   * @returns USDC balance in atomic units and formatted\n   */\n  async getUsdcBalance(\n    address?: Address,\n  ): Promise<{ balance: bigint; formatted: string }> {\n    const target = address ?? this.account.address;\n    const balance = await this.publicClient.readContract({\n      address: this.chainConfig.usdc,\n      abi: erc20Abi,\n      functionName: 'balanceOf',\n      args: [target],\n    });\n\n    return {\n      balance,\n      formatted: formatUnits(balance, 6),\n    };\n  }\n\n  /**\n   * Get all balances (wallet + gateway) in one call.\n   *\n   * @param address - Optional address to check (defaults to account address)\n   * @returns All balances\n   */\n  async getBalances(address?: Address): Promise<Balances> {\n    const target = address ?? this.account.address;\n\n    const [wallet, gateway] = await Promise.all([\n      this.getUsdcBalance(target),\n      this.getGatewayBalance(target),\n    ]);\n\n    return {\n      wallet,\n      gateway,\n    };\n  }\n\n  /**\n   * Get the Gateway balance for an address.\n   *\n   * @param address - Optional address to check (defaults to account address)\n   * @returns Gateway balance information\n   * @deprecated Use `getBalances()` instead for a unified view\n   */\n  async getBalance(address?: Address): Promise<GatewayBalance> {\n    return this.getGatewayBalance(address);\n  }\n\n  /**\n   * Get the Gateway balance for an address via Gateway API.\n   */\n  private async getGatewayBalance(address?: Address): Promise<GatewayBalance> {\n    const target = address ?? this.account.address;\n    const apiBaseUrl = this.isTestnet() ? GATEWAY_API_TESTNET : GATEWAY_API_MAINNET;\n\n    const response = await fetch(`${apiBaseUrl}/balances`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        ...this.gatewayApiHeaders(),\n      },\n      body: JSON.stringify({\n        token: 'USDC',\n        sources: [{ depositor: target, domain: this.chainConfig.domain }],\n      }),\n    });\n\n    const data = (await response.json()) as {\n      balances?: Array<{\n        balance: string;\n        withdrawing?: string;\n        withdrawable?: string;\n      }>;\n      message?: string;\n    };\n\n    if (!response.ok) {\n      throw new Error(\n        `Gateway API balance fetch failed: ${data.message ?? response.statusText}`,\n      );\n    }\n\n    if (!data.balances || data.balances.length === 0) {\n      throw new Error('Gateway API returned no balances for the depositor.');\n    }\n\n    const balanceData = data.balances[0];\n    // Gateway API returns formatted decimal strings (e.g. \"0.300000\") for USDC.\n    // Convert to atomic units (6 decimals) for bigint fields.\n    const available = parseUnits(balanceData.balance, 6);\n    const withdrawing = parseUnits(balanceData.withdrawing ?? '0', 6);\n    const withdrawable = parseUnits(balanceData.withdrawable ?? '0', 6);\n    const total = available + withdrawing;\n\n    return {\n      total,\n      available,\n      withdrawing,\n      withdrawable,\n      formattedTotal: formatUnits(total, 6),\n      formattedAvailable: formatUnits(available, 6),\n      formattedWithdrawing: formatUnits(withdrawing, 6),\n      formattedWithdrawable: formatUnits(withdrawable, 6),\n    };\n  }\n\n  /**\n   * Deposit USDC into the Gateway Wallet.\n   *\n   * This method first approves the Gateway Wallet contract to spend USDC,\n   * then deposits the specified amount.\n   *\n   * @param amount - Amount of USDC to deposit (as a decimal string, e.g., \"10.5\")\n   * @param options - Optional deposit options\n   * @returns Deposit result with transaction hashes\n   */\n  async deposit(\n    amount: string,\n    options?: {\n      /** Amount to approve (defaults to amount) */\n      approveAmount?: string;\n      /** Skip approval if already approved */\n      skipApprovalCheck?: boolean;\n    },\n  ): Promise<DepositResult> {\n    const depositAmount = parseUnits(amount, 6);\n    const approveAmount = parseUnits(options?.approveAmount ?? amount, 6);\n\n    // Check balance\n    const { balance } = await this.getUsdcBalance();\n    if (balance < depositAmount) {\n      throw new Error(\n        `Insufficient USDC balance. Have: ${formatUnits(balance, 6)}, Need: ${amount}`,\n      );\n    }\n\n    let approvalTxHash: Hex | undefined;\n\n    // Check current allowance unless skipped\n    if (!options?.skipApprovalCheck) {\n      const allowance = await this.publicClient.readContract({\n        address: this.chainConfig.usdc,\n        abi: erc20Abi,\n        functionName: 'allowance',\n        args: [this.account.address, this.chainConfig.gatewayWallet],\n      });\n\n      if (allowance < depositAmount) {\n        // Approve the Gateway Wallet\n        approvalTxHash = await this.walletClient.writeContract({\n          address: this.chainConfig.usdc,\n          abi: erc20Abi,\n          functionName: 'approve',\n          args: [this.chainConfig.gatewayWallet, approveAmount],\n        });\n\n        try {\n          await this.publicClient.waitForTransactionReceipt({ hash: approvalTxHash });\n        } catch (err) {\n          throw new Error(`Approval transaction failed: ${approvalTxHash}`, {\n            cause: err,\n          });\n        }\n      }\n    }\n\n    // Deposit into Gateway Wallet\n    const depositTxHash = await this.walletClient.writeContract({\n      address: this.chainConfig.gatewayWallet,\n      abi: GATEWAY_WALLET_ABI,\n      functionName: 'deposit',\n      args: [this.chainConfig.usdc, depositAmount],\n      gas: 120000n,\n    });\n\n    try {\n      await this.publicClient.waitForTransactionReceipt({ hash: depositTxHash });\n    } catch (err) {\n      throw new Error(`Deposit transaction failed: ${depositTxHash}`, {\n        cause: err,\n      });\n    }\n\n    return {\n      approvalTxHash,\n      depositTxHash,\n      amount: depositAmount,\n      formattedAmount: amount,\n      depositor: this.account.address,\n    };\n  }\n\n  /**\n   * Deposit USDC into the Gateway Wallet on behalf of another address.\n   *\n   * The resulting balance belongs to the specified depositor address,\n   * not the caller.\n   *\n   * @param amount - Amount of USDC to deposit (as a decimal string)\n   * @param depositor - Address that will own the resulting balance\n   * @param options - Optional deposit options\n   * @returns Deposit result with transaction hashes\n   */\n  async depositFor(\n    amount: string,\n    depositor: Address,\n    options?: {\n      /** Amount to approve (defaults to amount) */\n      approveAmount?: string;\n      /** Skip approval if already approved */\n      skipApprovalCheck?: boolean;\n    },\n  ): Promise<DepositResult> {\n    const depositAmount = parseUnits(amount, 6);\n    const approveAmount = parseUnits(options?.approveAmount ?? amount, 6);\n\n    // Check balance\n    const { balance } = await this.getUsdcBalance();\n    if (balance < depositAmount) {\n      throw new Error(\n        `Insufficient USDC balance. Have: ${formatUnits(balance, 6)}, Need: ${amount}`,\n      );\n    }\n\n    let approvalTxHash: Hex | undefined;\n\n    // Check current allowance unless skipped\n    if (!options?.skipApprovalCheck) {\n      const allowance = await this.publicClient.readContract({\n        address: this.chainConfig.usdc,\n        abi: erc20Abi,\n        functionName: 'allowance',\n        args: [this.account.address, this.chainConfig.gatewayWallet],\n      });\n\n      if (allowance < depositAmount) {\n        // Approve the Gateway Wallet\n        approvalTxHash = await this.walletClient.writeContract({\n          address: this.chainConfig.usdc,\n          abi: erc20Abi,\n          functionName: 'approve',\n          args: [this.chainConfig.gatewayWallet, approveAmount],\n        });\n\n        try {\n          await this.publicClient.waitForTransactionReceipt({ hash: approvalTxHash });\n        } catch (err) {\n          throw new Error(`Approval transaction failed: ${approvalTxHash}`, {\n            cause: err,\n          });\n        }\n      }\n    }\n\n    // Deposit into Gateway Wallet for another address\n    const depositTxHash = await this.walletClient.writeContract({\n      address: this.chainConfig.gatewayWallet,\n      abi: GATEWAY_WALLET_ABI,\n      functionName: 'depositFor',\n      args: [this.chainConfig.usdc, depositor, depositAmount],\n      gas: 120000n,\n    });\n\n    try {\n      await this.publicClient.waitForTransactionReceipt({ hash: depositTxHash });\n    } catch (err) {\n      throw new Error(`Deposit transaction failed: ${depositTxHash}`, {\n        cause: err,\n      });\n    }\n\n    return {\n      approvalTxHash,\n      depositTxHash,\n      amount: depositAmount,\n      formattedAmount: amount,\n      depositor,\n    };\n  }\n\n  // ============================================================================\n  // PAYMENT (Pay for x402 resources)\n  // ============================================================================\n\n  /**\n   * Check if a URL supports Gateway batching before paying.\n   *\n   * @param url - The URL to check\n   * @returns Whether batching is supported and payment requirements\n   */\n  async supports(url: string): Promise<SupportsResult> {\n    try {\n      const response = await fetch(url);\n\n      if (response.status !== 402) {\n        return { supported: false, error: 'Resource does not require payment (not 402)' };\n      }\n\n      // x402 v2: Read from PAYMENT-REQUIRED header (base64-encoded)\n      const paymentRequiredHeader = response.headers.get('PAYMENT-REQUIRED');\n      if (!paymentRequiredHeader) {\n        return {\n          supported: false,\n          error: 'Missing PAYMENT-REQUIRED header in 402 response',\n        };\n      }\n      const data: { accepts?: Array<Record<string, unknown>> } = JSON.parse(\n        Buffer.from(paymentRequiredHeader, 'base64').toString('utf-8'),\n      );\n      const accepts = data.accepts;\n\n      if (!accepts || accepts.length === 0) {\n        return { supported: false, error: 'No payment options in 402 response' };\n      }\n\n      // Find a batching option matching this client's chain\n      const expectedNetwork = `eip155:${this.chainConfig.chain.id}`;\n      const batchingOption = accepts.find((opt) => {\n        const extra = opt.extra as Record<string, unknown> | undefined;\n        return (\n          opt.network === expectedNetwork &&\n          extra?.name === 'GatewayWalletBatched' &&\n          extra?.version === '1' &&\n          typeof extra?.verifyingContract === 'string'\n        );\n      });\n\n      if (!batchingOption) {\n        return {\n          supported: false,\n          error: `No Gateway batching option available for network ${expectedNetwork} (${this.chainConfig.chain.name})`,\n        };\n      }\n\n      return { supported: true, requirements: batchingOption };\n    } catch (error) {\n      return { supported: false, error: (error as Error).message };\n    }\n  }\n\n  /**\n   * Pay for an x402-protected resource.\n   *\n   * This method handles the full 402 payment flow automatically:\n   * 1. Makes initial request\n   * 2. If 402, finds Gateway batching option\n   * 3. Signs payment authorization\n   * 4. Retries with Payment-Signature header\n   *\n   * @param url - The URL to pay for\n   * @param options - Optional request options\n   * @returns The response data and payment info\n   *\n   * @example\n   * ```typescript\n   * const { data, amount } = await gateway.pay('https://api.example.com/resource');\n   * console.log('Paid', amount, 'USDC for:', data);\n   * ```\n   */\n  async pay<T = unknown>(\n    url: string,\n    options?: {\n      /** HTTP method (default: GET) */\n      method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n      /** Request body for POST/PUT */\n      body?: unknown;\n      /** Additional headers */\n      headers?: Record<string, string>;\n    },\n  ): Promise<PayResult<T>> {\n    const method = options?.method ?? 'GET';\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      ...options?.headers,\n    };\n    const serializedBody =\n      options?.body !== undefined\n        ? typeof options.body === 'string'\n          ? options.body\n          : JSON.stringify(options.body)\n        : undefined;\n\n    // Step 1: Make initial request\n    const initialResponse = await fetch(url, {\n      method,\n      headers,\n      body: serializedBody,\n    });\n\n    // If not 402, check if it's an error or success\n    if (initialResponse.status !== 402) {\n      if (initialResponse.ok) {\n        const data = (await initialResponse.json()) as T;\n        return {\n          data,\n          amount: 0n,\n          formattedAmount: '0',\n          transaction: '',\n          status: initialResponse.status,\n        };\n      }\n      throw new Error(`Request failed with status ${initialResponse.status}`);\n    }\n\n    // Step 2: Parse 402 response\n    // x402 v2: Read from PAYMENT-REQUIRED header (base64-encoded)\n    const paymentRequiredHeader = initialResponse.headers.get('PAYMENT-REQUIRED');\n    if (!paymentRequiredHeader) {\n      throw new Error('Missing PAYMENT-REQUIRED header in 402 response');\n    }\n    const paymentRequired = JSON.parse(\n      Buffer.from(paymentRequiredHeader, 'base64').toString('utf-8'),\n    ) as {\n      x402Version?: number;\n      accepts?: Array<Record<string, unknown>>;\n      resource?: Record<string, unknown>;\n    };\n    const accepts = paymentRequired.accepts;\n\n    if (!accepts || accepts.length === 0) {\n      throw new Error('No payment options in 402 response');\n    }\n\n    // Step 3: Find Gateway batching option matching this client's chain\n    const expectedNetwork = `eip155:${this.chainConfig.chain.id}`;\n    const batchingOption = accepts.find((opt) => {\n      const extra = opt.extra as Record<string, unknown> | undefined;\n      return (\n        opt.network === expectedNetwork &&\n        extra?.name === 'GatewayWalletBatched' &&\n        extra?.version === '1' &&\n        typeof extra?.verifyingContract === 'string'\n      );\n    });\n\n    if (!batchingOption) {\n      throw new Error(\n        `No Gateway batching option available for network ${expectedNetwork} (${this.chainConfig.chain.name}). The seller may not support this chain. Use supports() to check first.`,\n      );\n    }\n\n    // Step 4: Create, sign, and send the payment. `createPaymentPayload`\n    // (delegated to BatchEvmScheme) runs the onBefore/onAfter/onFailure payment\n    // hooks; `dispatchPaymentResponse` runs the onPaymentResponse hooks and may\n    // request a single retry with a fresh payload.\n    const x402Version = paymentRequired.x402Version ?? 2;\n    const amount = BigInt(batchingOption.amount as string);\n\n    for (let attempt = 0; ; attempt++) {\n      const paymentPayload = await this.batchScheme.createPaymentPayload(\n        x402Version,\n        batchingOption as unknown as Parameters<\n          BatchEvmScheme['createPaymentPayload']\n        >[1],\n      );\n\n      const paymentHeader = Buffer.from(\n        JSON.stringify({\n          ...paymentPayload,\n          resource: paymentRequired.resource,\n          accepted: batchingOption,\n        }),\n      ).toString('base64');\n\n      const paidResponse = await fetch(url, {\n        method,\n        headers: {\n          ...headers,\n          'Payment-Signature': paymentHeader,\n        },\n        body: serializedBody,\n      });\n\n      // x402 v2: settlement info lives in the PAYMENT-RESPONSE header\n      // (base64-encoded). Parse it once for both the response hook and result.\n      let settleResponse: { transaction?: string } | undefined;\n      const paymentResponseHeader = paidResponse.headers.get('PAYMENT-RESPONSE');\n      if (paymentResponseHeader) {\n        settleResponse = JSON.parse(\n          Buffer.from(paymentResponseHeader, 'base64').toString('utf-8'),\n        ) as { transaction?: string };\n      }\n\n      const responseContext: PaymentResponseContext = {\n        paymentPayload: {\n          x402Version: paymentPayload.x402Version,\n          payload: paymentPayload.payload as unknown as Record<string, unknown>,\n        },\n        requirements: batchingOption as unknown as PaymentResponseContext['requirements'],\n        paymentRequired:\n          paymentRequired as unknown as PaymentResponseContext['paymentRequired'],\n        settleResponse:\n          settleResponse as unknown as PaymentResponseContext['settleResponse'],\n        error: paidResponse.ok\n          ? undefined\n          : new Error(`Payment failed with status ${paidResponse.status}`),\n      };\n\n      const recovery = await this.batchScheme.dispatchPaymentResponse(responseContext);\n      // Honor a single retry request from an onPaymentResponse hook.\n      if (recovery?.recovered && attempt === 0) {\n        continue;\n      }\n\n      if (!paidResponse.ok) {\n        const error = await paidResponse.json().catch(() => ({}));\n        throw new Error(\n          `Payment failed: ${(error as { error?: string }).error || paidResponse.statusText}`,\n        );\n      }\n\n      const data = (await paidResponse.json()) as T;\n\n      return {\n        data,\n        amount,\n        formattedAmount: formatUnits(amount, 6),\n        transaction: settleResponse?.transaction ?? '',\n        status: paidResponse.status,\n      };\n    }\n  }\n\n  // ============================================================================\n  // WITHDRAW (Instant way to get USDC out)\n  // ============================================================================\n\n  /**\n   * Withdraw USDC from Gateway to your wallet.\n   *\n   * By default, withdraws to the same chain (instant, no 7-day delay).\n   * Optionally, withdraw to a different chain (requires gas on destination).\n   *\n   * @param amount - Amount of USDC to withdraw (as a decimal string)\n   * @param options - Optional withdrawal options\n   * @returns Withdrawal result with transaction hash\n   *\n   * @example\n   * ```typescript\n   * // Withdraw to same chain (instant!)\n   * await gateway.withdraw('50');\n   *\n   * // Withdraw to Base Sepolia (requires ETH on Base for gas)\n   * await gateway.withdraw('25', { chain: 'baseSepolia' });\n   * ```\n   */\n  async withdraw(\n    amount: string,\n    options?: {\n      /** Destination chain (defaults to same chain) */\n      chain?: SupportedChainName;\n      /** Recipient address (defaults to your address) */\n      recipient?: Address;\n      /** Max fee willing to pay in USDC (defaults to 2.01) */\n      maxFee?: string;\n    },\n  ): Promise<WithdrawResult> {\n    // Find destination chain config\n    const destinationChainName = options?.chain ?? this.getChainName();\n    const destConfig = CHAIN_CONFIGS[destinationChainName];\n    if (!destConfig) {\n      throw new Error(`Unsupported destination chain: ${destinationChainName}`);\n    }\n\n    const withdrawAmount = parseUnits(amount, 6);\n    const recipient = options?.recipient ?? this.account.address;\n    const maxFee = parseUnits(options?.maxFee ?? '2.01', 6);\n\n    // Check available balance\n    const balances = await this.getBalances();\n    if (balances.gateway.available < withdrawAmount) {\n      throw new Error(\n        `Insufficient available balance. Have: ${balances.gateway.formattedAvailable}, Need: ${amount}`,\n      );\n    }\n\n    // Create burn intent\n    const burnIntent = this.createBurnIntent(\n      this.chainConfig,\n      destConfig,\n      withdrawAmount,\n      recipient,\n      maxFee,\n    );\n\n    // Sign the burn intent\n    const signature = await this.account.signTypedData({\n      domain: { name: 'GatewayWallet', version: '1' },\n      types: {\n        EIP712Domain: [\n          { name: 'name', type: 'string' },\n          { name: 'version', type: 'string' },\n        ],\n        TransferSpec: [\n          { name: 'version', type: 'uint32' },\n          { name: 'sourceDomain', type: 'uint32' },\n          { name: 'destinationDomain', type: 'uint32' },\n          { name: 'sourceContract', type: 'bytes32' },\n          { name: 'destinationContract', type: 'bytes32' },\n          { name: 'sourceToken', type: 'bytes32' },\n          { name: 'destinationToken', type: 'bytes32' },\n          { name: 'sourceDepositor', type: 'bytes32' },\n          { name: 'destinationRecipient', type: 'bytes32' },\n          { name: 'sourceSigner', type: 'bytes32' },\n          { name: 'destinationCaller', type: 'bytes32' },\n          { name: 'value', type: 'uint256' },\n          { name: 'salt', type: 'bytes32' },\n          { name: 'hookData', type: 'bytes' },\n        ],\n        BurnIntent: [\n          { name: 'maxBlockHeight', type: 'uint256' },\n          { name: 'maxFee', type: 'uint256' },\n          { name: 'spec', type: 'TransferSpec' },\n        ],\n      },\n      primaryType: 'BurnIntent',\n      message: burnIntent,\n    });\n\n    // Get attestation from Gateway API\n    const apiUrl = this.isTestnet() ? GATEWAY_API_TESTNET : GATEWAY_API_MAINNET;\n    const response = await fetch(`${apiUrl}/transfer`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        ...this.gatewayApiHeaders(),\n      },\n      body: JSON.stringify([{ burnIntent, signature }], (_, v) =>\n        typeof v === 'bigint' ? v.toString() : v,\n      ),\n    });\n\n    const result = (await response.json()) as {\n      success?: boolean;\n      error?: string;\n      message?: string;\n      attestation?: string;\n      signature?: string;\n    };\n\n    if (\n      result.success === false ||\n      result.error ||\n      !result.attestation ||\n      !result.signature\n    ) {\n      throw new Error(\n        `Gateway API error: ${result.message || result.error || JSON.stringify(result)}`,\n      );\n    }\n\n    // Create destination chain client for minting\n    const destTransport = destConfig.rpcUrl ? http(destConfig.rpcUrl) : http();\n    const destWalletClient = createWalletClient({\n      account: this.account,\n      chain: destConfig.chain,\n      transport: destTransport,\n    });\n    const destPublicClient = createPublicClient({\n      chain: destConfig.chain,\n      transport: destTransport,\n    });\n\n    // Mint on destination chain\n    const mintTxHash = await destWalletClient.writeContract({\n      address: destConfig.gatewayMinter,\n      abi: GATEWAY_MINTER_ABI,\n      functionName: 'gatewayMint',\n      args: [result.attestation as Hex, result.signature as Hex],\n    });\n\n    try {\n      await destPublicClient.waitForTransactionReceipt({ hash: mintTxHash });\n    } catch (err) {\n      throw new Error(`Mint transaction failed: ${mintTxHash}`, { cause: err });\n    }\n\n    return {\n      mintTxHash,\n      amount: withdrawAmount,\n      formattedAmount: amount,\n      sourceChain: this.chainConfig.chain.name,\n      destinationChain: destConfig.chain.name,\n      recipient,\n    };\n  }\n\n  /**\n   * Transfer USDC to any supported chain (alias for withdraw with destination chain).\n   * @deprecated Use `withdraw({ chain })` instead\n   */\n  async transfer(\n    amount: string,\n    destinationChain: SupportedChainName,\n    recipient?: Address,\n  ): Promise<WithdrawResult> {\n    return this.withdraw(amount, { chain: destinationChain, recipient });\n  }\n\n  /**\n   * Create a burn intent for a transfer.\n   */\n  private createBurnIntent(\n    from: ChainConfig,\n    to: ChainConfig,\n    value: bigint,\n    recipient: Address,\n    maxFee: bigint,\n  ) {\n    const addressToBytes32 = (addr: string): Hex =>\n      pad(addr.toLowerCase() as Address, { size: 32 });\n\n    return {\n      maxBlockHeight: maxUint256,\n      maxFee,\n      spec: {\n        version: 1,\n        sourceDomain: from.domain,\n        destinationDomain: to.domain,\n        sourceContract: addressToBytes32(from.gatewayWallet),\n        destinationContract: addressToBytes32(to.gatewayMinter),\n        sourceToken: addressToBytes32(from.usdc),\n        destinationToken: addressToBytes32(to.usdc),\n        sourceDepositor: addressToBytes32(this.account.address),\n        destinationRecipient: addressToBytes32(recipient),\n        sourceSigner: addressToBytes32(this.account.address),\n        destinationCaller: addressToBytes32(zeroAddress),\n        value,\n        salt: `0x${randomBytes(32).toString('hex')}` as Hex,\n        hookData: '0x' as Hex,\n      },\n    };\n  }\n\n  // ============================================================================\n  // TRANSFER QUERIES\n  // ============================================================================\n\n  /**\n   * Get a single x402 transfer by ID.\n   *\n   * @param id - The transfer UUID\n   * @returns Transfer object\n   */\n  async getTransferById(id: string): Promise<TransferResponse> {\n    const apiBaseUrl = this.isTestnet() ? GATEWAY_API_TESTNET : GATEWAY_API_MAINNET;\n    const response = await fetch(\n      `${apiBaseUrl}/x402/transfers/${encodeURIComponent(id)}`,\n      { method: 'GET', headers: this.gatewayApiHeaders() },\n    );\n\n    if (!response.ok) {\n      const errorText = await response.text().catch(() => response.statusText);\n      throw new Error(\n        `Gateway getTransferById failed (${response.status}): ${errorText}`,\n      );\n    }\n\n    return (await response.json()) as TransferResponse;\n  }\n\n  /**\n   * Search x402 transfers with optional filters.\n   *\n   * Supports cursor-based pagination via `pageAfter` / `pageBefore`.\n   * When `network` is omitted, defaults to the client's chain (e.g., `eip155:84532`).\n   * When `status` is provided, also provide `from`, `to`, or `nonce`.\n   *\n   * @param params - Optional transfer search filters\n   * @returns Paginated transfer search response\n   */\n  async searchTransfers(\n    params: SearchTransfersParams = {},\n  ): Promise<SearchTransfersResponse> {\n    const apiBaseUrl = this.isTestnet() ? GATEWAY_API_TESTNET : GATEWAY_API_MAINNET;\n\n    const query = new URLSearchParams();\n    if (params.from) query.set('from', params.from);\n    if (params.to) query.set('to', params.to);\n    if (params.nonce) query.set('nonce', params.nonce);\n    const network = params.network ?? `eip155:${this.chainConfig.chain.id}`;\n    query.set('network', network);\n    if (params.status) query.set('status', params.status);\n    if (params.token) query.set('token', params.token);\n    if (params.startDate) query.set('startDate', params.startDate);\n    if (params.endDate) query.set('endDate', params.endDate);\n    if (typeof params.pageSize === 'number')\n      query.set('pageSize', String(params.pageSize));\n    if (params.pageAfter) query.set('pageAfter', params.pageAfter);\n    if (params.pageBefore) query.set('pageBefore', params.pageBefore);\n\n    const path = `${apiBaseUrl}/x402/transfers`;\n    const queryString = query.toString().replaceAll('%3A', ':');\n    const url = queryString ? `${path}?${queryString}` : path;\n\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: this.gatewayApiHeaders(),\n    });\n\n    if (!response.ok) {\n      const errorText = await response.text().catch(() => response.statusText);\n      throw new Error(\n        `Gateway searchTransfers failed (${response.status}): ${errorText}`,\n      );\n    }\n\n    const data = (await response.json()) as SearchTransfersResponse;\n    const linkHeader = response.headers?.get?.('Link') ?? null;\n    const pagination = this.parseLinkHeader(linkHeader);\n\n    if (!pagination) {\n      return data;\n    }\n\n    return { ...data, pagination };\n  }\n\n  // ============================================================================\n  // PRIVATE HELPERS\n  // ============================================================================\n\n  private gatewayApiHeaders(): Record<string, string> {\n    return this._headers;\n  }\n\n  /**\n   * Check if this client is connected to a testnet.\n   */\n  private isTestnet(): boolean {\n    const testnetChainIds = new Set<number>(\n      (\n        [\n          'arbitrumSepolia',\n          'arcTestnet',\n          'avalancheFuji',\n          'baseSepolia',\n          'sepolia',\n          'hyperEvmTestnet',\n          'optimismSepolia',\n          'polygonAmoy',\n          'seiAtlantic',\n          'sonicTestnet',\n          'unichainSepolia',\n          'worldChainSepolia',\n        ] as SupportedChainName[]\n      ).map((name) => CHAIN_CONFIGS[name].chain.id),\n    );\n    return testnetChainIds.has(this.chainConfig.chain.id);\n  }\n\n  /**\n   * Parse pagination from an RFC 5988 Link header.\n   * Could be replaced with 'http-link-header' library\n   *\n   * Example:\n   * <https://.../transfers?pageAfter=...>; rel=\"next\", <...>; rel=\"self\"\n   */\n  private parseLinkHeader(linkHeader: string | null): CursorPagination | undefined {\n    if (!linkHeader) {\n      return undefined;\n    }\n\n    const pagination: CursorPagination = {};\n    const linkRegex = /<([^>]+)>\\s*;\\s*rel=\"([^\"]+)\"/g;\n    let match: RegExpExecArray | null = linkRegex.exec(linkHeader);\n\n    while (match) {\n      const [, url, rel] = match;\n      if (rel === 'self' || rel === 'first' || rel === 'prev' || rel === 'next') {\n        pagination[rel] = url;\n      }\n      match = linkRegex.exec(linkHeader);\n    }\n\n    if (pagination.next) {\n      const cursor = this.getQueryParam(pagination.next, 'pageAfter');\n      if (cursor) pagination.pageAfter = cursor;\n    }\n    if (pagination.prev) {\n      const cursor = this.getQueryParam(pagination.prev, 'pageBefore');\n      if (cursor) pagination.pageBefore = cursor;\n    }\n\n    return Object.keys(pagination).length > 0 ? pagination : undefined;\n  }\n\n  private getQueryParam(url: string, key: string): string | undefined {\n    try {\n      return new URL(url).searchParams.get(key) ?? undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  // ============================================================================\n  // TRUSTLESS WITHDRAWAL (Emergency use only)\n  // ============================================================================\n\n  /**\n   * Get the trustless withdrawal delay in blocks (~7 days).\n   *\n   * NOTE: This is for the emergency trustless withdrawal flow only.\n   * For normal withdrawals, use `transfer()` to the same chain.\n   *\n   * @returns Number of blocks to wait after initiating trustless withdrawal\n   */\n  async getTrustlessWithdrawalDelay(): Promise<bigint> {\n    return this.publicClient.readContract({\n      address: this.chainConfig.gatewayWallet,\n      abi: GATEWAY_WALLET_ABI,\n      functionName: 'withdrawalDelay',\n    });\n  }\n\n  /**\n   * Get the block at which a pending trustless withdrawal becomes available.\n   *\n   * @param address - Optional address to check (defaults to account address)\n   * @returns Block number, or 0n if no pending withdrawal\n   */\n  async getTrustlessWithdrawalBlock(address?: Address): Promise<bigint> {\n    const target = address ?? this.account.address;\n    return this.publicClient.readContract({\n      address: this.chainConfig.gatewayWallet,\n      abi: GATEWAY_WALLET_ABI,\n      functionName: 'withdrawalBlock',\n      args: [this.chainConfig.usdc, target],\n    });\n  }\n\n  /**\n   * Initiate a trustless withdrawal from the Gateway Wallet.\n   *\n   * ⚠️ **WARNING: This is for emergency use only!**\n   *\n   * Use this only when Circle's Gateway API is unavailable. For normal\n   * withdrawals, use `transfer()` to the same chain - it's instant.\n   *\n   * After calling this, you must wait ~7 days (`withdrawalDelay` blocks)\n   * before calling `completeTrustlessWithdrawal()`.\n   *\n   * @param amount - Amount of USDC to withdraw (as a decimal string)\n   * @returns Withdrawal initiation result\n   */\n  async initiateTrustlessWithdrawal(\n    amount: string,\n  ): Promise<TrustlessWithdrawalInitResult> {\n    const withdrawAmount = parseUnits(amount, 6);\n\n    // Check available balance\n    const balance = await this.getBalance();\n    if (balance.available < withdrawAmount) {\n      throw new Error(\n        `Insufficient available balance. Have: ${balance.formattedAvailable}, Need: ${amount}`,\n      );\n    }\n\n    // Initiate withdrawal\n    const txHash = await this.walletClient.writeContract({\n      address: this.chainConfig.gatewayWallet,\n      abi: GATEWAY_WALLET_ABI,\n      functionName: 'initiateWithdrawal',\n      args: [this.chainConfig.usdc, withdrawAmount],\n      gas: 100000n,\n    });\n\n    try {\n      await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n    } catch (err) {\n      throw new Error(`Trustless withdrawal initiation failed: ${txHash}`, {\n        cause: err,\n      });\n    }\n\n    // Get the withdrawal block\n    const withdrawalBlock = await this.getTrustlessWithdrawalBlock();\n\n    return {\n      txHash,\n      amount: withdrawAmount,\n      formattedAmount: amount,\n      withdrawalBlock,\n    };\n  }\n\n  /**\n   * Complete a trustless withdrawal after the ~7-day delay period.\n   *\n   * ⚠️ **WARNING: This is for emergency use only!**\n   *\n   * Use this only when Circle's Gateway API is unavailable. For normal\n   * withdrawals, use `transfer()` to the same chain - it's instant.\n   *\n   * @returns Withdrawal result\n   */\n  async completeTrustlessWithdrawal(): Promise<TrustlessWithdrawalResult> {\n    // Check withdrawable balance\n    const balance = await this.getBalance();\n    if (balance.withdrawable === 0n) {\n      const withdrawalBlock = await this.getTrustlessWithdrawalBlock();\n      const currentBlock = await this.publicClient.getBlockNumber();\n\n      if (withdrawalBlock > 0n && currentBlock < withdrawalBlock) {\n        throw new Error(\n          `Trustless withdrawal not yet available. Current block: ${currentBlock}, Available at: ${withdrawalBlock}`,\n        );\n      }\n\n      throw new Error(\n        'No withdrawable balance. Call initiateTrustlessWithdrawal() first.',\n      );\n    }\n\n    const withdrawAmount = balance.withdrawable;\n\n    // Complete withdrawal\n    const txHash = await this.walletClient.writeContract({\n      address: this.chainConfig.gatewayWallet,\n      abi: GATEWAY_WALLET_ABI,\n      functionName: 'withdraw',\n      args: [this.chainConfig.usdc],\n      gas: 100000n,\n    });\n\n    try {\n      await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n    } catch (err) {\n      throw new Error(`Trustless withdrawal completion failed: ${txHash}`, {\n        cause: err,\n      });\n    }\n\n    return {\n      txHash,\n      amount: withdrawAmount,\n      formattedAmount: formatUnits(withdrawAmount, 6),\n    };\n  }\n}\n"],"mappings":"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","names":[]}