{"version":3,"sources":["../../../src/client/x402Client.ts"],"sourcesContent":["import { x402Version } from \"..\";\nimport { SchemeNetworkClient } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network, PaymentRequired, SettleResponse } from \"../types\";\nimport { findByNetworkAndScheme, findSchemesByNetwork } from \"../utils\";\n\n/**\n * Client Hook Context Interfaces\n */\n\nexport interface PaymentCreationContext {\n  paymentRequired: PaymentRequired;\n  selectedRequirements: PaymentRequirements;\n}\n\nexport interface PaymentCreatedContext extends PaymentCreationContext {\n  paymentPayload: PaymentPayload;\n}\n\nexport interface PaymentCreationFailureContext extends PaymentCreationContext {\n  error: Error;\n}\n\n/**\n * Client Hook Type Definitions\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: PaymentPayload }>;\n\n/**\n * Context provided to payment response hooks after the paid request completes.\n *\n * Discriminate by what's present:\n * - `settleResponse` with `success: true` → settle succeeded\n * - `settleResponse` with `success: false` → settle failed\n * - `paymentRequired` (no `settleResponse`) → verify failed\n * - `error` → transport or parse error\n */\nexport interface PaymentResponseContext {\n  paymentPayload: PaymentPayload;\n  requirements: PaymentRequirements;\n  settleResponse?: SettleResponse;\n  paymentRequired?: PaymentRequired;\n  error?: Error;\n}\n\n/**\n * Hook fired after a paid request completes.\n * Return `{ recovered: true }` to signal the transport should retry with a fresh payload.\n */\nexport type OnPaymentResponseHook = (\n  ctx: PaymentResponseContext,\n) => Promise<void | { recovered: true }>;\n\nexport type SelectPaymentRequirements = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements;\n\ntype ClientHookAdapterHandles = {\n  beforePaymentCreation?: BeforePaymentCreationHook;\n  afterPaymentCreation?: AfterPaymentCreationHook;\n  onPaymentCreationFailure?: OnPaymentCreationFailureHook;\n  onPaymentResponse?: OnPaymentResponseHook;\n};\n\ntype ClientHookPhase = keyof ClientHookAdapterHandles;\n\nexport interface ClientExtensionHooks {\n  onBeforePaymentCreation?: (\n    declaration: unknown,\n    context: PaymentCreationContext,\n  ) => Promise<void | { abort: true; reason: string }>;\n  onAfterPaymentCreation?: (\n    declaration: unknown,\n    context: PaymentCreatedContext,\n  ) => Promise<void>;\n  onPaymentCreationFailure?: (\n    declaration: unknown,\n    context: PaymentCreationFailureContext,\n  ) => Promise<void | { recovered: true; payload: PaymentPayload }>;\n  onPaymentResponse?: (\n    declaration: unknown,\n    context: PaymentResponseContext,\n  ) => Promise<void | { recovered: true }>;\n}\n\nexport interface ClientTransportExtensionHooks {\n  [transport: string]: unknown;\n}\n\n/**\n * Extension that can enrich payment payloads on the client side.\n *\n * Client extensions are invoked after the scheme creates the base payment payload\n * but before it is returned. This allows mechanism-specific logic (e.g., EVM EIP-2612\n * permit signing) to enrich the payload's extensions data.\n */\nexport interface ClientExtension {\n  /**\n   * Unique key identifying this extension (e.g., \"eip2612GasSponsoring\").\n   * Must match the extension key used in PaymentRequired.extensions.\n   */\n  key: string;\n\n  /**\n   * Called after payload creation when the extension key is present in\n   * paymentRequired.extensions. Allows the extension to enrich the payload\n   * with extension-specific data (e.g., signing an EIP-2612 permit).\n   *\n   * @param paymentPayload - The payment payload to enrich\n   * @param paymentRequired - The original PaymentRequired response\n   * @returns The enriched payment payload\n   */\n  enrichPaymentPayload?: (\n    paymentPayload: PaymentPayload,\n    paymentRequired: PaymentRequired,\n  ) => Promise<PaymentPayload>;\n\n  hooks?: ClientExtensionHooks;\n  transportHooks?: ClientTransportExtensionHooks;\n}\n\n/**\n * A policy function that filters or transforms payment requirements.\n * Policies are applied in order before the selector chooses the final option.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - Array of payment requirements to filter/transform\n * @returns Filtered array of payment requirements\n */\nexport type PaymentPolicy = (x402Version: number, paymentRequirements: PaymentRequirements[]) => PaymentRequirements[];\n\n\n/**\n * Configuration for registering a payment scheme with a specific network\n */\nexport interface SchemeRegistration {\n  /**\n   * The network identifier (e.g., 'eip155:8453', 'solana:mainnet')\n   */\n  network: Network;\n\n  /**\n   * The scheme client implementation for this network\n   */\n  client: SchemeNetworkClient;\n\n  /**\n   * The x402 protocol version to use for this scheme\n   *\n   * @default 2\n   */\n  x402Version?: number;\n}\n\n/**\n * Configuration options for the fetch wrapper\n */\nexport interface x402ClientConfig {\n  /**\n   * Array of scheme registrations defining which payment methods are supported\n   */\n  schemes: SchemeRegistration[];\n\n  /**\n   * Policies to apply to the client\n   */\n  policies?: PaymentPolicy[];\n\n  /**\n   * Custom payment requirements selector function\n   * If not provided, uses the default selector (first available option)\n   */\n  paymentRequirementsSelector?: SelectPaymentRequirements;\n}\n\n/**\n * Core client for managing x402 payment schemes and creating payment payloads.\n *\n * Handles registration of payment schemes, policy-based filtering of payment requirements,\n * and creation of payment payloads based on server requirements.\n */\nexport class x402Client {\n  private readonly paymentRequirementsSelector: SelectPaymentRequirements;\n  private readonly registeredClientSchemes: Map<number, Map<string, Map<string, SchemeNetworkClient>>> = new Map();\n  private readonly schemeClientHookAdapters: Map<number, Map<string, Map<string, ClientHookAdapterHandles>>> = new Map();\n  private readonly policies: PaymentPolicy[] = [];\n  private readonly registeredExtensions: Map<string, ClientExtension> = new Map();\n\n  private beforePaymentCreationHooks: BeforePaymentCreationHook[] = [];\n  private afterPaymentCreationHooks: AfterPaymentCreationHook[] = [];\n  private onPaymentCreationFailureHooks: OnPaymentCreationFailureHook[] = [];\n  private paymentResponseHooks: OnPaymentResponseHook[] = [];\n\n  /**\n   * Creates a new x402Client instance.\n   *\n   * @param paymentRequirementsSelector - Function to select payment requirements from available options\n   */\n  constructor(paymentRequirementsSelector?: SelectPaymentRequirements) {\n    this.paymentRequirementsSelector = paymentRequirementsSelector || ((x402Version, accepts) => accepts[0]);\n  }\n\n  /**\n   * Creates a new x402Client instance from a configuration object.\n   *\n   * @param config - The client configuration including schemes, policies, and payment requirements selector\n   * @returns A configured x402Client instance\n   */\n  static fromConfig(config: x402ClientConfig): x402Client {\n    const client = new x402Client(config.paymentRequirementsSelector);\n    config.schemes.forEach(scheme => {\n      if (scheme.x402Version === 1) {\n        client.registerV1(scheme.network, scheme.client);\n      } else {\n        client.register(scheme.network, scheme.client);\n      }\n    });\n    config.policies?.forEach(policy => {\n      client.registerPolicy(policy);\n    });\n    return client;\n  }\n\n  /**\n   * Registers a scheme client for the current x402 version.\n   *\n   * @param network - The network to register the client for\n   * @param client - The scheme network client to register\n   * @returns The x402Client instance for chaining\n   */\n  register(network: Network, client: SchemeNetworkClient): x402Client {\n    return this._registerScheme(x402Version, network, client);\n  }\n\n  /**\n   * Registers a scheme client for x402 version 1.\n   *\n   * @param network - The v1 network identifier (e.g., 'base-sepolia', 'solana-devnet')\n   * @param client - The scheme network client to register\n   * @returns The x402Client instance for chaining\n   */\n  registerV1(network: string, client: SchemeNetworkClient): x402Client {\n    return this._registerScheme(1, network as Network, client);\n  }\n\n  /**\n   * Registers a policy to filter or transform payment requirements.\n   *\n   * Policies are applied in order after filtering by registered schemes\n   * and before the selector chooses the final payment requirement.\n   *\n   * @param policy - Function to filter/transform payment requirements\n   * @returns The x402Client instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Prefer cheaper options\n   * client.registerPolicy((version, reqs) =>\n   *   reqs.filter(r => BigInt(r.value) < BigInt('1000000'))\n   * );\n   *\n   * // Prefer specific networks\n   * client.registerPolicy((version, reqs) =>\n   *   reqs.filter(r => r.network.startsWith('eip155:'))\n   * );\n   * ```\n   */\n  registerPolicy(policy: PaymentPolicy): x402Client {\n    this.policies.push(policy);\n    return this;\n  }\n\n  /**\n   * Registers a client extension that can enrich payment payloads.\n   *\n   * Extensions are invoked after the scheme creates the base payload and the\n   * payload is wrapped with extensions/resource/accepted data. If the extension's\n   * key is present in `paymentRequired.extensions`, the extension's\n   * `enrichPaymentPayload` hook is called to modify the payload.\n   *\n   * @param extension - The client extension to register\n   * @returns The x402Client instance for chaining\n   */\n  registerExtension(extension: ClientExtension): x402Client {\n    this.registeredExtensions.set(extension.key, extension);\n    return this;\n  }\n\n  /**\n   * Get all registered client extensions.\n   *\n   * @returns Array of registered extensions\n   */\n  getExtensions(): ClientExtension[] {\n    return Array.from(this.registeredExtensions.values());\n  }\n\n  /**\n   * Register a hook to execute before payment payload creation.\n   * Can abort creation by returning { abort: true, reason: string }\n   *\n   * @param hook - The hook function to register\n   * @returns The x402Client instance for chaining\n   */\n  onBeforePaymentCreation(hook: BeforePaymentCreationHook): x402Client {\n    this.beforePaymentCreationHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook to execute after successful payment payload creation.\n   *\n   * @param hook - The hook function to register\n   * @returns The x402Client instance for chaining\n   */\n  onAfterPaymentCreation(hook: AfterPaymentCreationHook): x402Client {\n    this.afterPaymentCreationHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook to execute when payment payload creation fails.\n   * Can recover from failure by returning { recovered: true, payload: PaymentPayload }\n   *\n   * @param hook - The hook function to register\n   * @returns The x402Client instance for chaining\n   */\n  onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): x402Client {\n    this.onPaymentCreationFailureHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Register a hook to execute after a paid request completes.\n   * Can signal recovery by returning { recovered: true }, causing the transport to retry.\n   *\n   * @param hook - The hook function to register\n   * @returns The x402Client instance for chaining\n   */\n  onPaymentResponse(hook: OnPaymentResponseHook): x402Client {\n    this.paymentResponseHooks.push(hook);\n    return this;\n  }\n\n  /**\n   * Fires all registered payment response hooks in order.\n   * Returns `{ recovered: true }` if any hook signals recovery (first wins).\n   *\n   * @param ctx - The payment response context\n   * @returns Recovery signal or undefined\n   */\n  async handlePaymentResponse(\n    ctx: PaymentResponseContext,\n  ): Promise<{ recovered: true } | undefined> {\n    for (const hook of this.getLabeledHooks(\n      \"onPaymentResponse\",\n      ctx.paymentPayload.x402Version,\n      ctx.requirements,\n      ctx.paymentRequired?.extensions ?? ctx.paymentPayload.extensions,\n    )) {\n      const result = await hook(ctx);\n      if (result && \"recovered\" in result && result.recovered) {\n        return { recovered: true };\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Creates a payment payload based on a PaymentRequired response.\n   *\n   * Automatically extracts x402Version, resource, and extensions from the PaymentRequired\n   * response and constructs a complete PaymentPayload with the accepted requirements.\n   *\n   * @param paymentRequired - The PaymentRequired response from the server\n   * @returns Promise resolving to the complete payment payload\n   */\n  async createPaymentPayload(\n    paymentRequired: PaymentRequired,\n  ): Promise<PaymentPayload> {\n    const clientSchemesByNetwork = this.registeredClientSchemes.get(paymentRequired.x402Version);\n    if (!clientSchemesByNetwork) {\n      throw new Error(`No client registered for x402 version: ${paymentRequired.x402Version}`);\n    }\n\n    const requirements = this.selectPaymentRequirements(paymentRequired.x402Version, paymentRequired.accepts);\n\n    const context: PaymentCreationContext = {\n      paymentRequired,\n      selectedRequirements: requirements,\n    };\n\n    for (const hook of this.getLabeledHooks(\n      \"beforePaymentCreation\",\n      paymentRequired.x402Version,\n      requirements,\n      paymentRequired.extensions,\n    )) {\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      const schemeNetworkClient = findByNetworkAndScheme(clientSchemesByNetwork, requirements.scheme, requirements.network);\n      if (!schemeNetworkClient) {\n        throw new Error(`No client registered for scheme: ${requirements.scheme} and network: ${requirements.network}`);\n      }\n\n      const partialPayload = await schemeNetworkClient.createPaymentPayload(\n        paymentRequired.x402Version,\n        requirements,\n        { extensions: paymentRequired.extensions },\n      );\n\n      let paymentPayload: PaymentPayload;\n      if (partialPayload.x402Version == 1) {\n        paymentPayload = partialPayload as PaymentPayload;\n      } else {\n        // Merge server-declared extensions with any scheme-provided extensions.\n        // Scheme extensions overlay on top (e.g., EIP-2612 info enriches server declaration).\n        const mergedExtensions = this.mergeExtensions(\n          paymentRequired.extensions,\n          partialPayload.extensions,\n        );\n\n        paymentPayload = {\n          x402Version: partialPayload.x402Version,\n          payload: partialPayload.payload,\n          extensions: mergedExtensions,\n          resource: paymentRequired.resource,\n          accepted: requirements,\n        };\n      }\n\n      // Enrich payload via registered client extensions (for non-scheme extensions)\n      paymentPayload = await this.enrichPaymentPayloadWithExtensions(paymentPayload, paymentRequired);\n\n      const createdContext: PaymentCreatedContext = {\n        ...context,\n        paymentPayload,\n      };\n\n      for (const hook of this.getLabeledHooks(\n        \"afterPaymentCreation\",\n        paymentRequired.x402Version,\n        requirements,\n        paymentRequired.extensions,\n      )) {\n        await hook(createdContext);\n      }\n\n      return paymentPayload;\n    } catch (error) {\n      const failureContext: PaymentCreationFailureContext = {\n        ...context,\n        error: error as Error,\n      };\n\n      for (const hook of this.getLabeledHooks(\n        \"onPaymentCreationFailure\",\n        paymentRequired.x402Version,\n        requirements,\n        paymentRequired.extensions,\n      )) {\n        const result = await hook(failureContext);\n        if (result && \"recovered\" in result && result.recovered) {\n          return result.payload;\n        }\n      }\n\n      throw error;\n    }\n  }\n\n\n\n  /**\n   * Merges server-declared extensions with client extension echoes.\n   * Client extension data may add fields, but server-declared fields remain intact.\n   *\n   * @param serverExtensions - Extensions declared by the server in the 402 response\n   * @param clientExtensions - Extensions provided by the client or scheme\n   * @returns The merged extensions object, or undefined if both inputs are undefined\n   */\n  private mergeExtensions(\n    serverExtensions?: Record<string, unknown>,\n    clientExtensions?: Record<string, unknown>,\n  ): Record<string, unknown> | undefined {\n    if (!clientExtensions) return serverExtensions;\n    if (!serverExtensions) return clientExtensions;\n\n    const merged = { ...serverExtensions };\n    for (const [key, clientValue] of Object.entries(clientExtensions)) {\n      const serverValue = merged[key];\n      if (\n        serverValue === null ||\n        typeof serverValue !== \"object\" ||\n        Array.isArray(serverValue) ||\n        clientValue === null ||\n        typeof clientValue !== \"object\" ||\n        Array.isArray(clientValue)\n      ) {\n        merged[key] = clientValue;\n        continue;\n      }\n\n      const serverRecord = serverValue as Record<string, unknown>;\n      const clientRecord = clientValue as Record<string, unknown>;\n      const extensionValue = { ...serverRecord };\n      const pending = [{ target: extensionValue, source: clientRecord }];\n      for (const item of pending) {\n        for (const [fieldKey, clientFieldValue] of Object.entries(item.source)) {\n          const serverFieldValue = item.target[fieldKey];\n          if (\n            serverFieldValue !== null &&\n            typeof serverFieldValue === \"object\" &&\n            !Array.isArray(serverFieldValue) &&\n            clientFieldValue !== null &&\n            typeof clientFieldValue === \"object\" &&\n            !Array.isArray(clientFieldValue)\n          ) {\n            const nestedValue = { ...(serverFieldValue as Record<string, unknown>) };\n            item.target[fieldKey] = nestedValue;\n            pending.push({\n              target: nestedValue,\n              source: clientFieldValue as Record<string, unknown>,\n            });\n            continue;\n          }\n\n          if (!Object.prototype.hasOwnProperty.call(item.target, fieldKey)) {\n            item.target[fieldKey] = clientFieldValue;\n          }\n        }\n      }\n\n      merged[key] = extensionValue;\n    }\n    return merged;\n  }\n\n  /**\n   * Enriches a payment payload by calling registered extension hooks.\n   * For each extension key present in the PaymentRequired response,\n   * invokes the corresponding extension's enrichPaymentPayload callback.\n   *\n   * @param paymentPayload - The payment payload to enrich with extension data\n   * @param paymentRequired - The PaymentRequired response containing extension declarations\n   * @returns The enriched payment payload with extension data applied\n   */\n  private async enrichPaymentPayloadWithExtensions(\n    paymentPayload: PaymentPayload,\n    paymentRequired: PaymentRequired,\n  ): Promise<PaymentPayload> {\n    if (!paymentRequired.extensions || this.registeredExtensions.size === 0) {\n      return paymentPayload;\n    }\n\n    let enriched = paymentPayload;\n    for (const [key, extension] of this.registeredExtensions) {\n      if (key in paymentRequired.extensions && extension.enrichPaymentPayload) {\n        enriched = await extension.enrichPaymentPayload(enriched, paymentRequired);\n      }\n    }\n\n    return {\n      ...enriched,\n      extensions: this.mergeExtensions(paymentRequired.extensions, enriched.extensions),\n    };\n  }\n\n  /**\n   * Selects appropriate payment requirements based on registered clients and policies.\n   *\n   * Selection process:\n   * 1. Filter by registered schemes (network + scheme support)\n   * 2. Apply all registered policies in order\n   * 3. Use selector to choose final requirement\n   *\n   * @param x402Version - The x402 protocol version\n   * @param paymentRequirements - Array of available payment requirements\n   * @returns The selected payment requirements\n   */\n  private selectPaymentRequirements(x402Version: number, paymentRequirements: PaymentRequirements[]): PaymentRequirements {\n    const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version);\n    if (!clientSchemesByNetwork) {\n      throw new Error(`No client registered for x402 version: ${x402Version}`);\n    }\n\n    // Step 1: Filter by registered schemes\n    const supportedPaymentRequirements = paymentRequirements.filter(requirement => {\n      let clientSchemes = findSchemesByNetwork(clientSchemesByNetwork, requirement.network);\n      if (!clientSchemes) {\n        return false;\n      }\n\n      return clientSchemes.has(requirement.scheme);\n    })\n\n    if (supportedPaymentRequirements.length === 0) {\n      throw new Error(`No network/scheme registered for x402 version: ${x402Version} which comply with the payment requirements. ${JSON.stringify({\n        x402Version,\n        paymentRequirements,\n        x402Versions: Array.from(this.registeredClientSchemes.keys()),\n        networks: Array.from(clientSchemesByNetwork.keys()),\n        schemes: Array.from(clientSchemesByNetwork.values()).map(schemes => Array.from(schemes.keys())).flat(),\n      })}`);\n    }\n\n    // Step 2: Apply all policies in order\n    let filteredRequirements = supportedPaymentRequirements;\n    for (const policy of this.policies) {\n      filteredRequirements = policy(x402Version, filteredRequirements);\n\n      if (filteredRequirements.length === 0) {\n        throw new Error(`All payment requirements were filtered out by policies for x402 version: ${x402Version}`);\n      }\n    }\n\n    // Step 3: Use selector to choose final requirement\n    return this.paymentRequirementsSelector(x402Version, filteredRequirements);\n  }\n\n  /**\n   * Internal method to register a scheme client.\n   *\n   * @param x402Version - The x402 protocol version\n   * @param network - The network to register the client for\n   * @param client - The scheme network client to register\n   * @returns The x402Client instance for chaining\n   */\n  private _registerScheme(x402Version: number, network: Network, client: SchemeNetworkClient): x402Client {\n    if (!this.registeredClientSchemes.has(x402Version)) {\n      this.registeredClientSchemes.set(x402Version, new Map());\n    }\n    const clientSchemesByNetwork = this.registeredClientSchemes.get(x402Version)!;\n    if (!clientSchemesByNetwork.has(network)) {\n      clientSchemesByNetwork.set(network, new Map());\n    }\n\n    const clientByScheme = clientSchemesByNetwork.get(network)!;\n    clientByScheme.set(client.scheme, client);\n\n    if (!this.schemeClientHookAdapters.has(x402Version)) {\n      this.schemeClientHookAdapters.set(x402Version, new Map());\n    }\n    const adaptersByNetwork = this.schemeClientHookAdapters.get(x402Version)!;\n    if (!adaptersByNetwork.has(network)) {\n      adaptersByNetwork.set(network, new Map());\n    }\n\n    const adaptersByScheme = adaptersByNetwork.get(network)!;\n    const hooks = client.schemeHooks;\n    if (!hooks) {\n      adaptersByScheme.delete(client.scheme);\n      return this;\n    }\n\n    const handles: ClientHookAdapterHandles = {};\n    if (hooks.onBeforePaymentCreation) {\n      handles.beforePaymentCreation = hooks.onBeforePaymentCreation;\n    }\n    if (hooks.onAfterPaymentCreation) {\n      handles.afterPaymentCreation = hooks.onAfterPaymentCreation;\n    }\n    if (hooks.onPaymentCreationFailure) {\n      handles.onPaymentCreationFailure = hooks.onPaymentCreationFailure;\n    }\n    if (hooks.onPaymentResponse) {\n      handles.onPaymentResponse = hooks.onPaymentResponse;\n    }\n\n    if (Object.keys(handles).length > 0) {\n      adaptersByScheme.set(client.scheme, handles);\n    } else {\n      adaptersByScheme.delete(client.scheme);\n    }\n\n    return this;\n  }\n\n  /**\n   * Returns manual hooks followed by the selected scheme hook and declared extension hooks.\n   *\n   * @param phase - Hook slot to collect\n   * @param x402Version - Protocol version for the selected requirement\n   * @param requirements - Selected payment requirement\n   * @param declaredExtensions - Extension declarations that scope extension hooks\n   * @returns Hooks in invocation order\n   */\n  private getLabeledHooks<P extends ClientHookPhase>(\n    phase: P,\n    x402Version: number,\n    requirements: PaymentRequirements,\n    declaredExtensions?: Record<string, unknown>,\n  ): Array<NonNullable<ClientHookAdapterHandles[P]>> {\n    let manual: Array<NonNullable<ClientHookAdapterHandles[P]>>;\n    switch (phase) {\n      case \"beforePaymentCreation\":\n        manual = this.beforePaymentCreationHooks as Array<\n          NonNullable<ClientHookAdapterHandles[P]>\n        >;\n        break;\n      case \"afterPaymentCreation\":\n        manual = this.afterPaymentCreationHooks as Array<\n          NonNullable<ClientHookAdapterHandles[P]>\n        >;\n        break;\n      case \"onPaymentCreationFailure\":\n        manual = this.onPaymentCreationFailureHooks as Array<\n          NonNullable<ClientHookAdapterHandles[P]>\n        >;\n        break;\n      case \"onPaymentResponse\":\n        manual = this.paymentResponseHooks as Array<NonNullable<ClientHookAdapterHandles[P]>>;\n        break;\n    }\n\n    const out: Array<NonNullable<ClientHookAdapterHandles[P]>> = [...manual];\n    const adaptersByNetwork = this.schemeClientHookAdapters.get(x402Version);\n    const schemeAdapter = adaptersByNetwork\n      ? findByNetworkAndScheme(adaptersByNetwork, requirements.scheme, requirements.network)\n      : undefined;\n    const hook = schemeAdapter?.[phase];\n    if (hook !== undefined) {\n      out.push(hook);\n    }\n    if (!declaredExtensions) {\n      return out;\n    }\n\n    const extensionHookKey = this.getClientExtensionHookKey(phase);\n    for (const [extensionKey, extension] of this.registeredExtensions) {\n      if (!(extensionKey in declaredExtensions)) continue;\n\n      const extensionHook = extension.hooks?.[extensionHookKey];\n      if (!extensionHook) continue;\n\n      type HookFn = NonNullable<ClientHookAdapterHandles[P]>;\n      type HookContext = Parameters<HookFn>[0];\n      out.push((async (ctx: HookContext) => {\n        return (\n          extensionHook as (\n            declaration: unknown,\n            context: HookContext,\n          ) => ReturnType<HookFn>\n        )(declaredExtensions[extensionKey], ctx);\n      }) as HookFn);\n    }\n    return out;\n  }\n\n  /**\n   * Maps internal hook phases to extension hook names.\n   *\n   * @param phase - Internal hook phase\n   * @returns Extension hook key for the phase\n   */\n  private getClientExtensionHookKey<P extends ClientHookPhase>(\n    phase: P,\n  ): keyof ClientExtensionHooks {\n    switch (phase) {\n      case \"beforePaymentCreation\":\n        return \"onBeforePaymentCreation\";\n      case \"afterPaymentCreation\":\n        return \"onAfterPaymentCreation\";\n      case \"onPaymentCreationFailure\":\n        return \"onPaymentCreationFailure\";\n      case \"onPaymentResponse\":\n        return \"onPaymentResponse\";\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA4LO,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBtB,YAAY,6BAAyD;AAfrE,SAAiB,0BAAsF,oBAAI,IAAI;AAC/G,SAAiB,2BAA4F,oBAAI,IAAI;AACrH,SAAiB,WAA4B,CAAC;AAC9C,SAAiB,uBAAqD,oBAAI,IAAI;AAE9E,SAAQ,6BAA0D,CAAC;AACnE,SAAQ,4BAAwD,CAAC;AACjE,SAAQ,gCAAgE,CAAC;AACzE,SAAQ,uBAAgD,CAAC;AAQvD,SAAK,8BAA8B,gCAAgC,CAACA,cAAa,YAAY,QAAQ,CAAC;AAAA,EACxG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,WAAW,QAAsC;AACtD,UAAM,SAAS,IAAI,YAAW,OAAO,2BAA2B;AAChE,WAAO,QAAQ,QAAQ,YAAU;AAC/B,UAAI,OAAO,gBAAgB,GAAG;AAC5B,eAAO,WAAW,OAAO,SAAS,OAAO,MAAM;AAAA,MACjD,OAAO;AACL,eAAO,SAAS,OAAO,SAAS,OAAO,MAAM;AAAA,MAC/C;AAAA,IACF,CAAC;AACD,WAAO,UAAU,QAAQ,YAAU;AACjC,aAAO,eAAe,MAAM;AAAA,IAC9B,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,SAAkB,QAAyC;AAClE,WAAO,KAAK,gBAAgB,aAAa,SAAS,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,SAAiB,QAAyC;AACnE,WAAO,KAAK,gBAAgB,GAAG,SAAoB,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,eAAe,QAAmC;AAChD,SAAK,SAAS,KAAK,MAAM;AACzB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,kBAAkB,WAAwC;AACxD,SAAK,qBAAqB,IAAI,UAAU,KAAK,SAAS;AACtD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAmC;AACjC,WAAO,MAAM,KAAK,KAAK,qBAAqB,OAAO,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,wBAAwB,MAA6C;AACnE,SAAK,2BAA2B,KAAK,IAAI;AACzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBAAuB,MAA4C;AACjE,SAAK,0BAA0B,KAAK,IAAI;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,yBAAyB,MAAgD;AACvE,SAAK,8BAA8B,KAAK,IAAI;AAC5C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,MAAyC;AACzD,SAAK,qBAAqB,KAAK,IAAI;AACnC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,sBACJ,KAC0C;AAC1C,eAAW,QAAQ,KAAK;AAAA,MACtB;AAAA,MACA,IAAI,eAAe;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI,iBAAiB,cAAc,IAAI,eAAe;AAAA,IACxD,GAAG;AACD,YAAM,SAAS,MAAM,KAAK,GAAG;AAC7B,UAAI,UAAU,eAAe,UAAU,OAAO,WAAW;AACvD,eAAO,EAAE,WAAW,KAAK;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,qBACJ,iBACyB;AACzB,UAAM,yBAAyB,KAAK,wBAAwB,IAAI,gBAAgB,WAAW;AAC3F,QAAI,CAAC,wBAAwB;AAC3B,YAAM,IAAI,MAAM,0CAA0C,gBAAgB,WAAW,EAAE;AAAA,IACzF;AAEA,UAAM,eAAe,KAAK,0BAA0B,gBAAgB,aAAa,gBAAgB,OAAO;AAExG,UAAM,UAAkC;AAAA,MACtC;AAAA,MACA,sBAAsB;AAAA,IACxB;AAEA,eAAW,QAAQ,KAAK;AAAA,MACtB;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA,gBAAgB;AAAA,IAClB,GAAG;AACD,YAAM,SAAS,MAAM,KAAK,OAAO;AACjC,UAAI,UAAU,WAAW,UAAU,OAAO,OAAO;AAC/C,cAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,EAAE;AAAA,MAC9D;AAAA,IACF;AAEA,QAAI;AACF,YAAM,sBAAsB,uBAAuB,wBAAwB,aAAa,QAAQ,aAAa,OAAO;AACpH,UAAI,CAAC,qBAAqB;AACxB,cAAM,IAAI,MAAM,oCAAoC,aAAa,MAAM,iBAAiB,aAAa,OAAO,EAAE;AAAA,MAChH;AAEA,YAAM,iBAAiB,MAAM,oBAAoB;AAAA,QAC/C,gBAAgB;AAAA,QAChB;AAAA,QACA,EAAE,YAAY,gBAAgB,WAAW;AAAA,MAC3C;AAEA,UAAI;AACJ,UAAI,eAAe,eAAe,GAAG;AACnC,yBAAiB;AAAA,MACnB,OAAO;AAGL,cAAM,mBAAmB,KAAK;AAAA,UAC5B,gBAAgB;AAAA,UAChB,eAAe;AAAA,QACjB;AAEA,yBAAiB;AAAA,UACf,aAAa,eAAe;AAAA,UAC5B,SAAS,eAAe;AAAA,UACxB,YAAY;AAAA,UACZ,UAAU,gBAAgB;AAAA,UAC1B,UAAU;AAAA,QACZ;AAAA,MACF;AAGA,uBAAiB,MAAM,KAAK,mCAAmC,gBAAgB,eAAe;AAE9F,YAAM,iBAAwC;AAAA,QAC5C,GAAG;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,QAAQ,KAAK;AAAA,QACtB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA,gBAAgB;AAAA,MAClB,GAAG;AACD,cAAM,KAAK,cAAc;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,iBAAgD;AAAA,QACpD,GAAG;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,QAAQ,KAAK;AAAA,QACtB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA,gBAAgB;AAAA,MAClB,GAAG;AACD,cAAM,SAAS,MAAM,KAAK,cAAc;AACxC,YAAI,UAAU,eAAe,UAAU,OAAO,WAAW;AACvD,iBAAO,OAAO;AAAA,QAChB;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,gBACN,kBACA,kBACqC;AACrC,QAAI,CAAC,iBAAkB,QAAO;AAC9B,QAAI,CAAC,iBAAkB,QAAO;AAE9B,UAAM,SAAS,EAAE,GAAG,iBAAiB;AACrC,eAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACjE,YAAM,cAAc,OAAO,GAAG;AAC9B,UACE,gBAAgB,QAChB,OAAO,gBAAgB,YACvB,MAAM,QAAQ,WAAW,KACzB,gBAAgB,QAChB,OAAO,gBAAgB,YACvB,MAAM,QAAQ,WAAW,GACzB;AACA,eAAO,GAAG,IAAI;AACd;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,YAAM,eAAe;AACrB,YAAM,iBAAiB,EAAE,GAAG,aAAa;AACzC,YAAM,UAAU,CAAC,EAAE,QAAQ,gBAAgB,QAAQ,aAAa,CAAC;AACjE,iBAAW,QAAQ,SAAS;AAC1B,mBAAW,CAAC,UAAU,gBAAgB,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACtE,gBAAM,mBAAmB,KAAK,OAAO,QAAQ;AAC7C,cACE,qBAAqB,QACrB,OAAO,qBAAqB,YAC5B,CAAC,MAAM,QAAQ,gBAAgB,KAC/B,qBAAqB,QACrB,OAAO,qBAAqB,YAC5B,CAAC,MAAM,QAAQ,gBAAgB,GAC/B;AACA,kBAAM,cAAc,EAAE,GAAI,iBAA6C;AACvE,iBAAK,OAAO,QAAQ,IAAI;AACxB,oBAAQ,KAAK;AAAA,cACX,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV,CAAC;AACD;AAAA,UACF;AAEA,cAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAChE,iBAAK,OAAO,QAAQ,IAAI;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,aAAO,GAAG,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,mCACZ,gBACA,iBACyB;AACzB,QAAI,CAAC,gBAAgB,cAAc,KAAK,qBAAqB,SAAS,GAAG;AACvE,aAAO;AAAA,IACT;AAEA,QAAI,WAAW;AACf,eAAW,CAAC,KAAK,SAAS,KAAK,KAAK,sBAAsB;AACxD,UAAI,OAAO,gBAAgB,cAAc,UAAU,sBAAsB;AACvE,mBAAW,MAAM,UAAU,qBAAqB,UAAU,eAAe;AAAA,MAC3E;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,KAAK,gBAAgB,gBAAgB,YAAY,SAAS,UAAU;AAAA,IAClF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,0BAA0BA,cAAqB,qBAAiE;AACtH,UAAM,yBAAyB,KAAK,wBAAwB,IAAIA,YAAW;AAC3E,QAAI,CAAC,wBAAwB;AAC3B,YAAM,IAAI,MAAM,0CAA0CA,YAAW,EAAE;AAAA,IACzE;AAGA,UAAM,+BAA+B,oBAAoB,OAAO,iBAAe;AAC7E,UAAI,gBAAgB,qBAAqB,wBAAwB,YAAY,OAAO;AACpF,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,MACT;AAEA,aAAO,cAAc,IAAI,YAAY,MAAM;AAAA,IAC7C,CAAC;AAED,QAAI,6BAA6B,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,kDAAkDA,YAAW,gDAAgD,KAAK,UAAU;AAAA,QAC1I,aAAAA;AAAA,QACA;AAAA,QACA,cAAc,MAAM,KAAK,KAAK,wBAAwB,KAAK,CAAC;AAAA,QAC5D,UAAU,MAAM,KAAK,uBAAuB,KAAK,CAAC;AAAA,QAClD,SAAS,MAAM,KAAK,uBAAuB,OAAO,CAAC,EAAE,IAAI,aAAW,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC,EAAE,KAAK;AAAA,MACvG,CAAC,CAAC,EAAE;AAAA,IACN;AAGA,QAAI,uBAAuB;AAC3B,eAAW,UAAU,KAAK,UAAU;AAClC,6BAAuB,OAAOA,cAAa,oBAAoB;AAE/D,UAAI,qBAAqB,WAAW,GAAG;AACrC,cAAM,IAAI,MAAM,4EAA4EA,YAAW,EAAE;AAAA,MAC3G;AAAA,IACF;AAGA,WAAO,KAAK,4BAA4BA,cAAa,oBAAoB;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,gBAAgBA,cAAqB,SAAkB,QAAyC;AACtG,QAAI,CAAC,KAAK,wBAAwB,IAAIA,YAAW,GAAG;AAClD,WAAK,wBAAwB,IAAIA,cAAa,oBAAI,IAAI,CAAC;AAAA,IACzD;AACA,UAAM,yBAAyB,KAAK,wBAAwB,IAAIA,YAAW;AAC3E,QAAI,CAAC,uBAAuB,IAAI,OAAO,GAAG;AACxC,6BAAuB,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IAC/C;AAEA,UAAM,iBAAiB,uBAAuB,IAAI,OAAO;AACzD,mBAAe,IAAI,OAAO,QAAQ,MAAM;AAExC,QAAI,CAAC,KAAK,yBAAyB,IAAIA,YAAW,GAAG;AACnD,WAAK,yBAAyB,IAAIA,cAAa,oBAAI,IAAI,CAAC;AAAA,IAC1D;AACA,UAAM,oBAAoB,KAAK,yBAAyB,IAAIA,YAAW;AACvE,QAAI,CAAC,kBAAkB,IAAI,OAAO,GAAG;AACnC,wBAAkB,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IAC1C;AAEA,UAAM,mBAAmB,kBAAkB,IAAI,OAAO;AACtD,UAAM,QAAQ,OAAO;AACrB,QAAI,CAAC,OAAO;AACV,uBAAiB,OAAO,OAAO,MAAM;AACrC,aAAO;AAAA,IACT;AAEA,UAAM,UAAoC,CAAC;AAC3C,QAAI,MAAM,yBAAyB;AACjC,cAAQ,wBAAwB,MAAM;AAAA,IACxC;AACA,QAAI,MAAM,wBAAwB;AAChC,cAAQ,uBAAuB,MAAM;AAAA,IACvC;AACA,QAAI,MAAM,0BAA0B;AAClC,cAAQ,2BAA2B,MAAM;AAAA,IAC3C;AACA,QAAI,MAAM,mBAAmB;AAC3B,cAAQ,oBAAoB,MAAM;AAAA,IACpC;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,uBAAiB,IAAI,OAAO,QAAQ,OAAO;AAAA,IAC7C,OAAO;AACL,uBAAiB,OAAO,OAAO,MAAM;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,gBACN,OACAA,cACA,cACA,oBACiD;AACjD,QAAI;AACJ,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,iBAAS,KAAK;AAGd;AAAA,MACF,KAAK;AACH,iBAAS,KAAK;AAGd;AAAA,MACF,KAAK;AACH,iBAAS,KAAK;AAGd;AAAA,MACF,KAAK;AACH,iBAAS,KAAK;AACd;AAAA,IACJ;AAEA,UAAM,MAAuD,CAAC,GAAG,MAAM;AACvE,UAAM,oBAAoB,KAAK,yBAAyB,IAAIA,YAAW;AACvE,UAAM,gBAAgB,oBAClB,uBAAuB,mBAAmB,aAAa,QAAQ,aAAa,OAAO,IACnF;AACJ,UAAM,OAAO,gBAAgB,KAAK;AAClC,QAAI,SAAS,QAAW;AACtB,UAAI,KAAK,IAAI;AAAA,IACf;AACA,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,KAAK,0BAA0B,KAAK;AAC7D,eAAW,CAAC,cAAc,SAAS,KAAK,KAAK,sBAAsB;AACjE,UAAI,EAAE,gBAAgB,oBAAqB;AAE3C,YAAM,gBAAgB,UAAU,QAAQ,gBAAgB;AACxD,UAAI,CAAC,cAAe;AAIpB,UAAI,MAAM,OAAO,QAAqB;AACpC,eACE,cAIA,mBAAmB,YAAY,GAAG,GAAG;AAAA,MACzC,EAAY;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,0BACN,OAC4B;AAC5B,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF;AACF;","names":["x402Version"]}